harnery 0.35.0 → 0.37.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 (843) hide show
  1. package/dist/commander.d.ts +30 -5
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +128 -96
  4. package/dist/commands/agents.d.ts +23 -3
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +464 -242
  7. package/dist/commands/artifacts.d.ts.map +1 -1
  8. package/dist/commands/artifacts.js +26 -1
  9. package/dist/commands/backup.d.ts.map +1 -1
  10. package/dist/commands/backup.js +10 -10
  11. package/dist/commands/browse-session.d.ts.map +1 -1
  12. package/dist/commands/browse-session.js +12 -0
  13. package/dist/commands/browse.d.ts +1 -1
  14. package/dist/commands/browse.d.ts.map +1 -1
  15. package/dist/commands/browse.js +16 -4
  16. package/dist/commands/conversations.d.ts +10 -0
  17. package/dist/commands/conversations.d.ts.map +1 -0
  18. package/dist/commands/conversations.js +201 -0
  19. package/dist/commands/deinit.d.ts.map +1 -1
  20. package/dist/commands/deinit.js +5 -0
  21. package/dist/commands/diagnostics.d.ts +4 -0
  22. package/dist/commands/diagnostics.d.ts.map +1 -0
  23. package/dist/commands/diagnostics.js +229 -0
  24. package/dist/commands/docs.d.ts.map +1 -1
  25. package/dist/commands/docs.js +13 -2
  26. package/dist/commands/doctor.d.ts +5 -0
  27. package/dist/commands/doctor.d.ts.map +1 -1
  28. package/dist/commands/doctor.js +51 -7
  29. package/dist/commands/fetch.js +6 -5
  30. package/dist/commands/files.d.ts +34 -0
  31. package/dist/commands/files.d.ts.map +1 -0
  32. package/dist/commands/files.js +166 -0
  33. package/dist/commands/governor.d.ts.map +1 -1
  34. package/dist/commands/governor.js +18 -12
  35. package/dist/commands/inbox.d.ts +5 -0
  36. package/dist/commands/inbox.d.ts.map +1 -0
  37. package/dist/commands/inbox.js +57 -0
  38. package/dist/commands/init.d.ts +4 -5
  39. package/dist/commands/init.d.ts.map +1 -1
  40. package/dist/commands/init.js +63 -13
  41. package/dist/commands/ledger-v3.d.ts.map +1 -1
  42. package/dist/commands/ledger-v3.js +417 -2
  43. package/dist/commands/logs.d.ts +4 -0
  44. package/dist/commands/logs.d.ts.map +1 -0
  45. package/dist/commands/logs.js +169 -0
  46. package/dist/commands/messages.d.ts +5 -0
  47. package/dist/commands/messages.d.ts.map +1 -0
  48. package/dist/commands/messages.js +45 -0
  49. package/dist/commands/outline.d.ts +1 -1
  50. package/dist/commands/outline.d.ts.map +1 -1
  51. package/dist/commands/outline.js +2 -2
  52. package/dist/commands/qa-run.d.ts +4 -0
  53. package/dist/commands/qa-run.d.ts.map +1 -0
  54. package/dist/commands/qa-run.js +141 -0
  55. package/dist/commands/read.d.ts +1 -1
  56. package/dist/commands/read.d.ts.map +1 -1
  57. package/dist/commands/read.js +2 -2
  58. package/dist/commands/resources.d.ts +4 -0
  59. package/dist/commands/resources.d.ts.map +1 -0
  60. package/dist/commands/resources.js +29 -0
  61. package/dist/commands/semantic.d.ts.map +1 -1
  62. package/dist/commands/semantic.js +54 -2
  63. package/dist/commands/storage.d.ts +4 -0
  64. package/dist/commands/storage.d.ts.map +1 -0
  65. package/dist/commands/storage.js +238 -0
  66. package/dist/commands/supervisor.d.ts +4 -0
  67. package/dist/commands/supervisor.d.ts.map +1 -0
  68. package/dist/commands/supervisor.js +101 -0
  69. package/dist/commands/tunnel.d.ts +5 -1
  70. package/dist/commands/tunnel.d.ts.map +1 -1
  71. package/dist/commands/tunnel.js +44 -31
  72. package/dist/commands/web.d.ts +3 -0
  73. package/dist/commands/web.d.ts.map +1 -1
  74. package/dist/commands/web.js +84 -7
  75. package/dist/commands/work.js +3 -3
  76. package/dist/commands/workflow.d.ts.map +1 -1
  77. package/dist/commands/workflow.js +17 -13
  78. package/dist/core/adapters/profiles.d.ts +1 -1
  79. package/dist/core/agents/cli.js +215 -41
  80. package/dist/core/agents/health.d.ts +17 -0
  81. package/dist/core/agents/health.d.ts.map +1 -0
  82. package/dist/core/agents/health.js +109 -0
  83. package/dist/core/agents/live-authority-v3.d.ts +47 -1
  84. package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
  85. package/dist/core/agents/live-authority-v3.js +244 -10
  86. package/dist/core/agents/live-lifecycle-v3.js +6 -1
  87. package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
  88. package/dist/core/agents/live-observation-v3.js +6 -1
  89. package/dist/core/agents/mailbox.d.ts +92 -0
  90. package/dist/core/agents/mailbox.d.ts.map +1 -0
  91. package/dist/core/agents/mailbox.js +325 -0
  92. package/dist/core/agents/reconcile-coordination-v3.d.ts +44 -0
  93. package/dist/core/agents/reconcile-coordination-v3.d.ts.map +1 -0
  94. package/dist/core/agents/reconcile-coordination-v3.js +58 -0
  95. package/dist/core/agents/render/prompt-context.d.ts +14 -3
  96. package/dist/core/agents/render/prompt-context.d.ts.map +1 -1
  97. package/dist/core/agents/render/prompt-context.js +54 -16
  98. package/dist/core/agents/render/session-context.d.ts +8 -0
  99. package/dist/core/agents/render/session-context.d.ts.map +1 -1
  100. package/dist/core/agents/render/session-context.js +34 -3
  101. package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
  102. package/dist/core/agents/rules/commit-conflict.js +50 -1
  103. package/dist/core/agents/rules/stop-hook.d.ts +2 -0
  104. package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
  105. package/dist/core/agents/rules/stop-hook.js +93 -16
  106. package/dist/core/agents/rules/verdict.d.ts +1 -0
  107. package/dist/core/agents/rules/verdict.d.ts.map +1 -1
  108. package/dist/core/agents/session-events.d.ts.map +1 -1
  109. package/dist/core/agents/session-events.js +4 -0
  110. package/dist/core/agents/session-finalization-state-v3.js +1 -1
  111. package/dist/core/agents/session-finalizer-v3.js +9 -2
  112. package/dist/core/agents/state/activity-log.d.ts +3 -0
  113. package/dist/core/agents/state/activity-log.d.ts.map +1 -1
  114. package/dist/core/agents/state/activity-log.js +6 -3
  115. package/dist/core/agents/state/heartbeat-writer.d.ts +6 -0
  116. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  117. package/dist/core/agents/state/heartbeat-writer.js +18 -0
  118. package/dist/core/agents/state/live-coordination-view.d.ts +5 -7
  119. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  120. package/dist/core/agents/state/live-coordination-view.js +15 -90
  121. package/dist/core/agents/state/live-coordination-writer.d.ts +12 -0
  122. package/dist/core/agents/state/live-coordination-writer.d.ts.map +1 -0
  123. package/dist/core/agents/state/live-coordination-writer.js +92 -0
  124. package/dist/core/artifacts/index.d.ts +47 -1
  125. package/dist/core/artifacts/index.d.ts.map +1 -1
  126. package/dist/core/artifacts/index.js +191 -6
  127. package/dist/core/config.d.ts +74 -4
  128. package/dist/core/config.d.ts.map +1 -1
  129. package/dist/core/config.js +141 -4
  130. package/dist/core/conversations/archive.d.ts +49 -0
  131. package/dist/core/conversations/archive.d.ts.map +1 -0
  132. package/dist/core/conversations/archive.js +136 -0
  133. package/dist/core/conversations/catalog.d.ts +10 -0
  134. package/dist/core/conversations/catalog.d.ts.map +1 -0
  135. package/dist/core/conversations/catalog.js +72 -0
  136. package/dist/core/conversations/context-pack.d.ts +6 -0
  137. package/dist/core/conversations/context-pack.d.ts.map +1 -0
  138. package/dist/core/conversations/context-pack.js +60 -0
  139. package/dist/core/conversations/contract.d.ts +155 -0
  140. package/dist/core/conversations/contract.d.ts.map +1 -0
  141. package/dist/core/conversations/contract.js +1 -0
  142. package/dist/core/conversations/evaluation.d.ts +16 -0
  143. package/dist/core/conversations/evaluation.d.ts.map +1 -0
  144. package/dist/core/conversations/evaluation.js +9 -0
  145. package/dist/core/conversations/index.d.ts +10 -0
  146. package/dist/core/conversations/index.d.ts.map +1 -0
  147. package/dist/core/conversations/index.js +9 -0
  148. package/dist/core/conversations/lifecycle.d.ts +28 -0
  149. package/dist/core/conversations/lifecycle.d.ts.map +1 -0
  150. package/dist/core/conversations/lifecycle.js +29 -0
  151. package/dist/core/conversations/normalize.d.ts +14 -0
  152. package/dist/core/conversations/normalize.d.ts.map +1 -0
  153. package/dist/core/conversations/normalize.js +82 -0
  154. package/dist/core/conversations/query.d.ts +8 -0
  155. package/dist/core/conversations/query.d.ts.map +1 -0
  156. package/dist/core/conversations/query.js +280 -0
  157. package/dist/core/conversations/search-index.d.ts +9 -0
  158. package/dist/core/conversations/search-index.d.ts.map +1 -0
  159. package/dist/core/conversations/search-index.js +29 -0
  160. package/dist/core/diagnostics/advice.d.ts +9 -0
  161. package/dist/core/diagnostics/advice.d.ts.map +1 -0
  162. package/dist/core/diagnostics/advice.js +112 -0
  163. package/dist/core/diagnostics/bundle.d.ts +35 -0
  164. package/dist/core/diagnostics/bundle.d.ts.map +1 -0
  165. package/dist/core/diagnostics/bundle.js +874 -0
  166. package/dist/core/diagnostics/comparison.d.ts +5 -0
  167. package/dist/core/diagnostics/comparison.d.ts.map +1 -0
  168. package/dist/core/diagnostics/comparison.js +444 -0
  169. package/dist/core/diagnostics/contract.d.ts +245 -0
  170. package/dist/core/diagnostics/contract.d.ts.map +1 -0
  171. package/dist/core/diagnostics/contract.js +18 -0
  172. package/dist/core/diagnostics/identity.d.ts +3 -0
  173. package/dist/core/diagnostics/identity.d.ts.map +1 -0
  174. package/dist/core/diagnostics/identity.js +10 -0
  175. package/dist/core/diagnostics/index.d.ts +8 -0
  176. package/dist/core/diagnostics/index.d.ts.map +1 -0
  177. package/dist/core/diagnostics/index.js +7 -0
  178. package/dist/core/diagnostics/replay.d.ts +8 -0
  179. package/dist/core/diagnostics/replay.d.ts.map +1 -0
  180. package/dist/core/diagnostics/replay.js +213 -0
  181. package/dist/core/diagnostics/sanitize.d.ts +9 -0
  182. package/dist/core/diagnostics/sanitize.d.ts.map +1 -0
  183. package/dist/core/diagnostics/sanitize.js +84 -0
  184. package/dist/core/events/legacy-storage/canary.d.ts +18 -0
  185. package/dist/core/events/legacy-storage/canary.d.ts.map +1 -0
  186. package/dist/core/events/legacy-storage/canary.js +150 -0
  187. package/dist/core/events/legacy-storage/compression.d.ts +13 -0
  188. package/dist/core/events/legacy-storage/compression.d.ts.map +1 -0
  189. package/dist/core/events/legacy-storage/compression.js +107 -0
  190. package/dist/core/events/legacy-storage/fence.d.ts +15 -0
  191. package/dist/core/events/legacy-storage/fence.d.ts.map +1 -0
  192. package/dist/core/events/legacy-storage/fence.js +115 -0
  193. package/dist/core/events/legacy-storage/index.d.ts +7 -0
  194. package/dist/core/events/legacy-storage/index.d.ts.map +1 -0
  195. package/dist/core/events/legacy-storage/index.js +6 -0
  196. package/dist/core/events/legacy-storage/inventory.d.ts +10 -0
  197. package/dist/core/events/legacy-storage/inventory.d.ts.map +1 -0
  198. package/dist/core/events/legacy-storage/inventory.js +40 -0
  199. package/dist/core/events/legacy-storage/manifest.d.ts +23 -0
  200. package/dist/core/events/legacy-storage/manifest.d.ts.map +1 -0
  201. package/dist/core/events/legacy-storage/manifest.js +108 -0
  202. package/dist/core/events/legacy-storage/reader.d.ts +15 -0
  203. package/dist/core/events/legacy-storage/reader.d.ts.map +1 -0
  204. package/dist/core/events/legacy-storage/reader.js +154 -0
  205. package/dist/core/events/v3/archive-retention.d.ts +33 -0
  206. package/dist/core/events/v3/archive-retention.d.ts.map +1 -0
  207. package/dist/core/events/v3/archive-retention.js +195 -0
  208. package/dist/core/events/v3/authority-outbox.d.ts +7 -2
  209. package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
  210. package/dist/core/events/v3/authority-outbox.js +16 -3
  211. package/dist/core/events/v3/base-contract.d.ts +81 -41
  212. package/dist/core/events/v3/base-contract.d.ts.map +1 -1
  213. package/dist/core/events/v3/base-contract.js +17 -7
  214. package/dist/core/events/v3/bootstrap.d.ts +39 -0
  215. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  216. package/dist/core/events/v3/bootstrap.js +167 -3
  217. package/dist/core/events/v3/capabilities.d.ts +1 -1
  218. package/dist/core/events/v3/capabilities.d.ts.map +1 -1
  219. package/dist/core/events/v3/capabilities.js +4 -3
  220. package/dist/core/events/v3/control-witness.d.ts +44 -0
  221. package/dist/core/events/v3/control-witness.d.ts.map +1 -0
  222. package/dist/core/events/v3/control-witness.js +233 -0
  223. package/dist/core/events/v3/control-writer.d.ts +4 -0
  224. package/dist/core/events/v3/control-writer.d.ts.map +1 -0
  225. package/dist/core/events/v3/control-writer.js +16 -0
  226. package/dist/core/events/v3/control.d.ts +8 -2
  227. package/dist/core/events/v3/control.d.ts.map +1 -1
  228. package/dist/core/events/v3/control.js +46 -18
  229. package/dist/core/events/v3/coordination-transaction-recovery.d.ts +42 -0
  230. package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -0
  231. package/dist/core/events/v3/coordination-transaction-recovery.js +342 -0
  232. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  233. package/dist/core/events/v3/coordination-view.js +16 -1
  234. package/dist/core/events/v3/generated.d.ts +1 -1
  235. package/dist/core/events/v3/generated.js +1 -1
  236. package/dist/core/events/v3/index.d.ts +5 -2
  237. package/dist/core/events/v3/index.d.ts.map +1 -1
  238. package/dist/core/events/v3/index.js +4 -1
  239. package/dist/core/events/v3/live-route-observer.d.ts +31 -0
  240. package/dist/core/events/v3/live-route-observer.d.ts.map +1 -0
  241. package/dist/core/events/v3/live-route-observer.js +58 -0
  242. package/dist/core/events/v3/live-routing.d.ts +13 -21
  243. package/dist/core/events/v3/live-routing.d.ts.map +1 -1
  244. package/dist/core/events/v3/live-routing.js +46 -41
  245. package/dist/core/events/v3/producers/coordination-recorder.d.ts +11 -1
  246. package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
  247. package/dist/core/events/v3/producers/coordination-recorder.js +76 -10
  248. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts +129 -0
  249. package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -0
  250. package/dist/core/events/v3/producers/diagnostic-summaries.js +499 -0
  251. package/dist/core/events/v3/producers/hook-base.d.ts +1 -1
  252. package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
  253. package/dist/core/events/v3/producers/hook-base.js +14 -3
  254. package/dist/core/events/v3/producers/intake.d.ts +7 -0
  255. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  256. package/dist/core/events/v3/producers/intake.js +26 -2
  257. package/dist/core/events/v3/producers/producer-state-observer.d.ts +8 -0
  258. package/dist/core/events/v3/producers/producer-state-observer.d.ts.map +1 -0
  259. package/dist/core/events/v3/producers/producer-state-observer.js +45 -0
  260. package/dist/core/events/v3/producers/recorder.d.ts +71 -1
  261. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  262. package/dist/core/events/v3/producers/recorder.js +441 -25
  263. package/dist/core/events/v3/reader.d.ts +51 -0
  264. package/dist/core/events/v3/reader.d.ts.map +1 -1
  265. package/dist/core/events/v3/reader.js +181 -1
  266. package/dist/core/events/v3/rotation-config.d.ts +9 -0
  267. package/dist/core/events/v3/rotation-config.d.ts.map +1 -0
  268. package/dist/core/events/v3/rotation-config.js +91 -0
  269. package/dist/core/events/v3/runtime-build.d.ts +11 -0
  270. package/dist/core/events/v3/runtime-build.d.ts.map +1 -0
  271. package/dist/core/events/v3/runtime-build.js +39 -0
  272. package/dist/core/events/v3/runtime-identity.d.ts +5 -0
  273. package/dist/core/events/v3/runtime-identity.d.ts.map +1 -0
  274. package/dist/core/events/v3/runtime-identity.js +18 -0
  275. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +6 -5
  276. package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -1
  277. package/dist/core/events/v3/runtime-telemetry-capabilities.js +1 -1
  278. package/dist/core/events/v3/support-storage/classify.d.ts +46 -0
  279. package/dist/core/events/v3/support-storage/classify.d.ts.map +1 -0
  280. package/dist/core/events/v3/support-storage/classify.js +149 -0
  281. package/dist/core/events/v3/support-storage/eligibility.d.ts +29 -0
  282. package/dist/core/events/v3/support-storage/eligibility.d.ts.map +1 -0
  283. package/dist/core/events/v3/support-storage/eligibility.js +35 -0
  284. package/dist/core/events/v3/support-storage/index.d.ts +10 -0
  285. package/dist/core/events/v3/support-storage/index.d.ts.map +1 -0
  286. package/dist/core/events/v3/support-storage/index.js +9 -0
  287. package/dist/core/events/v3/support-storage/inventory.d.ts +30 -0
  288. package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -0
  289. package/dist/core/events/v3/support-storage/inventory.js +94 -0
  290. package/dist/core/events/v3/support-storage/logical-authority.d.ts +14 -0
  291. package/dist/core/events/v3/support-storage/logical-authority.d.ts.map +1 -0
  292. package/dist/core/events/v3/support-storage/logical-authority.js +104 -0
  293. package/dist/core/events/v3/support-storage/maintenance.d.ts +98 -0
  294. package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -0
  295. package/dist/core/events/v3/support-storage/maintenance.js +352 -0
  296. package/dist/core/events/v3/support-storage/pack-contract.d.ts +59 -0
  297. package/dist/core/events/v3/support-storage/pack-contract.d.ts.map +1 -0
  298. package/dist/core/events/v3/support-storage/pack-contract.js +249 -0
  299. package/dist/core/events/v3/support-storage/pack-reader.d.ts +34 -0
  300. package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -0
  301. package/dist/core/events/v3/support-storage/pack-reader.js +258 -0
  302. package/dist/core/events/v3/support-storage/pack-writer.d.ts +30 -0
  303. package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -0
  304. package/dist/core/events/v3/support-storage/pack-writer.js +268 -0
  305. package/dist/core/events/v3/support-storage/recovery.d.ts +15 -0
  306. package/dist/core/events/v3/support-storage/recovery.d.ts.map +1 -0
  307. package/dist/core/events/v3/support-storage/recovery.js +22 -0
  308. package/dist/core/events/v3/turn-telemetry.d.ts +14 -8
  309. package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
  310. package/dist/core/events/v3/turn-telemetry.js +32 -2
  311. package/dist/core/events/v3/writer.d.ts +13 -1
  312. package/dist/core/events/v3/writer.d.ts.map +1 -1
  313. package/dist/core/events/v3/writer.js +126 -12
  314. package/dist/core/governor/plan-read.d.ts.map +1 -1
  315. package/dist/core/governor/plan-read.js +5 -21
  316. package/dist/core/governor/planning.js +6 -8
  317. package/dist/core/governor/service-read.d.ts +12 -0
  318. package/dist/core/governor/service-read.d.ts.map +1 -1
  319. package/dist/core/governor/service-read.js +266 -2
  320. package/dist/core/governor/service.d.ts +1 -0
  321. package/dist/core/governor/service.d.ts.map +1 -1
  322. package/dist/core/governor/service.js +53 -18
  323. package/dist/core/guard/evidence-v3.d.ts.map +1 -1
  324. package/dist/core/guard/evidence-v3.js +2 -0
  325. package/dist/core/hooks/adapter/events.d.ts.map +1 -1
  326. package/dist/core/hooks/adapter/events.js +1 -0
  327. package/dist/core/hooks/adapter/output.d.ts +12 -2
  328. package/dist/core/hooks/adapter/output.d.ts.map +1 -1
  329. package/dist/core/hooks/adapter/output.js +23 -5
  330. package/dist/core/hooks/adapter/runtime-telemetry.d.ts +27 -4
  331. package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -1
  332. package/dist/core/hooks/adapter/runtime-telemetry.js +307 -6
  333. package/dist/core/hooks/cli.js +380 -207
  334. package/dist/core/hooks/effects/image-capture.d.ts +1 -1
  335. package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
  336. package/dist/core/hooks/effects/image-capture.js +4 -2
  337. package/dist/core/hooks/health.d.ts +59 -0
  338. package/dist/core/hooks/health.d.ts.map +1 -0
  339. package/dist/core/hooks/health.js +84 -0
  340. package/dist/core/hooks/remediation-cap.d.ts +8 -3
  341. package/dist/core/hooks/remediation-cap.d.ts.map +1 -1
  342. package/dist/core/hooks/remediation-cap.js +3 -11
  343. package/dist/core/hooks/resolve/coord-root.d.ts +22 -9
  344. package/dist/core/hooks/resolve/coord-root.d.ts.map +1 -1
  345. package/dist/core/hooks/resolve/coord-root.js +92 -11
  346. package/dist/core/hooks/resolve/owner.d.ts.map +1 -1
  347. package/dist/core/hooks/resolve/owner.js +5 -0
  348. package/dist/core/hooks/resolve/transcript.d.ts +8 -0
  349. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  350. package/dist/core/hooks/resolve/transcript.js +11 -0
  351. package/dist/core/inbox/contract.d.ts +64 -0
  352. package/dist/core/inbox/contract.d.ts.map +1 -0
  353. package/dist/core/inbox/contract.js +13 -0
  354. package/dist/core/inbox/index.d.ts +5 -0
  355. package/dist/core/inbox/index.d.ts.map +1 -0
  356. package/dist/core/inbox/index.js +4 -0
  357. package/dist/core/inbox/lifecycle.d.ts +22 -0
  358. package/dist/core/inbox/lifecycle.d.ts.map +1 -0
  359. package/dist/core/inbox/lifecycle.js +41 -0
  360. package/dist/core/inbox/service.d.ts +36 -0
  361. package/dist/core/inbox/service.d.ts.map +1 -0
  362. package/dist/core/inbox/service.js +210 -0
  363. package/dist/core/inbox/watcher.d.ts +7 -0
  364. package/dist/core/inbox/watcher.d.ts.map +1 -0
  365. package/dist/core/inbox/watcher.js +26 -0
  366. package/dist/core/presence/codec-digest.d.ts.map +1 -1
  367. package/dist/core/presence/codec-digest.js +14 -3
  368. package/dist/core/presence/relay-client.d.ts +1 -0
  369. package/dist/core/presence/relay-client.d.ts.map +1 -1
  370. package/dist/core/presence/relay-client.js +52 -8
  371. package/dist/core/resources/contract.d.ts +90 -0
  372. package/dist/core/resources/contract.d.ts.map +1 -0
  373. package/dist/core/resources/contract.js +2 -0
  374. package/dist/core/resources/index.d.ts +6 -0
  375. package/dist/core/resources/index.d.ts.map +1 -0
  376. package/dist/core/resources/index.js +5 -0
  377. package/dist/core/resources/sampler.d.ts +27 -0
  378. package/dist/core/resources/sampler.d.ts.map +1 -0
  379. package/dist/core/resources/sampler.js +357 -0
  380. package/dist/core/resources/service-status.d.ts +3 -0
  381. package/dist/core/resources/service-status.d.ts.map +1 -0
  382. package/dist/core/resources/service-status.js +48 -0
  383. package/dist/core/resources/service.d.ts +26 -0
  384. package/dist/core/resources/service.d.ts.map +1 -0
  385. package/dist/core/resources/service.js +292 -0
  386. package/dist/core/resources/storage.d.ts +13 -0
  387. package/dist/core/resources/storage.d.ts.map +1 -0
  388. package/dist/core/resources/storage.js +30 -0
  389. package/dist/core/semantic/adapters.d.ts +11 -8
  390. package/dist/core/semantic/adapters.d.ts.map +1 -1
  391. package/dist/core/semantic/adapters.js +169 -31
  392. package/dist/core/semantic/contract.d.ts +532 -48
  393. package/dist/core/semantic/contract.d.ts.map +1 -1
  394. package/dist/core/semantic/contract.js +104 -3
  395. package/dist/core/semantic/index.d.ts +7 -3
  396. package/dist/core/semantic/index.d.ts.map +1 -1
  397. package/dist/core/semantic/index.js +7 -3
  398. package/dist/core/semantic/once.d.ts +6 -1
  399. package/dist/core/semantic/once.d.ts.map +1 -1
  400. package/dist/core/semantic/once.js +80 -9
  401. package/dist/core/semantic/prompt.d.ts.map +1 -1
  402. package/dist/core/semantic/prompt.js +14 -1
  403. package/dist/core/semantic/review.d.ts +144 -0
  404. package/dist/core/semantic/review.d.ts.map +1 -0
  405. package/dist/core/semantic/review.js +544 -0
  406. package/dist/core/semantic/routes.d.ts +10 -0
  407. package/dist/core/semantic/routes.d.ts.map +1 -0
  408. package/dist/core/semantic/routes.js +21 -0
  409. package/dist/core/semantic/scheduler.d.ts +14 -3
  410. package/dist/core/semantic/scheduler.d.ts.map +1 -1
  411. package/dist/core/semantic/scheduler.js +30 -6
  412. package/dist/core/semantic/service-status.d.ts +20 -0
  413. package/dist/core/semantic/service-status.d.ts.map +1 -1
  414. package/dist/core/semantic/service-status.js +60 -4
  415. package/dist/core/semantic/service.d.ts +1 -0
  416. package/dist/core/semantic/service.d.ts.map +1 -1
  417. package/dist/core/semantic/service.js +104 -15
  418. package/dist/core/semantic/soak.d.ts +75 -0
  419. package/dist/core/semantic/soak.d.ts.map +1 -0
  420. package/dist/core/semantic/soak.js +476 -0
  421. package/dist/core/semantic/storage.d.ts +11 -1
  422. package/dist/core/semantic/storage.d.ts.map +1 -1
  423. package/dist/core/semantic/storage.js +4 -3
  424. package/dist/core/semantic/usage.d.ts +43 -0
  425. package/dist/core/semantic/usage.d.ts.map +1 -0
  426. package/dist/core/semantic/usage.js +193 -0
  427. package/dist/core/semantic/validate.d.ts +3 -1
  428. package/dist/core/semantic/validate.d.ts.map +1 -1
  429. package/dist/core/semantic/validate.js +34 -1
  430. package/dist/core/storage/atomic-json.d.ts +3 -0
  431. package/dist/core/storage/atomic-json.d.ts.map +1 -0
  432. package/dist/core/storage/atomic-json.js +15 -0
  433. package/dist/core/storage/buffer.d.ts +28 -0
  434. package/dist/core/storage/buffer.d.ts.map +1 -0
  435. package/dist/core/storage/buffer.js +101 -0
  436. package/dist/core/storage/builtins.d.ts +3 -0
  437. package/dist/core/storage/builtins.d.ts.map +1 -0
  438. package/dist/core/storage/builtins.js +722 -0
  439. package/dist/core/storage/catalog.d.ts +19 -0
  440. package/dist/core/storage/catalog.d.ts.map +1 -0
  441. package/dist/core/storage/catalog.js +365 -0
  442. package/dist/core/storage/config.d.ts +16 -0
  443. package/dist/core/storage/config.d.ts.map +1 -0
  444. package/dist/core/storage/config.js +311 -0
  445. package/dist/core/storage/contract.d.ts +275 -0
  446. package/dist/core/storage/contract.d.ts.map +1 -0
  447. package/dist/core/storage/contract.js +3 -0
  448. package/dist/core/storage/durable-history.d.ts +36 -0
  449. package/dist/core/storage/durable-history.d.ts.map +1 -0
  450. package/dist/core/storage/durable-history.js +606 -0
  451. package/dist/core/storage/health.d.ts +4 -0
  452. package/dist/core/storage/health.d.ts.map +1 -0
  453. package/dist/core/storage/health.js +65 -0
  454. package/dist/core/storage/index.d.ts +16 -0
  455. package/dist/core/storage/index.d.ts.map +1 -0
  456. package/dist/core/storage/index.js +15 -0
  457. package/dist/core/storage/inventory.d.ts +25 -0
  458. package/dist/core/storage/inventory.d.ts.map +1 -0
  459. package/dist/core/storage/inventory.js +666 -0
  460. package/dist/core/storage/jsonl.d.ts +52 -0
  461. package/dist/core/storage/jsonl.d.ts.map +1 -0
  462. package/dist/core/storage/jsonl.js +156 -0
  463. package/dist/core/storage/log-retention.d.ts +52 -0
  464. package/dist/core/storage/log-retention.d.ts.map +1 -0
  465. package/dist/core/storage/log-retention.js +419 -0
  466. package/dist/core/storage/logger.d.ts +84 -0
  467. package/dist/core/storage/logger.d.ts.map +1 -0
  468. package/dist/core/storage/logger.js +413 -0
  469. package/dist/core/storage/maintenance-providers.d.ts +26 -0
  470. package/dist/core/storage/maintenance-providers.d.ts.map +1 -0
  471. package/dist/core/storage/maintenance-providers.js +141 -0
  472. package/dist/core/storage/maintenance.d.ts +125 -0
  473. package/dist/core/storage/maintenance.d.ts.map +1 -0
  474. package/dist/core/storage/maintenance.js +609 -0
  475. package/dist/core/storage/metrics.d.ts +60 -0
  476. package/dist/core/storage/metrics.d.ts.map +1 -0
  477. package/dist/core/storage/metrics.js +134 -0
  478. package/dist/core/storage/policy.d.ts +7 -0
  479. package/dist/core/storage/policy.d.ts.map +1 -0
  480. package/dist/core/storage/policy.js +110 -0
  481. package/dist/core/storage/process-log.d.ts +38 -0
  482. package/dist/core/storage/process-log.d.ts.map +1 -0
  483. package/dist/core/storage/process-log.js +165 -0
  484. package/dist/core/storage/query.d.ts +48 -0
  485. package/dist/core/storage/query.d.ts.map +1 -0
  486. package/dist/core/storage/query.js +346 -0
  487. package/dist/core/storage/receipts.d.ts +23 -0
  488. package/dist/core/storage/receipts.d.ts.map +1 -0
  489. package/dist/core/storage/receipts.js +117 -0
  490. package/dist/core/storage/segments.d.ts +84 -0
  491. package/dist/core/storage/segments.d.ts.map +1 -0
  492. package/dist/core/storage/segments.js +542 -0
  493. package/dist/core/storage/sink-graph.d.ts +65 -0
  494. package/dist/core/storage/sink-graph.d.ts.map +1 -0
  495. package/dist/core/storage/sink-graph.js +213 -0
  496. package/dist/core/storage/storm-control.d.ts +23 -0
  497. package/dist/core/storage/storm-control.d.ts.map +1 -0
  498. package/dist/core/storage/storm-control.js +59 -0
  499. package/dist/core/supervisor/activity.d.ts +4 -0
  500. package/dist/core/supervisor/activity.d.ts.map +1 -0
  501. package/dist/core/supervisor/activity.js +141 -0
  502. package/dist/core/supervisor/contract.d.ts +268 -0
  503. package/dist/core/supervisor/contract.d.ts.map +1 -0
  504. package/dist/core/supervisor/contract.js +35 -0
  505. package/dist/core/supervisor/explanations.d.ts +4 -0
  506. package/dist/core/supervisor/explanations.d.ts.map +1 -0
  507. package/dist/core/supervisor/explanations.js +71 -0
  508. package/dist/core/supervisor/findings.d.ts +20 -0
  509. package/dist/core/supervisor/findings.d.ts.map +1 -0
  510. package/dist/core/supervisor/findings.js +399 -0
  511. package/dist/core/supervisor/history.d.ts +9 -0
  512. package/dist/core/supervisor/history.d.ts.map +1 -0
  513. package/dist/core/supervisor/history.js +46 -0
  514. package/dist/core/supervisor/hook-health-alerts.d.ts +14 -0
  515. package/dist/core/supervisor/hook-health-alerts.d.ts.map +1 -0
  516. package/dist/core/supervisor/hook-health-alerts.js +70 -0
  517. package/dist/core/supervisor/hook-health-storage.d.ts +5 -0
  518. package/dist/core/supervisor/hook-health-storage.d.ts.map +1 -0
  519. package/dist/core/supervisor/hook-health-storage.js +24 -0
  520. package/dist/core/supervisor/hook-health.d.ts +72 -0
  521. package/dist/core/supervisor/hook-health.d.ts.map +1 -0
  522. package/dist/core/supervisor/hook-health.js +203 -0
  523. package/dist/core/supervisor/hooks.d.ts +10 -0
  524. package/dist/core/supervisor/hooks.d.ts.map +1 -0
  525. package/dist/core/supervisor/hooks.js +28 -0
  526. package/dist/core/supervisor/index.d.ts +15 -0
  527. package/dist/core/supervisor/index.d.ts.map +1 -0
  528. package/dist/core/supervisor/index.js +14 -0
  529. package/dist/core/supervisor/log-feed.d.ts +9 -0
  530. package/dist/core/supervisor/log-feed.d.ts.map +1 -0
  531. package/dist/core/supervisor/log-feed.js +103 -0
  532. package/dist/core/supervisor/service.d.ts +29 -0
  533. package/dist/core/supervisor/service.d.ts.map +1 -0
  534. package/dist/core/supervisor/service.js +450 -0
  535. package/dist/core/supervisor/services.d.ts +11 -0
  536. package/dist/core/supervisor/services.d.ts.map +1 -0
  537. package/dist/core/supervisor/services.js +155 -0
  538. package/dist/core/supervisor/status.d.ts +3 -0
  539. package/dist/core/supervisor/status.d.ts.map +1 -0
  540. package/dist/core/supervisor/status.js +48 -0
  541. package/dist/core/supervisor/storage.d.ts +30 -0
  542. package/dist/core/supervisor/storage.d.ts.map +1 -0
  543. package/dist/core/supervisor/storage.js +73 -0
  544. package/dist/core/supervisor/timeline.d.ts +3 -0
  545. package/dist/core/supervisor/timeline.d.ts.map +1 -0
  546. package/dist/core/supervisor/timeline.js +87 -0
  547. package/dist/core/work/state.d.ts.map +1 -1
  548. package/dist/core/work/state.js +10 -14
  549. package/dist/core/workflow/admission.d.ts +23 -0
  550. package/dist/core/workflow/admission.d.ts.map +1 -0
  551. package/dist/core/workflow/admission.js +136 -0
  552. package/dist/core/workflow/engine.d.ts.map +1 -1
  553. package/dist/core/workflow/engine.js +77 -2
  554. package/dist/core/workflow/index.d.ts +3 -2
  555. package/dist/core/workflow/index.d.ts.map +1 -1
  556. package/dist/core/workflow/index.js +2 -1
  557. package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
  558. package/dist/core/workflow/live-session-v3.js +2 -1
  559. package/dist/core/workflow/proof.d.ts +2 -1
  560. package/dist/core/workflow/proof.d.ts.map +1 -1
  561. package/dist/core/workflow/proof.js +39 -1
  562. package/dist/core/workflow/run-state.d.ts +3 -2
  563. package/dist/core/workflow/run-state.d.ts.map +1 -1
  564. package/dist/core/workflow/run-state.js +8 -1
  565. package/dist/core/workflow/types.d.ts +33 -1
  566. package/dist/core/workflow/types.d.ts.map +1 -1
  567. package/dist/core/workflow/types.js +2 -1
  568. package/dist/index.d.ts +2 -0
  569. package/dist/index.d.ts.map +1 -1
  570. package/dist/index.js +2 -0
  571. package/dist/lazy-commands.d.ts +26 -0
  572. package/dist/lazy-commands.d.ts.map +1 -0
  573. package/dist/lazy-commands.js +210 -0
  574. package/dist/lib/browser/client.d.ts +5 -0
  575. package/dist/lib/browser/client.d.ts.map +1 -1
  576. package/dist/lib/browser/client.js +1 -0
  577. package/dist/lib/browser/index.d.ts +2 -0
  578. package/dist/lib/browser/index.d.ts.map +1 -1
  579. package/dist/lib/browser/index.js +2 -0
  580. package/dist/lib/browser/qa-run-contracts.d.ts +173 -0
  581. package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -0
  582. package/dist/lib/browser/qa-run-contracts.js +226 -0
  583. package/dist/lib/browser/qa-run.d.ts +51 -0
  584. package/dist/lib/browser/qa-run.d.ts.map +1 -0
  585. package/dist/lib/browser/qa-run.js +684 -0
  586. package/dist/lib/coord-root-id.d.ts +9 -0
  587. package/dist/lib/coord-root-id.d.ts.map +1 -0
  588. package/dist/lib/coord-root-id.js +17 -0
  589. package/dist/lib/docs-lint.d.ts +2 -0
  590. package/dist/lib/docs-lint.d.ts.map +1 -1
  591. package/dist/lib/docs-lint.js +45 -80
  592. package/dist/lib/docs-metadata-audit.d.ts +3 -0
  593. package/dist/lib/docs-metadata-audit.d.ts.map +1 -1
  594. package/dist/lib/docs-metadata-audit.js +13 -23
  595. package/dist/lib/docs-metadata-sync.d.ts +1 -0
  596. package/dist/lib/docs-metadata-sync.d.ts.map +1 -1
  597. package/dist/lib/docs-metadata-sync.js +28 -10
  598. package/dist/lib/docs-repository-view.d.ts +22 -0
  599. package/dist/lib/docs-repository-view.d.ts.map +1 -0
  600. package/dist/lib/docs-repository-view.js +185 -0
  601. package/dist/lib/http/client.d.ts +11 -5
  602. package/dist/lib/http/client.d.ts.map +1 -1
  603. package/dist/lib/http/client.js +22 -4
  604. package/dist/lib/http/index.d.ts +1 -1
  605. package/dist/lib/http/index.d.ts.map +1 -1
  606. package/dist/lib/http/index.js +1 -1
  607. package/dist/lib/indexer-exclusions.d.ts +27 -0
  608. package/dist/lib/indexer-exclusions.d.ts.map +1 -0
  609. package/dist/lib/indexer-exclusions.js +176 -0
  610. package/dist/lib/instructions/apply.d.ts +3 -1
  611. package/dist/lib/instructions/apply.d.ts.map +1 -1
  612. package/dist/lib/instructions/apply.js +74 -3
  613. package/dist/lib/instructions/templates.d.ts.map +1 -1
  614. package/dist/lib/instructions/templates.js +11 -0
  615. package/dist/lib/local-file-url.d.ts +9 -0
  616. package/dist/lib/local-file-url.d.ts.map +1 -0
  617. package/dist/lib/local-file-url.js +20 -0
  618. package/dist/lib/web-performance.d.ts +118 -0
  619. package/dist/lib/web-performance.d.ts.map +1 -0
  620. package/dist/lib/web-performance.js +192 -0
  621. package/package.json +40 -2
  622. package/schemas/config.schema.json +58 -0
  623. package/schemas/event-v3.schema.json +324 -112
  624. package/src/commander.ts +488 -95
  625. package/src/commands/agents.ts +617 -237
  626. package/src/commands/artifacts.ts +40 -2
  627. package/src/commands/backup.ts +18 -14
  628. package/src/commands/browse-session.ts +12 -0
  629. package/src/commands/browse.ts +21 -7
  630. package/src/commands/conversations.ts +279 -0
  631. package/src/commands/deinit.ts +6 -0
  632. package/src/commands/diagnostics.ts +271 -0
  633. package/src/commands/docs.ts +25 -6
  634. package/src/commands/doctor.ts +75 -9
  635. package/src/commands/fetch.ts +7 -6
  636. package/src/commands/files.ts +243 -0
  637. package/src/commands/governor.ts +21 -12
  638. package/src/commands/inbox.ts +61 -0
  639. package/src/commands/init.ts +78 -16
  640. package/src/commands/ledger-v3.ts +503 -1
  641. package/src/commands/logs.ts +224 -0
  642. package/src/commands/messages.ts +61 -0
  643. package/src/commands/outline.ts +6 -2
  644. package/src/commands/qa-run.ts +184 -0
  645. package/src/commands/read.ts +6 -2
  646. package/src/commands/resources.ts +38 -0
  647. package/src/commands/semantic.ts +66 -1
  648. package/src/commands/storage.ts +310 -0
  649. package/src/commands/supervisor.ts +141 -0
  650. package/src/commands/tunnel.ts +66 -52
  651. package/src/commands/web.ts +96 -7
  652. package/src/commands/work.ts +3 -3
  653. package/src/commands/workflow.ts +21 -13
  654. package/src/core/agents/cli.ts +265 -55
  655. package/src/core/agents/health.ts +142 -0
  656. package/src/core/agents/live-authority-v3.ts +341 -10
  657. package/src/core/agents/live-lifecycle-v3.ts +6 -1
  658. package/src/core/agents/live-observation-v3.ts +6 -1
  659. package/src/core/agents/mailbox.ts +373 -0
  660. package/src/core/agents/reconcile-coordination-v3.ts +77 -0
  661. package/src/core/agents/render/prompt-context.ts +66 -15
  662. package/src/core/agents/render/session-context.ts +37 -3
  663. package/src/core/agents/rules/commit-conflict.ts +58 -1
  664. package/src/core/agents/rules/stop-hook.ts +105 -20
  665. package/src/core/agents/rules/verdict.ts +1 -0
  666. package/src/core/agents/session-events.ts +4 -0
  667. package/src/core/agents/session-finalization-state-v3.ts +1 -1
  668. package/src/core/agents/session-finalizer-v3.ts +8 -2
  669. package/src/core/agents/state/activity-log.ts +7 -2
  670. package/src/core/agents/state/heartbeat-writer.ts +27 -0
  671. package/src/core/agents/state/live-coordination-view.ts +16 -105
  672. package/src/core/agents/state/live-coordination-writer.ts +141 -0
  673. package/src/core/artifacts/index.ts +260 -11
  674. package/src/core/config.ts +235 -5
  675. package/src/core/conversations/archive.ts +237 -0
  676. package/src/core/conversations/catalog.ts +79 -0
  677. package/src/core/conversations/context-pack.ts +72 -0
  678. package/src/core/conversations/contract.ts +178 -0
  679. package/src/core/conversations/evaluation.ts +30 -0
  680. package/src/core/conversations/index.ts +9 -0
  681. package/src/core/conversations/lifecycle.ts +63 -0
  682. package/src/core/conversations/normalize.ts +105 -0
  683. package/src/core/conversations/query.ts +318 -0
  684. package/src/core/conversations/search-index.ts +48 -0
  685. package/src/core/diagnostics/advice.ts +147 -0
  686. package/src/core/diagnostics/bundle.ts +1142 -0
  687. package/src/core/diagnostics/comparison.ts +565 -0
  688. package/src/core/diagnostics/contract.ts +311 -0
  689. package/src/core/diagnostics/identity.ts +11 -0
  690. package/src/core/diagnostics/index.ts +7 -0
  691. package/src/core/diagnostics/replay.ts +314 -0
  692. package/src/core/diagnostics/sanitize.ts +97 -0
  693. package/src/core/events/legacy-storage/canary.ts +177 -0
  694. package/src/core/events/legacy-storage/compression.ts +130 -0
  695. package/src/core/events/legacy-storage/fence.ts +129 -0
  696. package/src/core/events/legacy-storage/index.ts +6 -0
  697. package/src/core/events/legacy-storage/inventory.ts +51 -0
  698. package/src/core/events/legacy-storage/manifest.ts +136 -0
  699. package/src/core/events/legacy-storage/reader.ts +178 -0
  700. package/src/core/events/v3/archive-retention.ts +251 -0
  701. package/src/core/events/v3/authority-outbox.ts +22 -1
  702. package/src/core/events/v3/base-contract.ts +17 -7
  703. package/src/core/events/v3/bootstrap.ts +195 -2
  704. package/src/core/events/v3/capabilities.ts +5 -3
  705. package/src/core/events/v3/control-witness.ts +339 -0
  706. package/src/core/events/v3/control-writer.ts +16 -0
  707. package/src/core/events/v3/control.ts +54 -18
  708. package/src/core/events/v3/coordination-transaction-recovery.ts +477 -0
  709. package/src/core/events/v3/coordination-view.ts +17 -1
  710. package/src/core/events/v3/generated.ts +1 -1
  711. package/src/core/events/v3/index.ts +14 -2
  712. package/src/core/events/v3/live-route-observer.ts +80 -0
  713. package/src/core/events/v3/live-routing.ts +65 -46
  714. package/src/core/events/v3/producers/coordination-recorder.ts +95 -10
  715. package/src/core/events/v3/producers/diagnostic-summaries.ts +593 -0
  716. package/src/core/events/v3/producers/hook-base.ts +15 -3
  717. package/src/core/events/v3/producers/intake.ts +31 -2
  718. package/src/core/events/v3/producers/producer-state-observer.ts +52 -0
  719. package/src/core/events/v3/producers/recorder.ts +681 -34
  720. package/src/core/events/v3/reader.ts +243 -2
  721. package/src/core/events/v3/rotation-config.ts +98 -0
  722. package/src/core/events/v3/runtime-build.ts +41 -0
  723. package/src/core/events/v3/runtime-identity.ts +16 -0
  724. package/src/core/events/v3/runtime-telemetry-capabilities.ts +14 -8
  725. package/src/core/events/v3/support-storage/classify.ts +209 -0
  726. package/src/core/events/v3/support-storage/eligibility.ts +58 -0
  727. package/src/core/events/v3/support-storage/index.ts +9 -0
  728. package/src/core/events/v3/support-storage/inventory.ts +135 -0
  729. package/src/core/events/v3/support-storage/logical-authority.ts +117 -0
  730. package/src/core/events/v3/support-storage/maintenance.ts +501 -0
  731. package/src/core/events/v3/support-storage/pack-contract.ts +337 -0
  732. package/src/core/events/v3/support-storage/pack-reader.ts +346 -0
  733. package/src/core/events/v3/support-storage/pack-writer.ts +352 -0
  734. package/src/core/events/v3/support-storage/recovery.ts +43 -0
  735. package/src/core/events/v3/turn-telemetry.ts +58 -7
  736. package/src/core/events/v3/writer.ts +168 -16
  737. package/src/core/governor/plan-read.ts +5 -18
  738. package/src/core/governor/planning.ts +5 -8
  739. package/src/core/governor/service-read.ts +320 -2
  740. package/src/core/governor/service.ts +49 -22
  741. package/src/core/guard/evidence-v3.ts +1 -0
  742. package/src/core/hooks/adapter/events.ts +1 -0
  743. package/src/core/hooks/adapter/output.ts +23 -5
  744. package/src/core/hooks/adapter/runtime-telemetry.ts +408 -13
  745. package/src/core/hooks/cli.ts +404 -233
  746. package/src/core/hooks/effects/image-capture.ts +4 -1
  747. package/src/core/hooks/health.ts +146 -0
  748. package/src/core/hooks/remediation-cap.ts +12 -6
  749. package/src/core/hooks/resolve/coord-root.ts +91 -11
  750. package/src/core/hooks/resolve/owner.ts +4 -0
  751. package/src/core/hooks/resolve/transcript.ts +18 -0
  752. package/src/core/inbox/contract.ts +81 -0
  753. package/src/core/inbox/index.ts +4 -0
  754. package/src/core/inbox/lifecycle.ts +104 -0
  755. package/src/core/inbox/service.ts +305 -0
  756. package/src/core/inbox/watcher.ts +36 -0
  757. package/src/core/presence/codec-digest.ts +15 -9
  758. package/src/core/presence/relay-client.ts +55 -7
  759. package/src/core/resources/contract.ts +98 -0
  760. package/src/core/resources/index.ts +5 -0
  761. package/src/core/resources/sampler.ts +458 -0
  762. package/src/core/resources/service-status.ts +62 -0
  763. package/src/core/resources/service.ts +337 -0
  764. package/src/core/resources/storage.ts +44 -0
  765. package/src/core/semantic/adapters.ts +200 -41
  766. package/src/core/semantic/contract.ts +135 -3
  767. package/src/core/semantic/index.ts +76 -2
  768. package/src/core/semantic/once.ts +93 -7
  769. package/src/core/semantic/prompt.ts +13 -1
  770. package/src/core/semantic/review.ts +803 -0
  771. package/src/core/semantic/routes.ts +30 -0
  772. package/src/core/semantic/scheduler.ts +49 -5
  773. package/src/core/semantic/service-status.ts +99 -5
  774. package/src/core/semantic/service.ts +116 -15
  775. package/src/core/semantic/soak.ts +638 -0
  776. package/src/core/semantic/storage.ts +20 -6
  777. package/src/core/semantic/usage.ts +272 -0
  778. package/src/core/semantic/validate.ts +31 -0
  779. package/src/core/storage/atomic-json.ts +15 -0
  780. package/src/core/storage/buffer.ts +124 -0
  781. package/src/core/storage/builtins.ts +972 -0
  782. package/src/core/storage/catalog.ts +467 -0
  783. package/src/core/storage/config.ts +423 -0
  784. package/src/core/storage/contract.ts +342 -0
  785. package/src/core/storage/durable-history.ts +738 -0
  786. package/src/core/storage/health.ts +76 -0
  787. package/src/core/storage/index.ts +15 -0
  788. package/src/core/storage/inventory.ts +859 -0
  789. package/src/core/storage/jsonl.ts +213 -0
  790. package/src/core/storage/log-retention.ts +555 -0
  791. package/src/core/storage/logger.ts +548 -0
  792. package/src/core/storage/maintenance-providers.ts +200 -0
  793. package/src/core/storage/maintenance.ts +929 -0
  794. package/src/core/storage/metrics.ts +199 -0
  795. package/src/core/storage/policy.ts +141 -0
  796. package/src/core/storage/process-log.ts +203 -0
  797. package/src/core/storage/query.ts +418 -0
  798. package/src/core/storage/receipts.ts +162 -0
  799. package/src/core/storage/segments.ts +721 -0
  800. package/src/core/storage/sink-graph.ts +343 -0
  801. package/src/core/storage/storm-control.ts +91 -0
  802. package/src/core/supervisor/activity.ts +193 -0
  803. package/src/core/supervisor/contract.ts +312 -0
  804. package/src/core/supervisor/explanations.ts +104 -0
  805. package/src/core/supervisor/findings.ts +788 -0
  806. package/src/core/supervisor/history.ts +61 -0
  807. package/src/core/supervisor/hook-health-alerts.ts +108 -0
  808. package/src/core/supervisor/hook-health-storage.ts +25 -0
  809. package/src/core/supervisor/hook-health.ts +301 -0
  810. package/src/core/supervisor/hooks.ts +35 -0
  811. package/src/core/supervisor/index.ts +14 -0
  812. package/src/core/supervisor/log-feed.ts +131 -0
  813. package/src/core/supervisor/service.ts +511 -0
  814. package/src/core/supervisor/services.ts +203 -0
  815. package/src/core/supervisor/status.ts +59 -0
  816. package/src/core/supervisor/storage.ts +126 -0
  817. package/src/core/supervisor/timeline.ts +133 -0
  818. package/src/core/work/state.ts +12 -21
  819. package/src/core/workflow/admission.ts +215 -0
  820. package/src/core/workflow/engine.ts +93 -1
  821. package/src/core/workflow/index.ts +10 -0
  822. package/src/core/workflow/live-session-v3.ts +2 -4
  823. package/src/core/workflow/proof.ts +54 -1
  824. package/src/core/workflow/run-state.ts +13 -1
  825. package/src/core/workflow/types.ts +39 -1
  826. package/src/index.ts +2 -0
  827. package/src/lazy-commands.ts +294 -0
  828. package/src/lib/browser/client.ts +6 -0
  829. package/src/lib/browser/index.ts +29 -0
  830. package/src/lib/browser/qa-run-contracts.ts +380 -0
  831. package/src/lib/browser/qa-run.ts +784 -0
  832. package/src/lib/coord-root-id.ts +23 -0
  833. package/src/lib/docs-lint.ts +58 -77
  834. package/src/lib/docs-metadata-audit.ts +26 -21
  835. package/src/lib/docs-metadata-sync.ts +32 -9
  836. package/src/lib/docs-repository-view.ts +220 -0
  837. package/src/lib/http/client.ts +44 -8
  838. package/src/lib/http/index.ts +6 -1
  839. package/src/lib/indexer-exclusions.ts +173 -0
  840. package/src/lib/instructions/apply.ts +81 -2
  841. package/src/lib/instructions/templates.ts +11 -0
  842. package/src/lib/local-file-url.ts +31 -0
  843. package/src/lib/web-performance.ts +335 -0
@@ -0,0 +1,684 @@
1
+ // One-command page-QA matrix runner: planner, deterministic gates per
2
+ // context, interaction assertions, manifest-required critique, and the QA
3
+ // snapshot — executed as child `browse` processes through a bounded pool, and
4
+ // reported as one fail-closed machine-readable result.
5
+ //
6
+ // The runner never builds a shell string: every child is an argv array handed
7
+ // to an injectable exec function (default: node:child_process execFile with a
8
+ // closed stdin, bounded output, and an explicit timeout). Every child that
9
+ // fails, times out, or dies silently becomes a named blocker or a failed
10
+ // outcome in the result — nothing is filtered away.
11
+ //
12
+ // Toolkit tier: this module must not import src/core (layering check).
13
+ import { execFile } from "node:child_process";
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ import { computeVerdict, mergeCoverage, QA_RUN_RESULT_SCHEMA_VERSION, } from "./qa-run-contracts.js";
17
+ /** Set on critique children unless the job permits metered critique: the
18
+ * host's critique provider must stay on subscription-backed headless
19
+ * harnesses and surface exhaustion instead of falling back to a metered API. */
20
+ export const QA_RUN_HEADLESS_ONLY_ENV = "HARNERY_CRITIQUE_HEADLESS_ONLY";
21
+ /** Result document written into the run's output directory. */
22
+ export const QA_RUN_RESULT_FILENAME = "page-qa-result.json";
23
+ const DEFAULT_COMMAND_TIMEOUT_MS = 120_000;
24
+ const DEFAULT_COMMAND_CONCURRENCY = 2;
25
+ const EXEC_MAX_BUFFER = 16 * 1024 * 1024;
26
+ /** The planner's deterministic vocabulary is an executable contract, not a
27
+ * report-only hint. A job may add checks, but these arguments always run for
28
+ * every manifest context. `console` is enforced from the browse envelope
29
+ * because browse captures diagnostics without a separate fail flag. */
30
+ const MANIFEST_DETERMINISTIC_ARGS = {
31
+ console: [],
32
+ overflow: ["--check-overflow", "--check-overflow-fail"],
33
+ truncation: ["--check-truncation", "--check-truncation-fail"],
34
+ placeholder: ["--check-placeholder", "--check-placeholder-fail"],
35
+ };
36
+ /** Default executor: execFile with argv arrays only (never a shell string),
37
+ * closed stdin, bounded output buffers, and the policy timeout. */
38
+ export const defaultQaRunExec = (argv, options) => new Promise((resolvePromise) => {
39
+ const [command, ...args] = argv;
40
+ if (!command) {
41
+ resolvePromise({ exitCode: null, stdout: "", stderr: "", error: "empty argv" });
42
+ return;
43
+ }
44
+ const child = execFile(command, args, {
45
+ timeout: options.timeoutMs,
46
+ maxBuffer: EXEC_MAX_BUFFER,
47
+ env: options.env,
48
+ killSignal: "SIGTERM",
49
+ }, (err, stdout, stderr) => {
50
+ const out = String(stdout ?? "");
51
+ const errOut = String(stderr ?? "");
52
+ if (!err) {
53
+ resolvePromise({ exitCode: 0, stdout: out, stderr: errOut });
54
+ return;
55
+ }
56
+ const failure = err;
57
+ if (typeof failure.code === "number") {
58
+ // Completed with a nonzero exit code: a real outcome, not an error.
59
+ resolvePromise({ exitCode: failure.code, stdout: out, stderr: errOut });
60
+ return;
61
+ }
62
+ const reason = failure.killed || failure.signal
63
+ ? `killed by ${failure.signal ?? "signal"} (timeout ${options.timeoutMs}ms)`
64
+ : failure.message || "spawn failed";
65
+ resolvePromise({ exitCode: null, stdout: out, stderr: errOut, error: reason });
66
+ });
67
+ child.stdin?.end();
68
+ });
69
+ /** One-line tail excerpt of a failed child's output for blockers and
70
+ * failures, preferring stderr and falling back to stdout (browse prints its
71
+ * JSON error envelope there). Without this, a blocker like "planner exited 1"
72
+ * gives the reader nothing to act on. */
73
+ function execErrorExcerpt(res, maxLength = 240) {
74
+ const source = res.stderr.trim().length > 0 ? res.stderr : res.stdout;
75
+ const flat = source.trim().replace(/\s+/g, " ");
76
+ if (flat.length === 0)
77
+ return undefined;
78
+ return flat.length > maxLength ? `…${flat.slice(-maxLength)}` : flat;
79
+ }
80
+ /** Fixed-size promise pool: at most `limit` workers in flight, items claimed
81
+ * in order, results written by index so completion order never matters. */
82
+ async function runPool(items, limit, worker) {
83
+ let next = 0;
84
+ const lanes = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {
85
+ while (true) {
86
+ const index = next;
87
+ next += 1;
88
+ if (index >= items.length)
89
+ return;
90
+ const item = items[index];
91
+ await worker(item, index);
92
+ }
93
+ });
94
+ await Promise.all(lanes);
95
+ }
96
+ function readEnvelope(jsonPath) {
97
+ try {
98
+ const parsed = JSON.parse(readFileSync(jsonPath, "utf8"));
99
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
100
+ return parsed;
101
+ }
102
+ }
103
+ catch {
104
+ // Best-effort: a missing or unparseable artifact is handled by the caller.
105
+ }
106
+ return undefined;
107
+ }
108
+ function gatherArtifacts(outPrefix) {
109
+ const artifacts = {};
110
+ const png = `${outPrefix}.png`;
111
+ const html = `${outPrefix}.html`;
112
+ const json = `${outPrefix}.json`;
113
+ if (existsSync(png))
114
+ artifacts.png = png;
115
+ if (existsSync(html))
116
+ artifacts.html = html;
117
+ if (existsSync(json))
118
+ artifacts.json = json;
119
+ return artifacts;
120
+ }
121
+ /** Best-effort extraction of failing-check details from a browse JSON
122
+ * envelope. The exit-code entry the caller records is the guaranteed
123
+ * minimum; these lines add human-readable specifics when parseable. */
124
+ function parseGateFailures(envelope) {
125
+ if (!envelope)
126
+ return [];
127
+ const failures = [];
128
+ const overflow = envelope.overflow;
129
+ if (overflow?.hasHorizontalOverflow) {
130
+ failures.push(`overflow: +${overflow.overflowPx ?? "?"}px horizontal overflow`);
131
+ }
132
+ const asserts = envelope.asserts;
133
+ for (const entry of asserts ?? []) {
134
+ if (entry.outcome === "fail") {
135
+ failures.push(`assert ${entry.op ?? "?"} ${entry.selector ?? "?"} → "${entry.actual ?? ""}"`);
136
+ }
137
+ }
138
+ const visibility = envelope.visibility;
139
+ for (const entry of visibility ?? []) {
140
+ if (entry.found === false)
141
+ failures.push(`visibility ${entry.selector ?? "?"}: not found`);
142
+ else if (entry.cssVisible === false) {
143
+ failures.push(`visibility ${entry.selector ?? "?"}: CSS-hidden`);
144
+ }
145
+ }
146
+ const critique = envelope.critique;
147
+ if (critique?.outcome === "fail") {
148
+ for (const finding of critique.findings ?? []) {
149
+ failures.push(`critique [${finding.severity ?? "?"}]: ${finding.description ?? ""}`);
150
+ }
151
+ }
152
+ return failures;
153
+ }
154
+ function diagnosticSummary(entry) {
155
+ if (typeof entry === "string")
156
+ return entry;
157
+ if (entry && typeof entry === "object" && !Array.isArray(entry)) {
158
+ const record = entry;
159
+ for (const key of ["text", "message", "errorText", "failure", "url"]) {
160
+ const value = record[key];
161
+ if (typeof value === "string" && value.length > 0)
162
+ return value;
163
+ }
164
+ }
165
+ return JSON.stringify(entry);
166
+ }
167
+ /** `console` in the planner contract covers every browser diagnostic that the
168
+ * browse envelope records. Keep the first three details actionable and name
169
+ * any remainder without allowing an unbounded page log to bloat the result. */
170
+ function parseConsoleFailures(envelope) {
171
+ if (!envelope)
172
+ return [];
173
+ const failures = [];
174
+ const groups = [
175
+ ["console", envelope.consoleErrors],
176
+ ["page", envelope.pageErrors],
177
+ ["request", envelope.failedRequests],
178
+ ];
179
+ for (const [label, value] of groups) {
180
+ if (!Array.isArray(value) || value.length === 0)
181
+ continue;
182
+ for (const entry of value.slice(0, 3))
183
+ failures.push(`${label}: ${diagnosticSummary(entry)}`);
184
+ if (value.length > 3)
185
+ failures.push(`${label}: ${value.length - 3} additional failure(s)`);
186
+ }
187
+ return failures;
188
+ }
189
+ function providerLabel(critique) {
190
+ const meta = critique?.provider_meta;
191
+ if (meta) {
192
+ for (const key of ["provider", "route", "model"]) {
193
+ const value = meta[key];
194
+ if (typeof value === "string" && value.length > 0)
195
+ return value;
196
+ }
197
+ }
198
+ return critique?.provider ? "host" : "none";
199
+ }
200
+ /**
201
+ * Execute the whole QA matrix for one validated job and return the result
202
+ * (also written to `<outDir>/page-qa-result.json`). Stages: plan →
203
+ * deterministic gates (bounded pool) → interactions (serial) → critique (one
204
+ * context at a time; the critique provider owns tile concurrency) → snapshot.
205
+ * The verdict is computeVerdict over everything recorded — fail-closed.
206
+ */
207
+ export async function runQaMatrix(options) {
208
+ const { job, outDir, browseArgv } = options;
209
+ const exec = options.exec ?? defaultQaRunExec;
210
+ const log = options.onLog ?? (() => { });
211
+ const timeoutMs = job.policy?.command_timeout_ms ?? DEFAULT_COMMAND_TIMEOUT_MS;
212
+ const concurrency = job.policy?.command_concurrency ?? DEFAULT_COMMAND_CONCURRENCY;
213
+ mkdirSync(outDir, { recursive: true });
214
+ const startedAt = Date.now();
215
+ const wall = { plan: 0, gates: 0, interactions: 0, critique: 0, snapshot: 0, total: 0 };
216
+ const blockers = [];
217
+ const commands = [];
218
+ const critique = [];
219
+ let manifest = null;
220
+ let contexts = [];
221
+ let snapshot = { saved: false };
222
+ const baseEnv = { ...process.env, ...options.childEnv };
223
+ const timedExec = async (argv, env) => {
224
+ const started = Date.now();
225
+ let res;
226
+ try {
227
+ res = await exec(argv, { timeoutMs, env });
228
+ }
229
+ catch (err) {
230
+ res = {
231
+ exitCode: null,
232
+ stdout: "",
233
+ stderr: "",
234
+ error: err instanceof Error ? err.message : String(err),
235
+ };
236
+ }
237
+ return { res, wallTimeMs: Date.now() - started };
238
+ };
239
+ const finalize = () => {
240
+ wall.total = Date.now() - startedAt;
241
+ const result = {
242
+ schema_version: QA_RUN_RESULT_SCHEMA_VERSION,
243
+ target: job.target,
244
+ ...(job.tested_revision !== undefined ? { tested_revision: job.tested_revision } : {}),
245
+ mode: job.mode,
246
+ qa_plan: manifest,
247
+ contexts,
248
+ commands,
249
+ critique,
250
+ snapshot,
251
+ wall_time_ms: { ...wall },
252
+ blockers,
253
+ verdict: computeVerdict({
254
+ mode: job.mode,
255
+ blockers,
256
+ commands,
257
+ critique,
258
+ snapshotSaved: snapshot.saved,
259
+ }),
260
+ };
261
+ writeFileSync(join(outDir, QA_RUN_RESULT_FILENAME), `${JSON.stringify(result, null, 2)}\n`);
262
+ return result;
263
+ };
264
+ // Base render arguments shared by every per-context invocation.
265
+ const contextRenderArgs = (ctx) => [
266
+ "--viewport",
267
+ ctx.viewport,
268
+ ...(ctx.theme === "dark" ? ["--color-scheme", "dark"] : []),
269
+ ...(ctx.args ?? []),
270
+ ];
271
+ // ------------------------------------------------------------------ plan
272
+ const planArgv = [
273
+ ...browseArgv,
274
+ job.target,
275
+ "--qa-plan",
276
+ "--json",
277
+ "--no-screenshot",
278
+ ...(job.qa_hints?.scopes ?? []).flatMap((selector) => ["--qa-scope", selector]),
279
+ ...(job.qa_hints?.states?.length ? ["--qa-states", job.qa_hints.states.join(",")] : []),
280
+ ];
281
+ log(`plan: ${job.target}`);
282
+ const planStart = Date.now();
283
+ const plan = await timedExec(planArgv, baseEnv);
284
+ wall.plan = Date.now() - planStart;
285
+ let planEnvelope;
286
+ if (!plan.res.error && plan.res.exitCode === 0) {
287
+ try {
288
+ const parsed = JSON.parse(plan.res.stdout);
289
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
290
+ planEnvelope = parsed;
291
+ }
292
+ }
293
+ catch {
294
+ // handled below as a plan blocker
295
+ }
296
+ }
297
+ const qaPlanReport = planEnvelope?.qaPlan;
298
+ manifest = qaPlanReport?.manifest ?? null;
299
+ const planUsable = manifest !== null && !manifest.incomplete && plan.res.exitCode === 0;
300
+ commands.push({
301
+ context_id: "plan",
302
+ check_id: "plan",
303
+ argv: planArgv,
304
+ exit_code: plan.res.exitCode,
305
+ outcome: planUsable ? "passed" : "unknown",
306
+ failures: planUsable
307
+ ? []
308
+ : [plan.res.error, execErrorExcerpt(plan.res)].filter((entry) => Boolean(entry)),
309
+ artifacts: {},
310
+ wall_time_ms: plan.wallTimeMs,
311
+ });
312
+ if (plan.res.error) {
313
+ blockers.push({ stage: "plan", reason: `planner command did not complete: ${plan.res.error}` });
314
+ }
315
+ else if (plan.res.exitCode !== 0) {
316
+ const excerpt = execErrorExcerpt(plan.res);
317
+ blockers.push({
318
+ stage: "plan",
319
+ reason: `planner exited ${plan.res.exitCode}${excerpt ? `: ${excerpt}` : ""}`,
320
+ });
321
+ }
322
+ else if (!manifest) {
323
+ blockers.push({
324
+ stage: "plan",
325
+ reason: "planner envelope carried no parseable qaPlan.manifest",
326
+ });
327
+ }
328
+ else if (manifest.incomplete) {
329
+ blockers.push({
330
+ stage: "plan",
331
+ reason: `planner manifest is incomplete: ${manifest.incomplete.reason}`,
332
+ });
333
+ }
334
+ if (!planUsable || !manifest) {
335
+ // Stop before any further browser work: an untrusted plan cannot gate.
336
+ contexts = manifest ? mergeCoverage(manifest, job) : [];
337
+ return finalize();
338
+ }
339
+ // ----------------------------------------------------------------- gates
340
+ contexts = mergeCoverage(manifest, job);
341
+ const unsupportedDeterministic = manifest.checks.deterministic.filter((check) => MANIFEST_DETERMINISTIC_ARGS[check] === undefined);
342
+ if (unsupportedDeterministic.length > 0) {
343
+ for (const check of unsupportedDeterministic) {
344
+ blockers.push({
345
+ stage: "gates",
346
+ reason: `planner requires deterministic check "${check}" but qa-run has no executable ` +
347
+ "mapping for it — coverage cannot be narrowed",
348
+ });
349
+ }
350
+ return finalize();
351
+ }
352
+ const manifestGateArgs = manifest.checks.deterministic.flatMap((check) => MANIFEST_DETERMINISTIC_ARGS[check] ?? []);
353
+ const enforceConsole = manifest.checks.deterministic.includes("console");
354
+ const checks = job.checks ?? [];
355
+ const gateOutcomes = new Array(contexts.length);
356
+ const gatesStart = Date.now();
357
+ await runPool(contexts, concurrency, async (ctx, index) => {
358
+ const applicable = checks.filter((check) => check.contexts === undefined || check.contexts.includes(ctx.id));
359
+ const checkId = [
360
+ ...manifest.checks.deterministic.map((check) => `manifest:${check}`),
361
+ ...applicable.map((check) => check.id),
362
+ ].join("+") || "capture";
363
+ const outPrefix = join(outDir, ctx.id);
364
+ const argv = [
365
+ ...browseArgv,
366
+ job.target,
367
+ ...contextRenderArgs(ctx),
368
+ "--out",
369
+ outPrefix,
370
+ ...manifestGateArgs,
371
+ ...applicable.flatMap((check) => check.args),
372
+ ];
373
+ log(`gate ${ctx.id}: ${checkId}`);
374
+ const { res, wallTimeMs } = await timedExec(argv, baseEnv);
375
+ const jsonPath = `${outPrefix}.json`;
376
+ const failures = [];
377
+ let outcome;
378
+ const envelope = existsSync(jsonPath) ? readEnvelope(jsonPath) : undefined;
379
+ const consoleFailures = enforceConsole ? parseConsoleFailures(envelope) : [];
380
+ if (!res.error && res.exitCode === 0 && existsSync(jsonPath)) {
381
+ if (consoleFailures.length > 0) {
382
+ outcome = "failed";
383
+ failures.push(...consoleFailures);
384
+ }
385
+ else {
386
+ outcome = "passed";
387
+ }
388
+ }
389
+ else if (!res.error && res.exitCode === 2 && existsSync(jsonPath)) {
390
+ outcome = "failed";
391
+ failures.push(`exit code 2 (${jsonPath})`);
392
+ failures.push(...parseGateFailures(envelope), ...consoleFailures);
393
+ }
394
+ else {
395
+ outcome = "unknown";
396
+ const excerpt = execErrorExcerpt(res);
397
+ const base = res.error
398
+ ? res.error
399
+ : !existsSync(jsonPath)
400
+ ? `exit code ${res.exitCode ?? "null"}, missing JSON artifact ${jsonPath}`
401
+ : `exit code ${res.exitCode ?? "null"}`;
402
+ const reason = excerpt ? `${base}: ${excerpt}` : base;
403
+ failures.push(reason);
404
+ blockers.push({
405
+ stage: "gates",
406
+ context_id: ctx.id,
407
+ reason: `gate command did not complete: ${reason}`,
408
+ });
409
+ }
410
+ gateOutcomes[index] = {
411
+ context_id: ctx.id,
412
+ check_id: checkId,
413
+ argv,
414
+ exit_code: res.exitCode,
415
+ outcome,
416
+ failures,
417
+ artifacts: gatherArtifacts(outPrefix),
418
+ wall_time_ms: wallTimeMs,
419
+ };
420
+ });
421
+ wall.gates = Date.now() - gatesStart;
422
+ // Manifest order regardless of completion order: outcomes were written by
423
+ // context index, so a straight push preserves it.
424
+ commands.push(...gateOutcomes);
425
+ // ---------------------------------------------------------- interactions
426
+ const interactionsStart = Date.now();
427
+ const declaredStates = new Set((job.interaction_states ?? []).map((state) => state.name));
428
+ const manifestStates = [
429
+ ...new Set(manifest.contexts.map((context) => context.state).filter((state) => state !== "default")),
430
+ ];
431
+ for (const state of manifestStates) {
432
+ if (!declaredStates.has(state)) {
433
+ blockers.push({
434
+ stage: "interactions",
435
+ reason: `manifest requires interaction state "${state}" but the job declares no matching ` +
436
+ "interaction_states entry — job coverage may never be narrower than the manifest",
437
+ });
438
+ }
439
+ }
440
+ for (const state of job.interaction_states ?? []) {
441
+ const outPrefix = join(outDir, `interaction-${state.name}`);
442
+ const argv = [
443
+ ...browseArgv,
444
+ job.target,
445
+ "--out",
446
+ outPrefix,
447
+ ...state.setup,
448
+ ...state.assertions.flatMap((assertion) => ["--assert", assertion]),
449
+ "--assert-fail",
450
+ ];
451
+ log(`interaction ${state.name}`);
452
+ const { res, wallTimeMs } = await timedExec(argv, baseEnv);
453
+ const jsonPath = `${outPrefix}.json`;
454
+ const failures = [];
455
+ let outcome;
456
+ if (!res.error && res.exitCode === 0 && existsSync(jsonPath)) {
457
+ outcome = "passed";
458
+ }
459
+ else if (!res.error && res.exitCode === 2 && existsSync(jsonPath)) {
460
+ outcome = "failed";
461
+ failures.push(`exit code 2 (${jsonPath})`);
462
+ failures.push(...parseGateFailures(readEnvelope(jsonPath)));
463
+ }
464
+ else {
465
+ outcome = "unknown";
466
+ const excerpt = execErrorExcerpt(res);
467
+ const base = res.error
468
+ ? res.error
469
+ : !existsSync(jsonPath)
470
+ ? `exit code ${res.exitCode ?? "null"}, missing JSON artifact ${jsonPath}`
471
+ : `exit code ${res.exitCode ?? "null"}`;
472
+ const reason = excerpt ? `${base}: ${excerpt}` : base;
473
+ failures.push(reason);
474
+ blockers.push({
475
+ stage: "interactions",
476
+ context_id: state.name,
477
+ reason: `interaction command did not complete: ${reason}`,
478
+ });
479
+ }
480
+ commands.push({
481
+ context_id: state.name,
482
+ check_id: `interaction:${state.name}`,
483
+ argv,
484
+ exit_code: res.exitCode,
485
+ outcome,
486
+ failures,
487
+ artifacts: gatherArtifacts(outPrefix),
488
+ wall_time_ms: wallTimeMs,
489
+ });
490
+ }
491
+ wall.interactions = Date.now() - interactionsStart;
492
+ // -------------------------------------------------------------- critique
493
+ const visual = manifest.checks.visual;
494
+ const cleanSoFar = blockers.length === 0 && commands.every((command) => command.outcome === "passed");
495
+ const critiqueStart = Date.now();
496
+ const savedSnapshots = new Map();
497
+ if (cleanSoFar && visual !== "none") {
498
+ const critiqueEnv = job.policy?.allow_metered_critique
499
+ ? { ...baseEnv }
500
+ : { ...baseEnv, [QA_RUN_HEADLESS_ONLY_ENV]: "1" };
501
+ const scopeSelectors = visual === "full-page" ? [undefined] : manifest.scopes.map((s) => s.selector);
502
+ for (const ctx of contexts) {
503
+ let tilesTotal = 0;
504
+ let tilesReviewed = 0;
505
+ let tilesReused = 0;
506
+ let provider = "none";
507
+ let contextOutcome = "passed";
508
+ const findings = [];
509
+ for (const [scopeIndex, selector] of scopeSelectors.entries()) {
510
+ const suffix = scopeSelectors.length > 1 ? `-scope${scopeIndex}` : "";
511
+ const outPrefix = join(outDir, `${ctx.id}-critique${suffix}`);
512
+ const argv = [
513
+ ...browseArgv,
514
+ job.target,
515
+ ...contextRenderArgs(ctx),
516
+ "--out",
517
+ outPrefix,
518
+ ...(selector !== undefined ? ["--check-critique", selector] : ["--check-critique"]),
519
+ "--check-critique-fail",
520
+ ...(manifest.baseline_source !== "none" ? ["--qa-reuse"] : []),
521
+ ...(job.mode === "signoff"
522
+ ? ["--qa-snapshot", "--qa-theme", ctx.theme, "--qa-state", ctx.state]
523
+ : []),
524
+ ];
525
+ log(`critique ${ctx.id}${selector !== undefined ? ` [${selector}]` : ""}`);
526
+ const { res, wallTimeMs } = await timedExec(argv, critiqueEnv);
527
+ const jsonPath = `${outPrefix}.json`;
528
+ const envelope = readEnvelope(jsonPath);
529
+ const envelopeCritique = envelope?.critique;
530
+ const failures = [];
531
+ let commandOutcome;
532
+ if (res.error || (res.exitCode !== 0 && res.exitCode !== 2) || !envelope) {
533
+ commandOutcome = "unknown";
534
+ const excerpt = execErrorExcerpt(res);
535
+ const base = res.error
536
+ ? res.error
537
+ : !envelope
538
+ ? `exit code ${res.exitCode ?? "null"}, missing JSON artifact ${jsonPath}`
539
+ : `exit code ${res.exitCode ?? "null"}`;
540
+ const reason = excerpt ? `${base}: ${excerpt}` : base;
541
+ failures.push(reason);
542
+ blockers.push({
543
+ stage: "critique",
544
+ context_id: ctx.id,
545
+ reason: `critique command did not complete: ${reason}`,
546
+ });
547
+ contextOutcome = "unknown";
548
+ }
549
+ else {
550
+ tilesTotal += envelopeCritique?.tiles ?? 0;
551
+ const reuse = envelope.qaReuse;
552
+ tilesReused += reuse?.tiles_reused ?? 0;
553
+ tilesReviewed += reuse?.tiles_reviewed ?? envelopeCritique?.tiles ?? 0;
554
+ provider = providerLabel(envelopeCritique);
555
+ for (const finding of envelopeCritique?.findings ?? []) {
556
+ findings.push({
557
+ severity: finding.severity ?? "unknown",
558
+ summary: finding.category
559
+ ? `${finding.category}: ${finding.description ?? ""}`
560
+ : (finding.description ?? ""),
561
+ ...(selector !== undefined ? { selector } : {}),
562
+ });
563
+ }
564
+ if (envelopeCritique?.outcome === "pass" && res.exitCode === 0) {
565
+ commandOutcome = "passed";
566
+ }
567
+ else if (envelopeCritique?.outcome === "fail") {
568
+ commandOutcome = "failed";
569
+ failures.push(`critique found ${envelopeCritique.findings?.length ?? 0} defect(s)`);
570
+ contextOutcome = "failed";
571
+ }
572
+ else {
573
+ // "skipped" (no provider / exhausted headless list) or anything
574
+ // unrecognized: the review did not happen, so nothing is proven.
575
+ commandOutcome = "unknown";
576
+ const detail = envelopeCritique?.error ?? "critique reported no conclusive outcome";
577
+ failures.push(detail);
578
+ blockers.push({
579
+ stage: "critique",
580
+ context_id: ctx.id,
581
+ reason: job.policy?.allow_metered_critique
582
+ ? `critique did not complete: ${detail}`
583
+ : `critique did not complete under the headless-only policy ` +
584
+ `(${QA_RUN_HEADLESS_ONLY_ENV}=1; permit metered fallback with ` +
585
+ `policy.allow_metered_critique / --allow-metered): ${detail}`,
586
+ });
587
+ if (contextOutcome !== "failed")
588
+ contextOutcome = "unknown";
589
+ }
590
+ if (job.mode === "signoff") {
591
+ const saved = envelope.qaPlan
592
+ ?.snapshotSaved;
593
+ if (saved?.path)
594
+ savedSnapshots.set(ctx.id, saved.path);
595
+ }
596
+ }
597
+ commands.push({
598
+ context_id: ctx.id,
599
+ check_id: "critique",
600
+ argv,
601
+ exit_code: res.exitCode,
602
+ outcome: commandOutcome,
603
+ failures,
604
+ artifacts: gatherArtifacts(outPrefix),
605
+ wall_time_ms: wallTimeMs,
606
+ });
607
+ }
608
+ critique.push({
609
+ context_id: ctx.id,
610
+ provider,
611
+ tiles_total: tilesTotal,
612
+ tiles_reviewed: tilesReviewed,
613
+ tiles_reused: tilesReused,
614
+ outcome: contextOutcome,
615
+ findings,
616
+ });
617
+ if (job.mode === "signoff" && contextOutcome === "passed" && !savedSnapshots.has(ctx.id)) {
618
+ blockers.push({
619
+ stage: "snapshot",
620
+ context_id: ctx.id,
621
+ reason: "signoff critique passed but no QA snapshot was persisted for the context",
622
+ });
623
+ }
624
+ }
625
+ }
626
+ wall.critique = Date.now() - critiqueStart;
627
+ // -------------------------------------------------------------- snapshot
628
+ // Critique invocations carry --qa-snapshot in signoff mode. When the
629
+ // manifest requires no visual pass (visual === "none"), a passing signoff
630
+ // still needs its baseline persisted, so a dedicated snapshot pass runs.
631
+ const snapshotStart = Date.now();
632
+ if (job.mode === "signoff" && visual === "none" && blockers.length === 0) {
633
+ const stillClean = commands.every((command) => command.outcome === "passed");
634
+ if (stillClean) {
635
+ for (const ctx of contexts) {
636
+ const outPrefix = join(outDir, `${ctx.id}-snapshot`);
637
+ const argv = [
638
+ ...browseArgv,
639
+ job.target,
640
+ ...contextRenderArgs(ctx),
641
+ "--out",
642
+ outPrefix,
643
+ "--qa-snapshot",
644
+ "--qa-theme",
645
+ ctx.theme,
646
+ "--qa-state",
647
+ ctx.state,
648
+ ];
649
+ log(`snapshot ${ctx.id}`);
650
+ const { res, wallTimeMs } = await timedExec(argv, baseEnv);
651
+ const envelope = readEnvelope(`${outPrefix}.json`);
652
+ const saved = envelope?.qaPlan
653
+ ?.snapshotSaved;
654
+ const ok = !res.error && res.exitCode === 0 && Boolean(saved?.path);
655
+ if (ok && saved?.path)
656
+ savedSnapshots.set(ctx.id, saved.path);
657
+ else {
658
+ blockers.push({
659
+ stage: "snapshot",
660
+ context_id: ctx.id,
661
+ reason: `snapshot command did not persist a baseline${res.error ? `: ${res.error}` : ` (exit code ${res.exitCode ?? "null"})`}`,
662
+ });
663
+ }
664
+ commands.push({
665
+ context_id: ctx.id,
666
+ check_id: "snapshot",
667
+ argv,
668
+ exit_code: res.exitCode,
669
+ outcome: ok ? "passed" : "unknown",
670
+ failures: ok ? [] : [res.error ?? `exit code ${res.exitCode ?? "null"}`],
671
+ artifacts: gatherArtifacts(outPrefix),
672
+ wall_time_ms: wallTimeMs,
673
+ });
674
+ }
675
+ }
676
+ }
677
+ wall.snapshot = Date.now() - snapshotStart;
678
+ if (job.mode === "signoff") {
679
+ const allSaved = contexts.length > 0 && contexts.every((ctx) => savedSnapshots.has(ctx.id));
680
+ const lastPath = [...savedSnapshots.values()].pop();
681
+ snapshot = { saved: allSaved, ...(lastPath ? { path: lastPath } : {}) };
682
+ }
683
+ return finalize();
684
+ }
@@ -0,0 +1,9 @@
1
+ /** Local-only endpoint used to prove that a dashboard serves the caller's repo. */
2
+ export declare const COORD_ROOT_ID_PATH = "/api/coord-root";
3
+ /**
4
+ * Opaque identity for a canonical coordination root. The path stays local;
5
+ * only its digest crosses the dashboard boundary.
6
+ */
7
+ export declare function coordRootId(root: string): string;
8
+ export declare function localCoordRootIdUrl(port?: number | string, protocol?: string): string;
9
+ //# sourceMappingURL=coord-root-id.d.ts.map