harnery 0.32.0 → 0.34.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 (665) hide show
  1. package/README.md +2 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -1
  4. package/dist/commands/adapter.js +2 -2
  5. package/dist/commands/agents.d.ts +144 -1
  6. package/dist/commands/agents.d.ts.map +1 -1
  7. package/dist/commands/agents.js +1408 -565
  8. package/dist/commands/artifacts.d.ts.map +1 -1
  9. package/dist/commands/artifacts.js +7 -6
  10. package/dist/commands/backup.d.ts +1 -1
  11. package/dist/commands/backup.d.ts.map +1 -1
  12. package/dist/commands/backup.js +29 -16
  13. package/dist/commands/browse.d.ts.map +1 -1
  14. package/dist/commands/browse.js +234 -12
  15. package/dist/commands/checkpoint.d.ts.map +1 -1
  16. package/dist/commands/checkpoint.js +3 -2
  17. package/dist/commands/claude-desktop.d.ts +2 -2
  18. package/dist/commands/claude-desktop.d.ts.map +1 -1
  19. package/dist/commands/claude-desktop.js +2 -2
  20. package/dist/commands/context.js +1 -6
  21. package/dist/commands/decision.d.ts.map +1 -1
  22. package/dist/commands/decision.js +22 -38
  23. package/dist/commands/docs.d.ts.map +1 -1
  24. package/dist/commands/docs.js +91 -28
  25. package/dist/commands/doctor.d.ts +4 -2
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +55 -7
  28. package/dist/commands/events.d.ts +5 -0
  29. package/dist/commands/events.d.ts.map +1 -0
  30. package/dist/commands/events.js +189 -0
  31. package/dist/commands/governor.d.ts.map +1 -1
  32. package/dist/commands/governor.js +13 -4
  33. package/dist/commands/init.d.ts +10 -2
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +233 -51
  36. package/dist/commands/instructions.d.ts +4 -0
  37. package/dist/commands/instructions.d.ts.map +1 -0
  38. package/dist/commands/instructions.js +100 -0
  39. package/dist/commands/journal.d.ts.map +1 -1
  40. package/dist/commands/journal.js +4 -13
  41. package/dist/commands/ledger-v3.d.ts +5 -0
  42. package/dist/commands/ledger-v3.d.ts.map +1 -0
  43. package/dist/commands/ledger-v3.js +91 -0
  44. package/dist/commands/presence.d.ts.map +1 -1
  45. package/dist/commands/presence.js +15 -6
  46. package/dist/commands/sync.d.ts +1 -1
  47. package/dist/commands/sync.js +1 -1
  48. package/dist/commands/web.d.ts +6 -0
  49. package/dist/commands/web.d.ts.map +1 -1
  50. package/dist/commands/web.js +67 -7
  51. package/dist/commands/work.d.ts.map +1 -1
  52. package/dist/commands/work.js +22 -5
  53. package/dist/core/adapter.d.ts +5 -0
  54. package/dist/core/adapter.d.ts.map +1 -0
  55. package/dist/core/adapter.js +1 -0
  56. package/dist/core/adapters/attest.d.ts +5 -2
  57. package/dist/core/adapters/attest.d.ts.map +1 -1
  58. package/dist/core/adapters/attest.js +8 -3
  59. package/dist/core/adapters/profiles.d.ts +6 -6
  60. package/dist/core/adapters/profiles.d.ts.map +1 -1
  61. package/dist/core/adapters/profiles.js +4 -4
  62. package/dist/core/agents/canonical-emit.d.ts +17 -15
  63. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  64. package/dist/core/agents/canonical-emit.js +27 -25
  65. package/dist/core/agents/cli.js +212 -235
  66. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  67. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  68. package/dist/core/agents/codex-archive-v3.js +110 -0
  69. package/dist/core/agents/coord-client.d.ts +19 -70
  70. package/dist/core/agents/coord-client.d.ts.map +1 -1
  71. package/dist/core/agents/coord-client.js +65 -155
  72. package/dist/core/agents/finalization.d.ts +4 -1
  73. package/dist/core/agents/finalization.d.ts.map +1 -1
  74. package/dist/core/agents/finalization.js +89 -32
  75. package/dist/core/agents/index.d.ts +5 -5
  76. package/dist/core/agents/index.d.ts.map +1 -1
  77. package/dist/core/agents/index.js +5 -5
  78. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  79. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-authority-v3.js +233 -0
  81. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  82. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  83. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  84. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  85. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  86. package/dist/core/agents/live-observation-v3.js +157 -0
  87. package/dist/core/agents/render/prompt-context.d.ts +10 -4
  88. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  89. package/dist/core/agents/render/prompt-context.js +61 -55
  90. package/dist/core/agents/render/session-context.d.ts +1 -1
  91. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  92. package/dist/core/agents/render/session-context.js +15 -33
  93. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  94. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  95. package/dist/core/agents/rules/claim-conflict.js +79 -127
  96. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  97. package/dist/core/agents/rules/commit-conflict.js +3 -18
  98. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  99. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  100. package/dist/core/agents/rules/stop-hook.js +193 -236
  101. package/dist/core/agents/session-events.d.ts +5 -7
  102. package/dist/core/agents/session-events.d.ts.map +1 -1
  103. package/dist/core/agents/session-events.js +127 -95
  104. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  105. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  106. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  107. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  108. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  109. package/dist/core/agents/session-finalizer-v3.js +734 -0
  110. package/dist/core/agents/session-name-display.d.ts +40 -0
  111. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  112. package/dist/core/agents/session-name-display.js +119 -0
  113. package/dist/core/agents/state/activity-log.d.ts +3 -3
  114. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  115. package/dist/core/agents/state/activity-log.js +7 -16
  116. package/dist/core/agents/state/heartbeat-writer.d.ts +29 -46
  117. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  118. package/dist/core/agents/state/heartbeat-writer.js +59 -199
  119. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  120. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  121. package/dist/core/agents/state/live-coordination-view.js +209 -0
  122. package/dist/core/agents/state/session-state.d.ts +45 -0
  123. package/dist/core/agents/state/session-state.d.ts.map +1 -0
  124. package/dist/core/agents/state/session-state.js +90 -0
  125. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  126. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  127. package/dist/core/agents/state/stale-sweep.js +26 -15
  128. package/dist/core/artifacts/index.d.ts.map +1 -1
  129. package/dist/core/artifacts/index.js +5 -7
  130. package/dist/core/config.d.ts +33 -2
  131. package/dist/core/config.d.ts.map +1 -1
  132. package/dist/core/config.js +98 -2
  133. package/dist/core/context/index.d.ts +1 -4
  134. package/dist/core/context/index.d.ts.map +1 -1
  135. package/dist/core/context/index.js +9 -9
  136. package/dist/core/events/span-parent.d.ts +15 -0
  137. package/dist/core/events/span-parent.d.ts.map +1 -0
  138. package/dist/core/events/span-parent.js +34 -0
  139. package/dist/core/events/v3/advance.d.ts +14 -0
  140. package/dist/core/events/v3/advance.d.ts.map +1 -0
  141. package/dist/core/events/v3/advance.js +134 -0
  142. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  143. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  144. package/dist/core/events/v3/authority-outbox.js +399 -0
  145. package/dist/core/events/v3/base-builder.d.ts +20 -0
  146. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  147. package/dist/core/events/v3/base-builder.js +29 -0
  148. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  149. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  150. package/dist/core/events/v3/base-contract.js +647 -0
  151. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  152. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  153. package/dist/core/events/v3/bootstrap.js +175 -0
  154. package/dist/core/events/v3/builder.d.ts +20 -0
  155. package/dist/core/events/v3/builder.d.ts.map +1 -0
  156. package/dist/core/events/v3/builder.js +28 -0
  157. package/dist/core/events/v3/canonical.d.ts +31 -0
  158. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  159. package/dist/core/events/v3/canonical.js +100 -0
  160. package/dist/core/events/v3/capabilities.d.ts +31 -0
  161. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  162. package/dist/core/events/v3/capabilities.js +107 -0
  163. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  164. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  165. package/dist/core/events/v3/capability-drift.js +134 -0
  166. package/dist/core/events/v3/catalog.d.ts +38 -0
  167. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  168. package/dist/core/events/v3/catalog.js +135 -0
  169. package/dist/core/events/v3/clock-order.d.ts +34 -0
  170. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  171. package/dist/core/events/v3/clock-order.js +35 -0
  172. package/dist/core/events/v3/contract.d.ts +171 -0
  173. package/dist/core/events/v3/contract.d.ts.map +1 -0
  174. package/dist/core/events/v3/contract.js +180 -0
  175. package/dist/core/events/v3/control.d.ts +111 -0
  176. package/dist/core/events/v3/control.d.ts.map +1 -0
  177. package/dist/core/events/v3/control.js +419 -0
  178. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  179. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/coordination-view.js +119 -0
  181. package/dist/core/events/v3/economics.d.ts +77 -0
  182. package/dist/core/events/v3/economics.d.ts.map +1 -0
  183. package/dist/core/events/v3/economics.js +274 -0
  184. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  185. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  186. package/dist/core/events/v3/finalization-view.js +37 -0
  187. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  188. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  189. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  190. package/dist/core/events/v3/generated.d.ts +4 -0
  191. package/dist/core/events/v3/generated.d.ts.map +1 -0
  192. package/dist/core/events/v3/generated.js +47 -0
  193. package/dist/core/events/v3/ids.d.ts +9 -0
  194. package/dist/core/events/v3/ids.d.ts.map +1 -0
  195. package/dist/core/events/v3/ids.js +25 -0
  196. package/dist/core/events/v3/index.d.ts +35 -0
  197. package/dist/core/events/v3/index.d.ts.map +1 -0
  198. package/dist/core/events/v3/index.js +33 -0
  199. package/dist/core/events/v3/latency.d.ts +63 -0
  200. package/dist/core/events/v3/latency.d.ts.map +1 -0
  201. package/dist/core/events/v3/latency.js +412 -0
  202. package/dist/core/events/v3/live-feed.d.ts +45 -0
  203. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-feed.js +246 -0
  205. package/dist/core/events/v3/live-observation.d.ts +35 -0
  206. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  207. package/dist/core/events/v3/live-observation.js +1 -0
  208. package/dist/core/events/v3/live-routing.d.ts +57 -0
  209. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  210. package/dist/core/events/v3/live-routing.js +107 -0
  211. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  212. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  214. package/dist/core/events/v3/producers/command.d.ts +50 -0
  215. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/command.js +135 -0
  217. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  218. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  220. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  221. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/coordination.js +229 -0
  223. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  224. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/hook-base.js +424 -0
  226. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  227. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/hook.js +71 -0
  229. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  230. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  231. package/dist/core/events/v3/producers/intake.js +244 -0
  232. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  233. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  234. package/dist/core/events/v3/producers/recorder.js +2176 -0
  235. package/dist/core/events/v3/projection.d.ts +101 -0
  236. package/dist/core/events/v3/projection.d.ts.map +1 -0
  237. package/dist/core/events/v3/projection.js +479 -0
  238. package/dist/core/events/v3/reader.d.ts +75 -0
  239. package/dist/core/events/v3/reader.d.ts.map +1 -0
  240. package/dist/core/events/v3/reader.js +778 -0
  241. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  242. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  243. package/dist/core/events/v3/recovery-record.js +167 -0
  244. package/dist/core/events/v3/recovery.d.ts +22 -0
  245. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  246. package/dist/core/events/v3/recovery.js +227 -0
  247. package/dist/core/events/v3/span-state.d.ts +52 -0
  248. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  249. package/dist/core/events/v3/span-state.js +142 -0
  250. package/dist/core/events/v3/targets.d.ts +23 -0
  251. package/dist/core/events/v3/targets.d.ts.map +1 -0
  252. package/dist/core/events/v3/targets.js +134 -0
  253. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  254. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  255. package/dist/core/events/v3/turn-telemetry.js +168 -0
  256. package/dist/core/events/v3/validate.d.ts +9 -0
  257. package/dist/core/events/v3/validate.d.ts.map +1 -0
  258. package/dist/core/events/v3/validate.js +281 -0
  259. package/dist/core/events/v3/writer.d.ts +56 -0
  260. package/dist/core/events/v3/writer.d.ts.map +1 -0
  261. package/dist/core/events/v3/writer.js +335 -0
  262. package/dist/core/governor/index.d.ts +1 -1
  263. package/dist/core/governor/index.d.ts.map +1 -1
  264. package/dist/core/governor/index.js +1 -1
  265. package/dist/core/governor/plan-api.d.ts +2 -1
  266. package/dist/core/governor/plan-api.d.ts.map +1 -1
  267. package/dist/core/governor/plan-api.js +6 -3
  268. package/dist/core/governor/read.d.ts +1 -1
  269. package/dist/core/governor/read.d.ts.map +1 -1
  270. package/dist/core/governor/read.js +1 -1
  271. package/dist/core/governor/state.d.ts +9 -0
  272. package/dist/core/governor/state.d.ts.map +1 -1
  273. package/dist/core/governor/state.js +40 -3
  274. package/dist/core/guard/config.d.ts +5 -0
  275. package/dist/core/guard/config.d.ts.map +1 -0
  276. package/dist/core/guard/config.js +157 -0
  277. package/dist/core/guard/coordinator.d.ts +14 -0
  278. package/dist/core/guard/coordinator.d.ts.map +1 -0
  279. package/dist/core/guard/coordinator.js +173 -0
  280. package/dist/core/guard/evaluator.d.ts +4 -0
  281. package/dist/core/guard/evaluator.d.ts.map +1 -0
  282. package/dist/core/guard/evaluator.js +242 -0
  283. package/dist/core/guard/evidence-v3.d.ts +15 -0
  284. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  285. package/dist/core/guard/evidence-v3.js +171 -0
  286. package/dist/core/guard/index.d.ts +10 -0
  287. package/dist/core/guard/index.d.ts.map +1 -0
  288. package/dist/core/guard/index.js +6 -0
  289. package/dist/core/guard/live-source-v3.d.ts +40 -0
  290. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  291. package/dist/core/guard/live-source-v3.js +128 -0
  292. package/dist/core/guard/storage.d.ts +27 -0
  293. package/dist/core/guard/storage.d.ts.map +1 -0
  294. package/dist/core/guard/storage.js +140 -0
  295. package/dist/core/guard/types.d.ts +119 -0
  296. package/dist/core/guard/types.d.ts.map +1 -0
  297. package/dist/core/guard/types.js +1 -0
  298. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  299. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/detect.js +29 -0
  301. package/dist/core/hooks/adapter/events.d.ts +7 -4
  302. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  303. package/dist/core/hooks/adapter/events.js +13 -4
  304. package/dist/core/hooks/adapter/output.d.ts +2 -2
  305. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  306. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  307. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  308. package/dist/core/hooks/adapter/parse.js +64 -24
  309. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  310. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  311. package/dist/core/hooks/adapter/wiring.js +89 -11
  312. package/dist/core/hooks/cli.d.ts +1 -1
  313. package/dist/core/hooks/cli.js +345 -400
  314. package/dist/core/hooks/codex-authorization.d.ts +30 -0
  315. package/dist/core/hooks/codex-authorization.d.ts.map +1 -0
  316. package/dist/core/hooks/codex-authorization.js +199 -0
  317. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  318. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  319. package/dist/core/hooks/effects/image-capture.js +212 -221
  320. package/dist/core/hooks/effects/index.d.ts +1 -9
  321. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  322. package/dist/core/hooks/effects/index.js +1 -24
  323. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  324. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  325. package/dist/core/hooks/events/input-hash.js +43 -0
  326. package/dist/core/hooks/index.d.ts +4 -3
  327. package/dist/core/hooks/index.d.ts.map +1 -1
  328. package/dist/core/hooks/index.js +2 -3
  329. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  330. package/dist/core/hooks/resolve/coord-root.js +1 -1
  331. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  332. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  333. package/dist/core/hooks/resolve/owner.js +51 -42
  334. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  335. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  336. package/dist/core/hooks/resolve/transcript.js +155 -14
  337. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  338. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  339. package/dist/core/hooks/session-name-presence.js +15 -15
  340. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  341. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  342. package/dist/core/journal/index.d.ts +2 -2
  343. package/dist/core/journal/index.d.ts.map +1 -1
  344. package/dist/core/journal/index.js +9 -22
  345. package/dist/core/presence/blob.d.ts +8 -3
  346. package/dist/core/presence/blob.d.ts.map +1 -1
  347. package/dist/core/presence/blob.js +54 -41
  348. package/dist/core/presence/codec-digest.d.ts +29 -0
  349. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  350. package/dist/core/presence/codec-digest.js +170 -0
  351. package/dist/core/presence/index.js +15 -1
  352. package/dist/core/presence/relay-client.d.ts +1 -1
  353. package/dist/core/presence/relay-client.d.ts.map +1 -1
  354. package/dist/core/presence/relay-client.js +5 -5
  355. package/dist/core/work/index.d.ts +1 -1
  356. package/dist/core/work/index.d.ts.map +1 -1
  357. package/dist/core/work/index.js +1 -1
  358. package/dist/core/work/read.d.ts +1 -1
  359. package/dist/core/work/read.d.ts.map +1 -1
  360. package/dist/core/work/read.js +1 -1
  361. package/dist/core/work/runner.d.ts.map +1 -1
  362. package/dist/core/work/runner.js +6 -0
  363. package/dist/core/work/state.d.ts +9 -0
  364. package/dist/core/work/state.d.ts.map +1 -1
  365. package/dist/core/work/state.js +17 -3
  366. package/dist/core/workflow/engine.js +24 -25
  367. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  368. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  369. package/dist/core/workflow/live-session-v3.js +86 -0
  370. package/dist/core/workflow/scope-id.d.ts +3 -0
  371. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  372. package/dist/core/workflow/scope-id.js +5 -0
  373. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  374. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  375. package/dist/core/workflow/workspaces/leases.js +53 -19
  376. package/dist/index.d.ts +1 -1
  377. package/dist/index.js +1 -1
  378. package/dist/lib/browser/client.d.ts +41 -0
  379. package/dist/lib/browser/client.d.ts.map +1 -1
  380. package/dist/lib/browser/client.js +203 -0
  381. package/dist/lib/browser/critique.d.ts +28 -2
  382. package/dist/lib/browser/critique.d.ts.map +1 -1
  383. package/dist/lib/browser/critique.js +74 -18
  384. package/dist/lib/browser/geometry.d.ts +1 -1
  385. package/dist/lib/browser/geometry.d.ts.map +1 -1
  386. package/dist/lib/browser/geometry.js +130 -6
  387. package/dist/lib/browser/index.d.ts +3 -0
  388. package/dist/lib/browser/index.d.ts.map +1 -1
  389. package/dist/lib/browser/index.js +3 -0
  390. package/dist/lib/browser/qa-plan.d.ts +174 -0
  391. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  392. package/dist/lib/browser/qa-plan.js +321 -0
  393. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  394. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  395. package/dist/lib/browser/qa-reuse.js +222 -0
  396. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  397. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  398. package/dist/lib/browser/qa-snapshot.js +171 -0
  399. package/dist/lib/browser/runts.d.ts.map +1 -1
  400. package/dist/lib/browser/runts.js +22 -1
  401. package/dist/lib/browser/tiling.d.ts +71 -0
  402. package/dist/lib/browser/tiling.d.ts.map +1 -0
  403. package/dist/lib/browser/tiling.js +118 -0
  404. package/dist/lib/context/index.d.ts +0 -3
  405. package/dist/lib/context/index.d.ts.map +1 -1
  406. package/dist/lib/context/index.js +20 -42
  407. package/dist/lib/council/index.d.ts +2 -2
  408. package/dist/lib/council/index.d.ts.map +1 -1
  409. package/dist/lib/council/index.js +9 -20
  410. package/dist/lib/docs-frontmatter.d.ts +1 -6
  411. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  412. package/dist/lib/docs-frontmatter.js +12 -78
  413. package/dist/lib/docs-index.d.ts +9 -0
  414. package/dist/lib/docs-index.d.ts.map +1 -1
  415. package/dist/lib/docs-index.js +32 -3
  416. package/dist/lib/docs-lint.d.ts.map +1 -1
  417. package/dist/lib/docs-lint.js +14 -30
  418. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  419. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  420. package/dist/lib/docs-metadata-audit.js +132 -0
  421. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  422. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  423. package/dist/lib/docs-metadata-managed.js +78 -0
  424. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  425. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  426. package/dist/lib/docs-metadata-sync.js +222 -0
  427. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  428. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  429. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  430. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  431. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  432. package/dist/lib/docs-metadata-v2.js +424 -0
  433. package/dist/lib/docs-new.d.ts +11 -0
  434. package/dist/lib/docs-new.d.ts.map +1 -0
  435. package/dist/lib/docs-new.js +52 -0
  436. package/dist/lib/docs-sweep.d.ts.map +1 -1
  437. package/dist/lib/docs-sweep.js +45 -29
  438. package/dist/lib/headless/index.d.ts +98 -0
  439. package/dist/lib/headless/index.d.ts.map +1 -0
  440. package/dist/lib/headless/index.js +211 -0
  441. package/dist/lib/identities/assume.d.ts +4 -4
  442. package/dist/lib/identities/assume.d.ts.map +1 -1
  443. package/dist/lib/identities/assume.js +52 -68
  444. package/dist/lib/instructions/apply.d.ts +5 -4
  445. package/dist/lib/instructions/apply.d.ts.map +1 -1
  446. package/dist/lib/instructions/apply.js +32 -20
  447. package/dist/lib/instructions/bundle.d.ts +33 -0
  448. package/dist/lib/instructions/bundle.d.ts.map +1 -0
  449. package/dist/lib/instructions/bundle.js +149 -0
  450. package/dist/lib/instructions/splice.d.ts +0 -1
  451. package/dist/lib/instructions/splice.d.ts.map +1 -1
  452. package/dist/lib/instructions/splice.js +22 -6
  453. package/dist/lib/instructions/templates.d.ts +7 -5
  454. package/dist/lib/instructions/templates.d.ts.map +1 -1
  455. package/dist/lib/instructions/templates.js +79 -9
  456. package/package.json +27 -6
  457. package/schemas/config.schema.json +120 -2
  458. package/schemas/docs-metadata-v2.schema.json +441 -0
  459. package/schemas/event-v3.schema.json +24472 -0
  460. package/src/commander.ts +7 -1
  461. package/src/commands/adapter.ts +2 -2
  462. package/src/commands/agents.ts +1737 -570
  463. package/src/commands/artifacts.ts +7 -6
  464. package/src/commands/backup.ts +29 -21
  465. package/src/commands/browse.ts +349 -8
  466. package/src/commands/checkpoint.ts +4 -3
  467. package/src/commands/claude-desktop.ts +7 -5
  468. package/src/commands/context.ts +1 -6
  469. package/src/commands/decision.ts +27 -44
  470. package/src/commands/docs.ts +100 -33
  471. package/src/commands/doctor.ts +73 -8
  472. package/src/commands/events.ts +256 -0
  473. package/src/commands/governor.ts +18 -4
  474. package/src/commands/init.ts +264 -57
  475. package/src/commands/instructions.ts +129 -0
  476. package/src/commands/journal.ts +4 -13
  477. package/src/commands/ledger-v3.ts +111 -0
  478. package/src/commands/presence.ts +18 -11
  479. package/src/commands/sync.ts +1 -1
  480. package/src/commands/web.ts +67 -8
  481. package/src/commands/work.ts +28 -5
  482. package/src/core/adapter.ts +5 -0
  483. package/src/core/adapters/attest.ts +8 -3
  484. package/src/core/adapters/profiles.ts +4 -6
  485. package/src/core/agents/canonical-emit.ts +39 -28
  486. package/src/core/agents/cli.ts +242 -263
  487. package/src/core/agents/codex-archive-v3.ts +138 -0
  488. package/src/core/agents/coord-client.ts +75 -177
  489. package/src/core/agents/finalization.ts +120 -38
  490. package/src/core/agents/index.ts +5 -5
  491. package/src/core/agents/live-authority-v3.ts +375 -0
  492. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  493. package/src/core/agents/live-observation-v3.ts +216 -0
  494. package/src/core/agents/render/prompt-context.ts +89 -55
  495. package/src/core/agents/render/session-context.ts +23 -32
  496. package/src/core/agents/rules/claim-conflict.ts +85 -126
  497. package/src/core/agents/rules/commit-conflict.ts +3 -14
  498. package/src/core/agents/rules/stop-hook.ts +239 -293
  499. package/src/core/agents/session-events.ts +137 -104
  500. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  501. package/src/core/agents/session-finalizer-v3.ts +953 -0
  502. package/src/core/agents/session-name-display.ts +149 -0
  503. package/src/core/agents/state/activity-log.ts +6 -14
  504. package/src/core/agents/state/heartbeat-writer.ts +98 -242
  505. package/src/core/agents/state/live-coordination-view.ts +290 -0
  506. package/src/core/agents/state/session-state.ts +143 -0
  507. package/src/core/agents/state/stale-sweep.ts +40 -17
  508. package/src/core/artifacts/index.ts +4 -5
  509. package/src/core/config.ts +148 -3
  510. package/src/core/context/index.ts +9 -17
  511. package/src/core/events/span-parent.ts +46 -0
  512. package/src/core/events/v3/advance.ts +168 -0
  513. package/src/core/events/v3/authority-outbox.ts +548 -0
  514. package/src/core/events/v3/base-builder.ts +60 -0
  515. package/src/core/events/v3/base-contract.ts +882 -0
  516. package/src/core/events/v3/bootstrap.ts +226 -0
  517. package/src/core/events/v3/builder.ts +59 -0
  518. package/src/core/events/v3/canonical.ts +153 -0
  519. package/src/core/events/v3/capabilities.ts +171 -0
  520. package/src/core/events/v3/capability-drift.ts +177 -0
  521. package/src/core/events/v3/catalog.ts +202 -0
  522. package/src/core/events/v3/clock-order.ts +41 -0
  523. package/src/core/events/v3/contract.ts +365 -0
  524. package/src/core/events/v3/control.ts +576 -0
  525. package/src/core/events/v3/coordination-view.ts +193 -0
  526. package/src/core/events/v3/economics.ts +384 -0
  527. package/src/core/events/v3/finalization-view.ts +67 -0
  528. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  529. package/src/core/events/v3/generated.ts +48 -0
  530. package/src/core/events/v3/ids.ts +33 -0
  531. package/src/core/events/v3/index.ts +322 -0
  532. package/src/core/events/v3/latency.ts +551 -0
  533. package/src/core/events/v3/live-feed.ts +319 -0
  534. package/src/core/events/v3/live-observation.ts +39 -0
  535. package/src/core/events/v3/live-routing.ts +135 -0
  536. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  537. package/src/core/events/v3/producers/command.ts +201 -0
  538. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  539. package/src/core/events/v3/producers/coordination.ts +355 -0
  540. package/src/core/events/v3/producers/hook-base.ts +578 -0
  541. package/src/core/events/v3/producers/hook.ts +119 -0
  542. package/src/core/events/v3/producers/intake.ts +319 -0
  543. package/src/core/events/v3/producers/recorder.ts +2805 -0
  544. package/src/core/events/v3/projection.ts +653 -0
  545. package/src/core/events/v3/reader.ts +1127 -0
  546. package/src/core/events/v3/recovery-record.ts +244 -0
  547. package/src/core/events/v3/recovery.ts +271 -0
  548. package/src/core/events/v3/span-state.ts +187 -0
  549. package/src/core/events/v3/targets.ts +182 -0
  550. package/src/core/events/v3/turn-telemetry.ts +259 -0
  551. package/src/core/events/v3/validate.ts +361 -0
  552. package/src/core/events/v3/writer.ts +419 -0
  553. package/src/core/governor/index.ts +3 -0
  554. package/src/core/governor/plan-api.ts +10 -2
  555. package/src/core/governor/read.ts +3 -0
  556. package/src/core/governor/state.ts +52 -5
  557. package/src/core/guard/config.ts +206 -0
  558. package/src/core/guard/coordinator.ts +227 -0
  559. package/src/core/guard/evaluator.ts +343 -0
  560. package/src/core/guard/evidence-v3.ts +227 -0
  561. package/src/core/guard/index.ts +35 -0
  562. package/src/core/guard/live-source-v3.ts +204 -0
  563. package/src/core/guard/storage.ts +188 -0
  564. package/src/core/guard/types.ts +152 -0
  565. package/src/core/hooks/adapter/detect.ts +28 -1
  566. package/src/core/hooks/adapter/events.ts +15 -6
  567. package/src/core/hooks/adapter/output.ts +7 -2
  568. package/src/core/hooks/adapter/parse.ts +81 -36
  569. package/src/core/hooks/adapter/wiring.ts +119 -13
  570. package/src/core/hooks/cli.ts +398 -422
  571. package/src/core/hooks/codex-authorization.ts +253 -0
  572. package/src/core/hooks/effects/image-capture.ts +228 -238
  573. package/src/core/hooks/effects/index.ts +1 -36
  574. package/src/core/hooks/events/input-hash.ts +47 -0
  575. package/src/core/hooks/index.ts +4 -11
  576. package/src/core/hooks/resolve/coord-root.ts +1 -1
  577. package/src/core/hooks/resolve/owner.ts +52 -45
  578. package/src/core/hooks/resolve/transcript.ts +165 -14
  579. package/src/core/hooks/session-name-presence.ts +14 -15
  580. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  581. package/src/core/journal/index.ts +15 -22
  582. package/src/core/presence/blob.ts +63 -38
  583. package/src/core/presence/codec-digest.ts +215 -0
  584. package/src/core/presence/index.ts +18 -1
  585. package/src/core/presence/relay-client.ts +5 -5
  586. package/src/core/work/index.ts +3 -0
  587. package/src/core/work/read.ts +3 -0
  588. package/src/core/work/runner.ts +6 -0
  589. package/src/core/work/state.ts +27 -3
  590. package/src/core/workflow/engine.ts +24 -24
  591. package/src/core/workflow/live-session-v3.ts +126 -0
  592. package/src/core/workflow/scope-id.ts +6 -0
  593. package/src/core/workflow/workspaces/leases.ts +56 -19
  594. package/src/index.ts +1 -1
  595. package/src/lib/browser/client.ts +230 -0
  596. package/src/lib/browser/critique.ts +104 -27
  597. package/src/lib/browser/geometry.ts +143 -14
  598. package/src/lib/browser/index.ts +34 -0
  599. package/src/lib/browser/qa-plan.ts +501 -0
  600. package/src/lib/browser/qa-reuse.ts +306 -0
  601. package/src/lib/browser/qa-snapshot.ts +223 -0
  602. package/src/lib/browser/runts.ts +27 -2
  603. package/src/lib/browser/tiling.ts +164 -0
  604. package/src/lib/context/index.ts +22 -46
  605. package/src/lib/council/index.ts +9 -21
  606. package/src/lib/docs-frontmatter.ts +8 -79
  607. package/src/lib/docs-index.ts +33 -3
  608. package/src/lib/docs-lint.ts +15 -29
  609. package/src/lib/docs-metadata-audit.ts +166 -0
  610. package/src/lib/docs-metadata-managed.ts +83 -0
  611. package/src/lib/docs-metadata-sync.ts +262 -0
  612. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  613. package/src/lib/docs-metadata-v2.ts +646 -0
  614. package/src/lib/docs-new.ts +63 -0
  615. package/src/lib/docs-sweep.ts +42 -28
  616. package/src/lib/headless/index.ts +287 -0
  617. package/src/lib/identities/assume.ts +67 -86
  618. package/src/lib/instructions/apply.ts +33 -20
  619. package/src/lib/instructions/bundle.ts +199 -0
  620. package/src/lib/instructions/splice.ts +21 -7
  621. package/src/lib/instructions/templates.ts +85 -13
  622. package/dist/core/agents/cli-emit.d.ts +0 -27
  623. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  624. package/dist/core/agents/cli-emit.js +0 -57
  625. package/dist/core/agents/codex-replay.d.ts +0 -29
  626. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  627. package/dist/core/agents/codex-replay.js +0 -138
  628. package/dist/core/agents/events/consume.d.ts +0 -82
  629. package/dist/core/agents/events/consume.d.ts.map +0 -1
  630. package/dist/core/agents/events/consume.js +0 -195
  631. package/dist/core/agents/events/emit.d.ts +0 -42
  632. package/dist/core/agents/events/emit.d.ts.map +0 -1
  633. package/dist/core/agents/events/emit.js +0 -75
  634. package/dist/core/agents/events/ulid.d.ts +0 -11
  635. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  636. package/dist/core/agents/events/ulid.js +0 -47
  637. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -65
  638. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  639. package/dist/core/agents/state/heartbeat-projector.js +0 -527
  640. package/dist/core/hooks/events/emit.d.ts +0 -31
  641. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  642. package/dist/core/hooks/events/emit.js +0 -93
  643. package/dist/core/hooks/events/rotate.d.ts +0 -43
  644. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  645. package/dist/core/hooks/events/rotate.js +0 -142
  646. package/dist/core/hooks/events/schema.d.ts +0 -312
  647. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  648. package/dist/core/hooks/events/schema.js +0 -12
  649. package/dist/core/hooks/events/ulid.d.ts +0 -10
  650. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  651. package/dist/core/hooks/events/ulid.js +0 -47
  652. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  653. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  654. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  655. package/src/core/agents/cli-emit.ts +0 -64
  656. package/src/core/agents/codex-replay.ts +0 -163
  657. package/src/core/agents/events/consume.ts +0 -254
  658. package/src/core/agents/events/emit.ts +0 -115
  659. package/src/core/agents/events/ulid.ts +0 -51
  660. package/src/core/agents/state/heartbeat-projector.ts +0 -582
  661. package/src/core/hooks/events/emit.ts +0 -125
  662. package/src/core/hooks/events/rotate.ts +0 -151
  663. package/src/core/hooks/events/schema.ts +0 -538
  664. package/src/core/hooks/events/ulid.ts +0 -51
  665. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -3,7 +3,7 @@ import { dirname, isAbsolute, resolve } from "node:path";
3
3
  import { adapterProofInputs, createBuiltinAdapterRegistry, probeBinaryVersion, readAttestation, } from "../core/adapters/index.js";
4
4
  import { workflowSubscriptionOnly } from "../core/config.js";
5
5
  import { inspectAdapterSpread } from "../core/governor/adapter-spread.js";
6
- import { approveGovernorPlan, configureGovernorService, createGovernor, governorServiceLogPath, listGovernors, readGovernor, readGovernorPlan, readGovernorServiceConfig, readGovernorServiceStatus, rejectGovernorPlan, requestGovernorServiceStop, retryGovernorPlan, runGovernor, runGovernorServiceDaemon, spawnGovernorService, } from "../core/governor/index.js";
6
+ import { approveGovernorPlan, configureGovernorService, createGovernor, governorServiceLogPath, listGovernorsWithWarnings, readGovernor, readGovernorPlan, readGovernorServiceConfig, readGovernorServiceStatus, rejectGovernorPlan, requestGovernorServiceStop, retryGovernorPlan, runGovernor, runGovernorServiceDaemon, spawnGovernorService, } from "../core/governor/index.js";
7
7
  import { findCoordRoot } from "../core/hooks/resolve/coord-root.js";
8
8
  import { loadPolicyFile } from "../core/policy/index.js";
9
9
  export function registerGovernorCommand(program, emit) {
@@ -83,16 +83,22 @@ export function registerGovernorCommand(program, emit) {
83
83
  .option("--json", "Emit complete governor records as JSON")
84
84
  .action((opts) => {
85
85
  withGovernorRoot(emit, (coordRoot) => {
86
- const records = listGovernors(coordRoot);
86
+ const { records, warnings } = listGovernorsWithWarnings(coordRoot);
87
87
  if (opts.json) {
88
88
  emit.config({ format: "json" });
89
89
  emit.data(records);
90
+ for (const warning of warnings) {
91
+ emit.log(renderGovernorListWarning(warning.goal_id, warning.reason), "warn");
92
+ }
90
93
  }
91
- else if (records.length === 0) {
94
+ else if (records.length === 0 && warnings.length === 0) {
92
95
  emit.text("no durable governors\n");
93
96
  }
94
97
  else {
95
- emit.text(`${records.map(renderGovernorRow).join("\n")}\n`);
98
+ emit.text(`${[
99
+ ...records.map(renderGovernorRow),
100
+ ...warnings.map((warning) => renderGovernorListWarning(warning.goal_id, warning.reason)),
101
+ ].join("\n")}\n`);
96
102
  }
97
103
  });
98
104
  });
@@ -693,6 +699,9 @@ function renderPlanRow(plan) {
693
699
  const review = plan.review ? ` review:${plan.review.status}` : "";
694
700
  return `${plan.request.id} ${plan.status.padEnd(18)} ${plan.request.prior_root_work_id}${review}`;
695
701
  }
702
+ function renderGovernorListWarning(goalId, reason) {
703
+ return `warning ${goalId} unreadable: ${reason}`;
704
+ }
696
705
  function delay(ms) {
697
706
  return new Promise((resolveDelay) => setTimeout(resolveDelay, ms));
698
707
  }
@@ -17,9 +17,18 @@
17
17
  */
18
18
  import type { Command } from "commander";
19
19
  import type { EmitContext } from "../commander.js";
20
+ import type { EventV3ControlState } from "../core/events/v3/control.js";
20
21
  import { type AdapterId, type AdapterSpec } from "../core/hooks/adapter/events.js";
21
22
  import { type SettingsFile } from "../core/hooks/adapter/wiring.js";
22
23
  export declare function registerInitCommand(program: Command, emit: EmitContext, binName?: string): void;
24
+ /**
25
+ * Runtime gates bound into an immutable V3 epoch. `init` is the explicit
26
+ * upgrade boundary: when code or capability profiles change, it archives the
27
+ * old epoch intact and activates a compatible one instead of letting upgraded
28
+ * hooks fail closed against stale approvals.
29
+ */
30
+ export declare function eventLedgerV3RuntimeIssues(control: EventV3ControlState, harneryBuild: string): string[];
31
+ export declare function codexHookReviewAction(adapter: AdapterId): string | null;
23
32
  /**
24
33
  * Merge agent-hook entries into a adapter settings object in place, idempotently.
25
34
  * Preserves every existing hook; rewrites events already wired to
@@ -29,8 +38,7 @@ export declare function registerInitCommand(program: Command, emit: EmitContext,
29
38
  * `{ command }`) and ensures the root `version` key when the adapter requires
30
39
  * one. Pure (no fs/git) so it's unit-testable.
31
40
  *
32
- * The trailing space in the match (`agent-hook ${subcommand} `) is load-bearing:
33
- * it keeps `stop` from matching `stop-failure`.
41
+ * Token-aware matching keeps `stop` from matching `stop-failure`.
34
42
  */
35
43
  export declare function wireHooks(settings: SettingsFile, spec: AdapterSpec, agentHookPath: string, adapter: AdapterId): {
36
44
  wired: number;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAClG,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;AAmBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAuJ/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,SAAS,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAqCvE;AAyDD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAmB1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmDhG;AASD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkCxF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAQxE,OAAO,EAAiB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAClG,OAAO,EASL,KAAK,YAAY,EAClB,MAAM,iCAAiC,CAAC;AAmBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CA+P/F;AAiBD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CAoBV;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAOvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,WAAW,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,SAAS,GACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CA8CvE;AAwFD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAa1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmDhG;AASD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAkCxF"}
@@ -16,12 +16,18 @@
16
16
  * already wired, so it's safe to re-run. `--dry-run` previews without writing.
17
17
  */
18
18
  import { spawnSync } from "node:child_process";
19
+ import { createHash } from "node:crypto";
19
20
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
20
21
  import { dirname, relative, resolve } from "node:path";
21
22
  import { fileURLToPath } from "node:url";
22
23
  import { DEFAULT_BIN_NAME, pinnedBinName, stripJsonComments } from "../core/config.js";
24
+ import { canonicalJsonV3 } from "../core/events/v3/canonical.js";
25
+ import { ADAPTER_CAPABILITY_PROFILES_V3 } from "../core/events/v3/capabilities.js";
26
+ import { EVENT_V3_SCHEMA_DIGEST } from "../core/events/v3/generated.js";
27
+ import { initializeEventLedgerV3, readEventV3ControlState, sha256V3, } from "../core/events/v3/index.js";
28
+ import { liveEventV3BuildId } from "../core/events/v3/live-routing.js";
23
29
  import { ADAPTER_SPECS } from "../core/hooks/adapter/events.js";
24
- import { commandWiresSubcommand, groupCommands, makeEntry, } from "../core/hooks/adapter/wiring.js";
30
+ import { agentHookPathForProject, commandWiresSubcommand, diffWiring, groupCommands, hookCommand, isAgentHookCommand, makeEntry, } from "../core/hooks/adapter/wiring.js";
25
31
  import { applyInstructions, checkInstructions, } from "../lib/instructions/apply.js";
26
32
  import { applyGitHooks, checkGitHooks } from "../lib/instructions/git-hooks.js";
27
33
  import { HostAddendumError } from "../lib/instructions/host-addendum.js";
@@ -53,15 +59,76 @@ export function registerInitCommand(program, emit, binName) {
53
59
  // init inside any checkout). Without this, re-running init from a host
54
60
  // CLI re-stamps the host's name into committed agent-facing surfaces.
55
61
  const bin = pinnedBinName(projectRoot) ?? (binName?.trim() ? binName : DEFAULT_BIN_NAME);
56
- // ── --check: read-only drift report on the block + skills ──────────────
62
+ // ── --check: read-only drift report on every init-managed surface ─────
57
63
  if (opts.check === true) {
58
64
  const { status, issues } = checkInstructions(projectRoot, { binName: bin, adapter });
65
+ let hookCheckError = false;
66
+ let hookDrift = false;
67
+ const settingsPath = resolve(projectRoot, spec.settingsFile);
68
+ const agentHook = agentHookPathForProject(projectRoot, HARNERY_ROOT);
69
+ if (!existsSync(settingsPath)) {
70
+ hookDrift = true;
71
+ issues.push(`${spec.settingsFile}: missing (re-run init)`);
72
+ }
73
+ else {
74
+ try {
75
+ const settings = JSON.parse(readFileSync(settingsPath, "utf8"));
76
+ const hookDiff = diffWiring(settings, spec, { agentHookPath: agentHook, adapter });
77
+ hookDrift =
78
+ hookDiff.missing.length > 0 ||
79
+ hookDiff.stale.length > 0 ||
80
+ hookDiff.duplicates.length > 0 ||
81
+ hookDiff.misplaced.length > 0 ||
82
+ hookDiff.orphans.length > 0 ||
83
+ hookDiff.invalidTopLevelKeys.length > 0 ||
84
+ hookDiff.invalidEventKeys.length > 0;
85
+ if (hookDiff.missing.length > 0) {
86
+ issues.push(`${spec.settingsFile}: missing hooks (${hookDiff.missing.map((e) => e.settingsKey).join(", ")})`);
87
+ }
88
+ if (hookDiff.stale.length > 0) {
89
+ issues.push(`${spec.settingsFile}: stale hook commands (${hookDiff.stale.map((e) => e.settingsKey).join(", ")})`);
90
+ }
91
+ if (hookDiff.duplicates.length > 0) {
92
+ issues.push(`${spec.settingsFile}: duplicate hooks (${hookDiff.duplicates.map((e) => e.settingsKey).join(", ")})`);
93
+ }
94
+ if (hookDiff.misplaced.length > 0) {
95
+ issues.push(`${spec.settingsFile}: hooks under the wrong event (${hookDiff.misplaced.map((e) => e.subcommand).join(", ")})`);
96
+ }
97
+ if (hookDiff.orphans.length > 0) {
98
+ issues.push(`${spec.settingsFile}: obsolete hooks (${hookDiff.orphans.join(", ")})`);
99
+ }
100
+ if (hookDiff.invalidTopLevelKeys.length > 0) {
101
+ issues.push(`${spec.settingsFile}: invalid fields (${hookDiff.invalidTopLevelKeys.join(", ")})`);
102
+ }
103
+ if (hookDiff.invalidEventKeys.length > 0) {
104
+ issues.push(`${spec.settingsFile}: unsupported events (${hookDiff.invalidEventKeys.join(", ")})`);
105
+ }
106
+ }
107
+ catch (error) {
108
+ hookCheckError = true;
109
+ issues.push(`${spec.settingsFile}: invalid JSON (${error.message})`);
110
+ }
111
+ }
59
112
  const gitHooks = checkGitHooks(projectRoot);
60
113
  if (gitHooks.status !== "fresh")
61
114
  issues.push(...gitHooks.issues);
62
- const merged = status === "error" ? "error" : gitHooks.status !== "fresh" ? "drift" : status;
115
+ const ledger = readEventV3ControlState(projectRoot);
116
+ if (ledger.state !== "active")
117
+ issues.push(`event ledger V3 is ${ledger.state}`);
118
+ const ledgerRuntimeIssues = eventLedgerV3RuntimeIssues(ledger, gitBuild(HARNERY_ROOT));
119
+ if (ledgerRuntimeIssues.length > 0) {
120
+ issues.push(`event ledger V3 is runtime-stale (${ledgerRuntimeIssues.join(", ")})`);
121
+ }
122
+ const merged = status === "error" || hookCheckError
123
+ ? "error"
124
+ : hookDrift ||
125
+ gitHooks.status !== "fresh" ||
126
+ ledger.state !== "active" ||
127
+ ledgerRuntimeIssues.length > 0
128
+ ? "drift"
129
+ : status;
63
130
  const head = merged === "fresh"
64
- ? "harn init --check: instructions + skills + git hooks are current"
131
+ ? "harn init --check: hooks + instructions + skills + event ledger V3 are current"
65
132
  : merged === "drift"
66
133
  ? "harn init --check: drift found (re-run `init` to refresh)"
67
134
  : "harn init --check: error";
@@ -109,9 +176,37 @@ export function registerInitCommand(program, emit, binName) {
109
176
  if (stamp)
110
177
  actions.push(stamp);
111
178
  }
179
+ // ── 1d. universal V3 event ledger ────────────────────────────────────
180
+ if (dryRun) {
181
+ const ledger = readEventV3ControlState(projectRoot);
182
+ const runtimeIssues = eventLedgerV3RuntimeIssues(ledger, gitBuild(HARNERY_ROOT));
183
+ actions.push(ledger.state === "active" && runtimeIssues.length === 0
184
+ ? "· event ledger V3 is active"
185
+ : ledger.state === "active"
186
+ ? `+ would refresh event ledger V3 runtime profile (${runtimeIssues.join(", ")})`
187
+ : `+ would initialize event ledger V3 (current state: ${ledger.state})`);
188
+ }
189
+ else {
190
+ const harneryBuild = gitBuild(HARNERY_ROOT);
191
+ const ledgerBefore = readEventV3ControlState(projectRoot);
192
+ const runtimeIssues = eventLedgerV3RuntimeIssues(ledgerBefore, harneryBuild);
193
+ const initialized = initializeEventLedgerV3({
194
+ coordRoot: projectRoot,
195
+ harneryBuild,
196
+ hostBuild: gitBuild(projectRoot),
197
+ configDigest: digestConfig(resolve(coordDir, "config.jsonc")),
198
+ approvalRecordId: "harnery-init-v3-universal",
199
+ forceNewEpoch: runtimeIssues.length > 0,
200
+ });
201
+ actions.push(initialized.archived_epoch
202
+ ? `+ refreshed event ledger V3 runtime profile (${runtimeIssues.join(", ")}); archived the prior epoch intact`
203
+ : initialized.initialized
204
+ ? "+ initialized event ledger V3"
205
+ : "· event ledger V3 already active");
206
+ }
112
207
  // ── 2. adapter hooks ───────────────────────────────────────────────────
113
208
  const settingsPath = resolve(projectRoot, spec.settingsFile);
114
- const agentHook = relative(projectRoot, resolve(HARNERY_ROOT, "bin", "agent-hook"));
209
+ const agentHook = agentHookPathForProject(projectRoot, HARNERY_ROOT);
115
210
  let settings;
116
211
  if (existsSync(settingsPath)) {
117
212
  try {
@@ -133,14 +228,17 @@ export function registerInitCommand(program, emit, binName) {
133
228
  }
134
229
  else if (dryRun) {
135
230
  actions.push(`+ would wire ${wired} hook(s), upgrade ${upgraded} stale command(s), and remove ` +
136
- `${removed} legacy hook(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`);
231
+ `${removed} obsolete/duplicate command(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`);
137
232
  }
138
233
  else {
139
234
  mkdirSync(dirname(settingsPath), { recursive: true });
140
235
  writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
141
236
  actions.push(`+ wired ${wired} hook(s), upgraded ${upgraded} stale command(s), and removed ` +
142
- `${removed} legacy hook(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`);
237
+ `${removed} obsolete/duplicate command(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`);
143
238
  }
239
+ const authorizationReview = codexHookReviewAction(adapter);
240
+ if (authorizationReview)
241
+ actions.push(authorizationReview);
144
242
  // ── 3. agent-facing instructions block + skills ────────────────────────
145
243
  // A misconfigured host addendum aborts here rather than half-writing: the
146
244
  // apply step validates the configured source before it touches a file, so
@@ -166,6 +264,50 @@ export function registerInitCommand(program, emit, binName) {
166
264
  emit.text(render(projectRoot, dryRun, actions, [...applied.warnings, ...gitHooks.warnings]));
167
265
  });
168
266
  }
267
+ function gitBuild(root) {
268
+ const result = spawnSync("git", ["-C", root, "rev-parse", "HEAD"], {
269
+ encoding: "utf8",
270
+ timeout: 5000,
271
+ });
272
+ const commit = result.status === 0 ? result.stdout.trim() : "";
273
+ return /^[0-9a-f]{40,64}$/.test(commit)
274
+ ? commit
275
+ : createHash("sha256").update(resolve(root)).digest("hex");
276
+ }
277
+ function digestConfig(path) {
278
+ return sha256V3(existsSync(path) ? readFileSync(path) : Buffer.from("{}\n"));
279
+ }
280
+ /**
281
+ * Runtime gates bound into an immutable V3 epoch. `init` is the explicit
282
+ * upgrade boundary: when code or capability profiles change, it archives the
283
+ * old epoch intact and activates a compatible one instead of letting upgraded
284
+ * hooks fail closed against stale approvals.
285
+ */
286
+ export function eventLedgerV3RuntimeIssues(control, harneryBuild) {
287
+ if (control.state !== "active")
288
+ return [];
289
+ const issues = [];
290
+ const profile = control.genesis.profile;
291
+ if (profile.initial_schema_digest !== EVENT_V3_SCHEMA_DIGEST)
292
+ issues.push("schema digest");
293
+ if (profile.contract_source_digest !== EVENT_V3_SCHEMA_DIGEST)
294
+ issues.push("contract digest");
295
+ if (!profile.producer_build_ids.includes(liveEventV3BuildId(harneryBuild))) {
296
+ issues.push("producer build");
297
+ }
298
+ const expectedCapabilities = Object.values(ADAPTER_CAPABILITY_PROFILES_V3).map((value) => sha256V3(canonicalJsonV3(value)));
299
+ if (expectedCapabilities.some((digest) => !profile.adapter_capability_profile_digests.includes(digest))) {
300
+ issues.push("adapter capabilities");
301
+ }
302
+ return issues;
303
+ }
304
+ export function codexHookReviewAction(adapter) {
305
+ if (adapter !== "codex")
306
+ return null;
307
+ return ("! Codex authorizes hook commands separately. Before starting work, review them in " +
308
+ "the terminal UI with `/hooks` or in Codex Desktop under Settings > Hooks. " +
309
+ "After approval, start a fresh task so SessionStart can run.");
310
+ }
169
311
  /**
170
312
  * Merge agent-hook entries into a adapter settings object in place, idempotently.
171
313
  * Preserves every existing hook; rewrites events already wired to
@@ -175,8 +317,7 @@ export function registerInitCommand(program, emit, binName) {
175
317
  * `{ command }`) and ensures the root `version` key when the adapter requires
176
318
  * one. Pure (no fs/git) so it's unit-testable.
177
319
  *
178
- * The trailing space in the match (`agent-hook ${subcommand} `) is load-bearing:
179
- * it keeps `stop` from matching `stop-failure`.
320
+ * Token-aware matching keeps `stop` from matching `stop-failure`.
180
321
  */
181
322
  export function wireHooks(settings, spec, agentHookPath, adapter) {
182
323
  if (spec.rootVersion !== undefined && settings.version === undefined) {
@@ -188,30 +329,41 @@ export function wireHooks(settings, spec, agentHookPath, adapter) {
188
329
  let already = 0;
189
330
  let removed = 0;
190
331
  let upgraded = 0;
191
- for (const { settingsKey, subcommand } of spec.legacyEvents ?? []) {
192
- const groups = settings.hooks[settingsKey] ?? [];
193
- const kept = groups.filter((group) => !groupCommands(group).some((command) => commandWiresSubcommand(command, subcommand)));
194
- removed += groups.length - kept.length;
195
- if (kept.length === 0)
196
- delete settings.hooks[settingsKey];
197
- else
198
- settings.hooks[settingsKey] = kept;
332
+ for (const { subcommand } of spec.legacyEvents ?? []) {
333
+ for (const settingsKey of Object.keys(settings.hooks)) {
334
+ removed += removeCommandsFromKey(settings, settingsKey, (command) => commandWiresSubcommand(command, subcommand));
335
+ }
199
336
  }
200
337
  for (const { settingsKey, subcommand } of spec.events) {
201
338
  const command = hookCommand(spec, agentHookPath, subcommand, adapter);
202
- const groups = settings.hooks[settingsKey] ?? [];
203
339
  let present = false;
340
+ for (const key of Object.keys(settings.hooks)) {
341
+ if (key === settingsKey)
342
+ continue;
343
+ removed += removeCommandsFromKey(settings, key, (candidate) => commandWiresSubcommand(candidate, subcommand));
344
+ }
345
+ const groups = settings.hooks[settingsKey] ?? [];
346
+ const nextGroups = [];
204
347
  for (const group of groups) {
205
- upgraded += rewriteStaleCommands(group, subcommand, command, () => {
348
+ const normalized = normalizeEventGroup(group, subcommand, command, present);
349
+ if (normalized.found && !present)
206
350
  present = true;
207
- });
351
+ upgraded += normalized.upgraded;
352
+ removed += normalized.removed;
353
+ if (normalized.group)
354
+ nextGroups.push(normalized.group);
208
355
  }
356
+ if (nextGroups.length > 0)
357
+ settings.hooks[settingsKey] = nextGroups;
358
+ else
359
+ delete settings.hooks[settingsKey];
209
360
  if (present) {
210
361
  already++;
211
362
  continue;
212
363
  }
213
- groups.push(makeEntry(spec.entryShape, command));
214
- settings.hooks[settingsKey] = groups;
364
+ const current = settings.hooks[settingsKey] ?? [];
365
+ current.push(makeEntry(spec.entryShape, command));
366
+ settings.hooks[settingsKey] = current;
215
367
  wired++;
216
368
  }
217
369
  return { wired, already, removed, upgraded };
@@ -226,40 +378,79 @@ export function wireHooks(settings, spec, agentHookPath, adapter) {
226
378
  * that don't set the var. Only the env expansion is quoted so the
227
379
  * `agent-hook <subcommand> ` wiring match stays byte-identical.
228
380
  */
229
- function hookCommand(spec, agentHookPath, subcommand, adapter) {
230
- const anchor = spec.projectDirEnv ? `"\${${spec.projectDirEnv}:-.}"/` : "";
231
- return `bash ${anchor}${agentHookPath} ${subcommand} --adapter ${adapter}`;
232
- }
233
- /**
234
- * Rewrite any harnery-owned command for `subcommand` inside one hook group to
235
- * the canonical form, in place. Returns the number of commands rewritten and
236
- * calls `onPresent` when the subcommand is wired in this group at all.
237
- */
238
- function rewriteStaleCommands(group, subcommand, canonical, onPresent) {
239
- let rewritten = 0;
381
+ function normalizeEventGroup(group, subcommand, canonical, alreadyFound) {
382
+ let found = false;
383
+ let upgraded = 0;
384
+ let removed = 0;
240
385
  if ("command" in group && typeof group.command === "string") {
241
386
  if (commandWiresSubcommand(group.command, subcommand)) {
242
- onPresent();
387
+ if (alreadyFound)
388
+ return { group: null, found: true, upgraded: 0, removed: 1 };
389
+ found = true;
243
390
  if (group.command !== canonical) {
244
391
  group.command = canonical;
245
- rewritten++;
392
+ upgraded++;
246
393
  }
247
394
  }
248
395
  }
249
396
  if ("hooks" in group && Array.isArray(group.hooks)) {
397
+ const kept = [];
250
398
  for (const hook of group.hooks) {
251
- if (typeof hook.command !== "string")
399
+ if (typeof hook.command !== "string" || !commandWiresSubcommand(hook.command, subcommand)) {
400
+ kept.push(hook);
252
401
  continue;
253
- if (!commandWiresSubcommand(hook.command, subcommand))
402
+ }
403
+ if (alreadyFound || found) {
404
+ removed++;
254
405
  continue;
255
- onPresent();
406
+ }
407
+ found = true;
256
408
  if (hook.command !== canonical) {
257
409
  hook.command = canonical;
258
- rewritten++;
410
+ upgraded++;
259
411
  }
412
+ kept.push(hook);
260
413
  }
414
+ group.hooks = kept;
415
+ if (group.hooks.length === 0)
416
+ return { group: null, found, upgraded, removed };
261
417
  }
262
- return rewritten;
418
+ return { group, found, upgraded, removed };
419
+ }
420
+ /** Remove matching command handlers while preserving unrelated handlers in a mixed group. */
421
+ function removeCommandsFromKey(settings, settingsKey, predicate) {
422
+ const groups = settings.hooks?.[settingsKey];
423
+ if (!Array.isArray(groups))
424
+ return 0;
425
+ let removed = 0;
426
+ const kept = [];
427
+ for (const group of groups) {
428
+ if ("command" in group && typeof group.command === "string") {
429
+ if (predicate(group.command))
430
+ removed++;
431
+ else
432
+ kept.push(group);
433
+ continue;
434
+ }
435
+ if ("hooks" in group && Array.isArray(group.hooks)) {
436
+ const handlers = group.hooks.filter((hook) => {
437
+ if (typeof hook.command !== "string" || !predicate(hook.command))
438
+ return true;
439
+ removed++;
440
+ return false;
441
+ });
442
+ group.hooks = handlers;
443
+ if (handlers.length > 0)
444
+ kept.push(group);
445
+ continue;
446
+ }
447
+ kept.push(group);
448
+ }
449
+ if (kept.length === 0)
450
+ delete settings.hooks?.[settingsKey];
451
+ else
452
+ settings.hooks[settingsKey] = kept;
453
+ return removed;
263
454
  }
264
455
  /**
265
456
  * Inverse of {@link wireHooks}: strip every harnery-owned hook entry from a
@@ -276,21 +467,12 @@ export function unwireHooks(settings) {
276
467
  return { removed: 0, remaining: 0 };
277
468
  let removed = 0;
278
469
  for (const key of Object.keys(settings.hooks)) {
279
- const groups = settings.hooks[key];
280
- if (!Array.isArray(groups))
281
- continue;
282
- const kept = groups.filter((g) => !groupCommands(g).some((c) => c.includes("agent-hook ")));
283
- removed += groups.length - kept.length;
284
- // removing the emptied hook key is the intent (tiny one-shot object)
285
- if (kept.length === 0)
286
- delete settings.hooks[key];
287
- else
288
- settings.hooks[key] = kept;
470
+ removed += removeCommandsFromKey(settings, key, isAgentHookCommand);
289
471
  }
290
472
  let remaining = 0;
291
473
  for (const groups of Object.values(settings.hooks)) {
292
474
  if (Array.isArray(groups))
293
- remaining += groups.length;
475
+ remaining += groups.flatMap(groupCommands).length;
294
476
  }
295
477
  // drop the now-empty hooks object so callers see a clean shape
296
478
  if (Object.keys(settings.hooks).length === 0)
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ import type { EmitContext } from "../commander.js";
3
+ export declare function registerInstructionsCommand(program: Command, emit: EmitContext): void;
4
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/commands/instructions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAcnD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAmDrF"}
@@ -0,0 +1,100 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { readFileSync, writeFileSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { countTokens } from "gpt-tokenizer/model/gpt-4o";
5
+ import { monorepoRoot } from "../core/agents/index.js";
6
+ import { buildInstructionBundle, } from "../lib/instructions/bundle.js";
7
+ export function registerInstructionsCommand(program, emit) {
8
+ const command = program
9
+ .command("instructions")
10
+ .description("Inspect and version the repo-authored instruction bundle loaded by each adapter.");
11
+ command
12
+ .command("manifest [paths...]")
13
+ .description("Emit a machine-readable bundle manifest for one or more working paths")
14
+ .option("--adapter <adapter>", "claude-code, cursor, codex, or all", "all")
15
+ .option("--format <type>", "Output format: json or table", "json")
16
+ .option("-o, --output <file>", "Write the complete JSON manifest to a file")
17
+ .action((paths, options) => {
18
+ if (options.format === "json")
19
+ emit.config({ format: "json" });
20
+ const coordRoot = monorepoRoot() ?? process.cwd();
21
+ const adapters = parseAdapters(options.adapter);
22
+ const profiles = (paths.length > 0 ? paths : [process.cwd()]).flatMap((path) => adapters.map((adapter) => enrichBundle(buildInstructionBundle({ coordRoot, cwd: resolve(path), adapter }), coordRoot)));
23
+ const manifest = {
24
+ ok: true,
25
+ schema_version: 1,
26
+ generated_at: new Date().toISOString(),
27
+ source_commit: gitHead(coordRoot),
28
+ tokenizer: "o200k_base",
29
+ coord_root: ".",
30
+ profile_count: profiles.length,
31
+ profiles,
32
+ };
33
+ if (options.output) {
34
+ const output = resolve(options.output);
35
+ writeFileSync(output, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
36
+ emit.data({
37
+ ok: true,
38
+ output,
39
+ schema_version: manifest.schema_version,
40
+ generated_at: manifest.generated_at,
41
+ source_commit: manifest.source_commit,
42
+ profile_count: manifest.profile_count,
43
+ });
44
+ }
45
+ else {
46
+ emit.data(manifest);
47
+ }
48
+ });
49
+ }
50
+ function parseAdapters(value) {
51
+ if (value === "all")
52
+ return ["claude-code", "cursor", "codex"];
53
+ if (value === "claude-code" || value === "cursor" || value === "codex")
54
+ return [value];
55
+ throw new Error(`unsupported adapter '${value}' (expected claude-code, cursor, codex, or all)`);
56
+ }
57
+ function enrichBundle(bundle, coordRoot) {
58
+ const components = bundle.components.map((component) => enrichComponent(component, coordRoot));
59
+ const canonicalSources = bundle.canonical_sources.map((component) => enrichComponent(component, coordRoot));
60
+ return {
61
+ ...bundle,
62
+ coord_root: ".",
63
+ components,
64
+ canonical_sources: canonicalSources,
65
+ totals: totals(components),
66
+ canonical_source_totals: totals(canonicalSources),
67
+ };
68
+ }
69
+ function enrichComponent(component, coordRoot) {
70
+ const bytes = readFileSync(resolve(coordRoot, component.path));
71
+ const text = bytes.includes(0) ? null : bytes.toString("utf8");
72
+ return {
73
+ ...component,
74
+ chars: text?.length ?? null,
75
+ tokens: text === null ? null : countTokens(text),
76
+ };
77
+ }
78
+ function totals(components) {
79
+ const roles = ["always_loaded", "just_in_time", "runtime_config"];
80
+ return {
81
+ files: components.length,
82
+ bytes: components.reduce((sum, component) => sum + component.bytes, 0),
83
+ tokens: components.reduce((sum, component) => sum + (component.tokens ?? 0), 0),
84
+ by_role: Object.fromEntries(roles.map((role) => {
85
+ const selected = components.filter((component) => component.role === role);
86
+ return [
87
+ role,
88
+ {
89
+ files: selected.length,
90
+ bytes: selected.reduce((sum, component) => sum + component.bytes, 0),
91
+ tokens: selected.reduce((sum, component) => sum + (component.tokens ?? 0), 0),
92
+ },
93
+ ];
94
+ })),
95
+ };
96
+ }
97
+ function gitHead(root) {
98
+ const result = spawnSync("git", ["rev-parse", "HEAD"], { cwd: root, encoding: "utf8" });
99
+ return result.status === 0 ? result.stdout.trim() : null;
100
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/commands/journal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA6BnD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CA2RrF"}
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/commands/journal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA8BnD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAgRrF"}
@@ -1,6 +1,7 @@
1
1
  import { existsSync, readdirSync, readFileSync, statSync, unlinkSync, watch } from "node:fs";
2
2
  import { resolve as resolvePath } from "node:path";
3
- import { emitCanonical, normalizeAdapter, readHeartbeat } from "../core/agents/index.js";
3
+ import { monorepoRoot } from "../core/agents/index.js";
4
+ import { readLiveCoordinationRow } from "../core/agents/state/live-coordination-view.js";
4
5
  import { resolveBinName } from "../core/config.js";
5
6
  import { appendEntry, archiveJournal, currentOwnerOrThrow, JOURNAL_CATEGORIES, journalDir, journalPath, lintJournal, listArchives, loadJournal, parseJournal, pruneArchives, resolveOwnerByName, sweepOrphanJournals, } from "../core/journal/index.js";
6
7
  /**
@@ -30,17 +31,6 @@ export function registerJournalCommand(program, emitParam) {
30
31
  try {
31
32
  const owner = currentOwnerOrThrow();
32
33
  const doc = appendEntry(owner, cat, body);
33
- const hb = readHeartbeat(owner);
34
- emitCanonical({
35
- type: "state.journal_append",
36
- owner,
37
- session: hb?.session_id ?? owner,
38
- adapter: normalizeAdapter(hb?.platform),
39
- data: {
40
- category: cat,
41
- body_summary: body.length > 1000 ? `${body.slice(0, 997)}...` : body,
42
- },
43
- });
44
34
  emit.data({
45
35
  instance_id: owner,
46
36
  name: doc.header.name,
@@ -313,7 +303,8 @@ function runRead(opts) {
313
303
  });
314
304
  process.exit(1);
315
305
  }
316
- const hb = readHeartbeat(owner);
306
+ const root = monorepoRoot();
307
+ const hb = root ? readLiveCoordinationRow(root, owner) : null;
317
308
  const staleBanner = renderStaleBannerIfNeeded(hb?.last_heartbeat);
318
309
  process.stdout.write(`${staleBanner + renderJournal(doc, limit)}\n`); // lint-ok-emission: pretty render, multi-line markdown for direct TTY/pipe consumption
319
310
  }
@@ -0,0 +1,5 @@
1
+ import type { Command } from "commander";
2
+ import type { EmitContext, HarneryProgramContext } from "../commander.js";
3
+ /** Inspect or initialize the universal V3 event ledger. */
4
+ export declare function registerLedgerV3Command(program: Command, emit: EmitContext, context?: HarneryProgramContext): void;
5
+ //# sourceMappingURL=ledger-v3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-v3.d.ts","sourceRoot":"","sources":["../../src/commands/ledger-v3.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,2DAA2D;AAC3D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CA+DN"}