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
@@ -10,7 +10,7 @@
10
10
  * events without affecting behavior": fail-soft beats fail-hard.
11
11
  */
12
12
 
13
- import type { Adapter } from "../events/schema.ts";
13
+ import type { Adapter } from "../../adapter.ts";
14
14
 
15
15
  export interface ParsedPayload {
16
16
  hook_event_name?: string;
@@ -27,6 +27,7 @@ export interface ParsedPayload {
27
27
  model?: string;
28
28
  source?: string; // SessionStart: "startup" | "resume" | …
29
29
  prompt?: string; // UserPromptSubmit / beforeSubmitPrompt
30
+ agent_message?: string; // Cursor PreToolUse: user-visible assistant text before the tool
30
31
  tool_name?: string; // Pre/PostToolUse
31
32
  tool_input?: unknown; // Pre/PostToolUse: the model's call arguments
32
33
  tool_response?: unknown; // PostToolUse: the tool's output (string or object)
@@ -35,6 +36,8 @@ export interface ParsedPayload {
35
36
  clean_exit?: boolean; // SessionEnd
36
37
  exit_status?: string; // SubagentStop
37
38
  reason?: string; // SubagentStop / StopFailure
39
+ /** Privacy-safe Cursor execution surface, derived from native lifecycle metadata. */
40
+ cursor_mode?: "local" | "cloud" | "unknown";
38
41
  /** original parsed object, preserved for callers that need a field we didn't pluck. */
39
42
  raw: Record<string, unknown>;
40
43
  }
@@ -52,9 +55,18 @@ export function parsePayload(raw: string, adapter: Adapter): ParsedPayload | nul
52
55
  return null;
53
56
  }
54
57
 
55
- const sessionId = normalizeSessionId(adapter, pickStr(json, "session_id"));
56
- const conversationId = normalizeSessionId(adapter, pickStr(json, "conversation_id"));
58
+ const rawSessionId = pickStr(json, "session_id");
59
+ const rawConversationId = pickStr(json, "conversation_id");
60
+ const sessionId = normalizeSessionId(adapter, rawSessionId);
61
+ const conversationId = normalizeSessionId(adapter, rawConversationId);
57
62
  const parentSessionId = normalizeSessionId(adapter, pickStr(json, "parent_session_id"));
63
+ const hookEventName = pickStr(json, "hook_event_name");
64
+ const cursorGenerationId = adapter === "cursor" ? pickStr(json, "generation_id") : undefined;
65
+ const cursorShellHook =
66
+ adapter === "cursor" &&
67
+ (hookEventName === "beforeShellExecution" || hookEventName === "afterShellExecution");
68
+ const cursorCommand = cursorShellHook ? pickStr(json, "command") : undefined;
69
+ const normalizedToolInput = normalizeToolInput(json.tool_input, adapter);
58
70
  const normalizedRaw =
59
71
  adapter === "cursor"
60
72
  ? {
@@ -66,13 +78,15 @@ export function parsePayload(raw: string, adapter: Adapter): ParsedPayload | nul
66
78
  : json;
67
79
 
68
80
  return {
69
- hook_event_name: pickStr(json, "hook_event_name"),
81
+ hook_event_name: hookEventName,
70
82
  session_id: sessionId,
71
83
  agent_id: pickStr(json, "agent_id"),
72
84
  subagent_id: pickStr(json, "subagent_id"),
73
85
  conversation_id: conversationId,
74
86
  parent_session_id: parentSessionId,
75
- turn_id: pickStr(json, "turn_id"),
87
+ // Claude Code names its native turn identifier prompt_id; both are the
88
+ // adapter's turn-scoped id and feed native turn stamping (ADR 0078).
89
+ turn_id: pickStr(json, "turn_id") ?? pickStr(json, "prompt_id") ?? cursorGenerationId,
76
90
  parent_turn_id: pickStr(json, "parent_turn_id"),
77
91
  transcript_path: pickStr(json, "transcript_path"),
78
92
  cwd: pickStr(json, "cwd"),
@@ -80,18 +94,50 @@ export function parsePayload(raw: string, adapter: Adapter): ParsedPayload | nul
80
94
  model: pickStr(json, "model"),
81
95
  source: pickStr(json, "source"),
82
96
  prompt: pickStr(json, "prompt"),
83
- tool_name: pickStr(json, "tool_name"),
84
- tool_input: json.tool_input,
85
- tool_response: json.tool_response,
97
+ agent_message: pickStr(json, "agent_message"),
98
+ tool_name: cursorShellHook ? "Shell" : pickStr(json, "tool_name"),
99
+ tool_input: cursorCommand ? { command: cursorCommand } : normalizedToolInput,
100
+ tool_response: hookEventName === "afterShellExecution" ? json.output : json.tool_response,
86
101
  tool_use_id: pickStr(json, "tool_use_id"),
87
102
  stop_hook_active: pickBool(json, "stop_hook_active"),
88
103
  clean_exit: pickBool(json, "clean_exit"),
89
104
  exit_status: pickStr(json, "exit_status"),
90
105
  reason: pickStr(json, "reason"),
106
+ cursor_mode: cursorMode(json, adapter, rawSessionId, rawConversationId),
91
107
  raw: normalizedRaw,
92
108
  };
93
109
  }
94
110
 
111
+ /**
112
+ * Cursor prefixes cloud/private-worker conversations with `bc-`. Current
113
+ * sessionStart payloads also expose `is_background_agent`; either native
114
+ * signal is enough to classify the execution surface without retaining text.
115
+ */
116
+ function cursorMode(
117
+ json: Record<string, unknown>,
118
+ adapter: Adapter,
119
+ sessionId: string | undefined,
120
+ conversationId: string | undefined,
121
+ ): ParsedPayload["cursor_mode"] {
122
+ if (adapter !== "cursor") return undefined;
123
+ const background = pickBool(json, "is_background_agent");
124
+ if (background === true) return "cloud";
125
+ if (background === false) return "local";
126
+ const nativeId = conversationId ?? sessionId;
127
+ if (!nativeId) return "unknown";
128
+ return nativeId.startsWith("bc-") ? "cloud" : "local";
129
+ }
130
+
131
+ /** Cursor can serialize generic tool_input as a JSON string instead of an object. */
132
+ function normalizeToolInput(value: unknown, adapter: Adapter): unknown {
133
+ if (adapter !== "cursor" || typeof value !== "string") return value;
134
+ try {
135
+ return JSON.parse(value) as unknown;
136
+ } catch {
137
+ return value;
138
+ }
139
+ }
140
+
95
141
  /** Cursor Glass prefixes conversation ids with `bc-`; coordination uses the bare id everywhere. */
96
142
  function normalizeSessionId(adapter: Adapter, value: string | undefined): string | undefined {
97
143
  if (adapter !== "cursor" || !value?.startsWith("bc-") || value.length <= 3) return value;
@@ -151,55 +197,54 @@ function pickBool(o: Record<string, unknown>, k: string): boolean | undefined {
151
197
  * Map the CLI-arg event-name (kebab-case, set by us in the wiring) to one of
152
198
  * the canonical event_types. Phase 2's CLI passes the kebab event
153
199
  * name; this returns the canonical event_type or null when the event has no
154
- * canonical equivalent (e.g. Cursor's before-shell-execution duplicates
155
- * pre-tool-use semantically, so we route both to `tool.pre_use`).
200
+ * canonical equivalent. Cursor's shell-specific hooks are retained as reliable
201
+ * remote/CLI fallbacks and normalized to the same tool events as generic hooks.
156
202
  */
157
203
  export function normalizeEventName(
158
204
  eventName: string,
159
205
  ): { event_type: NormalizedEventType; intra_turn: boolean } | null {
160
206
  switch (eventName) {
161
207
  case "session-start":
162
- return { event_type: "session.start", intra_turn: false };
208
+ return { event_type: "session.started", intra_turn: false };
163
209
  case "session-end":
164
- return { event_type: "session.end", intra_turn: false };
210
+ return { event_type: "session.ended", intra_turn: false };
165
211
  case "user-prompt-submit":
166
- return { event_type: "user_prompt.submit", intra_turn: false };
212
+ return { event_type: "turn.started", intra_turn: false };
167
213
  case "stop":
168
- return { event_type: "turn.stop", intra_turn: false };
214
+ return { event_type: "turn.completed", intra_turn: false };
169
215
  case "stop-failure":
170
- // Phase 2: a failed stop is still a turn boundary; emit turn.stop and
171
- // attach the failure signal in `data`. Phase 5 may introduce a
172
- // dedicated `turn.stop_failure` event if the projector needs to branch.
173
- return { event_type: "turn.stop", intra_turn: false };
216
+ return { event_type: "turn.completed", intra_turn: false };
174
217
  case "sub-agent-start":
175
- return { event_type: "subagent.start", intra_turn: false };
218
+ return { event_type: "agent.started", intra_turn: false };
176
219
  case "sub-agent-stop":
177
- return { event_type: "subagent.stop", intra_turn: false };
220
+ return { event_type: "agent.completed", intra_turn: false };
178
221
  case "pre-tool-use":
179
222
  case "before-shell-execution":
180
- return { event_type: "tool.pre_use", intra_turn: true };
223
+ return { event_type: "tool.requested", intra_turn: true };
224
+ case "permission-request":
225
+ return { event_type: "wait.started", intra_turn: true };
181
226
  case "post-tool-use":
182
- return { event_type: "tool.post_use", intra_turn: true };
227
+ case "after-shell-execution":
183
228
  case "post-tool-use-failure":
184
- return { event_type: "tool.post_use_failure", intra_turn: true };
229
+ return { event_type: "tool.completed", intra_turn: true };
185
230
  case "pre-compact":
186
- return { event_type: "context.compaction.started", intra_turn: false };
231
+ return { event_type: "context.compaction_started", intra_turn: false };
187
232
  case "post-compact":
188
- return { event_type: "context.compaction.completed", intra_turn: false };
233
+ return { event_type: "context.compaction_completed", intra_turn: false };
189
234
  default:
190
235
  return null;
191
236
  }
192
237
  }
193
238
 
194
239
  export type NormalizedEventType =
195
- | "session.start"
196
- | "session.end"
197
- | "user_prompt.submit"
198
- | "turn.stop"
199
- | "subagent.start"
200
- | "subagent.stop"
201
- | "tool.pre_use"
202
- | "tool.post_use"
203
- | "tool.post_use_failure"
204
- | "context.compaction.started"
205
- | "context.compaction.completed";
240
+ | "session.started"
241
+ | "session.ended"
242
+ | "turn.started"
243
+ | "turn.completed"
244
+ | "agent.started"
245
+ | "agent.completed"
246
+ | "tool.requested"
247
+ | "wait.started"
248
+ | "tool.completed"
249
+ | "context.compaction_started"
250
+ | "context.compaction_completed";
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { existsSync, readFileSync } from "node:fs";
15
- import { dirname, join, resolve } from "node:path";
15
+ import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
16
16
  import { fileURLToPath } from "node:url";
17
17
  import {
18
18
  ADAPTER_SPECS,
@@ -58,18 +58,54 @@ export function groupCommands(group: HookGroup): string[] {
58
58
 
59
59
  /**
60
60
  * Whether a hook command string wires the given agent-hook subcommand. The
61
- * trailing space is load-bearing: it keeps `stop` from matching `stop-failure`.
61
+ * token boundary keeps `stop` from matching `stop-failure`, while accepting a
62
+ * minimal command that ends immediately after the subcommand.
62
63
  */
63
64
  export function commandWiresSubcommand(command: string, subcommand: string): boolean {
64
- return command.includes(`agent-hook ${subcommand} `);
65
+ const escaped = subcommand.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
66
+ return new RegExp(`(?:^|[\\/\\s])agent-hook\\s+${escaped}(?:\\s|$)`).test(command);
65
67
  }
66
68
 
67
69
  /** Pull the agent-hook subcommand out of a command string, or null if none. */
68
70
  function commandSubcommand(command: string): string | null {
69
- const m = command.match(/agent-hook\s+([a-z][a-z-]*)\s/);
71
+ const m = command.match(/(?:^|[/\s])agent-hook\s+([a-z][a-z-]*)(?:\s|$)/);
70
72
  return m ? m[1]! : null;
71
73
  }
72
74
 
75
+ /** Whether a command invokes Harnery's agent-hook binary at all. */
76
+ export function isAgentHookCommand(command: string): boolean {
77
+ return commandSubcommand(command) !== null;
78
+ }
79
+
80
+ /** The canonical command installed for one adapter event. */
81
+ export function hookCommand(
82
+ spec: AdapterSpec,
83
+ agentHookPath: string,
84
+ subcommand: string,
85
+ adapter: AdapterId,
86
+ ): string {
87
+ if (agentHookPath === "agent-hook") {
88
+ return `agent-hook ${subcommand} --adapter ${adapter}`;
89
+ }
90
+ const anchor = spec.projectDirEnv ? `"\${${spec.projectDirEnv}:-.}"/` : "";
91
+ return `bash ${anchor}${agentHookPath} ${subcommand} --adapter ${adapter}`;
92
+ }
93
+
94
+ /**
95
+ * Pick a committed hook target that survives cloning the consumer elsewhere.
96
+ * Projects that contain Harnery can use its repo-relative launcher. Standalone
97
+ * consumers use the package's installed `agent-hook` executable from PATH
98
+ * instead of recording a relative path back into one developer's package tree.
99
+ */
100
+ export function agentHookPathForProject(projectRoot: string, packageRoot: string): string {
101
+ const hook = join(packageRoot, "bin", "agent-hook");
102
+ const candidate = relative(projectRoot, hook);
103
+ if (candidate === ".." || candidate.startsWith(`..${sep}`) || isAbsolute(candidate)) {
104
+ return "agent-hook";
105
+ }
106
+ return candidate;
107
+ }
108
+
73
109
  export interface WiringDiff {
74
110
  /** Spec events not wired in the settings file. */
75
111
  missing: HookEvent[];
@@ -77,10 +113,16 @@ export interface WiringDiff {
77
113
  present: HookEvent[];
78
114
  /**
79
115
  * agent-hook subcommands wired in the file that are NOT in the current spec
80
- * (e.g. an event renamed/removed by an upgrade). Additive re-init won't clean
81
- * these — they need explicit removal — so they're surfaced separately.
116
+ * (e.g. an event renamed/removed by an upgrade). Re-init removes these, so
117
+ * they are surfaced separately from missing hooks.
82
118
  */
83
119
  orphans: string[];
120
+ /** Spec events wired more than once under their correct event key. */
121
+ duplicates: HookEvent[];
122
+ /** Spec events wired under an event key other than the canonical one. */
123
+ misplaced: HookEvent[];
124
+ /** Spec events whose correct-key command differs from init's canonical command. */
125
+ stale: HookEvent[];
84
126
  /** Settings fields rejected by a adapter with a strict top-level schema. */
85
127
  invalidTopLevelKeys: string[];
86
128
  /** Hook event names rejected by a adapter with a strict event schema. */
@@ -91,17 +133,43 @@ export interface WiringDiff {
91
133
  * Pure diff of one settings object against one adapter spec. Read-only inverse
92
134
  * of `wireHooks`; no fs, so it's unit-testable.
93
135
  */
94
- export function diffWiring(settings: SettingsFile, spec: AdapterSpec): WiringDiff {
136
+ export function diffWiring(
137
+ settings: SettingsFile,
138
+ spec: AdapterSpec,
139
+ expected?: { agentHookPath: string; adapter: AdapterId },
140
+ ): WiringDiff {
95
141
  const missing: HookEvent[] = [];
96
142
  const present: HookEvent[] = [];
143
+ const duplicates: HookEvent[] = [];
144
+ const misplaced: HookEvent[] = [];
145
+ const stale: HookEvent[] = [];
97
146
  const hooks = settings.hooks ?? {};
98
147
 
99
148
  for (const event of spec.events) {
100
149
  const groups = hooks[event.settingsKey] ?? [];
101
- const wired = groups.some((g) =>
102
- groupCommands(g).some((c) => commandWiresSubcommand(c, event.subcommand)),
150
+ const commands = groups
151
+ .flatMap(groupCommands)
152
+ .filter((c) => commandWiresSubcommand(c, event.subcommand));
153
+ (commands.length > 0 ? present : missing).push(event);
154
+ if (commands.length > 1) duplicates.push(event);
155
+ if (expected && commands.length > 0) {
156
+ const canonical = hookCommand(
157
+ spec,
158
+ expected.agentHookPath,
159
+ event.subcommand,
160
+ expected.adapter,
161
+ );
162
+ if (commands.some((command) => command !== canonical)) stale.push(event);
163
+ }
164
+ const wrongKey = Object.entries(hooks).some(
165
+ ([key, otherGroups]) =>
166
+ key !== event.settingsKey &&
167
+ Array.isArray(otherGroups) &&
168
+ otherGroups.some((group) =>
169
+ groupCommands(group).some((command) => commandWiresSubcommand(command, event.subcommand)),
170
+ ),
103
171
  );
104
- (wired ? present : missing).push(event);
172
+ if (wrongKey) misplaced.push(event);
105
173
  }
106
174
 
107
175
  const specSubcommands = new Set(spec.events.map((e) => e.subcommand));
@@ -131,6 +199,9 @@ export function diffWiring(settings: SettingsFile, spec: AdapterSpec): WiringDif
131
199
  missing,
132
200
  present,
133
201
  orphans: [...orphans].sort(),
202
+ duplicates,
203
+ misplaced,
204
+ stale,
134
205
  invalidTopLevelKeys,
135
206
  invalidEventKeys,
136
207
  };
@@ -142,6 +213,9 @@ export interface AdapterWiringStatus {
142
213
  settingsFile: string;
143
214
  missing: HookEvent[];
144
215
  orphans: string[];
216
+ duplicates: HookEvent[];
217
+ misplaced: HookEvent[];
218
+ stale: HookEvent[];
145
219
  invalidTopLevelKeys: string[];
146
220
  invalidEventKeys: string[];
147
221
  parseError?: string;
@@ -172,17 +246,33 @@ export function loadAdapterWiring(projectRoot: string): AdapterWiringStatus[] {
172
246
  settingsFile: spec.settingsFile,
173
247
  missing: [],
174
248
  orphans: [],
249
+ duplicates: [],
250
+ misplaced: [],
251
+ stale: [],
175
252
  invalidTopLevelKeys: [],
176
253
  invalidEventKeys: [],
177
254
  parseError: (error as Error).message,
178
255
  });
179
256
  continue;
180
257
  }
181
- const diff = diffWiring(settings, spec);
258
+ const packageRoot = harneryPackageRoot();
259
+ const diff = diffWiring(
260
+ settings,
261
+ spec,
262
+ packageRoot
263
+ ? {
264
+ agentHookPath: agentHookPathForProject(projectRoot, packageRoot),
265
+ adapter: id,
266
+ }
267
+ : undefined,
268
+ );
182
269
  if (diff.present.length === 0) continue; // not opted in → not drift
183
270
  if (
184
271
  diff.missing.length === 0 &&
185
272
  diff.orphans.length === 0 &&
273
+ diff.duplicates.length === 0 &&
274
+ diff.misplaced.length === 0 &&
275
+ diff.stale.length === 0 &&
186
276
  diff.invalidTopLevelKeys.length === 0 &&
187
277
  diff.invalidEventKeys.length === 0
188
278
  ) {
@@ -193,6 +283,9 @@ export function loadAdapterWiring(projectRoot: string): AdapterWiringStatus[] {
193
283
  settingsFile: spec.settingsFile,
194
284
  missing: diff.missing,
195
285
  orphans: diff.orphans,
286
+ duplicates: diff.duplicates,
287
+ misplaced: diff.misplaced,
288
+ stale: diff.stale,
196
289
  invalidTopLevelKeys: diff.invalidTopLevelKeys,
197
290
  invalidEventKeys: diff.invalidEventKeys,
198
291
  });
@@ -249,12 +342,25 @@ export function summarizeAdapterWiring(projectRoot: string): AdapterWiringSummar
249
342
  * from `dist/`). Returns "" if unresolved — callers omit it from the message.
250
343
  */
251
344
  export function harneryVersion(): string {
345
+ const root = harneryPackageRoot();
346
+ if (!root) return "";
347
+ try {
348
+ const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
349
+ if (pkg.name === "harnery" && typeof pkg.version === "string") return pkg.version;
350
+ } catch {
351
+ /* unreadable package metadata */
352
+ }
353
+ return "";
354
+ }
355
+
356
+ /** Resolve the package root from either src/ (Bun) or dist/ (Node). */
357
+ export function harneryPackageRoot(): string | null {
252
358
  try {
253
359
  let dir = dirname(fileURLToPath(import.meta.url));
254
360
  for (let i = 0; i < 8; i++) {
255
361
  try {
256
362
  const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
257
- if (pkg.name === "harnery" && typeof pkg.version === "string") return pkg.version;
363
+ if (pkg.name === "harnery") return dir;
258
364
  } catch {
259
365
  /* no package.json here, or not ours; keep walking up */
260
366
  }
@@ -265,5 +371,5 @@ export function harneryVersion(): string {
265
371
  } catch {
266
372
  /* import.meta.url unavailable or fs error */
267
373
  }
268
- return "";
374
+ return null;
269
375
  }