harnery 0.33.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 (657) hide show
  1. package/dist/commander.d.ts.map +1 -1
  2. package/dist/commander.js +4 -0
  3. package/dist/commands/adapter.js +2 -2
  4. package/dist/commands/agents.d.ts +144 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +1220 -588
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +7 -6
  9. package/dist/commands/backup.d.ts +1 -1
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +29 -16
  12. package/dist/commands/browse.d.ts.map +1 -1
  13. package/dist/commands/browse.js +234 -12
  14. package/dist/commands/checkpoint.d.ts.map +1 -1
  15. package/dist/commands/checkpoint.js +3 -2
  16. package/dist/commands/claude-desktop.d.ts +1 -1
  17. package/dist/commands/claude-desktop.d.ts.map +1 -1
  18. package/dist/commands/claude-desktop.js +3 -74
  19. package/dist/commands/context.js +1 -6
  20. package/dist/commands/decision.d.ts.map +1 -1
  21. package/dist/commands/decision.js +22 -38
  22. package/dist/commands/docs.d.ts.map +1 -1
  23. package/dist/commands/docs.js +91 -28
  24. package/dist/commands/doctor.js +10 -1
  25. package/dist/commands/events.d.ts +5 -0
  26. package/dist/commands/events.d.ts.map +1 -0
  27. package/dist/commands/events.js +189 -0
  28. package/dist/commands/governor.d.ts.map +1 -1
  29. package/dist/commands/governor.js +13 -4
  30. package/dist/commands/init.d.ts +9 -2
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +223 -51
  33. package/dist/commands/journal.d.ts.map +1 -1
  34. package/dist/commands/journal.js +4 -13
  35. package/dist/commands/ledger-v3.d.ts +5 -0
  36. package/dist/commands/ledger-v3.d.ts.map +1 -0
  37. package/dist/commands/ledger-v3.js +91 -0
  38. package/dist/commands/presence.d.ts.map +1 -1
  39. package/dist/commands/presence.js +11 -5
  40. package/dist/commands/sync.d.ts +1 -1
  41. package/dist/commands/sync.js +1 -1
  42. package/dist/commands/web.d.ts +6 -0
  43. package/dist/commands/web.d.ts.map +1 -1
  44. package/dist/commands/web.js +67 -7
  45. package/dist/commands/work.d.ts.map +1 -1
  46. package/dist/commands/work.js +22 -5
  47. package/dist/core/adapter.d.ts +5 -0
  48. package/dist/core/adapter.d.ts.map +1 -0
  49. package/dist/core/adapter.js +1 -0
  50. package/dist/core/adapters/attest.d.ts +5 -2
  51. package/dist/core/adapters/attest.d.ts.map +1 -1
  52. package/dist/core/adapters/attest.js +8 -3
  53. package/dist/core/adapters/profiles.d.ts +6 -6
  54. package/dist/core/adapters/profiles.d.ts.map +1 -1
  55. package/dist/core/adapters/profiles.js +4 -4
  56. package/dist/core/agents/canonical-emit.d.ts +17 -15
  57. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  58. package/dist/core/agents/canonical-emit.js +22 -22
  59. package/dist/core/agents/cli.js +207 -234
  60. package/dist/core/agents/codex-archive-v3.d.ts +14 -0
  61. package/dist/core/agents/codex-archive-v3.d.ts.map +1 -0
  62. package/dist/core/agents/codex-archive-v3.js +110 -0
  63. package/dist/core/agents/coord-client.d.ts +19 -81
  64. package/dist/core/agents/coord-client.d.ts.map +1 -1
  65. package/dist/core/agents/coord-client.js +65 -155
  66. package/dist/core/agents/finalization.d.ts +4 -1
  67. package/dist/core/agents/finalization.d.ts.map +1 -1
  68. package/dist/core/agents/finalization.js +89 -32
  69. package/dist/core/agents/index.d.ts +4 -5
  70. package/dist/core/agents/index.d.ts.map +1 -1
  71. package/dist/core/agents/index.js +4 -5
  72. package/dist/core/agents/live-authority-v3.d.ts +59 -0
  73. package/dist/core/agents/live-authority-v3.d.ts.map +1 -0
  74. package/dist/core/agents/live-authority-v3.js +233 -0
  75. package/dist/core/agents/live-lifecycle-v3.d.ts +20 -0
  76. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -0
  77. package/dist/core/agents/live-lifecycle-v3.js +91 -0
  78. package/dist/core/agents/live-observation-v3.d.ts +25 -0
  79. package/dist/core/agents/live-observation-v3.d.ts.map +1 -0
  80. package/dist/core/agents/live-observation-v3.js +157 -0
  81. package/dist/core/agents/render/prompt-context.d.ts +4 -4
  82. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  83. package/dist/core/agents/render/prompt-context.js +23 -58
  84. package/dist/core/agents/render/session-context.d.ts +1 -1
  85. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  86. package/dist/core/agents/render/session-context.js +8 -32
  87. package/dist/core/agents/rules/claim-conflict.d.ts +3 -3
  88. package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
  89. package/dist/core/agents/rules/claim-conflict.js +79 -127
  90. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  91. package/dist/core/agents/rules/commit-conflict.js +3 -18
  92. package/dist/core/agents/rules/stop-hook.d.ts +9 -50
  93. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  94. package/dist/core/agents/rules/stop-hook.js +193 -236
  95. package/dist/core/agents/session-events.d.ts +5 -7
  96. package/dist/core/agents/session-events.d.ts.map +1 -1
  97. package/dist/core/agents/session-events.js +127 -95
  98. package/dist/core/agents/session-finalization-state-v3.d.ts +30 -0
  99. package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -0
  100. package/dist/core/agents/session-finalization-state-v3.js +40 -0
  101. package/dist/core/agents/session-finalizer-v3.d.ts +107 -0
  102. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -0
  103. package/dist/core/agents/session-finalizer-v3.js +734 -0
  104. package/dist/core/agents/session-name-display.d.ts +40 -0
  105. package/dist/core/agents/session-name-display.d.ts.map +1 -0
  106. package/dist/core/agents/session-name-display.js +119 -0
  107. package/dist/core/agents/state/activity-log.d.ts +3 -3
  108. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  109. package/dist/core/agents/state/activity-log.js +7 -16
  110. package/dist/core/agents/state/heartbeat-writer.d.ts +23 -55
  111. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  112. package/dist/core/agents/state/heartbeat-writer.js +56 -228
  113. package/dist/core/agents/state/live-coordination-view.d.ts +31 -0
  114. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -0
  115. package/dist/core/agents/state/live-coordination-view.js +209 -0
  116. package/dist/core/agents/state/session-state.d.ts +4 -3
  117. package/dist/core/agents/state/session-state.d.ts.map +1 -1
  118. package/dist/core/agents/state/session-state.js +18 -9
  119. package/dist/core/agents/state/stale-sweep.d.ts +1 -1
  120. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  121. package/dist/core/agents/state/stale-sweep.js +26 -15
  122. package/dist/core/artifacts/index.d.ts.map +1 -1
  123. package/dist/core/artifacts/index.js +5 -7
  124. package/dist/core/config.d.ts +33 -2
  125. package/dist/core/config.d.ts.map +1 -1
  126. package/dist/core/config.js +98 -2
  127. package/dist/core/context/index.d.ts +1 -4
  128. package/dist/core/context/index.d.ts.map +1 -1
  129. package/dist/core/context/index.js +9 -9
  130. package/dist/core/events/span-parent.d.ts +15 -0
  131. package/dist/core/events/span-parent.d.ts.map +1 -0
  132. package/dist/core/events/span-parent.js +34 -0
  133. package/dist/core/events/v3/advance.d.ts +14 -0
  134. package/dist/core/events/v3/advance.d.ts.map +1 -0
  135. package/dist/core/events/v3/advance.js +134 -0
  136. package/dist/core/events/v3/authority-outbox.d.ts +78 -0
  137. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -0
  138. package/dist/core/events/v3/authority-outbox.js +399 -0
  139. package/dist/core/events/v3/base-builder.d.ts +20 -0
  140. package/dist/core/events/v3/base-builder.d.ts.map +1 -0
  141. package/dist/core/events/v3/base-builder.js +29 -0
  142. package/dist/core/events/v3/base-contract.d.ts +7576 -0
  143. package/dist/core/events/v3/base-contract.d.ts.map +1 -0
  144. package/dist/core/events/v3/base-contract.js +647 -0
  145. package/dist/core/events/v3/bootstrap.d.ts +34 -0
  146. package/dist/core/events/v3/bootstrap.d.ts.map +1 -0
  147. package/dist/core/events/v3/bootstrap.js +175 -0
  148. package/dist/core/events/v3/builder.d.ts +20 -0
  149. package/dist/core/events/v3/builder.d.ts.map +1 -0
  150. package/dist/core/events/v3/builder.js +28 -0
  151. package/dist/core/events/v3/canonical.d.ts +31 -0
  152. package/dist/core/events/v3/canonical.d.ts.map +1 -0
  153. package/dist/core/events/v3/canonical.js +100 -0
  154. package/dist/core/events/v3/capabilities.d.ts +31 -0
  155. package/dist/core/events/v3/capabilities.d.ts.map +1 -0
  156. package/dist/core/events/v3/capabilities.js +107 -0
  157. package/dist/core/events/v3/capability-drift.d.ts +22 -0
  158. package/dist/core/events/v3/capability-drift.d.ts.map +1 -0
  159. package/dist/core/events/v3/capability-drift.js +134 -0
  160. package/dist/core/events/v3/catalog.d.ts +38 -0
  161. package/dist/core/events/v3/catalog.d.ts.map +1 -0
  162. package/dist/core/events/v3/catalog.js +135 -0
  163. package/dist/core/events/v3/clock-order.d.ts +34 -0
  164. package/dist/core/events/v3/clock-order.d.ts.map +1 -0
  165. package/dist/core/events/v3/clock-order.js +35 -0
  166. package/dist/core/events/v3/contract.d.ts +171 -0
  167. package/dist/core/events/v3/contract.d.ts.map +1 -0
  168. package/dist/core/events/v3/contract.js +180 -0
  169. package/dist/core/events/v3/control.d.ts +111 -0
  170. package/dist/core/events/v3/control.d.ts.map +1 -0
  171. package/dist/core/events/v3/control.js +419 -0
  172. package/dist/core/events/v3/coordination-view.d.ts +69 -0
  173. package/dist/core/events/v3/coordination-view.d.ts.map +1 -0
  174. package/dist/core/events/v3/coordination-view.js +119 -0
  175. package/dist/core/events/v3/economics.d.ts +77 -0
  176. package/dist/core/events/v3/economics.d.ts.map +1 -0
  177. package/dist/core/events/v3/economics.js +274 -0
  178. package/dist/core/events/v3/finalization-view.d.ts +26 -0
  179. package/dist/core/events/v3/finalization-view.d.ts.map +1 -0
  180. package/dist/core/events/v3/finalization-view.js +37 -0
  181. package/dist/core/events/v3/fingerprint-keys.d.ts +25 -0
  182. package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -0
  183. package/dist/core/events/v3/fingerprint-keys.js +217 -0
  184. package/dist/core/events/v3/generated.d.ts +4 -0
  185. package/dist/core/events/v3/generated.d.ts.map +1 -0
  186. package/dist/core/events/v3/generated.js +47 -0
  187. package/dist/core/events/v3/ids.d.ts +9 -0
  188. package/dist/core/events/v3/ids.d.ts.map +1 -0
  189. package/dist/core/events/v3/ids.js +25 -0
  190. package/dist/core/events/v3/index.d.ts +35 -0
  191. package/dist/core/events/v3/index.d.ts.map +1 -0
  192. package/dist/core/events/v3/index.js +33 -0
  193. package/dist/core/events/v3/latency.d.ts +63 -0
  194. package/dist/core/events/v3/latency.d.ts.map +1 -0
  195. package/dist/core/events/v3/latency.js +412 -0
  196. package/dist/core/events/v3/live-feed.d.ts +45 -0
  197. package/dist/core/events/v3/live-feed.d.ts.map +1 -0
  198. package/dist/core/events/v3/live-feed.js +246 -0
  199. package/dist/core/events/v3/live-observation.d.ts +35 -0
  200. package/dist/core/events/v3/live-observation.d.ts.map +1 -0
  201. package/dist/core/events/v3/live-observation.js +1 -0
  202. package/dist/core/events/v3/live-routing.d.ts +57 -0
  203. package/dist/core/events/v3/live-routing.d.ts.map +1 -0
  204. package/dist/core/events/v3/live-routing.js +107 -0
  205. package/dist/core/events/v3/producers/command-recorder.d.ts +67 -0
  206. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -0
  207. package/dist/core/events/v3/producers/command-recorder.js +477 -0
  208. package/dist/core/events/v3/producers/command.d.ts +50 -0
  209. package/dist/core/events/v3/producers/command.d.ts.map +1 -0
  210. package/dist/core/events/v3/producers/command.js +135 -0
  211. package/dist/core/events/v3/producers/coordination-recorder.d.ts +53 -0
  212. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -0
  213. package/dist/core/events/v3/producers/coordination-recorder.js +376 -0
  214. package/dist/core/events/v3/producers/coordination.d.ts +90 -0
  215. package/dist/core/events/v3/producers/coordination.d.ts.map +1 -0
  216. package/dist/core/events/v3/producers/coordination.js +229 -0
  217. package/dist/core/events/v3/producers/hook-base.d.ts +54 -0
  218. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -0
  219. package/dist/core/events/v3/producers/hook-base.js +424 -0
  220. package/dist/core/events/v3/producers/hook.d.ts +29 -0
  221. package/dist/core/events/v3/producers/hook.d.ts.map +1 -0
  222. package/dist/core/events/v3/producers/hook.js +71 -0
  223. package/dist/core/events/v3/producers/intake.d.ts +65 -0
  224. package/dist/core/events/v3/producers/intake.d.ts.map +1 -0
  225. package/dist/core/events/v3/producers/intake.js +244 -0
  226. package/dist/core/events/v3/producers/recorder.d.ts +240 -0
  227. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -0
  228. package/dist/core/events/v3/producers/recorder.js +2176 -0
  229. package/dist/core/events/v3/projection.d.ts +101 -0
  230. package/dist/core/events/v3/projection.d.ts.map +1 -0
  231. package/dist/core/events/v3/projection.js +479 -0
  232. package/dist/core/events/v3/reader.d.ts +75 -0
  233. package/dist/core/events/v3/reader.d.ts.map +1 -0
  234. package/dist/core/events/v3/reader.js +778 -0
  235. package/dist/core/events/v3/recovery-record.d.ts +47 -0
  236. package/dist/core/events/v3/recovery-record.d.ts.map +1 -0
  237. package/dist/core/events/v3/recovery-record.js +167 -0
  238. package/dist/core/events/v3/recovery.d.ts +22 -0
  239. package/dist/core/events/v3/recovery.d.ts.map +1 -0
  240. package/dist/core/events/v3/recovery.js +227 -0
  241. package/dist/core/events/v3/span-state.d.ts +52 -0
  242. package/dist/core/events/v3/span-state.d.ts.map +1 -0
  243. package/dist/core/events/v3/span-state.js +142 -0
  244. package/dist/core/events/v3/targets.d.ts +23 -0
  245. package/dist/core/events/v3/targets.d.ts.map +1 -0
  246. package/dist/core/events/v3/targets.js +134 -0
  247. package/dist/core/events/v3/turn-telemetry.d.ts +41 -0
  248. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -0
  249. package/dist/core/events/v3/turn-telemetry.js +168 -0
  250. package/dist/core/events/v3/validate.d.ts +9 -0
  251. package/dist/core/events/v3/validate.d.ts.map +1 -0
  252. package/dist/core/events/v3/validate.js +281 -0
  253. package/dist/core/events/v3/writer.d.ts +56 -0
  254. package/dist/core/events/v3/writer.d.ts.map +1 -0
  255. package/dist/core/events/v3/writer.js +335 -0
  256. package/dist/core/governor/index.d.ts +1 -1
  257. package/dist/core/governor/index.d.ts.map +1 -1
  258. package/dist/core/governor/index.js +1 -1
  259. package/dist/core/governor/plan-api.d.ts +2 -1
  260. package/dist/core/governor/plan-api.d.ts.map +1 -1
  261. package/dist/core/governor/plan-api.js +6 -3
  262. package/dist/core/governor/read.d.ts +1 -1
  263. package/dist/core/governor/read.d.ts.map +1 -1
  264. package/dist/core/governor/read.js +1 -1
  265. package/dist/core/governor/state.d.ts +9 -0
  266. package/dist/core/governor/state.d.ts.map +1 -1
  267. package/dist/core/governor/state.js +40 -3
  268. package/dist/core/guard/config.d.ts +5 -0
  269. package/dist/core/guard/config.d.ts.map +1 -0
  270. package/dist/core/guard/config.js +157 -0
  271. package/dist/core/guard/coordinator.d.ts +14 -0
  272. package/dist/core/guard/coordinator.d.ts.map +1 -0
  273. package/dist/core/guard/coordinator.js +173 -0
  274. package/dist/core/guard/evaluator.d.ts +4 -0
  275. package/dist/core/guard/evaluator.d.ts.map +1 -0
  276. package/dist/core/guard/evaluator.js +242 -0
  277. package/dist/core/guard/evidence-v3.d.ts +15 -0
  278. package/dist/core/guard/evidence-v3.d.ts.map +1 -0
  279. package/dist/core/guard/evidence-v3.js +171 -0
  280. package/dist/core/guard/index.d.ts +10 -0
  281. package/dist/core/guard/index.d.ts.map +1 -0
  282. package/dist/core/guard/index.js +6 -0
  283. package/dist/core/guard/live-source-v3.d.ts +40 -0
  284. package/dist/core/guard/live-source-v3.d.ts.map +1 -0
  285. package/dist/core/guard/live-source-v3.js +128 -0
  286. package/dist/core/guard/storage.d.ts +27 -0
  287. package/dist/core/guard/storage.d.ts.map +1 -0
  288. package/dist/core/guard/storage.js +140 -0
  289. package/dist/core/guard/types.d.ts +119 -0
  290. package/dist/core/guard/types.d.ts.map +1 -0
  291. package/dist/core/guard/types.js +1 -0
  292. package/dist/core/hooks/adapter/detect.d.ts +18 -1
  293. package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
  294. package/dist/core/hooks/adapter/detect.js +29 -0
  295. package/dist/core/hooks/adapter/events.d.ts +7 -4
  296. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  297. package/dist/core/hooks/adapter/events.js +12 -4
  298. package/dist/core/hooks/adapter/output.d.ts +2 -2
  299. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  300. package/dist/core/hooks/adapter/parse.d.ts +7 -4
  301. package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
  302. package/dist/core/hooks/adapter/parse.js +63 -25
  303. package/dist/core/hooks/adapter/wiring.d.ts +30 -4
  304. package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
  305. package/dist/core/hooks/adapter/wiring.js +89 -11
  306. package/dist/core/hooks/cli.d.ts +1 -1
  307. package/dist/core/hooks/cli.js +305 -444
  308. package/dist/core/hooks/effects/image-capture.d.ts +20 -34
  309. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  310. package/dist/core/hooks/effects/image-capture.js +212 -221
  311. package/dist/core/hooks/effects/index.d.ts +1 -9
  312. package/dist/core/hooks/effects/index.d.ts.map +1 -1
  313. package/dist/core/hooks/effects/index.js +1 -24
  314. package/dist/core/hooks/events/input-hash.d.ts +7 -0
  315. package/dist/core/hooks/events/input-hash.d.ts.map +1 -0
  316. package/dist/core/hooks/events/input-hash.js +43 -0
  317. package/dist/core/hooks/index.d.ts +4 -3
  318. package/dist/core/hooks/index.d.ts.map +1 -1
  319. package/dist/core/hooks/index.js +2 -3
  320. package/dist/core/hooks/resolve/coord-root.d.ts +1 -1
  321. package/dist/core/hooks/resolve/coord-root.js +1 -1
  322. package/dist/core/hooks/resolve/owner.d.ts +16 -15
  323. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  324. package/dist/core/hooks/resolve/owner.js +51 -42
  325. package/dist/core/hooks/resolve/transcript.d.ts +33 -3
  326. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  327. package/dist/core/hooks/resolve/transcript.js +155 -14
  328. package/dist/core/hooks/session-name-presence.d.ts +9 -10
  329. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  330. package/dist/core/hooks/session-name-presence.js +15 -15
  331. package/dist/core/hooks/unsafe-cross-shell.d.ts +1 -1
  332. package/dist/core/hooks/unsafe-cross-shell.d.ts.map +1 -1
  333. package/dist/core/journal/index.d.ts +2 -2
  334. package/dist/core/journal/index.d.ts.map +1 -1
  335. package/dist/core/journal/index.js +9 -22
  336. package/dist/core/presence/blob.d.ts +4 -3
  337. package/dist/core/presence/blob.d.ts.map +1 -1
  338. package/dist/core/presence/blob.js +45 -44
  339. package/dist/core/presence/codec-digest.d.ts +29 -0
  340. package/dist/core/presence/codec-digest.d.ts.map +1 -0
  341. package/dist/core/presence/codec-digest.js +170 -0
  342. package/dist/core/presence/relay-client.d.ts +1 -1
  343. package/dist/core/presence/relay-client.d.ts.map +1 -1
  344. package/dist/core/presence/relay-client.js +5 -5
  345. package/dist/core/work/index.d.ts +1 -1
  346. package/dist/core/work/index.d.ts.map +1 -1
  347. package/dist/core/work/index.js +1 -1
  348. package/dist/core/work/read.d.ts +1 -1
  349. package/dist/core/work/read.d.ts.map +1 -1
  350. package/dist/core/work/read.js +1 -1
  351. package/dist/core/work/runner.d.ts.map +1 -1
  352. package/dist/core/work/runner.js +6 -0
  353. package/dist/core/work/state.d.ts +9 -0
  354. package/dist/core/work/state.d.ts.map +1 -1
  355. package/dist/core/work/state.js +17 -3
  356. package/dist/core/workflow/engine.js +24 -25
  357. package/dist/core/workflow/live-session-v3.d.ts +19 -0
  358. package/dist/core/workflow/live-session-v3.d.ts.map +1 -0
  359. package/dist/core/workflow/live-session-v3.js +86 -0
  360. package/dist/core/workflow/scope-id.d.ts +3 -0
  361. package/dist/core/workflow/scope-id.d.ts.map +1 -0
  362. package/dist/core/workflow/scope-id.js +5 -0
  363. package/dist/core/workflow/workspaces/leases.d.ts +4 -0
  364. package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
  365. package/dist/core/workflow/workspaces/leases.js +53 -19
  366. package/dist/index.d.ts +1 -1
  367. package/dist/index.js +1 -1
  368. package/dist/lib/browser/client.d.ts +41 -0
  369. package/dist/lib/browser/client.d.ts.map +1 -1
  370. package/dist/lib/browser/client.js +203 -0
  371. package/dist/lib/browser/critique.d.ts +28 -2
  372. package/dist/lib/browser/critique.d.ts.map +1 -1
  373. package/dist/lib/browser/critique.js +74 -18
  374. package/dist/lib/browser/geometry.d.ts +1 -1
  375. package/dist/lib/browser/geometry.d.ts.map +1 -1
  376. package/dist/lib/browser/geometry.js +130 -6
  377. package/dist/lib/browser/index.d.ts +3 -0
  378. package/dist/lib/browser/index.d.ts.map +1 -1
  379. package/dist/lib/browser/index.js +3 -0
  380. package/dist/lib/browser/qa-plan.d.ts +174 -0
  381. package/dist/lib/browser/qa-plan.d.ts.map +1 -0
  382. package/dist/lib/browser/qa-plan.js +321 -0
  383. package/dist/lib/browser/qa-reuse.d.ts +99 -0
  384. package/dist/lib/browser/qa-reuse.d.ts.map +1 -0
  385. package/dist/lib/browser/qa-reuse.js +222 -0
  386. package/dist/lib/browser/qa-snapshot.d.ts +64 -0
  387. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -0
  388. package/dist/lib/browser/qa-snapshot.js +171 -0
  389. package/dist/lib/browser/runts.d.ts.map +1 -1
  390. package/dist/lib/browser/runts.js +22 -1
  391. package/dist/lib/browser/tiling.d.ts +71 -0
  392. package/dist/lib/browser/tiling.d.ts.map +1 -0
  393. package/dist/lib/browser/tiling.js +118 -0
  394. package/dist/lib/claude-desktop.d.ts +0 -47
  395. package/dist/lib/claude-desktop.d.ts.map +1 -1
  396. package/dist/lib/claude-desktop.js +1 -169
  397. package/dist/lib/context/index.d.ts +0 -3
  398. package/dist/lib/context/index.d.ts.map +1 -1
  399. package/dist/lib/context/index.js +20 -42
  400. package/dist/lib/council/index.d.ts +2 -2
  401. package/dist/lib/council/index.d.ts.map +1 -1
  402. package/dist/lib/council/index.js +9 -20
  403. package/dist/lib/docs-frontmatter.d.ts +1 -6
  404. package/dist/lib/docs-frontmatter.d.ts.map +1 -1
  405. package/dist/lib/docs-frontmatter.js +12 -78
  406. package/dist/lib/docs-index.d.ts +9 -0
  407. package/dist/lib/docs-index.d.ts.map +1 -1
  408. package/dist/lib/docs-index.js +32 -3
  409. package/dist/lib/docs-lint.d.ts.map +1 -1
  410. package/dist/lib/docs-lint.js +14 -30
  411. package/dist/lib/docs-metadata-audit.d.ts +19 -0
  412. package/dist/lib/docs-metadata-audit.d.ts.map +1 -0
  413. package/dist/lib/docs-metadata-audit.js +132 -0
  414. package/dist/lib/docs-metadata-managed.d.ts +23 -0
  415. package/dist/lib/docs-metadata-managed.d.ts.map +1 -0
  416. package/dist/lib/docs-metadata-managed.js +78 -0
  417. package/dist/lib/docs-metadata-sync.d.ts +20 -0
  418. package/dist/lib/docs-metadata-sync.d.ts.map +1 -0
  419. package/dist/lib/docs-metadata-sync.js +222 -0
  420. package/dist/lib/docs-metadata-v2-schema.d.ts +273 -0
  421. package/dist/lib/docs-metadata-v2-schema.d.ts.map +1 -0
  422. package/dist/lib/docs-metadata-v2-schema.js +134 -0
  423. package/dist/lib/docs-metadata-v2.d.ts +21 -0
  424. package/dist/lib/docs-metadata-v2.d.ts.map +1 -0
  425. package/dist/lib/docs-metadata-v2.js +424 -0
  426. package/dist/lib/docs-new.d.ts +11 -0
  427. package/dist/lib/docs-new.d.ts.map +1 -0
  428. package/dist/lib/docs-new.js +52 -0
  429. package/dist/lib/docs-sweep.d.ts.map +1 -1
  430. package/dist/lib/docs-sweep.js +45 -29
  431. package/dist/lib/headless/index.d.ts +98 -0
  432. package/dist/lib/headless/index.d.ts.map +1 -0
  433. package/dist/lib/headless/index.js +211 -0
  434. package/dist/lib/identities/assume.d.ts +4 -4
  435. package/dist/lib/identities/assume.d.ts.map +1 -1
  436. package/dist/lib/identities/assume.js +52 -68
  437. package/dist/lib/instructions/apply.d.ts +5 -4
  438. package/dist/lib/instructions/apply.d.ts.map +1 -1
  439. package/dist/lib/instructions/apply.js +32 -20
  440. package/dist/lib/instructions/bundle.d.ts +1 -1
  441. package/dist/lib/instructions/bundle.d.ts.map +1 -1
  442. package/dist/lib/instructions/bundle.js +1 -1
  443. package/dist/lib/instructions/splice.d.ts +0 -1
  444. package/dist/lib/instructions/splice.d.ts.map +1 -1
  445. package/dist/lib/instructions/splice.js +22 -6
  446. package/dist/lib/instructions/templates.d.ts +7 -5
  447. package/dist/lib/instructions/templates.d.ts.map +1 -1
  448. package/dist/lib/instructions/templates.js +79 -9
  449. package/package.json +26 -5
  450. package/schemas/config.schema.json +120 -2
  451. package/schemas/docs-metadata-v2.schema.json +441 -0
  452. package/schemas/event-v3.schema.json +24472 -0
  453. package/src/commander.ts +4 -0
  454. package/src/commands/adapter.ts +2 -2
  455. package/src/commands/agents.ts +1512 -592
  456. package/src/commands/artifacts.ts +7 -6
  457. package/src/commands/backup.ts +29 -21
  458. package/src/commands/browse.ts +349 -8
  459. package/src/commands/checkpoint.ts +4 -3
  460. package/src/commands/claude-desktop.ts +2 -101
  461. package/src/commands/context.ts +1 -6
  462. package/src/commands/decision.ts +27 -44
  463. package/src/commands/docs.ts +100 -33
  464. package/src/commands/doctor.ts +14 -1
  465. package/src/commands/events.ts +256 -0
  466. package/src/commands/governor.ts +18 -4
  467. package/src/commands/init.ts +253 -57
  468. package/src/commands/instructions.ts +1 -1
  469. package/src/commands/journal.ts +4 -13
  470. package/src/commands/ledger-v3.ts +111 -0
  471. package/src/commands/presence.ts +11 -10
  472. package/src/commands/sync.ts +1 -1
  473. package/src/commands/web.ts +67 -8
  474. package/src/commands/work.ts +28 -5
  475. package/src/core/adapter.ts +5 -0
  476. package/src/core/adapters/attest.ts +8 -3
  477. package/src/core/adapters/profiles.ts +4 -6
  478. package/src/core/agents/canonical-emit.ts +34 -25
  479. package/src/core/agents/cli.ts +236 -262
  480. package/src/core/agents/codex-archive-v3.ts +138 -0
  481. package/src/core/agents/coord-client.ts +75 -188
  482. package/src/core/agents/finalization.ts +120 -38
  483. package/src/core/agents/index.ts +4 -5
  484. package/src/core/agents/live-authority-v3.ts +375 -0
  485. package/src/core/agents/live-lifecycle-v3.ts +140 -0
  486. package/src/core/agents/live-observation-v3.ts +216 -0
  487. package/src/core/agents/render/prompt-context.ts +29 -60
  488. package/src/core/agents/render/session-context.ts +10 -31
  489. package/src/core/agents/rules/claim-conflict.ts +85 -126
  490. package/src/core/agents/rules/commit-conflict.ts +3 -14
  491. package/src/core/agents/rules/stop-hook.ts +239 -293
  492. package/src/core/agents/session-events.ts +137 -104
  493. package/src/core/agents/session-finalization-state-v3.ts +90 -0
  494. package/src/core/agents/session-finalizer-v3.ts +953 -0
  495. package/src/core/agents/session-name-display.ts +149 -0
  496. package/src/core/agents/state/activity-log.ts +6 -14
  497. package/src/core/agents/state/heartbeat-writer.ts +82 -277
  498. package/src/core/agents/state/live-coordination-view.ts +290 -0
  499. package/src/core/agents/state/session-state.ts +24 -12
  500. package/src/core/agents/state/stale-sweep.ts +40 -17
  501. package/src/core/artifacts/index.ts +4 -5
  502. package/src/core/config.ts +148 -3
  503. package/src/core/context/index.ts +9 -17
  504. package/src/core/events/span-parent.ts +46 -0
  505. package/src/core/events/v3/advance.ts +168 -0
  506. package/src/core/events/v3/authority-outbox.ts +548 -0
  507. package/src/core/events/v3/base-builder.ts +60 -0
  508. package/src/core/events/v3/base-contract.ts +882 -0
  509. package/src/core/events/v3/bootstrap.ts +226 -0
  510. package/src/core/events/v3/builder.ts +59 -0
  511. package/src/core/events/v3/canonical.ts +153 -0
  512. package/src/core/events/v3/capabilities.ts +171 -0
  513. package/src/core/events/v3/capability-drift.ts +177 -0
  514. package/src/core/events/v3/catalog.ts +202 -0
  515. package/src/core/events/v3/clock-order.ts +41 -0
  516. package/src/core/events/v3/contract.ts +365 -0
  517. package/src/core/events/v3/control.ts +576 -0
  518. package/src/core/events/v3/coordination-view.ts +193 -0
  519. package/src/core/events/v3/economics.ts +384 -0
  520. package/src/core/events/v3/finalization-view.ts +67 -0
  521. package/src/core/events/v3/fingerprint-keys.ts +260 -0
  522. package/src/core/events/v3/generated.ts +48 -0
  523. package/src/core/events/v3/ids.ts +33 -0
  524. package/src/core/events/v3/index.ts +322 -0
  525. package/src/core/events/v3/latency.ts +551 -0
  526. package/src/core/events/v3/live-feed.ts +319 -0
  527. package/src/core/events/v3/live-observation.ts +39 -0
  528. package/src/core/events/v3/live-routing.ts +135 -0
  529. package/src/core/events/v3/producers/command-recorder.ts +631 -0
  530. package/src/core/events/v3/producers/command.ts +201 -0
  531. package/src/core/events/v3/producers/coordination-recorder.ts +538 -0
  532. package/src/core/events/v3/producers/coordination.ts +355 -0
  533. package/src/core/events/v3/producers/hook-base.ts +578 -0
  534. package/src/core/events/v3/producers/hook.ts +119 -0
  535. package/src/core/events/v3/producers/intake.ts +319 -0
  536. package/src/core/events/v3/producers/recorder.ts +2805 -0
  537. package/src/core/events/v3/projection.ts +653 -0
  538. package/src/core/events/v3/reader.ts +1127 -0
  539. package/src/core/events/v3/recovery-record.ts +244 -0
  540. package/src/core/events/v3/recovery.ts +271 -0
  541. package/src/core/events/v3/span-state.ts +187 -0
  542. package/src/core/events/v3/targets.ts +182 -0
  543. package/src/core/events/v3/turn-telemetry.ts +259 -0
  544. package/src/core/events/v3/validate.ts +361 -0
  545. package/src/core/events/v3/writer.ts +419 -0
  546. package/src/core/governor/index.ts +3 -0
  547. package/src/core/governor/plan-api.ts +10 -2
  548. package/src/core/governor/read.ts +3 -0
  549. package/src/core/governor/state.ts +52 -5
  550. package/src/core/guard/config.ts +206 -0
  551. package/src/core/guard/coordinator.ts +227 -0
  552. package/src/core/guard/evaluator.ts +343 -0
  553. package/src/core/guard/evidence-v3.ts +227 -0
  554. package/src/core/guard/index.ts +35 -0
  555. package/src/core/guard/live-source-v3.ts +204 -0
  556. package/src/core/guard/storage.ts +188 -0
  557. package/src/core/guard/types.ts +152 -0
  558. package/src/core/hooks/adapter/detect.ts +28 -1
  559. package/src/core/hooks/adapter/events.ts +14 -6
  560. package/src/core/hooks/adapter/output.ts +7 -2
  561. package/src/core/hooks/adapter/parse.ts +80 -38
  562. package/src/core/hooks/adapter/wiring.ts +119 -13
  563. package/src/core/hooks/cli.ts +351 -466
  564. package/src/core/hooks/effects/image-capture.ts +228 -238
  565. package/src/core/hooks/effects/index.ts +1 -36
  566. package/src/core/hooks/events/input-hash.ts +47 -0
  567. package/src/core/hooks/index.ts +4 -11
  568. package/src/core/hooks/resolve/coord-root.ts +1 -1
  569. package/src/core/hooks/resolve/owner.ts +52 -45
  570. package/src/core/hooks/resolve/transcript.ts +165 -14
  571. package/src/core/hooks/session-name-presence.ts +14 -15
  572. package/src/core/hooks/unsafe-cross-shell.ts +1 -1
  573. package/src/core/journal/index.ts +15 -22
  574. package/src/core/presence/blob.ts +48 -41
  575. package/src/core/presence/codec-digest.ts +215 -0
  576. package/src/core/presence/relay-client.ts +5 -5
  577. package/src/core/work/index.ts +3 -0
  578. package/src/core/work/read.ts +3 -0
  579. package/src/core/work/runner.ts +6 -0
  580. package/src/core/work/state.ts +27 -3
  581. package/src/core/workflow/engine.ts +24 -24
  582. package/src/core/workflow/live-session-v3.ts +126 -0
  583. package/src/core/workflow/scope-id.ts +6 -0
  584. package/src/core/workflow/workspaces/leases.ts +56 -19
  585. package/src/index.ts +1 -1
  586. package/src/lib/browser/client.ts +230 -0
  587. package/src/lib/browser/critique.ts +104 -27
  588. package/src/lib/browser/geometry.ts +143 -14
  589. package/src/lib/browser/index.ts +34 -0
  590. package/src/lib/browser/qa-plan.ts +501 -0
  591. package/src/lib/browser/qa-reuse.ts +306 -0
  592. package/src/lib/browser/qa-snapshot.ts +223 -0
  593. package/src/lib/browser/runts.ts +27 -2
  594. package/src/lib/browser/tiling.ts +164 -0
  595. package/src/lib/claude-desktop.ts +1 -232
  596. package/src/lib/context/index.ts +22 -46
  597. package/src/lib/council/index.ts +9 -21
  598. package/src/lib/docs-frontmatter.ts +8 -79
  599. package/src/lib/docs-index.ts +33 -3
  600. package/src/lib/docs-lint.ts +15 -29
  601. package/src/lib/docs-metadata-audit.ts +166 -0
  602. package/src/lib/docs-metadata-managed.ts +83 -0
  603. package/src/lib/docs-metadata-sync.ts +262 -0
  604. package/src/lib/docs-metadata-v2-schema.ts +138 -0
  605. package/src/lib/docs-metadata-v2.ts +646 -0
  606. package/src/lib/docs-new.ts +63 -0
  607. package/src/lib/docs-sweep.ts +42 -28
  608. package/src/lib/headless/index.ts +287 -0
  609. package/src/lib/identities/assume.ts +67 -86
  610. package/src/lib/instructions/apply.ts +33 -20
  611. package/src/lib/instructions/bundle.ts +2 -2
  612. package/src/lib/instructions/splice.ts +21 -7
  613. package/src/lib/instructions/templates.ts +85 -13
  614. package/dist/core/agents/cli-emit.d.ts +0 -27
  615. package/dist/core/agents/cli-emit.d.ts.map +0 -1
  616. package/dist/core/agents/cli-emit.js +0 -57
  617. package/dist/core/agents/codex-replay.d.ts +0 -29
  618. package/dist/core/agents/codex-replay.d.ts.map +0 -1
  619. package/dist/core/agents/codex-replay.js +0 -138
  620. package/dist/core/agents/events/consume.d.ts +0 -82
  621. package/dist/core/agents/events/consume.d.ts.map +0 -1
  622. package/dist/core/agents/events/consume.js +0 -195
  623. package/dist/core/agents/events/emit.d.ts +0 -42
  624. package/dist/core/agents/events/emit.d.ts.map +0 -1
  625. package/dist/core/agents/events/emit.js +0 -75
  626. package/dist/core/agents/events/ulid.d.ts +0 -11
  627. package/dist/core/agents/events/ulid.d.ts.map +0 -1
  628. package/dist/core/agents/events/ulid.js +0 -47
  629. package/dist/core/agents/state/heartbeat-projector.d.ts +0 -76
  630. package/dist/core/agents/state/heartbeat-projector.d.ts.map +0 -1
  631. package/dist/core/agents/state/heartbeat-projector.js +0 -581
  632. package/dist/core/hooks/events/emit.d.ts +0 -31
  633. package/dist/core/hooks/events/emit.d.ts.map +0 -1
  634. package/dist/core/hooks/events/emit.js +0 -93
  635. package/dist/core/hooks/events/rotate.d.ts +0 -43
  636. package/dist/core/hooks/events/rotate.d.ts.map +0 -1
  637. package/dist/core/hooks/events/rotate.js +0 -142
  638. package/dist/core/hooks/events/schema.d.ts +0 -341
  639. package/dist/core/hooks/events/schema.d.ts.map +0 -1
  640. package/dist/core/hooks/events/schema.js +0 -12
  641. package/dist/core/hooks/events/ulid.d.ts +0 -10
  642. package/dist/core/hooks/events/ulid.d.ts.map +0 -1
  643. package/dist/core/hooks/events/ulid.js +0 -47
  644. package/dist/lib/docs-frontmatter-migrate.d.ts +0 -33
  645. package/dist/lib/docs-frontmatter-migrate.d.ts.map +0 -1
  646. package/dist/lib/docs-frontmatter-migrate.js +0 -364
  647. package/src/core/agents/cli-emit.ts +0 -64
  648. package/src/core/agents/codex-replay.ts +0 -163
  649. package/src/core/agents/events/consume.ts +0 -254
  650. package/src/core/agents/events/emit.ts +0 -115
  651. package/src/core/agents/events/ulid.ts +0 -51
  652. package/src/core/agents/state/heartbeat-projector.ts +0 -645
  653. package/src/core/hooks/events/emit.ts +0 -125
  654. package/src/core/hooks/events/rotate.ts +0 -151
  655. package/src/core/hooks/events/schema.ts +0 -582
  656. package/src/core/hooks/events/ulid.ts +0 -51
  657. package/src/lib/docs-frontmatter-migrate.ts +0 -427
@@ -17,17 +17,32 @@
17
17
  */
18
18
 
19
19
  import { spawnSync } from "node:child_process";
20
+ import { createHash } from "node:crypto";
20
21
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
21
22
  import { dirname, relative, resolve } from "node:path";
22
23
  import { fileURLToPath } from "node:url";
23
24
  import type { Command } from "commander";
24
25
  import type { EmitContext } from "../commander.ts";
25
26
  import { DEFAULT_BIN_NAME, pinnedBinName, stripJsonComments } from "../core/config.ts";
27
+ import { canonicalJsonV3 } from "../core/events/v3/canonical.ts";
28
+ import { ADAPTER_CAPABILITY_PROFILES_V3 } from "../core/events/v3/capabilities.ts";
29
+ import type { EventV3ControlState } from "../core/events/v3/control.ts";
30
+ import { EVENT_V3_SCHEMA_DIGEST } from "../core/events/v3/generated.ts";
31
+ import {
32
+ initializeEventLedgerV3,
33
+ readEventV3ControlState,
34
+ sha256V3,
35
+ } from "../core/events/v3/index.ts";
36
+ import { liveEventV3BuildId } from "../core/events/v3/live-routing.ts";
26
37
  import { ADAPTER_SPECS, type AdapterId, type AdapterSpec } from "../core/hooks/adapter/events.ts";
27
38
  import {
39
+ agentHookPathForProject,
28
40
  commandWiresSubcommand,
41
+ diffWiring,
29
42
  groupCommands,
30
43
  type HookGroup,
44
+ hookCommand,
45
+ isAgentHookCommand,
31
46
  makeEntry,
32
47
  type SettingsFile,
33
48
  } from "../core/hooks/adapter/wiring.ts";
@@ -79,16 +94,86 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
79
94
  // CLI re-stamps the host's name into committed agent-facing surfaces.
80
95
  const bin = pinnedBinName(projectRoot) ?? (binName?.trim() ? binName : DEFAULT_BIN_NAME);
81
96
 
82
- // ── --check: read-only drift report on the block + skills ──────────────
97
+ // ── --check: read-only drift report on every init-managed surface ─────
83
98
  if (opts.check === true) {
84
99
  const { status, issues } = checkInstructions(projectRoot, { binName: bin, adapter });
100
+ let hookCheckError = false;
101
+ let hookDrift = false;
102
+ const settingsPath = resolve(projectRoot, spec.settingsFile);
103
+ const agentHook = agentHookPathForProject(projectRoot, HARNERY_ROOT);
104
+ if (!existsSync(settingsPath)) {
105
+ hookDrift = true;
106
+ issues.push(`${spec.settingsFile}: missing (re-run init)`);
107
+ } else {
108
+ try {
109
+ const settings = JSON.parse(readFileSync(settingsPath, "utf8")) as SettingsFile;
110
+ const hookDiff = diffWiring(settings, spec, { agentHookPath: agentHook, adapter });
111
+ hookDrift =
112
+ hookDiff.missing.length > 0 ||
113
+ hookDiff.stale.length > 0 ||
114
+ hookDiff.duplicates.length > 0 ||
115
+ hookDiff.misplaced.length > 0 ||
116
+ hookDiff.orphans.length > 0 ||
117
+ hookDiff.invalidTopLevelKeys.length > 0 ||
118
+ hookDiff.invalidEventKeys.length > 0;
119
+ if (hookDiff.missing.length > 0) {
120
+ issues.push(
121
+ `${spec.settingsFile}: missing hooks (${hookDiff.missing.map((e) => e.settingsKey).join(", ")})`,
122
+ );
123
+ }
124
+ if (hookDiff.stale.length > 0) {
125
+ issues.push(
126
+ `${spec.settingsFile}: stale hook commands (${hookDiff.stale.map((e) => e.settingsKey).join(", ")})`,
127
+ );
128
+ }
129
+ if (hookDiff.duplicates.length > 0) {
130
+ issues.push(
131
+ `${spec.settingsFile}: duplicate hooks (${hookDiff.duplicates.map((e) => e.settingsKey).join(", ")})`,
132
+ );
133
+ }
134
+ if (hookDiff.misplaced.length > 0) {
135
+ issues.push(
136
+ `${spec.settingsFile}: hooks under the wrong event (${hookDiff.misplaced.map((e) => e.subcommand).join(", ")})`,
137
+ );
138
+ }
139
+ if (hookDiff.orphans.length > 0) {
140
+ issues.push(`${spec.settingsFile}: obsolete hooks (${hookDiff.orphans.join(", ")})`);
141
+ }
142
+ if (hookDiff.invalidTopLevelKeys.length > 0) {
143
+ issues.push(
144
+ `${spec.settingsFile}: invalid fields (${hookDiff.invalidTopLevelKeys.join(", ")})`,
145
+ );
146
+ }
147
+ if (hookDiff.invalidEventKeys.length > 0) {
148
+ issues.push(
149
+ `${spec.settingsFile}: unsupported events (${hookDiff.invalidEventKeys.join(", ")})`,
150
+ );
151
+ }
152
+ } catch (error) {
153
+ hookCheckError = true;
154
+ issues.push(`${spec.settingsFile}: invalid JSON (${(error as Error).message})`);
155
+ }
156
+ }
85
157
  const gitHooks = checkGitHooks(projectRoot);
86
158
  if (gitHooks.status !== "fresh") issues.push(...gitHooks.issues);
159
+ const ledger = readEventV3ControlState(projectRoot);
160
+ if (ledger.state !== "active") issues.push(`event ledger V3 is ${ledger.state}`);
161
+ const ledgerRuntimeIssues = eventLedgerV3RuntimeIssues(ledger, gitBuild(HARNERY_ROOT));
162
+ if (ledgerRuntimeIssues.length > 0) {
163
+ issues.push(`event ledger V3 is runtime-stale (${ledgerRuntimeIssues.join(", ")})`);
164
+ }
87
165
  const merged =
88
- status === "error" ? "error" : gitHooks.status !== "fresh" ? "drift" : status;
166
+ status === "error" || hookCheckError
167
+ ? "error"
168
+ : hookDrift ||
169
+ gitHooks.status !== "fresh" ||
170
+ ledger.state !== "active" ||
171
+ ledgerRuntimeIssues.length > 0
172
+ ? "drift"
173
+ : status;
89
174
  const head =
90
175
  merged === "fresh"
91
- ? "harn init --check: instructions + skills + git hooks are current"
176
+ ? "harn init --check: hooks + instructions + skills + event ledger V3 are current"
92
177
  : merged === "drift"
93
178
  ? "harn init --check: drift found (re-run `init` to refresh)"
94
179
  : "harn init --check: error";
@@ -137,9 +222,41 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
137
222
  if (stamp) actions.push(stamp);
138
223
  }
139
224
 
225
+ // ── 1d. universal V3 event ledger ────────────────────────────────────
226
+ if (dryRun) {
227
+ const ledger = readEventV3ControlState(projectRoot);
228
+ const runtimeIssues = eventLedgerV3RuntimeIssues(ledger, gitBuild(HARNERY_ROOT));
229
+ actions.push(
230
+ ledger.state === "active" && runtimeIssues.length === 0
231
+ ? "· event ledger V3 is active"
232
+ : ledger.state === "active"
233
+ ? `+ would refresh event ledger V3 runtime profile (${runtimeIssues.join(", ")})`
234
+ : `+ would initialize event ledger V3 (current state: ${ledger.state})`,
235
+ );
236
+ } else {
237
+ const harneryBuild = gitBuild(HARNERY_ROOT);
238
+ const ledgerBefore = readEventV3ControlState(projectRoot);
239
+ const runtimeIssues = eventLedgerV3RuntimeIssues(ledgerBefore, harneryBuild);
240
+ const initialized = initializeEventLedgerV3({
241
+ coordRoot: projectRoot,
242
+ harneryBuild,
243
+ hostBuild: gitBuild(projectRoot),
244
+ configDigest: digestConfig(resolve(coordDir, "config.jsonc")),
245
+ approvalRecordId: "harnery-init-v3-universal",
246
+ forceNewEpoch: runtimeIssues.length > 0,
247
+ });
248
+ actions.push(
249
+ initialized.archived_epoch
250
+ ? `+ refreshed event ledger V3 runtime profile (${runtimeIssues.join(", ")}); archived the prior epoch intact`
251
+ : initialized.initialized
252
+ ? "+ initialized event ledger V3"
253
+ : "· event ledger V3 already active",
254
+ );
255
+ }
256
+
140
257
  // ── 2. adapter hooks ───────────────────────────────────────────────────
141
258
  const settingsPath = resolve(projectRoot, spec.settingsFile);
142
- const agentHook = relative(projectRoot, resolve(HARNERY_ROOT, "bin", "agent-hook"));
259
+ const agentHook = agentHookPathForProject(projectRoot, HARNERY_ROOT);
143
260
 
144
261
  let settings: SettingsFile;
145
262
  if (existsSync(settingsPath)) {
@@ -165,14 +282,14 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
165
282
  } else if (dryRun) {
166
283
  actions.push(
167
284
  `+ would wire ${wired} hook(s), upgrade ${upgraded} stale command(s), and remove ` +
168
- `${removed} legacy hook(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`,
285
+ `${removed} obsolete/duplicate command(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`,
169
286
  );
170
287
  } else {
171
288
  mkdirSync(dirname(settingsPath), { recursive: true });
172
289
  writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
173
290
  actions.push(
174
291
  `+ wired ${wired} hook(s), upgraded ${upgraded} stale command(s), and removed ` +
175
- `${removed} legacy hook(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`,
292
+ `${removed} obsolete/duplicate command(s) in ${rel(projectRoot, settingsPath)} (${already} already present)`,
176
293
  );
177
294
  }
178
295
  const authorizationReview = codexHookReviewAction(adapter);
@@ -204,6 +321,52 @@ export function registerInitCommand(program: Command, emit: EmitContext, binName
204
321
  });
205
322
  }
206
323
 
324
+ function gitBuild(root: string): string {
325
+ const result = spawnSync("git", ["-C", root, "rev-parse", "HEAD"], {
326
+ encoding: "utf8",
327
+ timeout: 5000,
328
+ });
329
+ const commit = result.status === 0 ? result.stdout.trim() : "";
330
+ return /^[0-9a-f]{40,64}$/.test(commit)
331
+ ? commit
332
+ : createHash("sha256").update(resolve(root)).digest("hex");
333
+ }
334
+
335
+ function digestConfig(path: string): `sha256:${string}` {
336
+ return sha256V3(existsSync(path) ? readFileSync(path) : Buffer.from("{}\n"));
337
+ }
338
+
339
+ /**
340
+ * Runtime gates bound into an immutable V3 epoch. `init` is the explicit
341
+ * upgrade boundary: when code or capability profiles change, it archives the
342
+ * old epoch intact and activates a compatible one instead of letting upgraded
343
+ * hooks fail closed against stale approvals.
344
+ */
345
+ export function eventLedgerV3RuntimeIssues(
346
+ control: EventV3ControlState,
347
+ harneryBuild: string,
348
+ ): string[] {
349
+ if (control.state !== "active") return [];
350
+ const issues: string[] = [];
351
+ const profile = control.genesis.profile;
352
+ if (profile.initial_schema_digest !== EVENT_V3_SCHEMA_DIGEST) issues.push("schema digest");
353
+ if (profile.contract_source_digest !== EVENT_V3_SCHEMA_DIGEST) issues.push("contract digest");
354
+ if (!profile.producer_build_ids.includes(liveEventV3BuildId(harneryBuild))) {
355
+ issues.push("producer build");
356
+ }
357
+ const expectedCapabilities = Object.values(ADAPTER_CAPABILITY_PROFILES_V3).map((value) =>
358
+ sha256V3(canonicalJsonV3(value)),
359
+ );
360
+ if (
361
+ expectedCapabilities.some(
362
+ (digest) => !profile.adapter_capability_profile_digests.includes(digest),
363
+ )
364
+ ) {
365
+ issues.push("adapter capabilities");
366
+ }
367
+ return issues;
368
+ }
369
+
207
370
  export function codexHookReviewAction(adapter: AdapterId): string | null {
208
371
  if (adapter !== "codex") return null;
209
372
  return (
@@ -222,8 +385,7 @@ export function codexHookReviewAction(adapter: AdapterId): string | null {
222
385
  * `{ command }`) and ensures the root `version` key when the adapter requires
223
386
  * one. Pure (no fs/git) so it's unit-testable.
224
387
  *
225
- * The trailing space in the match (`agent-hook ${subcommand} `) is load-bearing:
226
- * it keeps `stop` from matching `stop-failure`.
388
+ * Token-aware matching keeps `stop` from matching `stop-failure`.
227
389
  */
228
390
  export function wireHooks(
229
391
  settings: SettingsFile,
@@ -239,31 +401,40 @@ export function wireHooks(
239
401
  let already = 0;
240
402
  let removed = 0;
241
403
  let upgraded = 0;
242
- for (const { settingsKey, subcommand } of spec.legacyEvents ?? []) {
243
- const groups = settings.hooks[settingsKey] ?? [];
244
- const kept = groups.filter(
245
- (group) =>
246
- !groupCommands(group).some((command) => commandWiresSubcommand(command, subcommand)),
247
- );
248
- removed += groups.length - kept.length;
249
- if (kept.length === 0) delete settings.hooks[settingsKey];
250
- else settings.hooks[settingsKey] = kept;
404
+ for (const { subcommand } of spec.legacyEvents ?? []) {
405
+ for (const settingsKey of Object.keys(settings.hooks)) {
406
+ removed += removeCommandsFromKey(settings, settingsKey, (command) =>
407
+ commandWiresSubcommand(command, subcommand),
408
+ );
409
+ }
251
410
  }
252
411
  for (const { settingsKey, subcommand } of spec.events) {
253
412
  const command = hookCommand(spec, agentHookPath, subcommand, adapter);
254
- const groups = settings.hooks[settingsKey] ?? [];
255
413
  let present = false;
414
+ for (const key of Object.keys(settings.hooks)) {
415
+ if (key === settingsKey) continue;
416
+ removed += removeCommandsFromKey(settings, key, (candidate) =>
417
+ commandWiresSubcommand(candidate, subcommand),
418
+ );
419
+ }
420
+ const groups = settings.hooks[settingsKey] ?? [];
421
+ const nextGroups: HookGroup[] = [];
256
422
  for (const group of groups) {
257
- upgraded += rewriteStaleCommands(group, subcommand, command, () => {
258
- present = true;
259
- });
423
+ const normalized = normalizeEventGroup(group, subcommand, command, present);
424
+ if (normalized.found && !present) present = true;
425
+ upgraded += normalized.upgraded;
426
+ removed += normalized.removed;
427
+ if (normalized.group) nextGroups.push(normalized.group);
260
428
  }
429
+ if (nextGroups.length > 0) settings.hooks[settingsKey] = nextGroups;
430
+ else delete settings.hooks[settingsKey];
261
431
  if (present) {
262
432
  already++;
263
433
  continue;
264
434
  }
265
- groups.push(makeEntry(spec.entryShape, command));
266
- settings.hooks[settingsKey] = groups;
435
+ const current = settings.hooks[settingsKey] ?? [];
436
+ current.push(makeEntry(spec.entryShape, command));
437
+ settings.hooks[settingsKey] = current;
267
438
  wired++;
268
439
  }
269
440
  return { wired, already, removed, upgraded };
@@ -279,49 +450,80 @@ export function wireHooks(
279
450
  * that don't set the var. Only the env expansion is quoted so the
280
451
  * `agent-hook <subcommand> ` wiring match stays byte-identical.
281
452
  */
282
- function hookCommand(
283
- spec: AdapterSpec,
284
- agentHookPath: string,
285
- subcommand: string,
286
- adapter: AdapterId,
287
- ): string {
288
- const anchor = spec.projectDirEnv ? `"\${${spec.projectDirEnv}:-.}"/` : "";
289
- return `bash ${anchor}${agentHookPath} ${subcommand} --adapter ${adapter}`;
290
- }
291
-
292
- /**
293
- * Rewrite any harnery-owned command for `subcommand` inside one hook group to
294
- * the canonical form, in place. Returns the number of commands rewritten and
295
- * calls `onPresent` when the subcommand is wired in this group at all.
296
- */
297
- function rewriteStaleCommands(
453
+ function normalizeEventGroup(
298
454
  group: HookGroup,
299
455
  subcommand: string,
300
456
  canonical: string,
301
- onPresent: () => void,
302
- ): number {
303
- let rewritten = 0;
457
+ alreadyFound: boolean,
458
+ ): { group: HookGroup | null; found: boolean; upgraded: number; removed: number } {
459
+ let found = false;
460
+ let upgraded = 0;
461
+ let removed = 0;
304
462
  if ("command" in group && typeof group.command === "string") {
305
463
  if (commandWiresSubcommand(group.command, subcommand)) {
306
- onPresent();
464
+ if (alreadyFound) return { group: null, found: true, upgraded: 0, removed: 1 };
465
+ found = true;
307
466
  if (group.command !== canonical) {
308
467
  group.command = canonical;
309
- rewritten++;
468
+ upgraded++;
310
469
  }
311
470
  }
312
471
  }
313
472
  if ("hooks" in group && Array.isArray(group.hooks)) {
473
+ const kept = [] as typeof group.hooks;
314
474
  for (const hook of group.hooks) {
315
- if (typeof hook.command !== "string") continue;
316
- if (!commandWiresSubcommand(hook.command, subcommand)) continue;
317
- onPresent();
475
+ if (typeof hook.command !== "string" || !commandWiresSubcommand(hook.command, subcommand)) {
476
+ kept.push(hook);
477
+ continue;
478
+ }
479
+ if (alreadyFound || found) {
480
+ removed++;
481
+ continue;
482
+ }
483
+ found = true;
318
484
  if (hook.command !== canonical) {
319
485
  hook.command = canonical;
320
- rewritten++;
486
+ upgraded++;
321
487
  }
488
+ kept.push(hook);
489
+ }
490
+ group.hooks = kept;
491
+ if (group.hooks.length === 0) return { group: null, found, upgraded, removed };
492
+ }
493
+ return { group, found, upgraded, removed };
494
+ }
495
+
496
+ /** Remove matching command handlers while preserving unrelated handlers in a mixed group. */
497
+ function removeCommandsFromKey(
498
+ settings: SettingsFile,
499
+ settingsKey: string,
500
+ predicate: (command: string) => boolean,
501
+ ): number {
502
+ const groups = settings.hooks?.[settingsKey];
503
+ if (!Array.isArray(groups)) return 0;
504
+ let removed = 0;
505
+ const kept: HookGroup[] = [];
506
+ for (const group of groups) {
507
+ if ("command" in group && typeof group.command === "string") {
508
+ if (predicate(group.command)) removed++;
509
+ else kept.push(group);
510
+ continue;
511
+ }
512
+ if ("hooks" in group && Array.isArray(group.hooks)) {
513
+ const handlers = group.hooks.filter((hook) => {
514
+ if (typeof hook.command !== "string" || !predicate(hook.command)) return true;
515
+ removed++;
516
+ return false;
517
+ });
518
+ group.hooks = handlers;
519
+ if (handlers.length > 0) kept.push(group);
520
+ continue;
322
521
  }
522
+ kept.push(group);
323
523
  }
324
- return rewritten;
524
+ if (kept.length === 0) delete settings.hooks?.[settingsKey];
525
+ else settings.hooks![settingsKey] = kept;
526
+ return removed;
325
527
  }
326
528
 
327
529
  /**
@@ -338,17 +540,11 @@ export function unwireHooks(settings: SettingsFile): { removed: number; remainin
338
540
  if (!settings.hooks || typeof settings.hooks !== "object") return { removed: 0, remaining: 0 };
339
541
  let removed = 0;
340
542
  for (const key of Object.keys(settings.hooks)) {
341
- const groups = settings.hooks[key];
342
- if (!Array.isArray(groups)) continue;
343
- const kept = groups.filter((g) => !groupCommands(g).some((c) => c.includes("agent-hook ")));
344
- removed += groups.length - kept.length;
345
- // removing the emptied hook key is the intent (tiny one-shot object)
346
- if (kept.length === 0) delete settings.hooks[key];
347
- else settings.hooks[key] = kept;
543
+ removed += removeCommandsFromKey(settings, key, isAgentHookCommand);
348
544
  }
349
545
  let remaining = 0;
350
546
  for (const groups of Object.values(settings.hooks)) {
351
- if (Array.isArray(groups)) remaining += groups.length;
547
+ if (Array.isArray(groups)) remaining += groups.flatMap(groupCommands).length;
352
548
  }
353
549
  // drop the now-empty hooks object so callers see a clean shape
354
550
  if (Object.keys(settings.hooks).length === 0) delete settings.hooks;
@@ -4,8 +4,8 @@ import { resolve } from "node:path";
4
4
  import type { Command } from "commander";
5
5
  import { countTokens } from "gpt-tokenizer/model/gpt-4o";
6
6
  import type { EmitContext } from "../commander.ts";
7
+ import type { Adapter } from "../core/adapter.ts";
7
8
  import { monorepoRoot } from "../core/agents/index.ts";
8
- import type { Adapter } from "../core/hooks/events/schema.ts";
9
9
  import {
10
10
  buildInstructionBundle,
11
11
  type InstructionBundleComponent,
@@ -2,7 +2,8 @@ import { existsSync, readdirSync, readFileSync, statSync, unlinkSync, watch } fr
2
2
  import { resolve as resolvePath } from "node:path";
3
3
  import type { Command } from "commander";
4
4
  import type { EmitContext } from "../commander.ts";
5
- import { emitCanonical, normalizeAdapter, readHeartbeat } from "../core/agents/index.ts";
5
+ import { monorepoRoot } from "../core/agents/index.ts";
6
+ import { readLiveCoordinationRow } from "../core/agents/state/live-coordination-view.ts";
6
7
  import { resolveBinName } from "../core/config.ts";
7
8
  import {
8
9
  appendEntry,
@@ -53,17 +54,6 @@ export function registerJournalCommand(program: Command, emitParam: EmitContext)
53
54
  try {
54
55
  const owner = currentOwnerOrThrow();
55
56
  const doc = appendEntry(owner, cat, body);
56
- const hb = readHeartbeat(owner);
57
- emitCanonical({
58
- type: "state.journal_append",
59
- owner,
60
- session: hb?.session_id ?? owner,
61
- adapter: normalizeAdapter(hb?.platform),
62
- data: {
63
- category: cat,
64
- body_summary: body.length > 1000 ? `${body.slice(0, 997)}...` : body,
65
- },
66
- });
67
57
  emit.data({
68
58
  instance_id: owner,
69
59
  name: doc.header.name,
@@ -341,7 +331,8 @@ function runRead(opts: { name?: string; owner?: string; archive?: string; limit:
341
331
  process.exit(1);
342
332
  }
343
333
 
344
- const hb = readHeartbeat(owner);
334
+ const root = monorepoRoot();
335
+ const hb = root ? readLiveCoordinationRow(root, owner) : null;
345
336
  const staleBanner = renderStaleBannerIfNeeded(hb?.last_heartbeat);
346
337
  process.stdout.write(`${staleBanner + renderJournal(doc, limit)}\n`); // lint-ok-emission: pretty render, multi-line markdown for direct TTY/pipe consumption
347
338
  }
@@ -0,0 +1,111 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ import type { Command } from "commander";
6
+ import type { EmitContext, HarneryProgramContext } from "../commander.ts";
7
+ import {
8
+ initializeEventLedgerV3,
9
+ readEventV3ControlState,
10
+ recoverInvalidEventLedgerV3,
11
+ sha256V3,
12
+ } from "../core/events/v3/index.ts";
13
+
14
+ /** Inspect or initialize the universal V3 event ledger. */
15
+ export function registerLedgerV3Command(
16
+ program: Command,
17
+ emit: EmitContext,
18
+ context?: HarneryProgramContext,
19
+ ): void {
20
+ const command = program
21
+ .command("ledger-v3")
22
+ .description("Inspect or initialize the universal event-ledger V3 epoch");
23
+
24
+ command
25
+ .command("status")
26
+ .description("Read the V3 control boundary without changing it")
27
+ .action(() => {
28
+ try {
29
+ emit.data(readEventV3ControlState(coordRoot(context)));
30
+ } catch (error) {
31
+ emitFailure(emit, "ledger_v3_status_failed", error);
32
+ }
33
+ });
34
+
35
+ command
36
+ .command("initialize")
37
+ .description("Create V3 control state, or archive and replace the current V3 epoch")
38
+ .option("--root <path>", "Explicit coordination root")
39
+ .requiredOption("--approval-record-id <id>", "Durable approval record identifier")
40
+ .option("--force-new-epoch", "Archive the current V3 epoch and create a new one")
41
+ .action((options: { root?: string; approvalRecordId: string; forceNewEpoch?: boolean }) => {
42
+ try {
43
+ const root = resolve(options.root ?? coordRoot(context));
44
+ emit.data(
45
+ initializeEventLedgerV3({
46
+ coordRoot: root,
47
+ harneryBuild: repositoryBuild(resolve(import.meta.dir, "..", "..")),
48
+ hostBuild: repositoryBuild(root),
49
+ configDigest: configDigest(root),
50
+ approvalRecordId: options.approvalRecordId,
51
+ forceNewEpoch: options.forceNewEpoch === true,
52
+ }),
53
+ );
54
+ } catch (error) {
55
+ emitFailure(emit, "ledger_v3_initialize_failed", error);
56
+ }
57
+ });
58
+
59
+ command
60
+ .command("recover")
61
+ .description("Quarantine one invalid active authority and start a clean V3 epoch")
62
+ .option("--root <path>", "Explicit coordination root")
63
+ .requiredOption("--approval-record-id <id>", "Durable approval record identifier")
64
+ .option("--yes", "Confirm the failed authority should be quarantined")
65
+ .action((options: { root?: string; approvalRecordId: string; yes?: boolean }) => {
66
+ try {
67
+ if (!options.yes) throw new Error("--yes is required to recover an invalid V3 authority");
68
+ const root = resolve(options.root ?? coordRoot(context));
69
+ emit.data(
70
+ recoverInvalidEventLedgerV3({
71
+ coordRoot: root,
72
+ harneryBuild: repositoryBuild(resolve(import.meta.dir, "..", "..")),
73
+ hostBuild: repositoryBuild(root),
74
+ configDigest: configDigest(root),
75
+ approvalRecordId: options.approvalRecordId,
76
+ }),
77
+ );
78
+ } catch (error) {
79
+ emitFailure(emit, "ledger_v3_recovery_failed", error);
80
+ }
81
+ });
82
+ }
83
+
84
+ function coordRoot(context: HarneryProgramContext | undefined): string {
85
+ return resolve(
86
+ context?.resolveCoordRoot?.() ??
87
+ context?.repoRoot ??
88
+ process.env.HARNERY_COORD_ROOT ??
89
+ process.cwd(),
90
+ );
91
+ }
92
+
93
+ function repositoryBuild(root: string): string {
94
+ const result = spawnSync("git", ["-C", root, "rev-parse", "HEAD"], {
95
+ encoding: "utf8",
96
+ timeout: 5000,
97
+ });
98
+ const commit = result.status === 0 ? result.stdout.trim() : "";
99
+ if (/^[0-9a-f]{40,64}$/.test(commit)) return commit;
100
+ return createHash("sha256").update(resolve(root)).digest("hex");
101
+ }
102
+
103
+ function configDigest(root: string): `sha256:${string}` {
104
+ const path = resolve(root, ".harnery", "config.jsonc");
105
+ return sha256V3(existsSync(path) ? readFileSync(path) : Buffer.from("{}\n"));
106
+ }
107
+
108
+ function emitFailure(emit: EmitContext, code: string, error: unknown): never {
109
+ emit.error({ code, message: error instanceof Error ? error.message : String(error) });
110
+ throw error;
111
+ }
@@ -1,12 +1,8 @@
1
1
  import type { Command } from "commander";
2
2
  import type { EmitContext } from "../commander.ts";
3
3
  import { monorepoRoot } from "../core/agents/coord-client.ts";
4
- import {
5
- emitCanonical,
6
- normalizeAdapter,
7
- readHeartbeat,
8
- resolveOwner,
9
- } from "../core/agents/index.ts";
4
+ import { emitEventV3, normalizeAdapter, resolveOwner } from "../core/agents/index.ts";
5
+ import { readLiveCoordinationRow } from "../core/agents/state/live-coordination-view.ts";
10
6
  import {
11
7
  fetchPresence,
12
8
  publishPresence,
@@ -253,12 +249,17 @@ function emitPresenceChange(
253
249
  if (from === to) return;
254
250
  const owner = resolveOwner();
255
251
  if (!owner) return;
256
- const hb = readHeartbeat(owner);
257
- emitCanonical({
258
- type: "state.presence_change",
252
+ const root = monorepoRoot();
253
+ const hb = root ? readLiveCoordinationRow(root, owner) : null;
254
+ emitEventV3({
259
255
  owner,
260
256
  session: hb?.session_id ?? owner,
261
257
  adapter: normalizeAdapter(hb?.platform),
262
- data: { from, to, source },
258
+ observation: {
259
+ event_type: "coord.presence_changed",
260
+ prior_state: from,
261
+ new_state: to,
262
+ reason: `presence_${source}`,
263
+ },
263
264
  });
264
265
  }
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Scope: a deliberately small set of file types: durable identities,
6
6
  * archived journals, council manifests. The high-churn machine-local
7
- * stuff (events.ndjson, .pid-map/, active/, .last-intent.*) stays put.
7
+ * state (ledgers/, .pid-map/, active/, .last-intent.*) stays put.
8
8
  *
9
9
  * Subcommands:
10
10
  * init: interactive: `rclone config` walks through Google OAuth, then