harnery 0.38.0 → 0.40.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 (378) hide show
  1. package/dist/commands/agents.d.ts.map +1 -1
  2. package/dist/commands/agents.js +32 -8
  3. package/dist/commands/artifacts.d.ts.map +1 -1
  4. package/dist/commands/artifacts.js +97 -6
  5. package/dist/commands/backup.d.ts +16 -0
  6. package/dist/commands/backup.d.ts.map +1 -1
  7. package/dist/commands/backup.js +239 -33
  8. package/dist/commands/browse.d.ts +8 -0
  9. package/dist/commands/browse.d.ts.map +1 -1
  10. package/dist/commands/browse.js +466 -231
  11. package/dist/commands/diagnostics.d.ts.map +1 -1
  12. package/dist/commands/diagnostics.js +6 -3
  13. package/dist/commands/ledger-v3.d.ts.map +1 -1
  14. package/dist/commands/ledger-v3.js +20 -4
  15. package/dist/commands/qa-run.d.ts.map +1 -1
  16. package/dist/commands/qa-run.js +26 -3
  17. package/dist/commands/qa-status.d.ts.map +1 -1
  18. package/dist/commands/qa-status.js +7 -2
  19. package/dist/commands/resources.d.ts.map +1 -1
  20. package/dist/commands/resources.js +23 -3
  21. package/dist/commands/review-pack.d.ts.map +1 -1
  22. package/dist/commands/review-pack.js +98 -23
  23. package/dist/commands/tunnel.d.ts.map +1 -1
  24. package/dist/commands/tunnel.js +2 -2
  25. package/dist/core/adapters/profiles.d.ts +1 -1
  26. package/dist/core/agents/canonical-emit.d.ts +3 -2
  27. package/dist/core/agents/canonical-emit.d.ts.map +1 -1
  28. package/dist/core/agents/canonical-emit.js +2 -0
  29. package/dist/core/agents/cli.js +13 -6
  30. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  31. package/dist/core/agents/live-authority-v3.js +5 -3
  32. package/dist/core/agents/live-lifecycle-v3.d.ts +2 -2
  33. package/dist/core/agents/live-lifecycle-v3.d.ts.map +1 -1
  34. package/dist/core/agents/render/prompt-context.d.ts +7 -5
  35. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  36. package/dist/core/agents/render/prompt-context.js +63 -8
  37. package/dist/core/agents/session-finalizer-v3.d.ts +2 -2
  38. package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -1
  39. package/dist/core/agents/state/live-coordination-view.d.ts +3 -3
  40. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  41. package/dist/core/agents/state/live-coordination-view.js +2 -1
  42. package/dist/core/agents/state/names.d.ts +35 -2
  43. package/dist/core/agents/state/names.d.ts.map +1 -1
  44. package/dist/core/agents/state/names.js +80 -5
  45. package/dist/core/agents/state/stale-sweep.d.ts +2 -1
  46. package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
  47. package/dist/core/agents/state/stale-sweep.js +23 -6
  48. package/dist/core/agents/turn-elapsed.d.ts +51 -0
  49. package/dist/core/agents/turn-elapsed.d.ts.map +1 -0
  50. package/dist/core/agents/turn-elapsed.js +91 -0
  51. package/dist/core/artifacts/activity.d.ts +14 -0
  52. package/dist/core/artifacts/activity.d.ts.map +1 -0
  53. package/dist/core/artifacts/activity.js +52 -0
  54. package/dist/core/artifacts/delivery-card.d.ts +39 -0
  55. package/dist/core/artifacts/delivery-card.d.ts.map +1 -0
  56. package/dist/core/artifacts/delivery-card.js +282 -0
  57. package/dist/core/artifacts/index.d.ts +42 -7
  58. package/dist/core/artifacts/index.d.ts.map +1 -1
  59. package/dist/core/artifacts/index.js +288 -76
  60. package/dist/core/artifacts/mutation-lock.d.ts +2 -0
  61. package/dist/core/artifacts/mutation-lock.d.ts.map +1 -0
  62. package/dist/core/artifacts/mutation-lock.js +91 -0
  63. package/dist/core/backup/host-snapshot.d.ts +18 -0
  64. package/dist/core/backup/host-snapshot.d.ts.map +1 -0
  65. package/dist/core/backup/host-snapshot.js +64 -0
  66. package/dist/core/config.d.ts +20 -5
  67. package/dist/core/config.d.ts.map +1 -1
  68. package/dist/core/config.js +44 -10
  69. package/dist/core/diagnostics/advice.d.ts +38 -3
  70. package/dist/core/diagnostics/advice.d.ts.map +1 -1
  71. package/dist/core/diagnostics/advice.js +103 -99
  72. package/dist/core/diagnostics/bundle.d.ts.map +1 -1
  73. package/dist/core/diagnostics/bundle.js +111 -47
  74. package/dist/core/diagnostics/comparison.d.ts.map +1 -1
  75. package/dist/core/diagnostics/comparison.js +3 -2
  76. package/dist/core/diagnostics/contract.d.ts +15 -31
  77. package/dist/core/diagnostics/contract.d.ts.map +1 -1
  78. package/dist/core/diagnostics/contract.js +2 -5
  79. package/dist/core/diagnostics/index.d.ts +2 -0
  80. package/dist/core/diagnostics/index.d.ts.map +1 -1
  81. package/dist/core/diagnostics/index.js +2 -0
  82. package/dist/core/diagnostics/pressure-contract.d.ts +260 -0
  83. package/dist/core/diagnostics/pressure-contract.d.ts.map +1 -0
  84. package/dist/core/diagnostics/pressure-contract.js +70 -0
  85. package/dist/core/diagnostics/pressure.d.ts +25 -0
  86. package/dist/core/diagnostics/pressure.d.ts.map +1 -0
  87. package/dist/core/diagnostics/pressure.js +1138 -0
  88. package/dist/core/diagnostics/replay.d.ts.map +1 -1
  89. package/dist/core/diagnostics/replay.js +90 -10
  90. package/dist/core/events/v3/adapter-id.d.ts +6 -0
  91. package/dist/core/events/v3/adapter-id.d.ts.map +1 -0
  92. package/dist/core/events/v3/adapter-id.js +7 -0
  93. package/dist/core/events/v3/archive-retention.d.ts.map +1 -1
  94. package/dist/core/events/v3/archive-retention.js +3 -2
  95. package/dist/core/events/v3/bootstrap.d.ts +41 -4
  96. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  97. package/dist/core/events/v3/bootstrap.js +120 -17
  98. package/dist/core/events/v3/capabilities.d.ts +16 -9
  99. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  100. package/dist/core/events/v3/capabilities.js +37 -2
  101. package/dist/core/events/v3/capability-drift.d.ts +2 -2
  102. package/dist/core/events/v3/capability-drift.d.ts.map +1 -1
  103. package/dist/core/events/v3/control-witness.d.ts +48 -5
  104. package/dist/core/events/v3/control-witness.d.ts.map +1 -1
  105. package/dist/core/events/v3/control-witness.js +91 -36
  106. package/dist/core/events/v3/control.d.ts.map +1 -1
  107. package/dist/core/events/v3/control.js +22 -2
  108. package/dist/core/events/v3/index.d.ts +2 -1
  109. package/dist/core/events/v3/index.d.ts.map +1 -1
  110. package/dist/core/events/v3/index.js +2 -1
  111. package/dist/core/events/v3/live-feed.d.ts +7 -1
  112. package/dist/core/events/v3/live-feed.d.ts.map +1 -1
  113. package/dist/core/events/v3/live-feed.js +21 -3
  114. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  115. package/dist/core/events/v3/live-routing.js +10 -2
  116. package/dist/core/events/v3/producers/command-recorder.d.ts +2 -2
  117. package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
  118. package/dist/core/events/v3/producers/command-recorder.js +2 -1
  119. package/dist/core/events/v3/producers/coordination-recorder.d.ts +2 -2
  120. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  121. package/dist/core/events/v3/producers/coordination-recorder.js +2 -1
  122. package/dist/core/events/v3/producers/hook-base.d.ts +2 -2
  123. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  124. package/dist/core/events/v3/producers/hook-base.js +15 -5
  125. package/dist/core/events/v3/producers/hook.d.ts.map +1 -1
  126. package/dist/core/events/v3/producers/hook.js +17 -4
  127. package/dist/core/events/v3/producers/intake.d.ts +4 -4
  128. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  129. package/dist/core/events/v3/producers/intake.js +3 -2
  130. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -1
  131. package/dist/core/events/v3/producers/producer-state-observer.js +2 -1
  132. package/dist/core/events/v3/producers/recorder.d.ts +16 -5
  133. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  134. package/dist/core/events/v3/producers/recorder.js +31 -9
  135. package/dist/core/events/v3/reader.d.ts.map +1 -1
  136. package/dist/core/events/v3/reader.js +10 -13
  137. package/dist/core/events/v3/runtime-build.d.ts.map +1 -1
  138. package/dist/core/events/v3/runtime-build.js +3 -2
  139. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +2 -2
  140. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
  141. package/dist/core/events/v3/turn-telemetry.d.ts +2 -2
  142. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  143. package/dist/core/hooks/adapter/output.d.ts +16 -14
  144. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  145. package/dist/core/hooks/adapter/output.js +36 -38
  146. package/dist/core/hooks/backup-schedule.d.ts +34 -0
  147. package/dist/core/hooks/backup-schedule.d.ts.map +1 -0
  148. package/dist/core/hooks/backup-schedule.js +114 -0
  149. package/dist/core/hooks/cli.js +61 -18
  150. package/dist/core/hooks/codex-wsl-bridge.d.ts +2 -0
  151. package/dist/core/hooks/codex-wsl-bridge.d.ts.map +1 -1
  152. package/dist/core/hooks/codex-wsl-bridge.js +18 -4
  153. package/dist/core/hooks/index.d.ts +1 -0
  154. package/dist/core/hooks/index.d.ts.map +1 -1
  155. package/dist/core/hooks/index.js +1 -0
  156. package/dist/core/hooks/prompt-context/contract.d.ts +61 -0
  157. package/dist/core/hooks/prompt-context/contract.d.ts.map +1 -0
  158. package/dist/core/hooks/prompt-context/contract.js +102 -0
  159. package/dist/core/hooks/prompt-context/index.d.ts +5 -0
  160. package/dist/core/hooks/prompt-context/index.d.ts.map +1 -0
  161. package/dist/core/hooks/prompt-context/index.js +2 -0
  162. package/dist/core/hooks/prompt-context/runner.d.ts +24 -0
  163. package/dist/core/hooks/prompt-context/runner.d.ts.map +1 -0
  164. package/dist/core/hooks/prompt-context/runner.js +249 -0
  165. package/dist/core/qa-artifacts.d.ts +3 -0
  166. package/dist/core/qa-artifacts.d.ts.map +1 -1
  167. package/dist/core/qa-artifacts.js +25 -3
  168. package/dist/core/resources/contract.d.ts +69 -3
  169. package/dist/core/resources/contract.d.ts.map +1 -1
  170. package/dist/core/resources/contract.js +1 -1
  171. package/dist/core/resources/index.d.ts +1 -0
  172. package/dist/core/resources/index.d.ts.map +1 -1
  173. package/dist/core/resources/index.js +1 -0
  174. package/dist/core/resources/native.d.ts +36 -0
  175. package/dist/core/resources/native.d.ts.map +1 -0
  176. package/dist/core/resources/native.js +418 -0
  177. package/dist/core/resources/sampler.d.ts +2 -0
  178. package/dist/core/resources/sampler.d.ts.map +1 -1
  179. package/dist/core/resources/sampler.js +31 -1
  180. package/dist/core/resources/status.d.ts +61 -0
  181. package/dist/core/resources/status.d.ts.map +1 -0
  182. package/dist/core/resources/status.js +536 -0
  183. package/dist/core/resources/system.d.ts +27 -0
  184. package/dist/core/resources/system.d.ts.map +1 -0
  185. package/dist/core/resources/system.js +439 -0
  186. package/dist/core/semantic/contract.d.ts +13 -13
  187. package/dist/core/semantic/service.d.ts +2 -0
  188. package/dist/core/semantic/service.d.ts.map +1 -1
  189. package/dist/core/semantic/service.js +27 -4
  190. package/dist/core/storage/builtins.js +41 -0
  191. package/dist/core/supervisor/contract.d.ts +41 -3
  192. package/dist/core/supervisor/contract.d.ts.map +1 -1
  193. package/dist/core/supervisor/contract.js +3 -2
  194. package/dist/core/supervisor/findings.d.ts +3 -0
  195. package/dist/core/supervisor/findings.d.ts.map +1 -1
  196. package/dist/core/supervisor/findings.js +88 -0
  197. package/dist/core/supervisor/history.d.ts.map +1 -1
  198. package/dist/core/supervisor/history.js +14 -0
  199. package/dist/core/supervisor/ledger-state.d.ts +55 -0
  200. package/dist/core/supervisor/ledger-state.d.ts.map +1 -0
  201. package/dist/core/supervisor/ledger-state.js +0 -0
  202. package/dist/core/supervisor/service.d.ts.map +1 -1
  203. package/dist/core/supervisor/service.js +120 -7
  204. package/dist/core/supervisor/storage.d.ts +3 -1
  205. package/dist/core/supervisor/storage.d.ts.map +1 -1
  206. package/dist/core/supervisor/storage.js +4 -0
  207. package/dist/core/workflow/admission.d.ts +3 -0
  208. package/dist/core/workflow/admission.d.ts.map +1 -1
  209. package/dist/core/workflow/admission.js +28 -16
  210. package/dist/core/workflow/engine.js +2 -2
  211. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  212. package/dist/core/workflow/live-session-v3.js +6 -1
  213. package/dist/core/workflow/proof.d.ts.map +1 -1
  214. package/dist/core/workflow/proof.js +4 -3
  215. package/dist/lib/browser/capture-fidelity.d.ts +7 -0
  216. package/dist/lib/browser/capture-fidelity.d.ts.map +1 -1
  217. package/dist/lib/browser/capture-fidelity.js +17 -0
  218. package/dist/lib/browser/client.d.ts +9 -0
  219. package/dist/lib/browser/client.d.ts.map +1 -1
  220. package/dist/lib/browser/client.js +85 -37
  221. package/dist/lib/browser/index.d.ts +3 -1
  222. package/dist/lib/browser/index.d.ts.map +1 -1
  223. package/dist/lib/browser/index.js +2 -1
  224. package/dist/lib/browser/page-review-budget.d.ts +13 -0
  225. package/dist/lib/browser/page-review-budget.d.ts.map +1 -0
  226. package/dist/lib/browser/page-review-budget.js +251 -0
  227. package/dist/lib/browser/page-review-contracts.d.ts +127 -0
  228. package/dist/lib/browser/page-review-contracts.d.ts.map +1 -0
  229. package/dist/lib/browser/page-review-contracts.js +5 -0
  230. package/dist/lib/browser/page-review-evidence.d.ts +48 -0
  231. package/dist/lib/browser/page-review-evidence.d.ts.map +1 -0
  232. package/dist/lib/browser/page-review-evidence.js +340 -0
  233. package/dist/lib/browser/page-review-judge.d.ts +1 -1
  234. package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
  235. package/dist/lib/browser/page-review-judge.js +46 -38
  236. package/dist/lib/browser/page-review-pack.d.ts +44 -22
  237. package/dist/lib/browser/page-review-pack.d.ts.map +1 -1
  238. package/dist/lib/browser/page-review-pack.js +116 -36
  239. package/dist/lib/browser/page-review-source.d.ts +12 -0
  240. package/dist/lib/browser/page-review-source.d.ts.map +1 -0
  241. package/dist/lib/browser/page-review-source.js +22 -0
  242. package/dist/lib/browser/qa-run-contracts.d.ts +35 -9
  243. package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
  244. package/dist/lib/browser/qa-run-contracts.js +48 -14
  245. package/dist/lib/browser/qa-run.d.ts.map +1 -1
  246. package/dist/lib/browser/qa-run.js +215 -68
  247. package/dist/lib/browser/qa-snapshot.d.ts +6 -0
  248. package/dist/lib/browser/qa-snapshot.d.ts.map +1 -1
  249. package/dist/lib/browser/qa-snapshot.js +259 -48
  250. package/dist/lib/browser/review-capture-transaction.d.ts +13 -0
  251. package/dist/lib/browser/review-capture-transaction.d.ts.map +1 -0
  252. package/dist/lib/browser/review-capture-transaction.js +79 -0
  253. package/dist/lib/browser/standalone-html.d.ts.map +1 -1
  254. package/dist/lib/browser/standalone-html.js +4 -2
  255. package/dist/lib/browser/thumbnail-association.d.ts +34 -0
  256. package/dist/lib/browser/thumbnail-association.d.ts.map +1 -0
  257. package/dist/lib/browser/thumbnail-association.js +158 -0
  258. package/dist/lib/browser/tiling.d.ts +30 -0
  259. package/dist/lib/browser/tiling.d.ts.map +1 -1
  260. package/dist/lib/browser/tiling.js +38 -0
  261. package/dist/lib/docs-metadata-managed.d.ts.map +1 -1
  262. package/dist/lib/docs-metadata-managed.js +4 -1
  263. package/dist/lib/identities/assume.d.ts.map +1 -1
  264. package/dist/lib/identities/assume.js +7 -1
  265. package/dist/lib/instructions/templates.d.ts.map +1 -1
  266. package/dist/lib/instructions/templates.js +1 -0
  267. package/dist/lib/local-file-url.d.ts +12 -0
  268. package/dist/lib/local-file-url.d.ts.map +1 -1
  269. package/dist/lib/local-file-url.js +16 -2
  270. package/dist/lib/tunnel/state.d.ts +19 -4
  271. package/dist/lib/tunnel/state.d.ts.map +1 -1
  272. package/dist/lib/tunnel/state.js +53 -13
  273. package/package.json +7 -4
  274. package/schemas/config.schema.json +69 -2
  275. package/src/commands/agents.ts +42 -9
  276. package/src/commands/artifacts.ts +130 -6
  277. package/src/commands/backup.ts +287 -34
  278. package/src/commands/browse.ts +564 -267
  279. package/src/commands/diagnostics.ts +6 -3
  280. package/src/commands/ledger-v3.ts +20 -3
  281. package/src/commands/qa-run.ts +37 -3
  282. package/src/commands/qa-status.ts +11 -2
  283. package/src/commands/resources.ts +23 -3
  284. package/src/commands/review-pack.ts +165 -62
  285. package/src/commands/tunnel.ts +2 -1
  286. package/src/core/agents/canonical-emit.ts +4 -2
  287. package/src/core/agents/cli.ts +14 -6
  288. package/src/core/agents/live-authority-v3.ts +7 -3
  289. package/src/core/agents/live-lifecycle-v3.ts +2 -2
  290. package/src/core/agents/render/prompt-context.ts +68 -14
  291. package/src/core/agents/session-finalizer-v3.ts +2 -2
  292. package/src/core/agents/state/live-coordination-view.ts +4 -4
  293. package/src/core/agents/state/names.ts +92 -7
  294. package/src/core/agents/state/stale-sweep.ts +22 -8
  295. package/src/core/agents/turn-elapsed.ts +135 -0
  296. package/src/core/artifacts/activity.ts +71 -0
  297. package/src/core/artifacts/delivery-card.ts +375 -0
  298. package/src/core/artifacts/index.ts +385 -91
  299. package/src/core/artifacts/mutation-lock.ts +106 -0
  300. package/src/core/backup/host-snapshot.ts +76 -0
  301. package/src/core/config.ts +66 -13
  302. package/src/core/diagnostics/advice.ts +148 -120
  303. package/src/core/diagnostics/bundle.ts +138 -52
  304. package/src/core/diagnostics/comparison.ts +6 -2
  305. package/src/core/diagnostics/contract.ts +39 -42
  306. package/src/core/diagnostics/index.ts +2 -0
  307. package/src/core/diagnostics/pressure-contract.ts +294 -0
  308. package/src/core/diagnostics/pressure.ts +1361 -0
  309. package/src/core/diagnostics/replay.ts +116 -11
  310. package/src/core/events/v3/adapter-id.ts +12 -0
  311. package/src/core/events/v3/archive-retention.ts +3 -6
  312. package/src/core/events/v3/bootstrap.ts +163 -16
  313. package/src/core/events/v3/capabilities.ts +75 -25
  314. package/src/core/events/v3/capability-drift.ts +2 -2
  315. package/src/core/events/v3/control-witness.ts +172 -41
  316. package/src/core/events/v3/control.ts +34 -2
  317. package/src/core/events/v3/index.ts +3 -0
  318. package/src/core/events/v3/live-feed.ts +23 -5
  319. package/src/core/events/v3/live-routing.ts +14 -2
  320. package/src/core/events/v3/producers/command-recorder.ts +4 -4
  321. package/src/core/events/v3/producers/coordination-recorder.ts +4 -4
  322. package/src/core/events/v3/producers/hook-base.ts +21 -16
  323. package/src/core/events/v3/producers/hook.ts +21 -4
  324. package/src/core/events/v3/producers/intake.ts +6 -6
  325. package/src/core/events/v3/producers/producer-state-observer.ts +2 -1
  326. package/src/core/events/v3/producers/recorder.ts +50 -21
  327. package/src/core/events/v3/reader.ts +14 -13
  328. package/src/core/events/v3/runtime-build.ts +3 -2
  329. package/src/core/events/v3/runtime-telemetry-capabilities.ts +3 -3
  330. package/src/core/events/v3/turn-telemetry.ts +4 -4
  331. package/src/core/hooks/adapter/output.ts +50 -36
  332. package/src/core/hooks/backup-schedule.ts +147 -0
  333. package/src/core/hooks/cli.ts +65 -14
  334. package/src/core/hooks/codex-wsl-bridge.ts +21 -5
  335. package/src/core/hooks/index.ts +1 -0
  336. package/src/core/hooks/prompt-context/contract.ts +177 -0
  337. package/src/core/hooks/prompt-context/index.ts +22 -0
  338. package/src/core/hooks/prompt-context/runner.ts +303 -0
  339. package/src/core/qa-artifacts.ts +29 -3
  340. package/src/core/resources/contract.ts +76 -3
  341. package/src/core/resources/index.ts +1 -0
  342. package/src/core/resources/native.ts +481 -0
  343. package/src/core/resources/sampler.ts +46 -1
  344. package/src/core/resources/status.ts +717 -0
  345. package/src/core/resources/system.ts +530 -0
  346. package/src/core/semantic/service.ts +37 -3
  347. package/src/core/storage/builtins.ts +41 -0
  348. package/src/core/supervisor/contract.ts +45 -3
  349. package/src/core/supervisor/findings.ts +159 -0
  350. package/src/core/supervisor/history.ts +15 -0
  351. package/src/core/supervisor/ledger-state.ts +0 -0
  352. package/src/core/supervisor/service.ts +133 -5
  353. package/src/core/supervisor/storage.ts +7 -0
  354. package/src/core/workflow/admission.ts +33 -17
  355. package/src/core/workflow/engine.ts +2 -2
  356. package/src/core/workflow/live-session-v3.ts +6 -8
  357. package/src/core/workflow/proof.ts +4 -3
  358. package/src/lib/browser/capture-fidelity.ts +23 -0
  359. package/src/lib/browser/client.ts +96 -44
  360. package/src/lib/browser/index.ts +15 -1
  361. package/src/lib/browser/page-review-budget.ts +309 -0
  362. package/src/lib/browser/page-review-contracts.ts +129 -0
  363. package/src/lib/browser/page-review-evidence.ts +465 -0
  364. package/src/lib/browser/page-review-judge.ts +56 -40
  365. package/src/lib/browser/page-review-pack.ts +181 -43
  366. package/src/lib/browser/page-review-source.ts +30 -0
  367. package/src/lib/browser/qa-run-contracts.ts +62 -18
  368. package/src/lib/browser/qa-run.ts +259 -71
  369. package/src/lib/browser/qa-snapshot.ts +289 -48
  370. package/src/lib/browser/review-capture-transaction.ts +106 -0
  371. package/src/lib/browser/standalone-html.ts +4 -2
  372. package/src/lib/browser/thumbnail-association.ts +190 -0
  373. package/src/lib/browser/tiling.ts +63 -0
  374. package/src/lib/docs-metadata-managed.ts +4 -1
  375. package/src/lib/identities/assume.ts +12 -4
  376. package/src/lib/instructions/templates.ts +1 -0
  377. package/src/lib/local-file-url.ts +17 -2
  378. package/src/lib/tunnel/state.ts +70 -13
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/commands/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAyB1E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAiKN"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/commands/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AA0B1E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAmKN"}
@@ -1,6 +1,7 @@
1
1
  import { monorepoRoot, resolveOwner } from "../core/agents/index.js";
2
2
  import { readLiveCoordinationRow } from "../core/agents/state/live-coordination-view.js";
3
3
  import { buildDiagnosticAdvice, captureDiagnosticBundle, compareDiagnosticBundles, DIAGNOSTIC_COMMAND_SCHEMA_VERSION, listDiagnosticBundles, renderDiagnosticBundleComparison, replayDiagnosticBundle, showDiagnosticBundle, } from "../core/diagnostics/index.js";
4
+ import { readPublishedPressure } from "../core/resources/status.js";
4
5
  import { buildSupervisorTimeline, explainSupervisorFinding, readSupervisorExplanation, readSupervisorFindings, readSupervisorStatus, readSupervisorTimeline, } from "../core/supervisor/index.js";
5
6
  export function registerDiagnosticsCommand(program, emit, context) {
6
7
  const root = program
@@ -82,14 +83,16 @@ export function registerDiagnosticsCommand(program, emit, context) {
82
83
  }
83
84
  const report = readSupervisorFindings(repoRoot);
84
85
  const findings = mergeFindings(report?.active ?? [], report?.transitions ?? []);
85
- const sourceCapability = liveFindingsCapability(repoRoot, report !== undefined);
86
+ const published = readPublishedPressure(repoRoot);
86
87
  emit.data({
87
88
  schema_version: DIAGNOSTIC_COMMAND_SCHEMA_VERSION,
88
89
  kind: "diagnostic_advice",
89
90
  source: { mode: "live" },
90
91
  advice: buildDiagnosticAdvice({
91
- findings,
92
- sourceCapability,
92
+ assessment: published.assessment,
93
+ priorHysteresis: published.prior_hysteresis,
94
+ sourceCapability: published.capability,
95
+ activeFindingCount: findings.filter((finding) => finding.state === "opened").length,
93
96
  evaluatedAt: new Date().toISOString(),
94
97
  }),
95
98
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-v3.d.ts","sourceRoot":"","sources":["../../src/commands/ledger-v3.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAsC1E,2DAA2D;AAC3D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAiaN"}
1
+ {"version":3,"file":"ledger-v3.d.ts","sourceRoot":"","sources":["../../src/commands/ledger-v3.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAuC1E,2DAA2D;AAC3D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAgbN"}
@@ -3,7 +3,7 @@ import { createHash } from "node:crypto";
3
3
  import { existsSync, mkdirSync, readFileSync } from "node:fs";
4
4
  import { resolve } from "node:path";
5
5
  import { compressSealedLegacyV1Segments, inventoryLegacyV1Segments, streamLegacyV1Rows, verifyLegacyV1HardFence, writeLegacyV1Canary, } from "../core/events/legacy-storage/index.js";
6
- import { cleanEventV3Archives, initializeEventLedgerV3, inventoryEventV3Archives, readEventV3ControlState, recoverInvalidEventLedgerV3, sha256V3, } from "../core/events/v3/index.js";
6
+ import { cleanEventV3Archives, initializeEventLedgerV3, inventoryEventV3Archives, listHookProducerStateRecordsV3, readEventV3ControlState, recoverInvalidEventLedgerV3, sha256V3, } from "../core/events/v3/index.js";
7
7
  import { authorizeEventV3SupportReplacement, inventoryEventV3Support, planEventV3SupportReplacement, planEventV3SupportTransaction, readEventV3SupportPackManifest, readEventV3SupportTransaction, streamEventV3SupportPackRecords, unpackEventV3SupportPack, verifyEventV3SupportTransactionShadow, writeEventV3SupportTransactionShadow, } from "../core/events/v3/support-storage/index.js";
8
8
  /** Inspect or initialize the universal V3 event ledger. */
9
9
  export function registerLedgerV3Command(program, emit, context) {
@@ -13,9 +13,24 @@ export function registerLedgerV3Command(program, emit, context) {
13
13
  command
14
14
  .command("status")
15
15
  .description("Read the V3 control boundary without changing it")
16
- .action(() => {
16
+ .option("--root <path>", "Explicit coordination root")
17
+ .action((options) => {
17
18
  try {
18
- emit.data(readEventV3ControlState(coordRoot(context)));
19
+ const root = resolve(options.root ?? coordRoot(context));
20
+ const control = readEventV3ControlState(root);
21
+ const producers = listHookProducerStateRecordsV3(root, { includeTerminal: true });
22
+ const counts = producers.reduce((summary, record) => {
23
+ summary[record.state.adapter] = (summary[record.state.adapter] ?? 0) + 1;
24
+ return summary;
25
+ }, {});
26
+ emit.data({
27
+ ...control,
28
+ summary: {
29
+ adapters: Object.keys(counts).sort(),
30
+ producer_states: producers.length,
31
+ producer_states_by_adapter: counts,
32
+ },
33
+ });
19
34
  }
20
35
  catch (error) {
21
36
  emitFailure(emit, "ledger_v3_status_failed", error);
@@ -375,7 +390,8 @@ export function registerLedgerV3Command(program, emit, context) {
375
390
  });
376
391
  }
377
392
  function coordRoot(context) {
378
- return resolve(context?.resolveCoordRoot?.() ??
393
+ return resolve(process.env.HARNERY_COORD_ROOT_OVERRIDE ??
394
+ context?.resolveCoordRoot?.() ??
379
395
  context?.repoRoot ??
380
396
  process.env.HARNERY_COORD_ROOT ??
381
397
  process.cwd());
@@ -1 +1 @@
1
- {"version":3,"file":"qa-run.d.ts","sourceRoot":"","sources":["../../src/commands/qa-run.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AA0B1E,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,sDAAsD;AACtD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAmB/C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAwbN"}
1
+ {"version":3,"file":"qa-run.d.ts","sourceRoot":"","sources":["../../src/commands/qa-run.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AA8B1E,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,sDAAsD;AACtD,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAqB/C,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAodN"}
@@ -9,7 +9,7 @@ import { Option } from "commander";
9
9
  import { recordQaSignal } from "../core/agents/qa-signal.js";
10
10
  import { artifactsRoot } from "../core/artifacts/index.js";
11
11
  import { resolveBinName, reviewPackAutoCleanEnabled } from "../core/config.js";
12
- import { createManagedQaOutParent, resolveQaRepoRoot } from "../core/qa-artifacts.js";
12
+ import { createManagedQaOutParent, managedQaReviewGuidance, resolveQaRepoRoot, } from "../core/qa-artifacts.js";
13
13
  import { acquireAdmission, admissionBaseDir, admissionStatus } from "../lib/admission.js";
14
14
  import { deleteExpiredPacks, PAGE_REVIEW_DEFAULT_RETENTION_MINUTES, } from "../lib/browser/page-review-pack.js";
15
15
  import { QA_RUN_JOB_FILENAME, QA_RUN_RESULT_FILENAME, QA_RUN_STATUS_FILENAME, runQaMatrix, } from "../lib/browser/qa-run.js";
@@ -35,6 +35,8 @@ export function registerQaRunCommand(program, emit, context) {
35
35
  "always run serially; the judge pool is policy.critique_pool / --pool.")
36
36
  .option("--pool <n>", "Vision calls in flight during the judge stage, across every context (1-16; default: " +
37
37
  "the provider's own concurrency). Sets policy.critique_pool.")
38
+ .option("--tile-budget <n>", "Maximum native tiles across the complete review pack (8-400; default 96).")
39
+ .option("--accept-dispositions", "Apply fully reviewed prior decisions only to identical findings on identical native tiles.")
38
40
  .option("--allow-metered", "Permit the critique provider's metered-API fallback. Default: subscription-backed " +
39
41
  "headless harnesses only — exhaustion becomes an incomplete blocker, never a metered call.")
40
42
  .option("--retain <minutes>", `Minutes the run's page review pack lives after the judge finishes before the whole ` +
@@ -125,6 +127,20 @@ export function registerQaRunCommand(program, emit, context) {
125
127
  return;
126
128
  }
127
129
  const policy = { ...validation.job.policy };
130
+ if (opts.tileBudget !== undefined) {
131
+ const n = Number(opts.tileBudget);
132
+ if (!Number.isInteger(n) || n < 8 || n > 400) {
133
+ emit.error({
134
+ code: "qa_run_invalid_tile_budget",
135
+ message: "--tile-budget must be an integer between 8 and 400",
136
+ });
137
+ process.exitCode = 1;
138
+ return;
139
+ }
140
+ policy.critique_tile_budget = n;
141
+ }
142
+ if (opts.acceptDispositions)
143
+ policy.accept_dispositions = true;
128
144
  if (opts.concurrency !== undefined) {
129
145
  const n = Number.parseInt(opts.concurrency, 10);
130
146
  if (!Number.isInteger(n) || n < 1 || n > 8) {
@@ -183,7 +199,9 @@ export function registerQaRunCommand(program, emit, context) {
183
199
  outParent =
184
200
  opts.outDir !== undefined
185
201
  ? resolve(opts.outDir)
186
- : createManagedQaOutParent(repoRoot, "qa-run");
202
+ : createManagedQaOutParent(repoRoot, "qa-run", {
203
+ onCleanupWarning: (message) => emit.log(message, "warn"),
204
+ });
187
205
  }
188
206
  catch (err) {
189
207
  emit.error({
@@ -258,6 +276,8 @@ export function registerQaRunCommand(program, emit, context) {
258
276
  job.mode,
259
277
  ...(opts.concurrency !== undefined ? ["--concurrency", opts.concurrency] : []),
260
278
  ...(opts.pool !== undefined ? ["--pool", opts.pool] : []),
279
+ ...(opts.tileBudget !== undefined ? ["--tile-budget", opts.tileBudget] : []),
280
+ ...(opts.acceptDispositions ? ["--accept-dispositions"] : []),
261
281
  ...(opts.allowMetered ? ["--allow-metered"] : []),
262
282
  ...(opts.retain !== undefined ? ["--retain", opts.retain] : []),
263
283
  "--out-dir",
@@ -372,8 +392,11 @@ export function registerQaRunCommand(program, emit, context) {
372
392
  // session sees the runner clock instead of inferring QA time from
373
393
  // session age. Best-effort by contract: never throws.
374
394
  recordQaSignal(result);
395
+ const afterReview = managedQaReviewGuidance(repoRoot, outParent);
375
396
  if (opts.json)
376
- emit.data(result);
397
+ emit.data({ ...result, ...(afterReview ? { after_review: afterReview } : {}) });
398
+ if (afterReview)
399
+ emit.log(afterReview, "info");
377
400
  const resultPath = join(result.run.out_dir, QA_RUN_RESULT_FILENAME);
378
401
  for (const blocker of result.blockers) {
379
402
  emit.log(`blocker [${blocker.stage}${blocker.context_id ? ` ${blocker.context_id}` : ""}]: ${blocker.reason}`, "warn");
@@ -1 +1 @@
1
- {"version":3,"file":"qa-status.d.ts","sourceRoot":"","sources":["../../src/commands/qa-status.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAc1E,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;AAG5C;0DAC0D;AAC1D,eAAO,MAAM,4BAA4B,SAAU,CAAC;AAsCpD,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6B3F;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAkErF;AAMD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;IAClB;qCACiC;IACjC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAQjC;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,sBAAsB,CAiK3F;AAkHD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAiGN"}
1
+ {"version":3,"file":"qa-status.d.ts","sourceRoot":"","sources":["../../src/commands/qa-status.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAkB1E,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;AAG5C;0DAC0D;AAC1D,eAAO,MAAM,4BAA4B,SAAU,CAAC;AAsCpD,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6B3F;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAkErF;AAMD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAC;IAClB;qCACiC;IACjC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACpC,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAQjC;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,sBAAsB,CAiK3F;AAkHD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAsGN"}
@@ -8,7 +8,7 @@
8
8
  // machine-wide admission queue instead of any one run.
9
9
  import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
10
10
  import { dirname, join, resolve } from "node:path";
11
- import { latestManagedQaRun, resolveQaRepoRoot } from "../core/qa-artifacts.js";
11
+ import { latestManagedQaRun, managedQaReviewGuidance, resolveQaRepoRoot, } from "../core/qa-artifacts.js";
12
12
  import { admissionBaseDir, admissionStatus, pidAlive as defaultPidAlive, listAdmissionResources, } from "../lib/admission.js";
13
13
  import { QA_RUN_LATEST_FILENAME, QA_RUN_RESULT_FILENAME, QA_RUN_STATUS_FILENAME, } from "../lib/browser/qa-run.js";
14
14
  import { QA_RUN_STAGES, } from "../lib/browser/qa-run-contracts.js";
@@ -461,9 +461,14 @@ export function registerQaStatusCommand(program, emit, context) {
461
461
  const report = outcome.report;
462
462
  const settled = report.terminal || report.state === "dead";
463
463
  if (settled || !opts.wait) {
464
+ const afterReview = report.terminal
465
+ ? managedQaReviewGuidance(resolveQaRepoRoot(context), dirname(runDir))
466
+ : undefined;
464
467
  if (opts.json)
465
- emit.data(report);
468
+ emit.data({ ...report, ...(afterReview ? { after_review: afterReview } : {}) });
466
469
  renderReport(emit, report);
470
+ if (afterReview)
471
+ emit.log(afterReview, "info");
467
472
  if (!settled && !opts.wait) {
468
473
  emit.log("still in progress; rerun with --wait to block until the run settles", "info");
469
474
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/commands/resources.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAgBN"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/commands/resources.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAoCN"}
@@ -1,15 +1,35 @@
1
1
  import { resolve } from "node:path";
2
- import { sampleResources } from "../core/resources/index.js";
2
+ import { formatResourceStatus, readResourceStatus } from "../core/resources/status.js";
3
3
  export function registerResourcesCommand(program, emit, context) {
4
4
  const resources = program
5
5
  .command("resources")
6
- .description("Observe local CPU and memory pressure by agent and process tree");
6
+ .description("Observe local CPU, memory, disk capacity, and resource pressure");
7
+ resources
8
+ .command("status")
9
+ .description("Read the supervisor's cached resource measurements without sampling")
10
+ .option("--root <path>", "Explicit coordination root")
11
+ .option("--json", "Bounded structured output")
12
+ .option("--processes", "Include up to 20 processes, largest memory first")
13
+ .action((options) => {
14
+ const status = readResourceStatus(resolve(options.root ?? coordRoot(context)), {
15
+ includeProcesses: options.processes,
16
+ });
17
+ if (options.json) {
18
+ emit.config({ format: "json" });
19
+ emit.data(status);
20
+ }
21
+ else {
22
+ emit.config({ format: "text" });
23
+ emit.text(formatResourceStatus(status, program.name()));
24
+ }
25
+ });
7
26
  resources
8
27
  .command("snapshot")
9
28
  .description("Capture one machine and process-resource snapshot")
10
29
  .option("--root <path>", "Explicit coordination root")
11
- .action((options) => {
30
+ .action(async (options) => {
12
31
  try {
32
+ const { sampleResources } = await import("../core/resources/sampler.js");
13
33
  emit.data(sampleResources(resolve(options.root ?? coordRoot(context))).snapshot);
14
34
  }
15
35
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"review-pack.d.ts","sourceRoot":"","sources":["../../src/commands/review-pack.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AA4U1E,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAu6BN"}
1
+ {"version":3,"file":"review-pack.d.ts","sourceRoot":"","sources":["../../src/commands/review-pack.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAkV1E,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAugCN"}
@@ -3,12 +3,16 @@
3
3
  // and judge one from disk through one bounded pool of vision calls. qa-run
4
4
  // composes the same two library halves; this command exposes them directly
5
5
  // so an agent can prepare a page for review, or review a pack, on its own.
6
- import { mkdirSync, writeFileSync } from "node:fs";
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
7
+ import { userInfo } from "node:os";
7
8
  import { resolve } from "node:path";
9
+ import { resolveOwner } from "../core/agents/index.js";
10
+ import { readLiveCoordinationRow } from "../core/agents/state/live-coordination-view.js";
8
11
  import { artifactsRoot } from "../core/artifacts/index.js";
9
12
  import { resolveBinName, reviewPackAutoCleanEnabled } from "../core/config.js";
10
13
  import { createManagedQaOutParent, resolveQaRepoRoot } from "../core/qa-artifacts.js";
11
14
  import { DEFAULT_CRITIQUE_RUBRIC } from "../lib/browser/critique.js";
15
+ import { persistPackReviewDecisions } from "../lib/browser/page-review-evidence.js";
12
16
  import { judgePageReviewPack, toCritiqueRecords } from "../lib/browser/page-review-judge.js";
13
17
  import { aggregateMachineOutcome, deleteExpiredPacks, expandedTileFilename, finalizePageReviewPack, findPackTile, findPageReviewPacks, isPackDeletable, listPackContexts, machineFindingTargets, PAGE_REVIEW_DEFAULT_RETENTION_MINUTES, PAGE_REVIEW_DISPOSITIONS, PAGE_REVIEW_FINDING_CATEGORIES, PAGE_REVIEW_FINDING_SEVERITIES, PAGE_REVIEW_SUBAGENT_MODELS, PAGE_REVIEW_VERDICT_SCHEMA, packPaths, readPackContext, readPackFindings, readPackInspectionPlan, readPackManifest, readPackVerdict, resolvePackVerdict, validateFindingsDocument, writePackFindings, } from "../lib/browser/page-review-pack.js";
14
18
  import { defaultQaRunExec, QA_RUN_HEADLESS_ONLY_ENV } from "../lib/browser/qa-run.js";
@@ -201,8 +205,7 @@ export function registerReviewPackCommand(program, emit, context) {
201
205
  .option("--context <spec>", "Rendering context <viewport>[:<theme>[:<state>]] (repeatable; default desktop and " +
202
206
  "mobile in light and dark).", (value, previous = []) => [...previous, value], [])
203
207
  .option("--scope <selector>", "Also tile one screenshot per element matching <selector> (repeatable).", (value, previous = []) => [...previous, value], [])
204
- .option("--no-bands", "Keep only --scope tiles; skip full-page bands.")
205
- .option("--max-tiles <n>", "Full-page band cap per context (browse --check-critique-max-tiles).")
208
+ .option("--max-tiles <n>", "Native tile cap per context, including required top and bottom bands.")
206
209
  .option("--concurrency <n>", "Concurrent capture browsers (1-8; default 2).", "2")
207
210
  .option("--timeout <ms>", "Per-capture timeout in milliseconds (default 120000).", "120000")
208
211
  .option("--retain <minutes>", `Minutes the pack lives before the whole directory is deleted (1-43200; default ` +
@@ -287,7 +290,6 @@ export function registerReviewPackCommand(program, emit, context) {
287
290
  ctx.theme,
288
291
  "--qa-state",
289
292
  ctx.state,
290
- ...(opts.noBands ? ["--no-review-pack-bands"] : []),
291
293
  ...(opts.scope ?? []).flatMap((selector) => ["--review-pack-scope", selector]),
292
294
  ...(opts.maxTiles !== undefined ? ["--check-critique-max-tiles", opts.maxTiles] : []),
293
295
  ];
@@ -434,13 +436,14 @@ export function registerReviewPackCommand(program, emit, context) {
434
436
  const merged = new Map((manifest.critique ?? []).map((row) => [row.context_id, row]));
435
437
  for (const row of toCritiqueRecords(result))
436
438
  merged.set(row.context_id, row);
439
+ const judgedRecords = new Map(result.contexts.map((row) => [row.context_id, row.record]));
437
440
  finalizePageReviewPack({
438
441
  packDir,
439
442
  target: manifest.target,
440
443
  ...(manifest.tested_revision !== undefined
441
444
  ? { tested_revision: manifest.tested_revision }
442
445
  : {}),
443
- contexts: manifest.contexts,
446
+ contexts: manifest.contexts.map((record) => judgedRecords.get(record.id) ?? record),
444
447
  gates: manifest.gates,
445
448
  critique: [...merged.values()],
446
449
  pool: result.pool,
@@ -696,6 +699,23 @@ export function registerReviewPackCommand(program, emit, context) {
696
699
  .option("--json", "Print the summary as JSON.")
697
700
  .action((dir, opts) => {
698
701
  const packDir = resolve(dir);
702
+ const stubPath = resolve(packDir, "pack-expired.json");
703
+ if (existsSync(stubPath)) {
704
+ try {
705
+ const stub = JSON.parse(readFileSync(stubPath, "utf8"));
706
+ if (stub.schema !== "harnery-page-review-expired/v1")
707
+ throw new Error("Unknown expired pack schema");
708
+ if (opts.json)
709
+ emit.data(stub);
710
+ else
711
+ emit.log(`expired pack: ${stub.target}; machine ${stub.machine_outcome ?? "not judged"}; reviewed ${stub.result?.reviewed_outcome ?? "no verdict"}`, "info");
712
+ }
713
+ catch (error) {
714
+ emit.error({ code: "review_pack_invalid_stub", message: String(error) });
715
+ process.exitCode = 1;
716
+ }
717
+ return;
718
+ }
699
719
  let manifest;
700
720
  try {
701
721
  manifest = readPackManifest(packDir);
@@ -889,16 +909,20 @@ export function registerReviewPackCommand(program, emit, context) {
889
909
  emit.data(finding);
890
910
  });
891
911
  root
892
- .command("disposition <dir> <target> <disposition>")
912
+ .command("disposition <dir> <target-or-disposition> [disposition]")
893
913
  .description("Record the reviewer's verdict on one machine finding. <target> is " +
894
914
  "<context-id>/<tile-id>#<n>, n the finding's 0-based position among that tile's " +
895
915
  `findings in evidence/critique.json; <disposition> is one of ${PAGE_REVIEW_DISPOSITIONS.join(", ")}. ` +
896
916
  "A target that names no machine finding is refused; a prior disposition of the same " +
897
917
  "target is replaced. evidence/critique.json itself is never rewritten.")
898
918
  .option("--note <text>", "Why; what the tile actually shows.")
899
- .option("--by <name>", "Who dispositioned it.")
919
+ .option("--by <name>", "Who dispositioned it (default: current agent or local account).")
920
+ .option("--target <target>", "Explicit target (repeatable); use disposition as the first positional argument.", (value, previous = []) => [...previous, value], [])
921
+ .option("--all-high", "Disposition every high finding in --context.")
922
+ .option("--context <id>", "Required with --all-high.")
900
923
  .option("--json", "Print the written disposition as JSON.")
901
- .action((dir, target, disposition, opts) => {
924
+ .action((dir, targetOrDisposition, positionalDisposition, opts) => {
925
+ const disposition = positionalDisposition ?? targetOrDisposition;
902
926
  const pack = readReviewerPack(dir, emit);
903
927
  if (!pack)
904
928
  return;
@@ -920,36 +944,70 @@ export function registerReviewPackCommand(program, emit, context) {
920
944
  return;
921
945
  }
922
946
  const targets = machineFindingTargets(manifest.critique);
923
- const machine = targets.get(target.trim());
924
- if (!machine) {
925
- const sample = [...targets.keys()].slice(0, 8).join(", ");
947
+ if (opts.allHigh && (!opts.context || positionalDisposition || opts.target?.length)) {
948
+ emit.error({
949
+ code: "review_pack_invalid_selection",
950
+ message: "--all-high requires --context and cannot be combined with explicit targets",
951
+ });
952
+ process.exitCode = 1;
953
+ return;
954
+ }
955
+ if (opts.context && !manifest.contexts.some((ctx) => ctx.id === opts.context)) {
956
+ emit.error({
957
+ code: "review_pack_unknown_context",
958
+ message: "Unknown disposition context",
959
+ });
960
+ process.exitCode = 1;
961
+ return;
962
+ }
963
+ const selected = [
964
+ ...new Set(opts.allHigh
965
+ ? [...targets]
966
+ .filter(([, f]) => f.context_id === opts.context && f.severity === "high")
967
+ .map(([key]) => key)
968
+ : [
969
+ ...(positionalDisposition ? targetOrDisposition.split(",") : []),
970
+ ...(opts.target ?? []),
971
+ ]
972
+ .map((t) => t.trim())
973
+ .filter(Boolean)),
974
+ ];
975
+ const invalid = selected.filter((target) => !targets.has(target));
976
+ if (!selected.length || invalid.length) {
926
977
  emit.error({
927
978
  code: "review_pack_unknown_finding",
928
- message: `${JSON.stringify(target)} names no machine finding in evidence/critique.json` +
929
- (sample ? ` (known targets include: ${sample})` : " (the critique holds no findings)"),
979
+ message: `No valid selection, or unknown target(s): ${invalid.join(", ")} (known targets include: ${[...targets.keys()].slice(0, 8).join(", ")})`,
930
980
  });
931
981
  process.exitCode = 1;
932
982
  return;
933
983
  }
934
- const entry = {
935
- target: target.trim(),
984
+ const owner = resolveOwner();
985
+ const by = opts.by?.trim() ||
986
+ (owner
987
+ ? readLiveCoordinationRow(resolveQaRepoRoot(context), owner)?.name || owner
988
+ : userInfo().username);
989
+ const entries = selected.map((target) => ({
990
+ target,
936
991
  disposition: disposition,
937
- ...(opts.note !== undefined ? { note: opts.note } : {}),
938
- ...(opts.by !== undefined ? { by: opts.by } : {}),
992
+ ...(opts.note === undefined ? {} : { note: opts.note }),
993
+ by,
939
994
  at: new Date().toISOString(),
940
- };
941
- const kept = (doc.dispositions ?? []).filter((d) => d.target !== entry.target);
995
+ }));
942
996
  const next = {
943
997
  ...doc,
944
998
  reviewed_at: new Date().toISOString(),
945
- dispositions: [...kept, entry],
999
+ dispositions: [
1000
+ ...(doc.dispositions ?? []).filter((d) => !selected.includes(d.target)),
1001
+ ...entries,
1002
+ ],
946
1003
  };
947
1004
  if (!commitFindings(packDir, next, emit))
948
1005
  return;
949
- emit.log(`${entry.target} · ${machine.severity} · ${machine.category} → ${entry.disposition}` +
950
- (kept.length < (doc.dispositions ?? []).length ? " (replaced)" : ""), "info");
1006
+ emit.log(`${entries.length} finding(s) dispositioned ${disposition} by ${by}${(doc.dispositions ?? []).some((d) => selected.includes(d.target)) ? " (replaced)" : ""}`, "info");
951
1007
  if (opts.json)
952
- emit.data(entry);
1008
+ emit.data(entries.length === 1
1009
+ ? entries[0]
1010
+ : { dispositions: entries });
953
1011
  });
954
1012
  root
955
1013
  .command("verdict <dir>")
@@ -959,6 +1017,7 @@ export function registerReviewPackCommand(program, emit, context) {
959
1017
  "primary tile also needs completed delegated-review coverage. Writes evidence/verdict.json " +
960
1018
  "and refreshes review.md. Exit 2 on fail, 4 when critique or delegated coverage is " +
961
1019
  "skipped or incomplete, 1 on a findings.json validation error.")
1020
+ .option("--snapshot-store <dir>", "Native baseline and durable decision store (default: local QA cache).")
962
1021
  .option("--json", "Print the verdict as JSON.")
963
1022
  .action((dir, opts) => {
964
1023
  const pack = readReviewerPack(dir, emit);
@@ -981,6 +1040,22 @@ export function registerReviewPackCommand(program, emit, context) {
981
1040
  ...resolvePackVerdict(manifest, readPackInspectionPlan(packDir), doc),
982
1041
  reviewed_at: new Date().toISOString(),
983
1042
  };
1043
+ try {
1044
+ // Incomplete submissions may report their outcome, but cannot publish decisions.
1045
+ if (verdict.uncovered_primary_tiles.length === 0 &&
1046
+ verdict.machine_outcome !== "skipped" &&
1047
+ verdict.machine_outcome !== "incomplete") {
1048
+ persistPackReviewDecisions(packDir, opts.snapshotStore ? { root: resolve(opts.snapshotStore) } : {});
1049
+ }
1050
+ }
1051
+ catch (error) {
1052
+ emit.error({
1053
+ code: "review_pack_decisions_not_saved",
1054
+ message: error instanceof Error ? error.message : String(error),
1055
+ });
1056
+ process.exitCode = 1;
1057
+ return;
1058
+ }
984
1059
  const paths = packPaths(packDir);
985
1060
  mkdirSync(paths.evidenceDir, { recursive: true });
986
1061
  writeFileSync(paths.verdict, `${JSON.stringify(verdict, null, 2)}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,OAAO,EAWL,KAAK,cAAc,EACnB,KAAK,WAAW,EAGjB,MAAM,wBAAwB,CAAC;AAoDhC,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,SAAgB,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAcpC;AAuoBD;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsE7F;AA+MD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,YAAY,CAAC,EAAE,qBAAqB,GACnC,IAAI,CA2EN"}
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,OAAO,EAYL,KAAK,cAAc,EACnB,KAAK,WAAW,EAGjB,MAAM,wBAAwB,CAAC;AAoDhC,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,EACxB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,SAAgB,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAcpC;AAuoBD;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAsE7F;AA+MD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,YAAY,CAAC,EAAE,qBAAqB,GACnC,IAAI,CA2EN"}
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from "node:fs";
3
3
  import { resolve } from "node:path";
4
4
  import { resolveBinName } from "../core/config.js";
5
5
  import { processLogDestination, runRotatingProcessSync, spawnRotatingProcess, } from "../core/storage/process-log.js";
6
- import { clearState, DEFAULT_INSTANCE, ensureCloudflared, gateLogFile, isProcessAlive, listStates, providerLogFile, readConfig, readState, writeConfig, writeState, } from "../lib/tunnel/state.js";
6
+ import { clearState, DEFAULT_INSTANCE, ensureCloudflared, gateLogFile, isProcessAlive, isTunnelStateLive, listStates, providerLogFile, readConfig, readState, writeConfig, writeState, } from "../lib/tunnel/state.js";
7
7
  /**
8
8
  * `tunnel`: provider-backed tunnel in front of a local upstream.
9
9
  *
@@ -342,7 +342,7 @@ function providerIsAlive(state) {
342
342
  return typeof pid === "number" && isProcessAlive(pid);
343
343
  }
344
344
  function tunnelIsAlive(state) {
345
- return isProcessAlive(state.gate_pid) && providerIsAlive(state);
345
+ return isTunnelStateLive(state);
346
346
  }
347
347
  /**
348
348
  * Spawn the detached gate worker.
@@ -62,7 +62,7 @@ export declare const BUILTIN_ADAPTER_PROFILES: {
62
62
  };
63
63
  };
64
64
  export type BuiltinAdapterId = keyof typeof BUILTIN_ADAPTER_PROFILES;
65
- export declare const BUILTIN_ADAPTER_IDS: readonly ("cursor" | "claude-code" | "codex")[];
65
+ export declare const BUILTIN_ADAPTER_IDS: readonly ("claude-code" | "cursor" | "codex")[];
66
66
  export declare function isBuiltinAdapter(id: string): id is BuiltinAdapterId;
67
67
  export declare function builtinAdapterProfile(id: string): AdapterProfile | undefined;
68
68
  export declare function validateAdapterEffort(id: string, effort: string | undefined): void;
@@ -9,6 +9,7 @@
9
9
  * a 15-second safety budget; loaded-host checks normally finish in a few
10
10
  * seconds and record the observation before the parent command exits.
11
11
  */
12
+ import type { EventAdapterIdV3 } from "../events/v3/adapter-id.js";
12
13
  import type { LiveCoordinationObservationV3 } from "../events/v3/live-observation.js";
13
14
  import type { Heartbeat } from "./state/heartbeat-reader.js";
14
15
  export type EventV3EmitObservation = LiveCoordinationObservationV3 | {
@@ -20,7 +21,7 @@ export type EventV3EmitObservation = LiveCoordinationObservationV3 | {
20
21
  export interface EventV3EmitInput {
21
22
  owner: string;
22
23
  session: string;
23
- adapter: "claude-code" | "cursor" | "codex";
24
+ adapter: EventAdapterIdV3;
24
25
  observation: EventV3EmitObservation;
25
26
  }
26
27
  /**
@@ -35,7 +36,7 @@ export declare function emitEventV3(input: EventV3EmitInput): boolean;
35
36
  /**
36
37
  * Normalize the heartbeat's `platform` field to the canonical Adapter type.
37
38
  */
38
- export declare function normalizeAdapter(platform: string | undefined): "claude-code" | "cursor" | "codex";
39
+ export declare function normalizeAdapter(platform: string | undefined): EventAdapterIdV3;
39
40
  /** Producer joins use the private native session ID, never its V3 fingerprint. */
40
41
  export declare function nativeSessionIdentity(row: Pick<Heartbeat, "native_session_id" | "session_id"> | null | undefined, fallback: string): string;
41
42
  //# sourceMappingURL=canonical-emit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonical-emit.d.ts","sourceRoot":"","sources":["../../../src/core/agents/canonical-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAC9B,6BAA6B,GAC7B;IACE,UAAU,EAAE,yBAAyB,CAAC;IACtC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEN,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC5C,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CA4C5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAIjG;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,GAAG,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3E,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR"}
1
+ {"version":3,"file":"canonical-emit.d.ts","sourceRoot":"","sources":["../../../src/core/agents/canonical-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAC9B,6BAA6B,GAC7B;IACE,UAAU,EAAE,yBAAyB,CAAC;IACtC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEN,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CA4C5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAK/E;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,GAAG,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3E,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR"}
@@ -78,6 +78,8 @@ export function normalizeAdapter(platform) {
78
78
  return "cursor";
79
79
  if (platform === "codex")
80
80
  return "codex";
81
+ if (platform === "openclaw")
82
+ return "openclaw";
81
83
  return "claude-code";
82
84
  }
83
85
  /** Producer joins use the private native session ID, never its V3 fingerprint. */
@@ -237,7 +237,10 @@ async function handleStateAction(root, action, rest) {
237
237
  // same durable, idempotent pool path used by normal SessionStart.
238
238
  if (task && before && humanFacing && !before.name?.trim()) {
239
239
  const { assignName } = await import("./state/names.js");
240
- const name = assignName(root, owner, "session");
240
+ const { coordFreshnessSeconds } = await import("../config.js");
241
+ const name = assignName(root, owner, "session", {
242
+ freshnessSecs: coordFreshnessSeconds(root),
243
+ });
241
244
  before = writer.setAssignedNameCache(root, owner, name, "session");
242
245
  if (!before) {
243
246
  process.stderr.write(`agent-coord set-task: could not restore assigned name for ${owner}\n`);
@@ -273,7 +276,9 @@ async function handleStateAction(root, action, rest) {
273
276
  currentHumanFacing &&
274
277
  (!hb.name?.trim() || /^Agent unknown - /.test(hb.suggested_session_name ?? ""))) {
275
278
  const { assignName } = await import("./state/names.js");
276
- const name = hb.name?.trim() || assignName(root, owner, "session");
279
+ const { coordFreshnessSeconds } = await import("../config.js");
280
+ const name = hb.name?.trim() ||
281
+ assignName(root, owner, "session", { freshnessSecs: coordFreshnessSeconds(root) });
277
282
  hb = writer.setAssignedNameCache(root, owner, name, "session");
278
283
  }
279
284
  }
@@ -557,7 +562,11 @@ async function handleAssignName(root, rest) {
557
562
  process.stderr.write(`agent-coord assign-name: invalid kind ${kindArg}\n`);
558
563
  return 2;
559
564
  }
560
- const name = assignName(root, owner, kindArg, forkedFrom ? { forkedFrom } : undefined);
565
+ const { coordFreshnessSeconds } = await import("../config.js");
566
+ const name = assignName(root, owner, kindArg, {
567
+ freshnessSecs: coordFreshnessSeconds(root),
568
+ ...(forkedFrom ? { forkedFrom } : {}),
569
+ });
561
570
  process.stdout.write(`${JSON.stringify({
562
571
  instance_id: owner,
563
572
  name,
@@ -673,7 +682,6 @@ async function handlePromptContext(root, rest) {
673
682
  const instanceId = args.instance;
674
683
  const sessionId = args.session ?? instanceId;
675
684
  const agentName = args.name;
676
- const adapter = args.adapter;
677
685
  const sessionNameNudge = args["session-name-nudge"] === "true";
678
686
  const taskNudge = args["task-nudge"] === "true";
679
687
  const hostPromptReminder = args["host-prompt-reminder"] === "true";
@@ -682,7 +690,7 @@ async function handlePromptContext(root, rest) {
682
690
  // reminder with the adapter-neutral wording.
683
691
  const turnRitualNudge = args["turn-ritual-nudge"] === "true" ? "generic" : args["turn-ritual-nudge"];
684
692
  if (!instanceId) {
685
- process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--adapter <id>] [--session-name-nudge] [--task-nudge] [--host-prompt-reminder] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n");
693
+ process.stderr.write("agent-coord prompt-context --instance <id> [--session <id>] [--name <agent-name>] [--session-name-nudge] [--task-nudge] [--host-prompt-reminder] [--status-footer-nudge] [--turn-ritual-nudge <adapter>]\n");
686
694
  return 2;
687
695
  }
688
696
  const { renderPromptContext } = await import("./render/prompt-context.js");
@@ -696,7 +704,6 @@ async function handlePromptContext(root, rest) {
696
704
  hostPromptReminder,
697
705
  statusFooterNudge,
698
706
  turnRitualNudge,
699
- adapter,
700
707
  });
701
708
  process.stdout.write(text);
702
709
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"live-authority-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-authority-v3.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-authority-v3.d.ts","sourceRoot":"","sources":["../../../src/core/agents/live-authority-v3.ts"],"names":[],"mappings":"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"}