@quickchatai/pi-quickreview 0.0.0-stage → 1.1.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 (689) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +75 -2
  3. package/assets/agents/pass-abstraction.md +64 -0
  4. package/assets/agents/pass-ask-human.md +134 -0
  5. package/assets/agents/pass-backcompat.md +67 -0
  6. package/assets/agents/pass-baseline.md +61 -0
  7. package/assets/agents/pass-behaviour-delta.md +64 -0
  8. package/assets/agents/pass-bounds.md +36 -0
  9. package/assets/agents/pass-claims.md +31 -0
  10. package/assets/agents/pass-concurrency.md +168 -0
  11. package/assets/agents/pass-consistency.md +57 -0
  12. package/assets/agents/pass-contracts.md +30 -0
  13. package/assets/agents/pass-data-safety.md +54 -0
  14. package/assets/agents/pass-deferred.md +35 -0
  15. package/assets/agents/pass-delivery.md +37 -0
  16. package/assets/agents/pass-duplication.md +60 -0
  17. package/assets/agents/pass-intent.md +63 -0
  18. package/assets/agents/pass-lint-conformance.md +46 -0
  19. package/assets/agents/pass-maintainability.md +67 -0
  20. package/assets/agents/pass-placement.md +68 -0
  21. package/assets/agents/pass-prod-risk.md +24 -0
  22. package/assets/agents/pass-rollout.md +32 -0
  23. package/assets/agents/pass-roundtrip.md +46 -0
  24. package/assets/agents/pass-security.md +31 -0
  25. package/assets/agents/pass-simplicity.md +68 -0
  26. package/assets/agents/pass-statelessness.md +27 -0
  27. package/assets/agents/pass-style.md +37 -0
  28. package/assets/agents/pass-sweep.md +57 -0
  29. package/assets/agents/pass-tests.md +58 -0
  30. package/assets/agents/pass-ui.md +23 -0
  31. package/assets/agents/pass-validate.md +50 -0
  32. package/assets/agents/pass-widened.md +46 -0
  33. package/assets/agents/scan/pass-scan.md +86 -0
  34. package/assets/config.example.toml +1067 -0
  35. package/assets/deploy/reviewer/AGENTS.override.md +12 -0
  36. package/assets/profiles/default/README.md +21 -0
  37. package/assets/profiles/default/addenda/.gitkeep +0 -0
  38. package/assets/profiles/default/profile.toml +17 -0
  39. package/assets/profiles/example-django/README.md +21 -0
  40. package/assets/profiles/example-django/addenda/10-migration-discipline.md +13 -0
  41. package/assets/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
  42. package/assets/profiles/example-django/addenda/30-test-doctrine.md +12 -0
  43. package/assets/profiles/example-django/addenda/40-orm-usage.md +19 -0
  44. package/assets/profiles/example-django/addenda/50-declared-shape.md +10 -0
  45. package/assets/profiles/example-django/addenda/60-config-placement.md +14 -0
  46. package/assets/profiles/example-django/heuristics.toml +24 -0
  47. package/assets/profiles/example-django/profile.toml +9 -0
  48. package/assets/profiles/fast/README.md +24 -0
  49. package/assets/profiles/fast/profile.toml +59 -0
  50. package/assets/profiles/minimal/README.md +17 -0
  51. package/assets/profiles/minimal/addenda/.gitkeep +0 -0
  52. package/assets/profiles/minimal/profile.toml +8 -0
  53. package/assets/profiles/snappy/README.md +24 -0
  54. package/assets/profiles/snappy/addenda/10-race-as-question.md +6 -0
  55. package/assets/profiles/snappy/profile.toml +46 -0
  56. package/assets/prompts/companion-day-open.md +46 -0
  57. package/assets/prompts/companion-first-run.md +104 -0
  58. package/assets/prompts/companion.md +821 -0
  59. package/assets/prompts/conversation-system.md +117 -0
  60. package/assets/prompts/eod-sweep.md +120 -0
  61. package/assets/prompts/onboarding.md +74 -0
  62. package/assets/prompts/pass-common.md +52 -0
  63. package/assets/prompts/pass-quality-common.md +22 -0
  64. package/assets/prompts/round-first.md +874 -0
  65. package/assets/prompts/round-follow-up.md +991 -0
  66. package/assets/prompts/round-re-review.md +889 -0
  67. package/assets/prompts/round-recheck.md +196 -0
  68. package/assets/prompts/round-staleness.md +856 -0
  69. package/assets/schemas/review-result.v1.json +391 -0
  70. package/assets/schemas/scan-result.v1.json +421 -0
  71. package/assets/schemas/version.v1.json +57 -0
  72. package/assets/seed-manifest.json +19 -0
  73. package/assets/seeds/agents/pass-baseline.md +61 -0
  74. package/assets/seeds/agents/pass-contracts.md +30 -0
  75. package/assets/seeds/agents/pass-data-safety.md +54 -0
  76. package/assets/seeds/agents/pass-delivery.md +37 -0
  77. package/assets/seeds/agents/pass-prod-risk.md +24 -0
  78. package/assets/seeds/agents/pass-security.md +31 -0
  79. package/assets/seeds/agents/pass-statelessness.md +27 -0
  80. package/assets/seeds/agents/pass-ui.md +23 -0
  81. package/assets/seeds/agents/pass-validate.md +50 -0
  82. package/assets/seeds/prompts/conversation-system.md +117 -0
  83. package/assets/seeds/prompts/eod-sweep.md +120 -0
  84. package/assets/seeds/prompts/pass-common.md +52 -0
  85. package/dist/extensions/bash-guard.d.ts +467 -0
  86. package/dist/extensions/bash-guard.d.ts.map +1 -0
  87. package/dist/extensions/bash-guard.js +3058 -0
  88. package/dist/extensions/bash-guard.js.map +1 -0
  89. package/dist/extensions/finding-clusters.d.ts +33 -0
  90. package/dist/extensions/finding-clusters.d.ts.map +1 -0
  91. package/dist/extensions/finding-clusters.js +218 -0
  92. package/dist/extensions/finding-clusters.js.map +1 -0
  93. package/dist/extensions/ledger-pin.d.ts +76 -0
  94. package/dist/extensions/ledger-pin.d.ts.map +1 -0
  95. package/dist/extensions/ledger-pin.js +331 -0
  96. package/dist/extensions/ledger-pin.js.map +1 -0
  97. package/dist/extensions/lens.d.ts +43 -0
  98. package/dist/extensions/lens.d.ts.map +1 -0
  99. package/dist/extensions/lens.js +150 -0
  100. package/dist/extensions/lens.js.map +1 -0
  101. package/dist/extensions/pi-tool.d.ts +22 -0
  102. package/dist/extensions/pi-tool.d.ts.map +1 -0
  103. package/dist/extensions/pi-tool.js +20 -0
  104. package/dist/extensions/pi-tool.js.map +1 -0
  105. package/dist/extensions/quickreview.d.ts +21 -0
  106. package/dist/extensions/quickreview.d.ts.map +1 -0
  107. package/dist/extensions/quickreview.js +132 -0
  108. package/dist/extensions/quickreview.js.map +1 -0
  109. package/dist/src/anchors.d.ts +54 -0
  110. package/dist/src/anchors.d.ts.map +1 -0
  111. package/dist/src/anchors.js +127 -0
  112. package/dist/src/anchors.js.map +1 -0
  113. package/dist/src/assetroot.d.ts +16 -0
  114. package/dist/src/assetroot.d.ts.map +1 -0
  115. package/dist/src/assetroot.js +77 -0
  116. package/dist/src/assetroot.js.map +1 -0
  117. package/dist/src/authwatch.d.ts +61 -0
  118. package/dist/src/authwatch.d.ts.map +1 -0
  119. package/dist/src/authwatch.js +210 -0
  120. package/dist/src/authwatch.js.map +1 -0
  121. package/dist/src/budget.d.ts +15 -0
  122. package/dist/src/budget.d.ts.map +1 -0
  123. package/dist/src/budget.js +32 -0
  124. package/dist/src/budget.js.map +1 -0
  125. package/dist/src/casebudget.d.ts +3 -0
  126. package/dist/src/casebudget.d.ts.map +1 -0
  127. package/dist/src/casebudget.js +3 -0
  128. package/dist/src/casebudget.js.map +1 -0
  129. package/dist/src/cigate.d.ts +116 -0
  130. package/dist/src/cigate.d.ts.map +1 -0
  131. package/dist/src/cigate.js +176 -0
  132. package/dist/src/cigate.js.map +1 -0
  133. package/dist/src/codespan.d.ts +46 -0
  134. package/dist/src/codespan.d.ts.map +1 -0
  135. package/dist/src/codespan.js +75 -0
  136. package/dist/src/codespan.js.map +1 -0
  137. package/dist/src/contextpack.d.ts +56 -0
  138. package/dist/src/contextpack.d.ts.map +1 -0
  139. package/dist/src/contextpack.js +195 -0
  140. package/dist/src/contextpack.js.map +1 -0
  141. package/dist/src/contract.d.ts +8 -0
  142. package/dist/src/contract.d.ts.map +1 -0
  143. package/dist/src/contract.js +21 -0
  144. package/dist/src/contract.js.map +1 -0
  145. package/dist/src/coverage.d.ts +32 -0
  146. package/dist/src/coverage.d.ts.map +1 -0
  147. package/dist/src/coverage.js +85 -0
  148. package/dist/src/coverage.js.map +1 -0
  149. package/dist/src/datafence.d.ts +19 -0
  150. package/dist/src/datafence.d.ts.map +1 -0
  151. package/dist/src/datafence.js +60 -0
  152. package/dist/src/datafence.js.map +1 -0
  153. package/dist/src/dedup.d.ts +65 -0
  154. package/dist/src/dedup.d.ts.map +1 -0
  155. package/dist/src/dedup.js +459 -0
  156. package/dist/src/dedup.js.map +1 -0
  157. package/dist/src/depsources.d.ts +304 -0
  158. package/dist/src/depsources.d.ts.map +1 -0
  159. package/dist/src/depsources.js +3367 -0
  160. package/dist/src/depsources.js.map +1 -0
  161. package/dist/src/diffinput.d.ts +10 -0
  162. package/dist/src/diffinput.d.ts.map +1 -0
  163. package/dist/src/diffinput.js +172 -0
  164. package/dist/src/diffinput.js.map +1 -0
  165. package/dist/src/doubtwords.d.ts +10 -0
  166. package/dist/src/doubtwords.d.ts.map +1 -0
  167. package/dist/src/doubtwords.js +13 -0
  168. package/dist/src/doubtwords.js.map +1 -0
  169. package/dist/src/ecosystem.d.ts +148 -0
  170. package/dist/src/ecosystem.d.ts.map +1 -0
  171. package/dist/src/ecosystem.js +338 -0
  172. package/dist/src/ecosystem.js.map +1 -0
  173. package/dist/src/engine/agentdir.d.ts +5 -0
  174. package/dist/src/engine/agentdir.d.ts.map +1 -0
  175. package/dist/src/engine/agentdir.js +21 -0
  176. package/dist/src/engine/agentdir.js.map +1 -0
  177. package/dist/src/engine/auth.d.ts +214 -0
  178. package/dist/src/engine/auth.d.ts.map +1 -0
  179. package/dist/src/engine/auth.js +374 -0
  180. package/dist/src/engine/auth.js.map +1 -0
  181. package/dist/src/engine/budget.d.ts +60 -0
  182. package/dist/src/engine/budget.d.ts.map +1 -0
  183. package/dist/src/engine/budget.js +113 -0
  184. package/dist/src/engine/budget.js.map +1 -0
  185. package/dist/src/engine/capfd.d.ts +6 -0
  186. package/dist/src/engine/capfd.d.ts.map +1 -0
  187. package/dist/src/engine/capfd.js +21 -0
  188. package/dist/src/engine/capfd.js.map +1 -0
  189. package/dist/src/engine/caseout.d.ts +66 -0
  190. package/dist/src/engine/caseout.d.ts.map +1 -0
  191. package/dist/src/engine/caseout.js +107 -0
  192. package/dist/src/engine/caseout.js.map +1 -0
  193. package/dist/src/engine/context.d.ts +57 -0
  194. package/dist/src/engine/context.d.ts.map +1 -0
  195. package/dist/src/engine/context.js +212 -0
  196. package/dist/src/engine/context.js.map +1 -0
  197. package/dist/src/engine/envmap.d.ts +13 -0
  198. package/dist/src/engine/envmap.d.ts.map +1 -0
  199. package/dist/src/engine/envmap.js +372 -0
  200. package/dist/src/engine/envmap.js.map +1 -0
  201. package/dist/src/engine/extfiles.d.ts +7 -0
  202. package/dist/src/engine/extfiles.d.ts.map +1 -0
  203. package/dist/src/engine/extfiles.js +23 -0
  204. package/dist/src/engine/extfiles.js.map +1 -0
  205. package/dist/src/engine/keyroute.d.ts +21 -0
  206. package/dist/src/engine/keyroute.d.ts.map +1 -0
  207. package/dist/src/engine/keyroute.js +58 -0
  208. package/dist/src/engine/keyroute.js.map +1 -0
  209. package/dist/src/engine/lens/cache-group.d.ts +20 -0
  210. package/dist/src/engine/lens/cache-group.d.ts.map +1 -0
  211. package/dist/src/engine/lens/cache-group.js +31 -0
  212. package/dist/src/engine/lens/cache-group.js.map +1 -0
  213. package/dist/src/engine/lens/cache-run.d.ts +65 -0
  214. package/dist/src/engine/lens/cache-run.d.ts.map +1 -0
  215. package/dist/src/engine/lens/cache-run.js +159 -0
  216. package/dist/src/engine/lens/cache-run.js.map +1 -0
  217. package/dist/src/engine/lens/deadline.d.ts +54 -0
  218. package/dist/src/engine/lens/deadline.d.ts.map +1 -0
  219. package/dist/src/engine/lens/deadline.js +111 -0
  220. package/dist/src/engine/lens/deadline.js.map +1 -0
  221. package/dist/src/engine/lens/engine-tools.d.ts +13 -0
  222. package/dist/src/engine/lens/engine-tools.d.ts.map +1 -0
  223. package/dist/src/engine/lens/engine-tools.js +37 -0
  224. package/dist/src/engine/lens/engine-tools.js.map +1 -0
  225. package/dist/src/engine/lens/env.d.ts +23 -0
  226. package/dist/src/engine/lens/env.d.ts.map +1 -0
  227. package/dist/src/engine/lens/env.js +42 -0
  228. package/dist/src/engine/lens/env.js.map +1 -0
  229. package/dist/src/engine/lens/launch-plan.d.ts +63 -0
  230. package/dist/src/engine/lens/launch-plan.d.ts.map +1 -0
  231. package/dist/src/engine/lens/launch-plan.js +203 -0
  232. package/dist/src/engine/lens/launch-plan.js.map +1 -0
  233. package/dist/src/engine/lens/leaf-cache.d.ts +22 -0
  234. package/dist/src/engine/lens/leaf-cache.d.ts.map +1 -0
  235. package/dist/src/engine/lens/leaf-cache.js +115 -0
  236. package/dist/src/engine/lens/leaf-cache.js.map +1 -0
  237. package/dist/src/engine/lens/permits.d.ts +14 -0
  238. package/dist/src/engine/lens/permits.d.ts.map +1 -0
  239. package/dist/src/engine/lens/permits.js +18 -0
  240. package/dist/src/engine/lens/permits.js.map +1 -0
  241. package/dist/src/engine/lens/registry.d.ts +55 -0
  242. package/dist/src/engine/lens/registry.d.ts.map +1 -0
  243. package/dist/src/engine/lens/registry.js +140 -0
  244. package/dist/src/engine/lens/registry.js.map +1 -0
  245. package/dist/src/engine/lens/round-lens.d.ts +16 -0
  246. package/dist/src/engine/lens/round-lens.d.ts.map +1 -0
  247. package/dist/src/engine/lens/round-lens.js +46 -0
  248. package/dist/src/engine/lens/round-lens.js.map +1 -0
  249. package/dist/src/engine/lens/runlens.d.ts +103 -0
  250. package/dist/src/engine/lens/runlens.d.ts.map +1 -0
  251. package/dist/src/engine/lens/runlens.js +538 -0
  252. package/dist/src/engine/lens/runlens.js.map +1 -0
  253. package/dist/src/engine/lens/section.d.ts +19 -0
  254. package/dist/src/engine/lens/section.d.ts.map +1 -0
  255. package/dist/src/engine/lens/section.js +40 -0
  256. package/dist/src/engine/lens/section.js.map +1 -0
  257. package/dist/src/engine/lens/semaphore.d.ts +13 -0
  258. package/dist/src/engine/lens/semaphore.d.ts.map +1 -0
  259. package/dist/src/engine/lens/semaphore.js +44 -0
  260. package/dist/src/engine/lens/semaphore.js.map +1 -0
  261. package/dist/src/engine/lens/tool.d.ts +34 -0
  262. package/dist/src/engine/lens/tool.d.ts.map +1 -0
  263. package/dist/src/engine/lens/tool.js +345 -0
  264. package/dist/src/engine/lens/tool.js.map +1 -0
  265. package/dist/src/engine/lens/wave.d.ts +63 -0
  266. package/dist/src/engine/lens/wave.d.ts.map +1 -0
  267. package/dist/src/engine/lens/wave.js +95 -0
  268. package/dist/src/engine/lens/wave.js.map +1 -0
  269. package/dist/src/engine/livesessions.d.ts +21 -0
  270. package/dist/src/engine/livesessions.d.ts.map +1 -0
  271. package/dist/src/engine/livesessions.js +57 -0
  272. package/dist/src/engine/livesessions.js.map +1 -0
  273. package/dist/src/engine/livewire.d.ts +18 -0
  274. package/dist/src/engine/livewire.d.ts.map +1 -0
  275. package/dist/src/engine/livewire.js +31 -0
  276. package/dist/src/engine/livewire.js.map +1 -0
  277. package/dist/src/engine/openable.d.ts +37 -0
  278. package/dist/src/engine/openable.d.ts.map +1 -0
  279. package/dist/src/engine/openable.js +120 -0
  280. package/dist/src/engine/openable.js.map +1 -0
  281. package/dist/src/engine/pisdk.d.ts +226 -0
  282. package/dist/src/engine/pisdk.d.ts.map +1 -0
  283. package/dist/src/engine/pisdk.js +552 -0
  284. package/dist/src/engine/pisdk.js.map +1 -0
  285. package/dist/src/engine/port.d.ts +144 -0
  286. package/dist/src/engine/port.d.ts.map +1 -0
  287. package/dist/src/engine/port.js +16 -0
  288. package/dist/src/engine/port.js.map +1 -0
  289. package/dist/src/engine/prompts.d.ts +159 -0
  290. package/dist/src/engine/prompts.d.ts.map +1 -0
  291. package/dist/src/engine/prompts.js +339 -0
  292. package/dist/src/engine/prompts.js.map +1 -0
  293. package/dist/src/engine/render.d.ts +10 -0
  294. package/dist/src/engine/render.d.ts.map +1 -0
  295. package/dist/src/engine/render.js +23 -0
  296. package/dist/src/engine/render.js.map +1 -0
  297. package/dist/src/engine/reviewruntime.d.ts +13 -0
  298. package/dist/src/engine/reviewruntime.d.ts.map +1 -0
  299. package/dist/src/engine/reviewruntime.js +35 -0
  300. package/dist/src/engine/reviewruntime.js.map +1 -0
  301. package/dist/src/engine/reviewsdk.d.ts +75 -0
  302. package/dist/src/engine/reviewsdk.d.ts.map +1 -0
  303. package/dist/src/engine/reviewsdk.js +180 -0
  304. package/dist/src/engine/reviewsdk.js.map +1 -0
  305. package/dist/src/engine/round.d.ts +166 -0
  306. package/dist/src/engine/round.d.ts.map +1 -0
  307. package/dist/src/engine/round.js +543 -0
  308. package/dist/src/engine/round.js.map +1 -0
  309. package/dist/src/engine/roundagents.d.ts +17 -0
  310. package/dist/src/engine/roundagents.d.ts.map +1 -0
  311. package/dist/src/engine/roundagents.js +49 -0
  312. package/dist/src/engine/roundagents.js.map +1 -0
  313. package/dist/src/engine/roundevents.d.ts +110 -0
  314. package/dist/src/engine/roundevents.d.ts.map +1 -0
  315. package/dist/src/engine/roundevents.js +276 -0
  316. package/dist/src/engine/roundevents.js.map +1 -0
  317. package/dist/src/engine/roundsdk.d.ts +33 -0
  318. package/dist/src/engine/roundsdk.d.ts.map +1 -0
  319. package/dist/src/engine/roundsdk.js +76 -0
  320. package/dist/src/engine/roundsdk.js.map +1 -0
  321. package/dist/src/engine/sdkruntime.d.ts +23 -0
  322. package/dist/src/engine/sdkruntime.d.ts.map +1 -0
  323. package/dist/src/engine/sdkruntime.js +340 -0
  324. package/dist/src/engine/sdkruntime.js.map +1 -0
  325. package/dist/src/engine/select.d.ts +16 -0
  326. package/dist/src/engine/select.d.ts.map +1 -0
  327. package/dist/src/engine/select.js +32 -0
  328. package/dist/src/engine/select.js.map +1 -0
  329. package/dist/src/engine/sessionwrap.d.ts +4 -0
  330. package/dist/src/engine/sessionwrap.d.ts.map +1 -0
  331. package/dist/src/engine/sessionwrap.js +31 -0
  332. package/dist/src/engine/sessionwrap.js.map +1 -0
  333. package/dist/src/engine/toolfence.d.ts +90 -0
  334. package/dist/src/engine/toolfence.d.ts.map +1 -0
  335. package/dist/src/engine/toolfence.js +378 -0
  336. package/dist/src/engine/toolfence.js.map +1 -0
  337. package/dist/src/engine/tooluid.d.ts +128 -0
  338. package/dist/src/engine/tooluid.d.ts.map +1 -0
  339. package/dist/src/engine/tooluid.js +401 -0
  340. package/dist/src/engine/tooluid.js.map +1 -0
  341. package/dist/src/envstrip.d.ts +10 -0
  342. package/dist/src/envstrip.d.ts.map +1 -0
  343. package/dist/src/envstrip.js +15 -0
  344. package/dist/src/envstrip.js.map +1 -0
  345. package/dist/src/escalationprompt.d.ts +22 -0
  346. package/dist/src/escalationprompt.d.ts.map +1 -0
  347. package/dist/src/escalationprompt.js +54 -0
  348. package/dist/src/escalationprompt.js.map +1 -0
  349. package/dist/src/execfn.d.ts +29 -0
  350. package/dist/src/execfn.d.ts.map +1 -0
  351. package/dist/src/execfn.js +55 -0
  352. package/dist/src/execfn.js.map +1 -0
  353. package/dist/src/finding-chain.d.ts +40 -0
  354. package/dist/src/finding-chain.d.ts.map +1 -0
  355. package/dist/src/finding-chain.js +76 -0
  356. package/dist/src/finding-chain.js.map +1 -0
  357. package/dist/src/finding-row.d.ts +24 -0
  358. package/dist/src/finding-row.d.ts.map +1 -0
  359. package/dist/src/finding-row.js +26 -0
  360. package/dist/src/finding-row.js.map +1 -0
  361. package/dist/src/findingkey.d.ts +99 -0
  362. package/dist/src/findingkey.d.ts.map +1 -0
  363. package/dist/src/findingkey.js +210 -0
  364. package/dist/src/findingkey.js.map +1 -0
  365. package/dist/src/findingsrecord.d.ts +175 -0
  366. package/dist/src/findingsrecord.d.ts.map +1 -0
  367. package/dist/src/findingsrecord.js +410 -0
  368. package/dist/src/findingsrecord.js.map +1 -0
  369. package/dist/src/followup-mode.d.ts +4 -0
  370. package/dist/src/followup-mode.d.ts.map +1 -0
  371. package/dist/src/followup-mode.js +6 -0
  372. package/dist/src/followup-mode.js.map +1 -0
  373. package/dist/src/gate.d.ts +199 -0
  374. package/dist/src/gate.d.ts.map +1 -0
  375. package/dist/src/gate.js +315 -0
  376. package/dist/src/gate.js.map +1 -0
  377. package/dist/src/ghcred.d.ts +58 -0
  378. package/dist/src/ghcred.d.ts.map +1 -0
  379. package/dist/src/ghcred.js +139 -0
  380. package/dist/src/ghcred.js.map +1 -0
  381. package/dist/src/githubAuth.d.ts +32 -0
  382. package/dist/src/githubAuth.d.ts.map +1 -0
  383. package/dist/src/githubAuth.js +116 -0
  384. package/dist/src/githubAuth.js.map +1 -0
  385. package/dist/src/githubcore.d.ts +20 -0
  386. package/dist/src/githubcore.d.ts.map +1 -0
  387. package/dist/src/githubcore.js +20 -0
  388. package/dist/src/githubcore.js.map +1 -0
  389. package/dist/src/glob.d.ts +11 -0
  390. package/dist/src/glob.d.ts.map +1 -0
  391. package/dist/src/glob.js +69 -0
  392. package/dist/src/glob.js.map +1 -0
  393. package/dist/src/guards.d.ts +93 -0
  394. package/dist/src/guards.d.ts.map +1 -0
  395. package/dist/src/guards.js +306 -0
  396. package/dist/src/guards.js.map +1 -0
  397. package/dist/src/heartbeat.d.ts +29 -0
  398. package/dist/src/heartbeat.d.ts.map +1 -0
  399. package/dist/src/heartbeat.js +87 -0
  400. package/dist/src/heartbeat.js.map +1 -0
  401. package/dist/src/heuristics.d.ts +247 -0
  402. package/dist/src/heuristics.d.ts.map +1 -0
  403. package/dist/src/heuristics.js +927 -0
  404. package/dist/src/heuristics.js.map +1 -0
  405. package/dist/src/homes.d.ts +181 -0
  406. package/dist/src/homes.d.ts.map +1 -0
  407. package/dist/src/homes.js +242 -0
  408. package/dist/src/homes.js.map +1 -0
  409. package/dist/src/hunkheader.d.ts +11 -0
  410. package/dist/src/hunkheader.d.ts.map +1 -0
  411. package/dist/src/hunkheader.js +18 -0
  412. package/dist/src/hunkheader.js.map +1 -0
  413. package/dist/src/include.d.ts +435 -0
  414. package/dist/src/include.d.ts.map +1 -0
  415. package/dist/src/include.js +1692 -0
  416. package/dist/src/include.js.map +1 -0
  417. package/dist/src/launchvocab.d.ts +36 -0
  418. package/dist/src/launchvocab.d.ts.map +1 -0
  419. package/dist/src/launchvocab.js +59 -0
  420. package/dist/src/launchvocab.js.map +1 -0
  421. package/dist/src/ledgercarry.d.ts +24 -0
  422. package/dist/src/ledgercarry.d.ts.map +1 -0
  423. package/dist/src/ledgercarry.js +109 -0
  424. package/dist/src/ledgercarry.js.map +1 -0
  425. package/dist/src/lensids.d.ts +7 -0
  426. package/dist/src/lensids.d.ts.map +1 -0
  427. package/dist/src/lensids.js +53 -0
  428. package/dist/src/lensids.js.map +1 -0
  429. package/dist/src/lensplanning.d.ts +8 -0
  430. package/dist/src/lensplanning.d.ts.map +1 -0
  431. package/dist/src/lensplanning.js +126 -0
  432. package/dist/src/lensplanning.js.map +1 -0
  433. package/dist/src/lensresult.d.ts +94 -0
  434. package/dist/src/lensresult.d.ts.map +1 -0
  435. package/dist/src/lensresult.js +162 -0
  436. package/dist/src/lensresult.js.map +1 -0
  437. package/dist/src/lenstuning.d.ts +97 -0
  438. package/dist/src/lenstuning.d.ts.map +1 -0
  439. package/dist/src/lenstuning.js +326 -0
  440. package/dist/src/lenstuning.js.map +1 -0
  441. package/dist/src/lintconfig.d.ts +31 -0
  442. package/dist/src/lintconfig.d.ts.map +1 -0
  443. package/dist/src/lintconfig.js +543 -0
  444. package/dist/src/lintconfig.js.map +1 -0
  445. package/dist/src/live/events.d.ts +188 -0
  446. package/dist/src/live/events.d.ts.map +1 -0
  447. package/dist/src/live/events.js +136 -0
  448. package/dist/src/live/events.js.map +1 -0
  449. package/dist/src/live/writer.d.ts +54 -0
  450. package/dist/src/live/writer.d.ts.map +1 -0
  451. package/dist/src/live/writer.js +516 -0
  452. package/dist/src/live/writer.js.map +1 -0
  453. package/dist/src/localreview.d.ts +128 -0
  454. package/dist/src/localreview.d.ts.map +1 -0
  455. package/dist/src/localreview.js +426 -0
  456. package/dist/src/localreview.js.map +1 -0
  457. package/dist/src/loosenedtests.d.ts +13 -0
  458. package/dist/src/loosenedtests.d.ts.map +1 -0
  459. package/dist/src/loosenedtests.js +188 -0
  460. package/dist/src/loosenedtests.js.map +1 -0
  461. package/dist/src/memoryport.d.ts +264 -0
  462. package/dist/src/memoryport.d.ts.map +1 -0
  463. package/dist/src/memoryport.js +445 -0
  464. package/dist/src/memoryport.js.map +1 -0
  465. package/dist/src/migrations.d.ts +106 -0
  466. package/dist/src/migrations.d.ts.map +1 -0
  467. package/dist/src/migrations.js +373 -0
  468. package/dist/src/migrations.js.map +1 -0
  469. package/dist/src/oneshot.d.ts +12 -0
  470. package/dist/src/oneshot.d.ts.map +1 -0
  471. package/dist/src/oneshot.js +8 -0
  472. package/dist/src/oneshot.js.map +1 -0
  473. package/dist/src/packing.d.ts +11 -0
  474. package/dist/src/packing.d.ts.map +1 -0
  475. package/dist/src/packing.js +31 -0
  476. package/dist/src/packing.js.map +1 -0
  477. package/dist/src/passes.d.ts +16 -0
  478. package/dist/src/passes.d.ts.map +1 -0
  479. package/dist/src/passes.js +104 -0
  480. package/dist/src/passes.js.map +1 -0
  481. package/dist/src/passtasks.d.ts +68 -0
  482. package/dist/src/passtasks.d.ts.map +1 -0
  483. package/dist/src/passtasks.js +360 -0
  484. package/dist/src/passtasks.js.map +1 -0
  485. package/dist/src/pathinside.d.ts +5 -0
  486. package/dist/src/pathinside.d.ts.map +1 -0
  487. package/dist/src/pathinside.js +9 -0
  488. package/dist/src/pathinside.js.map +1 -0
  489. package/dist/src/pibuiltins.d.ts +36 -0
  490. package/dist/src/pibuiltins.d.ts.map +1 -0
  491. package/dist/src/pibuiltins.js +83 -0
  492. package/dist/src/pibuiltins.js.map +1 -0
  493. package/dist/src/plankey.d.ts +4 -0
  494. package/dist/src/plankey.d.ts.map +1 -0
  495. package/dist/src/plankey.js +10 -0
  496. package/dist/src/plankey.js.map +1 -0
  497. package/dist/src/planner.d.ts +375 -0
  498. package/dist/src/planner.d.ts.map +1 -0
  499. package/dist/src/planner.js +722 -0
  500. package/dist/src/planner.js.map +1 -0
  501. package/dist/src/plugin/args.d.ts +19 -0
  502. package/dist/src/plugin/args.d.ts.map +1 -0
  503. package/dist/src/plugin/args.js +107 -0
  504. package/dist/src/plugin/args.js.map +1 -0
  505. package/dist/src/plugin/index.d.ts +3 -0
  506. package/dist/src/plugin/index.d.ts.map +1 -0
  507. package/dist/src/plugin/index.js +14 -0
  508. package/dist/src/plugin/index.js.map +1 -0
  509. package/dist/src/plugin/login.d.ts +39 -0
  510. package/dist/src/plugin/login.d.ts.map +1 -0
  511. package/dist/src/plugin/login.js +73 -0
  512. package/dist/src/plugin/login.js.map +1 -0
  513. package/dist/src/plugin/review.d.ts +27 -0
  514. package/dist/src/plugin/review.d.ts.map +1 -0
  515. package/dist/src/plugin/review.js +298 -0
  516. package/dist/src/plugin/review.js.map +1 -0
  517. package/dist/src/plugin/runner.d.ts +6 -0
  518. package/dist/src/plugin/runner.d.ts.map +1 -0
  519. package/dist/src/plugin/runner.js +65 -0
  520. package/dist/src/plugin/runner.js.map +1 -0
  521. package/dist/src/plugin/scan.d.ts +79 -0
  522. package/dist/src/plugin/scan.d.ts.map +1 -0
  523. package/dist/src/plugin/scan.js +348 -0
  524. package/dist/src/plugin/scan.js.map +1 -0
  525. package/dist/src/plugin/session.d.ts +56 -0
  526. package/dist/src/plugin/session.d.ts.map +1 -0
  527. package/dist/src/plugin/session.js +2 -0
  528. package/dist/src/plugin/session.js.map +1 -0
  529. package/dist/src/plugin/setup.d.ts +19 -0
  530. package/dist/src/plugin/setup.d.ts.map +1 -0
  531. package/dist/src/plugin/setup.js +142 -0
  532. package/dist/src/plugin/setup.js.map +1 -0
  533. package/dist/src/plugin/versiongate.d.ts +26 -0
  534. package/dist/src/plugin/versiongate.d.ts.map +1 -0
  535. package/dist/src/plugin/versiongate.js +83 -0
  536. package/dist/src/plugin/versiongate.js.map +1 -0
  537. package/dist/src/postingkey.d.ts +8 -0
  538. package/dist/src/postingkey.d.ts.map +1 -0
  539. package/dist/src/postingkey.js +25 -0
  540. package/dist/src/postingkey.js.map +1 -0
  541. package/dist/src/postingpolicy.d.ts +108 -0
  542. package/dist/src/postingpolicy.d.ts.map +1 -0
  543. package/dist/src/postingpolicy.js +341 -0
  544. package/dist/src/postingpolicy.js.map +1 -0
  545. package/dist/src/pr-identity.d.ts +3 -0
  546. package/dist/src/pr-identity.d.ts.map +1 -0
  547. package/dist/src/pr-identity.js +9 -0
  548. package/dist/src/pr-identity.js.map +1 -0
  549. package/dist/src/prdelta.d.ts +181 -0
  550. package/dist/src/prdelta.d.ts.map +1 -0
  551. package/dist/src/prdelta.js +501 -0
  552. package/dist/src/prdelta.js.map +1 -0
  553. package/dist/src/pricing.d.ts +94 -0
  554. package/dist/src/pricing.d.ts.map +1 -0
  555. package/dist/src/pricing.js +209 -0
  556. package/dist/src/pricing.js.map +1 -0
  557. package/dist/src/priorfindings.d.ts +167 -0
  558. package/dist/src/priorfindings.d.ts.map +1 -0
  559. package/dist/src/priorfindings.js +445 -0
  560. package/dist/src/priorfindings.js.map +1 -0
  561. package/dist/src/priortasks.d.ts +31 -0
  562. package/dist/src/priortasks.d.ts.map +1 -0
  563. package/dist/src/priortasks.js +119 -0
  564. package/dist/src/priortasks.js.map +1 -0
  565. package/dist/src/profilelookup.d.ts +59 -0
  566. package/dist/src/profilelookup.d.ts.map +1 -0
  567. package/dist/src/profilelookup.js +98 -0
  568. package/dist/src/profilelookup.js.map +1 -0
  569. package/dist/src/profileoverrides.d.ts +91 -0
  570. package/dist/src/profileoverrides.d.ts.map +1 -0
  571. package/dist/src/profileoverrides.js +313 -0
  572. package/dist/src/profileoverrides.js.map +1 -0
  573. package/dist/src/profiles.d.ts +144 -0
  574. package/dist/src/profiles.d.ts.map +1 -0
  575. package/dist/src/profiles.js +604 -0
  576. package/dist/src/profiles.js.map +1 -0
  577. package/dist/src/promptdoc.d.ts +3 -0
  578. package/dist/src/promptdoc.d.ts.map +1 -0
  579. package/dist/src/promptdoc.js +18 -0
  580. package/dist/src/promptdoc.js.map +1 -0
  581. package/dist/src/prtarget.d.ts +70 -0
  582. package/dist/src/prtarget.d.ts.map +1 -0
  583. package/dist/src/prtarget.js +181 -0
  584. package/dist/src/prtarget.js.map +1 -0
  585. package/dist/src/recheckorder.d.ts +32 -0
  586. package/dist/src/recheckorder.d.ts.map +1 -0
  587. package/dist/src/recheckorder.js +5 -0
  588. package/dist/src/recheckorder.js.map +1 -0
  589. package/dist/src/reviewapi.d.ts +207 -0
  590. package/dist/src/reviewapi.d.ts.map +1 -0
  591. package/dist/src/reviewapi.js +939 -0
  592. package/dist/src/reviewapi.js.map +1 -0
  593. package/dist/src/reviewbotfindings.d.ts +33 -0
  594. package/dist/src/reviewbotfindings.d.ts.map +1 -0
  595. package/dist/src/reviewbotfindings.js +80 -0
  596. package/dist/src/reviewbotfindings.js.map +1 -0
  597. package/dist/src/reviewconfig.d.ts +741 -0
  598. package/dist/src/reviewconfig.d.ts.map +1 -0
  599. package/dist/src/reviewconfig.js +797 -0
  600. package/dist/src/reviewconfig.js.map +1 -0
  601. package/dist/src/reviewdelta.d.ts +51 -0
  602. package/dist/src/reviewdelta.d.ts.map +1 -0
  603. package/dist/src/reviewdelta.js +119 -0
  604. package/dist/src/reviewdelta.js.map +1 -0
  605. package/dist/src/reviewdest.d.ts +86 -0
  606. package/dist/src/reviewdest.d.ts.map +1 -0
  607. package/dist/src/reviewdest.js +142 -0
  608. package/dist/src/reviewdest.js.map +1 -0
  609. package/dist/src/reviewerstub.d.ts +12 -0
  610. package/dist/src/reviewerstub.d.ts.map +1 -0
  611. package/dist/src/reviewerstub.js +28 -0
  612. package/dist/src/reviewerstub.js.map +1 -0
  613. package/dist/src/reviewhost.d.ts +58 -0
  614. package/dist/src/reviewhost.d.ts.map +1 -0
  615. package/dist/src/reviewhost.js +135 -0
  616. package/dist/src/reviewhost.js.map +1 -0
  617. package/dist/src/reviewpost.d.ts +79 -0
  618. package/dist/src/reviewpost.d.ts.map +1 -0
  619. package/dist/src/reviewpost.js +233 -0
  620. package/dist/src/reviewpost.js.map +1 -0
  621. package/dist/src/reviewrender.d.ts +154 -0
  622. package/dist/src/reviewrender.d.ts.map +1 -0
  623. package/dist/src/reviewrender.js +480 -0
  624. package/dist/src/reviewrender.js.map +1 -0
  625. package/dist/src/reviewstate.d.ts +62 -0
  626. package/dist/src/reviewstate.d.ts.map +1 -0
  627. package/dist/src/reviewstate.js +167 -0
  628. package/dist/src/reviewstate.js.map +1 -0
  629. package/dist/src/reviewstore.d.ts +17 -0
  630. package/dist/src/reviewstore.d.ts.map +1 -0
  631. package/dist/src/reviewstore.js +105 -0
  632. package/dist/src/reviewstore.js.map +1 -0
  633. package/dist/src/round-progress.d.ts +120 -0
  634. package/dist/src/round-progress.d.ts.map +1 -0
  635. package/dist/src/round-progress.js +172 -0
  636. package/dist/src/round-progress.js.map +1 -0
  637. package/dist/src/round-stage-deadlines.d.ts +12 -0
  638. package/dist/src/round-stage-deadlines.d.ts.map +1 -0
  639. package/dist/src/round-stage-deadlines.js +10 -0
  640. package/dist/src/round-stage-deadlines.js.map +1 -0
  641. package/dist/src/session-command.d.ts +19 -0
  642. package/dist/src/session-command.d.ts.map +1 -0
  643. package/dist/src/session-command.js +20 -0
  644. package/dist/src/session-command.js.map +1 -0
  645. package/dist/src/settledread.d.ts +61 -0
  646. package/dist/src/settledread.d.ts.map +1 -0
  647. package/dist/src/settledread.js +135 -0
  648. package/dist/src/settledread.js.map +1 -0
  649. package/dist/src/severity.d.ts +167 -0
  650. package/dist/src/severity.d.ts.map +1 -0
  651. package/dist/src/severity.js +364 -0
  652. package/dist/src/severity.js.map +1 -0
  653. package/dist/src/severityrank.d.ts +8 -0
  654. package/dist/src/severityrank.d.ts.map +1 -0
  655. package/dist/src/severityrank.js +16 -0
  656. package/dist/src/severityrank.js.map +1 -0
  657. package/dist/src/standing-review.d.ts +45 -0
  658. package/dist/src/standing-review.d.ts.map +1 -0
  659. package/dist/src/standing-review.js +43 -0
  660. package/dist/src/standing-review.js.map +1 -0
  661. package/dist/src/storerows.d.ts +225 -0
  662. package/dist/src/storerows.d.ts.map +1 -0
  663. package/dist/src/storerows.js +7 -0
  664. package/dist/src/storerows.js.map +1 -0
  665. package/dist/src/styleguide.d.ts +25 -0
  666. package/dist/src/styleguide.d.ts.map +1 -0
  667. package/dist/src/styleguide.js +272 -0
  668. package/dist/src/styleguide.js.map +1 -0
  669. package/dist/src/sweepstatus.d.ts +42 -0
  670. package/dist/src/sweepstatus.d.ts.map +1 -0
  671. package/dist/src/sweepstatus.js +97 -0
  672. package/dist/src/sweepstatus.js.map +1 -0
  673. package/dist/src/templates.d.ts +243 -0
  674. package/dist/src/templates.d.ts.map +1 -0
  675. package/dist/src/templates.js +847 -0
  676. package/dist/src/templates.js.map +1 -0
  677. package/dist/src/types.d.ts +639 -0
  678. package/dist/src/types.d.ts.map +1 -0
  679. package/dist/src/types.js +90 -0
  680. package/dist/src/types.js.map +1 -0
  681. package/dist/src/unifieddiff.d.ts +22 -0
  682. package/dist/src/unifieddiff.d.ts.map +1 -0
  683. package/dist/src/unifieddiff.js +176 -0
  684. package/dist/src/unifieddiff.js.map +1 -0
  685. package/dist/src/yieldloop.d.ts +2 -0
  686. package/dist/src/yieldloop.d.ts.map +1 -0
  687. package/dist/src/yieldloop.js +14 -0
  688. package/dist/src/yieldloop.js.map +1 -0
  689. package/package.json +60 -4
@@ -0,0 +1,167 @@
1
+ // What `qcr review` remembers about a target between runs (repo plus branch
2
+ // today; a PR keys the same way), so a second review covers only what changed
3
+ // and never repeats a finding that is still open.
4
+ //
5
+ // The state is the production reasoning record in miniature: one row per
6
+ // finding a round recorded (`RoundFindingRow`) and one per status a later
7
+ // round reported for a prior finding. The open list handed to the next round
8
+ // is production's `computePriorFindings` over them, so the chain, supersede
9
+ // and resolution rules are the daemon's, not a copy.
10
+ //
11
+ // Kept in the install's state home (packages/pi-plugin/src/reviewstore.ts), never tracked, never
12
+ // shared. Unreadable state is no state: the next review is a full one.
13
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
14
+ import { dirname } from "node:path";
15
+ import { normalizeDisposition, recordString } from "./findingkey.js";
16
+ import { parseFindingsRecord } from "./findingsrecord.js";
17
+ import { computePriorFindings } from "./priorfindings.js";
18
+ export const STATE_VERSION = 1;
19
+ /** The target a review is of: the key its state is kept under. */
20
+ export function branchTargetKey(repo, branch) {
21
+ return `branch:${repo}@${branch}`;
22
+ }
23
+ /** A PR's key: the repo and the PR number, apart from any branch of the repo. */
24
+ export function prTargetKey(repo, number) {
25
+ return `pr:${repo}#${number}`;
26
+ }
27
+ export function emptyState(target) {
28
+ return { version: STATE_VERSION, target, rounds: [], rows: [], checks: [] };
29
+ }
30
+ /** The target's state; null when there is none or it cannot be trusted. */
31
+ export function loadState(path, target) {
32
+ if (path === null || !existsSync(path))
33
+ return null;
34
+ try {
35
+ const s = JSON.parse(readFileSync(path, "utf8"));
36
+ if (s.version !== STATE_VERSION ||
37
+ s.target !== target ||
38
+ !Array.isArray(s.rounds) ||
39
+ !Array.isArray(s.rows) ||
40
+ !Array.isArray(s.checks) ||
41
+ s.rounds.length === 0)
42
+ return null;
43
+ const last = s.rounds[s.rounds.length - 1];
44
+ if (typeof last?.head_sha !== "string" || typeof last.round_no !== "number")
45
+ return null;
46
+ return s;
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ /** Atomic: a crash never leaves half a state. Best-effort by contract — a
53
+ * state that could not be written only costs the next review its delta. */
54
+ export function saveState(path, s) {
55
+ if (path === null)
56
+ return false;
57
+ try {
58
+ mkdirSync(dirname(path), { recursive: true });
59
+ const tmp = `${path}.${process.pid}.tmp`;
60
+ writeFileSync(tmp, JSON.stringify(s, null, 2) + "\n");
61
+ renameSync(tmp, path);
62
+ return true;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ export const lastRound = (s) => s.rounds[s.rounds.length - 1];
69
+ /** The findings still open for the round after the last one: production's
70
+ * prior-findings list over the state. */
71
+ export function openFindings(s, nextRound) {
72
+ const roundNo = nextRound ?? (s ? lastRound(s).round_no + 1 : 1);
73
+ if (s === null)
74
+ return { pr: 0, round_no: roundNo, findings: [], dropped: [], incomplete: [] };
75
+ return computePriorFindings({
76
+ pr: 0,
77
+ roundNo,
78
+ rows: s.rows,
79
+ checks: s.checks.map((c) => ({ ...c })),
80
+ });
81
+ }
82
+ // ---- recording a round -----------------------------------------------------------
83
+ /** The dispositions a reader sees as findings (the terminal hides the
84
+ * review's own kills): carried as open findings, whatever the record called
85
+ * them. */
86
+ const SHOWN_AS_POSTED = new Set(["posted", "downgraded", "doubted", "unknown"]);
87
+ const norm = (s) => (s ?? "")
88
+ .toLowerCase()
89
+ .replace(/[^a-z0-9 ]+/g, " ")
90
+ .replace(/\s+/g, " ")
91
+ .trim();
92
+ /**
93
+ * Fold a finished round's findings record into the state. A finding that
94
+ * re-raises one already open (the same key on the same file, a named older round, the same
95
+ * title on the same file, or the same lens on the same line) is a repeat: it
96
+ * is kept in the state as `merged` (auditable) and never reaches the reader as
97
+ * new, whatever the session did. The statuses the round reported for the prior
98
+ * findings are recorded, so the next list shrinks.
99
+ */
100
+ export function recordRound(prev, target, round, rawRecord) {
101
+ const base = prev === null || round.scope === "full" ? emptyState(target) : structuredClone(prev);
102
+ const open = round.scope === "delta" && prev ? openFindings(prev, round.round_no) : null;
103
+ const raw = rawRecord !== null && typeof rawRecord === "object" && !Array.isArray(rawRecord)
104
+ ? { ...rawRecord, pr: undefined, round_no: undefined }
105
+ : rawRecord;
106
+ const parsed = parseFindingsRecord(raw, 0, round.round_no);
107
+ const entries = parsed.record?.findings ?? [];
108
+ const fresh = [];
109
+ const repeats = [];
110
+ let id = base.rows.reduce((m, r) => Math.max(m, r.id), 0);
111
+ for (const e of entries) {
112
+ const disposition = normalizeDisposition(e.disposition);
113
+ const shown = SHOWN_AS_POSTED.has(disposition);
114
+ const isRepeat = shown &&
115
+ open !== null &&
116
+ open.findings.some((p) =>
117
+ // A key is a round-local handle: it names the same finding only on
118
+ // the same file.
119
+ (p.finding_key === e.key && p.path === e.path) ||
120
+ (e.raised_in_round !== null && e.raised_in_round < round.round_no) ||
121
+ (p.path !== null &&
122
+ p.path === e.path &&
123
+ ((norm(p.title) !== "" && norm(p.title) === norm(e.title)) ||
124
+ (p.line !== null && p.line === e.line && p.lens === e.lens))));
125
+ if (shown)
126
+ (isRepeat ? repeats : fresh).push(e);
127
+ base.rows.push({
128
+ id: ++id,
129
+ pr: 0,
130
+ round_id: null,
131
+ round_no: round.round_no,
132
+ head_sha: round.head_sha,
133
+ finding_key: e.key,
134
+ path: e.path,
135
+ line: e.line,
136
+ lens: e.lens,
137
+ tier: e.tier,
138
+ unplanned: 0,
139
+ severity: e.severity,
140
+ confidence: e.confidence,
141
+ reachability: e.reachability,
142
+ kind: e.kind,
143
+ disposition: isRepeat ? "merged" : shown ? "posted" : disposition,
144
+ axis: e.axis,
145
+ word: isRepeat ? "repeat-of-open" : e.word,
146
+ reason: e.reason,
147
+ evidence: e.evidence,
148
+ posted_as: shown ? (e.posted_as ?? recordString(e.severity) ?? "finding") : e.posted_as,
149
+ raised_in_round: e.raised_in_round,
150
+ thread_id: e.thread_id,
151
+ recorded_at: round.reviewed_at,
152
+ title: e.title,
153
+ lens_ids: null,
154
+ });
155
+ }
156
+ for (const p of parsed.record?.prior ?? [])
157
+ base.checks.push({
158
+ checked_round: round.round_no,
159
+ round_no: p.round_no,
160
+ finding_key: p.finding_key,
161
+ status: p.status,
162
+ evidence: p.evidence,
163
+ });
164
+ base.rounds.push(round);
165
+ return { state: base, fresh, repeats };
166
+ }
167
+ //# sourceMappingURL=reviewstate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewstate.js","sourceRoot":"","sources":["../../src/reviewstate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface ReviewStore {
2
+ /** `<state home>/review/<key>`. */
3
+ readonly dir: string;
4
+ /** The state file for a target (`branchTargetKey` / `prTargetKey`). */
5
+ statePath(targetKey: string): string;
6
+ /** The repo's saved destinations. */
7
+ destinationPath(): string;
8
+ }
9
+ /** The repo's directory-safe key; null outside a git repo, or in one with no
10
+ * commit yet (nothing to key it by, and nothing to remember). Several root
11
+ * commits (merged histories): the smallest hash, so the key is stable. */
12
+ export declare function repoKey(cwd: string): string | null;
13
+ /** The repo's store under the review home `home`; null outside a git repo.
14
+ * Opening is cheap and creates nothing but, on the first open, the imported
15
+ * copies. */
16
+ export declare function openReviewStoreIn(home: string, cwd: string): ReviewStore | null;
17
+ //# sourceMappingURL=reviewstore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewstore.d.ts","sourceRoot":"","sources":["../../src/reviewstore.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,qCAAqC;IACrC,eAAe,IAAI,MAAM,CAAC;CAC3B;AAoBD;;0EAE0E;AAC1E,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAelD;AA8BD;;aAEa;AACb,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAgB/E"}
@@ -0,0 +1,105 @@
1
+ // Where a local review keeps what it remembers about a repo: the delta history
2
+ // per target (packages/pi-plugin/src/reviewstate.ts) and the saved destination (packages/pi-plugin/src/reviewdest.ts).
3
+ //
4
+ // One directory per repo under the review home the host names (the CLI's is
5
+ // `<state home>/review`, src/reviewhome.ts):
6
+ // <home>/<key>/state/<hash>.json one file per target
7
+ // <home>/<key>/destination.json the saved destinations
8
+ // The key is the origin's owner/name plus the repo's root commit, so every
9
+ // clone and worktree of a repo shares one history and a fork keeps its own.
10
+ // A repo with no origin is keyed by its directory name instead of an owner.
11
+ // The state home is the place a container volume mounts, which is why this is
12
+ // not the git dir any more. The git dir's old files are copied in once.
13
+ import { createHash } from "node:crypto";
14
+ import { execFileSync } from "node:child_process";
15
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
16
+ import { basename, dirname, join, resolve } from "node:path";
17
+ import { originRepo } from "./localreview.js";
18
+ const LEGACY_STATE_DIR = "qcr-review-state";
19
+ const LEGACY_DEST_FILE = "qcr-review-destination.json";
20
+ const IMPORTED_MARKER = ".legacy-imported";
21
+ function git(cwd, args) {
22
+ try {
23
+ return execFileSync("git", args, {
24
+ cwd,
25
+ encoding: "utf8",
26
+ stdio: ["ignore", "pipe", "ignore"],
27
+ }).trim();
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ const slug = (s) => s
34
+ .toLowerCase()
35
+ .replace(/[^a-z0-9._-]+/g, "_")
36
+ .replace(/^\.+/, "_");
37
+ /** The repo's directory-safe key; null outside a git repo, or in one with no
38
+ * commit yet (nothing to key it by, and nothing to remember). Several root
39
+ * commits (merged histories): the smallest hash, so the key is stable. */
40
+ export function repoKey(cwd) {
41
+ const roots = git(cwd, ["rev-list", "--max-parents=0", "HEAD"]);
42
+ const root = roots?.split("\n").filter(Boolean).sort()[0];
43
+ if (!root)
44
+ return null;
45
+ const origin = originRepo(cwd);
46
+ let name = origin;
47
+ if (name === null) {
48
+ const common = git(cwd, ["rev-parse", "--path-format=absolute", "--git-common-dir"]);
49
+ if (common === null)
50
+ return null;
51
+ // A normal repo's common dir is `<repo>/.git`; a bare one is the repo.
52
+ const dir = basename(common) === ".git" ? dirname(common) : common;
53
+ name = `local/${basename(dir)}`;
54
+ }
55
+ const [owner = "local", repo = ""] = name.split("/");
56
+ return `${slug(owner)}--${slug(repo)}--${root.slice(0, 12)}`;
57
+ }
58
+ /** Copy what the repo's git dir held before the state moved here. Once per
59
+ * store (a marker says so), and never over a file the store already has. The
60
+ * originals are left where they are. Best-effort: a copy that fails costs the
61
+ * repo its old history, not the review. */
62
+ function importLegacy(cwd, store) {
63
+ const marker = join(store.dir, IMPORTED_MARKER);
64
+ if (existsSync(marker))
65
+ return;
66
+ try {
67
+ const common = git(cwd, ["rev-parse", "--path-format=absolute", "--git-common-dir"]);
68
+ if (common !== null) {
69
+ const stateDir = join(common, LEGACY_STATE_DIR);
70
+ const copy = (from, to) => {
71
+ if (!existsSync(from) || existsSync(to))
72
+ return;
73
+ mkdirSync(dirname(to), { recursive: true });
74
+ copyFileSync(from, to);
75
+ };
76
+ if (existsSync(stateDir))
77
+ for (const f of readdirSync(stateDir))
78
+ if (f.endsWith(".json"))
79
+ copy(join(stateDir, f), join(store.dir, "state", f));
80
+ copy(join(common, LEGACY_DEST_FILE), store.destinationPath());
81
+ }
82
+ mkdirSync(store.dir, { recursive: true });
83
+ writeFileSync(marker, "");
84
+ }
85
+ catch {
86
+ // Unwritable store: the callers' own saves fail the same way, quietly.
87
+ }
88
+ }
89
+ /** The repo's store under the review home `home`; null outside a git repo.
90
+ * Opening is cheap and creates nothing but, on the first open, the imported
91
+ * copies. */
92
+ export function openReviewStoreIn(home, cwd) {
93
+ const key = repoKey(cwd);
94
+ if (key === null)
95
+ return null;
96
+ const dir = resolve(home, key);
97
+ const store = {
98
+ dir,
99
+ statePath: (targetKey) => join(dir, "state", `${createHash("sha256").update(targetKey).digest("hex").slice(0, 20)}.json`),
100
+ destinationPath: () => join(dir, "destination.json"),
101
+ };
102
+ importLegacy(cwd, store);
103
+ return store;
104
+ }
105
+ //# sourceMappingURL=reviewstore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewstore.js","sourceRoot":"","sources":["../../src/reviewstore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ export declare const LIVE_AGENT_STATUSES: readonly ["running", "completed", "failed"];
2
+ export type LiveAgentStatus = (typeof LIVE_AGENT_STATUSES)[number];
3
+ export declare function isLiveAgentStatus(value: unknown): value is LiveAgentStatus;
4
+ export type PassExecutionPhase = "plan" | "sweep" | "optional";
5
+ export interface LiveAgentProgress {
6
+ /** One subagent tool invocation, not merely an agent name. Repeated lenses
7
+ * remain distinct so an older completion cannot satisfy a newer run. */
8
+ execution_id?: string;
9
+ agent: string;
10
+ /** Task-directory phase. Absent on legacy/free-form calls, which retain
11
+ * their original plan interpretation. Sweep completions never repair a
12
+ * different phase's required failure. */
13
+ phase?: PassExecutionPhase;
14
+ status: LiveAgentStatus;
15
+ duration_ms: number;
16
+ tool_count: number;
17
+ /** Immutable execution milestones. Absent on version-1/display-only
18
+ * snapshots; supervisors must never infer their absence as a failure. */
19
+ started_at?: string;
20
+ finished_at?: string;
21
+ current_tool?: string;
22
+ last_message?: string;
23
+ error?: string;
24
+ }
25
+ export type RoundExecutionStage = "unknown" | "accepted" | "preparing" | "fanout-started" | "passes-complete" | "finalized";
26
+ export interface RoundProgressSnapshot {
27
+ /** v2 adds immutable execution milestones. v1 remains readable for the TUI
28
+ * and for settlement evidence, but cannot drive early pass-stage recovery. */
29
+ version: 1 | 2;
30
+ pr: number;
31
+ session: string;
32
+ run_started_at: string;
33
+ updated_at: string;
34
+ parent_status: "active" | "settled";
35
+ /** Exact durable command identity, learned from its correlated user
36
+ * message. Absent on interactive/legacy runs; absent means telemetry cannot
37
+ * prove settlement for command recovery. */
38
+ command_id?: string;
39
+ command_sha256?: string;
40
+ command_accepted_at?: string;
41
+ /** Prompt-derived immutable review identity. Together with command id/hash,
42
+ * this prevents a neighboring accepted run from impersonating this round. */
43
+ round_no?: number;
44
+ head_sha?: string;
45
+ /** Named parent milestones. `preparing_at` is stamped with exact
46
+ * command acceptance; `fanout_started_at` is the first subagent execution.
47
+ * `first_lens_started_at` remains the backwards-compatible spelling. */
48
+ preparing_at?: string;
49
+ first_lens_started_at?: string;
50
+ fanout_started_at?: string;
51
+ last_activity_at: string;
52
+ last_activity: string;
53
+ active_tool?: string;
54
+ agents: LiveAgentProgress[];
55
+ }
56
+ /** Built pass agents append their model tier to the lens identity. SQLite's
57
+ * authoritative plan stores the lens, while Pi progress reports the invoked
58
+ * agent, so every comparison crosses this one normalization seam. */
59
+ export declare function lensForAgent(agent: string): string;
60
+ /** A pass execution that has ended, either way. */
61
+ export declare function isTerminalAgentStatus(status: LiveAgentStatus): boolean;
62
+ /** A required lens is complete only when it ran and all its executions ended. */
63
+ export declare function executionsComplete(executions: readonly LiveAgentProgress[]): boolean;
64
+ /** The executions that open a round's fanout: a started run of one of the
65
+ * plan's DISCOVERY lenses. Validator-first, an added lens or a foreign
66
+ * subagent never counts. */
67
+ export declare function plannedFanoutAgents(progress: RoundProgressSnapshot, planned: readonly string[]): LiveAgentProgress[];
68
+ /** Classify the current parent stage from immutable milestones plus the
69
+ * authoritative round plan. Activity text and heartbeat age are deliberately
70
+ * absent: they can describe a stage but can never renew it. */
71
+ export declare function roundExecutionStage(progress: RoundProgressSnapshot, planned: readonly string[]): RoundExecutionStage;
72
+ /** Parse an untrusted remote sidecar. A malformed file is simply unavailable. */
73
+ export declare function parseRoundProgress(raw: string): RoundProgressSnapshot | undefined;
74
+ /**
75
+ * The APPEND-ONLY transition log beside the snapshot:
76
+ * `state/round-progress/pr-<n>.jsonl`. The snapshot is rewritten on every
77
+ * event, so it can only say what is true NOW; the log keeps the order in
78
+ * which a run got there — parent start/settle, command acceptance, every
79
+ * pass's start and end with its status — so a round the supervisor ended can
80
+ * be reconstructed afterwards. Diagnostic only: nothing in the daemon reads
81
+ * it for a decision.
82
+ */
83
+ export type ProgressTransition = {
84
+ event: "parent_start";
85
+ } | {
86
+ event: "command_accepted";
87
+ round_no?: number;
88
+ head_sha?: string;
89
+ } | {
90
+ event: "pass_start";
91
+ execution_id: string;
92
+ agent: string;
93
+ } | {
94
+ event: "pass_end";
95
+ execution_id: string;
96
+ agent: string;
97
+ status: LiveAgentStatus;
98
+ } | {
99
+ event: "parent_settle";
100
+ };
101
+ export type ProgressLogLine = ProgressTransition & {
102
+ at: string;
103
+ pr: number;
104
+ session: string;
105
+ run_started_at: string;
106
+ command_id?: string;
107
+ };
108
+ /** Size cap of the live log. A transition line is ~200–300 bytes and a round
109
+ * writes a few dozen (sweeps a little over a hundred), so 256 KiB holds many
110
+ * rounds of one PR. Past it the file rotates ONCE to `.jsonl.1` (the previous
111
+ * `.1` dropped), so a PR never holds more than ~512 KiB of log. Rotation is
112
+ * per line, not per round: a round may straddle the two files, so a
113
+ * reconstruction reads `.jsonl.1` then `.jsonl`. */
114
+ export declare const PROGRESS_LOG_MAX_BYTES: number;
115
+ /** `pr-<n>.json` → `pr-<n>.jsonl`. */
116
+ export declare function progressLogPath(snapshotPath: string): string;
117
+ /** Append one line, rotating first when it would cross the cap. Throws on an
118
+ * I/O failure — the caller (the extension) logs and carries on. */
119
+ export declare function appendProgressLog(path: string, line: ProgressLogLine, maxBytes?: number): void;
120
+ //# sourceMappingURL=round-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round-progress.d.ts","sourceRoot":"","sources":["../../src/round-progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Live, ephemeral progress from one PR's sticky pi session.
3
+ *
4
+ * SQLite remains authoritative for the round plan, timing and verdict. This
5
+ * sidecar answers only the question SQLite cannot: what the parent and its
6
+ * lens subagents are doing right now. Missing/stale data is UNKNOWN, never
7
+ * inferred as pending or done.
8
+ */
9
+ import { appendFileSync, renameSync, statSync } from "node:fs";
10
+ import { PASS_TIER_ORDER } from "./types.js";
11
+ export const LIVE_AGENT_STATUSES = ["running", "completed", "failed"];
12
+ export function isLiveAgentStatus(value) {
13
+ return typeof value === "string" && LIVE_AGENT_STATUSES.some((status) => status === value);
14
+ }
15
+ /** Built pass agents append their model tier to the lens identity. SQLite's
16
+ * authoritative plan stores the lens, while Pi progress reports the invoked
17
+ * agent, so every comparison crosses this one normalization seam. */
18
+ export function lensForAgent(agent) {
19
+ return agent.replace(TIER_SUFFIX, "");
20
+ }
21
+ /** `--<tier>` for every tier on the ladder (`PASS_TIER_ORDER`). */
22
+ const TIER_SUFFIX = new RegExp(`--(?:${PASS_TIER_ORDER.join("|")})$`);
23
+ /** A pass execution that has ended, either way. */
24
+ export function isTerminalAgentStatus(status) {
25
+ return status === "completed" || status === "failed";
26
+ }
27
+ /** A required lens is complete only when it ran and all its executions ended. */
28
+ export function executionsComplete(executions) {
29
+ return executions.length > 0 && executions.every((agent) => isTerminalAgentStatus(agent.status));
30
+ }
31
+ /** The executions that open a round's fanout: a started run of one of the
32
+ * plan's DISCOVERY lenses. Validator-first, an added lens or a foreign
33
+ * subagent never counts. */
34
+ export function plannedFanoutAgents(progress, planned) {
35
+ const discovery = planned.filter((name) => name !== "pass-validate");
36
+ return progress.agents.filter((agent) => discovery.includes(lensForAgent(agent.agent)) && agent.started_at !== undefined);
37
+ }
38
+ /** Classify the current parent stage from immutable milestones plus the
39
+ * authoritative round plan. Activity text and heartbeat age are deliberately
40
+ * absent: they can describe a stage but can never renew it. */
41
+ export function roundExecutionStage(progress, planned) {
42
+ if (progress.version !== 2 || !progress.command_id || !progress.command_sha256)
43
+ return "unknown";
44
+ if (progress.parent_status === "settled")
45
+ return "finalized";
46
+ if (plannedFanoutAgents(progress, planned).length === 0)
47
+ return progress.preparing_at ? "preparing" : "accepted";
48
+ const terminal = isTerminalAgentStatus;
49
+ const plannedComplete = planned.every((name) => {
50
+ const executions = progress.agents.filter((agent) => lensForAgent(agent.agent) === name);
51
+ return executionsComplete(executions);
52
+ });
53
+ const addedComplete = progress.agents
54
+ .filter((agent) => !planned.includes(lensForAgent(agent.agent)))
55
+ .every((agent) => terminal(agent.status));
56
+ return plannedComplete && addedComplete ? "passes-complete" : "fanout-started";
57
+ }
58
+ function instant(value) {
59
+ if (typeof value !== "string")
60
+ return undefined;
61
+ const parsed = Date.parse(value);
62
+ return Number.isFinite(parsed) ? parsed : undefined;
63
+ }
64
+ /** Parse an untrusted remote sidecar. A malformed file is simply unavailable. */
65
+ export function parseRoundProgress(raw) {
66
+ try {
67
+ const value = JSON.parse(raw);
68
+ if ((value.version !== 1 && value.version !== 2) ||
69
+ !Number.isInteger(value.pr) ||
70
+ typeof value.session !== "string" ||
71
+ instant(value.run_started_at) === undefined ||
72
+ instant(value.updated_at) === undefined ||
73
+ (value.parent_status !== "active" && value.parent_status !== "settled") ||
74
+ (value.command_id === undefined) !== (value.command_sha256 === undefined) ||
75
+ (value.command_id !== undefined && typeof value.command_id !== "string") ||
76
+ (value.command_sha256 !== undefined &&
77
+ (typeof value.command_sha256 !== "string" ||
78
+ !/^[a-f0-9]{64}$/.test(value.command_sha256))) ||
79
+ (value.round_no !== undefined && (!Number.isInteger(value.round_no) || value.round_no < 1)) ||
80
+ (value.head_sha !== undefined &&
81
+ (typeof value.head_sha !== "string" || value.head_sha.length === 0)) ||
82
+ instant(value.last_activity_at) === undefined ||
83
+ typeof value.last_activity !== "string" ||
84
+ !Array.isArray(value.agents))
85
+ return undefined;
86
+ const runStarted = instant(value.run_started_at);
87
+ const accepted = value.command_accepted_at === undefined ? undefined : instant(value.command_accepted_at);
88
+ const preparing = value.preparing_at === undefined ? undefined : instant(value.preparing_at);
89
+ const firstLens = value.first_lens_started_at === undefined ? undefined : instant(value.first_lens_started_at);
90
+ const fanout = value.fanout_started_at === undefined ? undefined : instant(value.fanout_started_at);
91
+ if ((value.command_accepted_at !== undefined && accepted === undefined) ||
92
+ (value.preparing_at !== undefined && preparing === undefined) ||
93
+ (value.first_lens_started_at !== undefined && firstLens === undefined) ||
94
+ (value.fanout_started_at !== undefined && fanout === undefined) ||
95
+ (accepted !== undefined && accepted < runStarted) ||
96
+ (accepted !== undefined && preparing !== undefined && preparing < accepted) ||
97
+ (accepted !== undefined && firstLens !== undefined && firstLens < accepted) ||
98
+ (preparing !== undefined && fanout !== undefined && fanout < preparing) ||
99
+ (firstLens !== undefined && fanout !== undefined && firstLens !== fanout))
100
+ return undefined;
101
+ if (value.version === 2 && value.command_id !== undefined && accepted === undefined)
102
+ return undefined;
103
+ if (value.version === 2 &&
104
+ value.agents.length > 0 &&
105
+ firstLens === undefined &&
106
+ fanout === undefined)
107
+ return undefined;
108
+ for (const rawAgent of value.agents) {
109
+ if (rawAgent === null || typeof rawAgent !== "object" || Array.isArray(rawAgent))
110
+ return undefined;
111
+ const agent = rawAgent;
112
+ if ((value.version === 2 && typeof agent.execution_id !== "string") ||
113
+ typeof agent.agent !== "string" ||
114
+ (agent.phase !== undefined && !["plan", "sweep", "optional"].includes(agent.phase)) ||
115
+ !isLiveAgentStatus(agent.status) ||
116
+ typeof agent.duration_ms !== "number" ||
117
+ !Number.isFinite(agent.duration_ms) ||
118
+ typeof agent.tool_count !== "number" ||
119
+ !Number.isFinite(agent.tool_count))
120
+ return undefined;
121
+ const started = agent.started_at === undefined ? undefined : instant(agent.started_at);
122
+ const finished = agent.finished_at === undefined ? undefined : instant(agent.finished_at);
123
+ if ((agent.started_at !== undefined && started === undefined) ||
124
+ (agent.finished_at !== undefined && finished === undefined) ||
125
+ (started !== undefined && started < runStarted) ||
126
+ (accepted !== undefined && started !== undefined && started < accepted) ||
127
+ (started !== undefined && finished !== undefined && finished < started) ||
128
+ (finished !== undefined && finished > instant(value.updated_at)) ||
129
+ (value.version === 2 && started === undefined) ||
130
+ (value.version === 2 && agent.status === "running" && finished !== undefined) ||
131
+ (value.version === 2 && agent.status !== "running" && finished === undefined))
132
+ return undefined;
133
+ }
134
+ if (value.version === 2) {
135
+ const ids = value.agents.map((agent) => agent.execution_id);
136
+ if (new Set(ids).size !== ids.length)
137
+ return undefined;
138
+ }
139
+ return value;
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ }
145
+ /** Size cap of the live log. A transition line is ~200–300 bytes and a round
146
+ * writes a few dozen (sweeps a little over a hundred), so 256 KiB holds many
147
+ * rounds of one PR. Past it the file rotates ONCE to `.jsonl.1` (the previous
148
+ * `.1` dropped), so a PR never holds more than ~512 KiB of log. Rotation is
149
+ * per line, not per round: a round may straddle the two files, so a
150
+ * reconstruction reads `.jsonl.1` then `.jsonl`. */
151
+ export const PROGRESS_LOG_MAX_BYTES = 256 * 1024;
152
+ /** `pr-<n>.json` → `pr-<n>.jsonl`. */
153
+ export function progressLogPath(snapshotPath) {
154
+ return snapshotPath.replace(/\.json$/, ".jsonl");
155
+ }
156
+ /** Append one line, rotating first when it would cross the cap. Throws on an
157
+ * I/O failure — the caller (the extension) logs and carries on. */
158
+ export function appendProgressLog(path, line, maxBytes = PROGRESS_LOG_MAX_BYTES) {
159
+ const bytes = `${JSON.stringify(line)}\n`;
160
+ let size = 0;
161
+ try {
162
+ size = statSync(path).size;
163
+ }
164
+ catch (err) {
165
+ if (err.code !== "ENOENT")
166
+ throw err;
167
+ }
168
+ if (size > 0 && size + Buffer.byteLength(bytes) > maxBytes)
169
+ renameSync(path, `${path}.1`);
170
+ appendFileSync(path, bytes);
171
+ }
172
+ //# sourceMappingURL=round-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"round-progress.js","sourceRoot":"","sources":["../../src/round-progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Start-derived round deadlines, shared by enforcement and status publication. */
2
+ export declare function roundStageDeadlines(started: number, bounds: {
3
+ first_pass_max_min: number;
4
+ passes_max_min: number;
5
+ running_max_min: number;
6
+ follow_up_sweep_extra_min?: number;
7
+ }, sweepOwed: boolean): {
8
+ first_pass_start: number;
9
+ passes_complete: number;
10
+ running_hard_bound: number;
11
+ };
12
+ //# sourceMappingURL=round-stage-deadlines.d.ts.map