@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,40 @@
1
+ import type { RoundFindingRow } from "./storerows.js";
2
+ /** A finding continuation address; the key may itself contain colons. */
3
+ export declare function carriedToRef(roundNo: number, findingKey: string): string;
4
+ export interface CarriedFinding {
5
+ round_no: number;
6
+ finding_key: string;
7
+ carried_to: string | null;
8
+ }
9
+ /** Follow known links once, ending at a missing target or a cycle. */
10
+ export declare function walkFindingChain<T extends CarriedFinding>(rows: readonly T[], root: T): T[];
11
+ /** Every unpointed root and its last known continuation. */
12
+ export declare function findingChains<T extends CarriedFinding>(rows: readonly T[]): Array<{
13
+ root: T;
14
+ end: T;
15
+ }>;
16
+ /** Was this row posted on the PR? `posted` with a tag — a downgraded, killed,
17
+ * doubted or withheld entry never reached the author as itself. */
18
+ export declare function isPostedRow(r: RoundFindingRow): boolean;
19
+ /** How far a later round's entry may sit from a finding's line and still be
20
+ * that finding (lines move as the branch moves). */
21
+ export declare const CONTINUATION_LINES = 10;
22
+ /**
23
+ * Which entry of the round `e` names in `raised_in_round` is `e` again? Only
24
+ * an entry on the same path, sharing a lens, within `CONTINUATION_LINES`:
25
+ * the one carrying `e`'s key when it is such an entry, else the single
26
+ * nearest such entry (a file-level line counts as the farthest near one). A
27
+ * tie is nobody's: two findings a few lines apart in one file and one lens
28
+ * must not both inherit one entry's fate. Returns the owner's key, or null.
29
+ *
30
+ * An equal key ALONE is no match: sessions number their keys per round (f1,
31
+ * f2, …), so a later round's `f1` is usually a different finding; a key-only
32
+ * match would carry one finding's fate onto another far away in the file.
33
+ */
34
+ export declare function predecessorOf(round: readonly RoundFindingRow[], e: RoundFindingRow): string | null;
35
+ /** Could `b` be `a` again? The same path, a shared lens, within
36
+ * `CONTINUATION_LINES` (an entry without a line is near). The one eligibility
37
+ * rule of predecessor ownership and of the weak next-round match; who wins
38
+ * among the eligible is each caller's own rule. */
39
+ export declare function sameSite(a: RoundFindingRow, b: RoundFindingRow): boolean;
40
+ //# sourceMappingURL=finding-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-chain.d.ts","sourceRoot":"","sources":["../../src/finding-chain.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAa3F;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,CAAC,SAAS,cAAc,EACpD,IAAI,EAAE,SAAS,CAAC,EAAE,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,CAAA;CAAE,CAAC,CAK5B;AAED;mEACmE;AACnE,wBAAgB,WAAW,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAEvD;AAED;oDACoD;AACpD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAMrC;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,eAAe,EAAE,EACjC,CAAC,EAAE,eAAe,GACjB,MAAM,GAAG,IAAI,CAUf;AAED;;;mDAGmD;AACnD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,GAAG,OAAO,CAMxE"}
@@ -0,0 +1,76 @@
1
+ import { storedLensIds } from "./lensids.js";
2
+ /** A finding continuation address; the key may itself contain colons. */
3
+ export function carriedToRef(roundNo, findingKey) {
4
+ return `${roundNo}:${findingKey}`;
5
+ }
6
+ /** Follow known links once, ending at a missing target or a cycle. */
7
+ export function walkFindingChain(rows, root) {
8
+ const byKey = new Map(rows.map((row) => [carriedToRef(row.round_no, row.finding_key), row]));
9
+ const seen = new Set();
10
+ const chain = [];
11
+ let row = root;
12
+ while (row) {
13
+ const key = carriedToRef(row.round_no, row.finding_key);
14
+ if (seen.has(key))
15
+ break;
16
+ seen.add(key);
17
+ chain.push(row);
18
+ row = row.carried_to ? byKey.get(row.carried_to) : undefined;
19
+ }
20
+ return chain;
21
+ }
22
+ /** Every unpointed root and its last known continuation. */
23
+ export function findingChains(rows) {
24
+ const pointed = new Set(rows.map((row) => row.carried_to).filter((ref) => !!ref));
25
+ return rows
26
+ .filter((row) => !pointed.has(carriedToRef(row.round_no, row.finding_key)))
27
+ .map((root) => ({ root, end: walkFindingChain(rows, root).at(-1) }));
28
+ }
29
+ /** Was this row posted on the PR? `posted` with a tag — a downgraded, killed,
30
+ * doubted or withheld entry never reached the author as itself. */
31
+ export function isPostedRow(r) {
32
+ return r.disposition === "posted" && r.posted_as !== null && r.posted_as.trim() !== "";
33
+ }
34
+ /** How far a later round's entry may sit from a finding's line and still be
35
+ * that finding (lines move as the branch moves). */
36
+ export const CONTINUATION_LINES = 10;
37
+ function lensIdsOf(row) {
38
+ return storedLensIds(row.lens_ids) ?? [];
39
+ }
40
+ /**
41
+ * Which entry of the round `e` names in `raised_in_round` is `e` again? Only
42
+ * an entry on the same path, sharing a lens, within `CONTINUATION_LINES`:
43
+ * the one carrying `e`'s key when it is such an entry, else the single
44
+ * nearest such entry (a file-level line counts as the farthest near one). A
45
+ * tie is nobody's: two findings a few lines apart in one file and one lens
46
+ * must not both inherit one entry's fate. Returns the owner's key, or null.
47
+ *
48
+ * An equal key ALONE is no match: sessions number their keys per round (f1,
49
+ * f2, …), so a later round's `f1` is usually a different finding; a key-only
50
+ * match would carry one finding's fate onto another far away in the file.
51
+ */
52
+ export function predecessorOf(round, e) {
53
+ const dist = (s) => s.line === null || e.line === null ? CONTINUATION_LINES : Math.abs(s.line - e.line);
54
+ const candidates = round.filter((s) => sameSite(s, e));
55
+ const keyed = candidates.find((s) => s.finding_key === e.finding_key);
56
+ if (keyed)
57
+ return keyed.finding_key;
58
+ if (candidates.length === 0)
59
+ return null;
60
+ const best = Math.min(...candidates.map(dist));
61
+ const nearest = candidates.filter((s) => dist(s) === best);
62
+ return nearest.length === 1 ? nearest[0].finding_key : null;
63
+ }
64
+ /** Could `b` be `a` again? The same path, a shared lens, within
65
+ * `CONTINUATION_LINES` (an entry without a line is near). The one eligibility
66
+ * rule of predecessor ownership and of the weak next-round match; who wins
67
+ * among the eligible is each caller's own rule. */
68
+ export function sameSite(a, b) {
69
+ if (!a.path || a.path !== b.path)
70
+ return false;
71
+ if (a.line !== null && b.line !== null && Math.abs(a.line - b.line) > CONTINUATION_LINES)
72
+ return false;
73
+ const ids = lensIdsOf(a);
74
+ return lensIdsOf(b).some((id) => ids.includes(id));
75
+ }
76
+ //# sourceMappingURL=finding-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-chain.js","sourceRoot":"","sources":["../../src/finding-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { RoundFindingInput } from "./storerows.js";
2
+ /** Semantic finding fields shared by file fallback and durable ingestion. */
3
+ export declare function findingRowFields(f: RoundFindingInput): {
4
+ finding_key: string;
5
+ path: string | null;
6
+ line: number | null;
7
+ lens: string;
8
+ tier: string | null;
9
+ severity: string | null;
10
+ confidence: number | null;
11
+ reachability: string | null;
12
+ kind: string | null;
13
+ disposition: string;
14
+ axis: string | null;
15
+ word: string | null;
16
+ reason: string | null;
17
+ evidence: string | null;
18
+ posted_as: string | null;
19
+ raised_in_round: number | null;
20
+ thread_id: number | null;
21
+ title: string | null;
22
+ lens_ids: string;
23
+ };
24
+ //# sourceMappingURL=finding-row.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-row.d.ts","sourceRoot":"","sources":["../../src/finding-row.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;EAsBpD"}
@@ -0,0 +1,26 @@
1
+ import { canonicalLensIds } from "./lensids.js";
2
+ /** Semantic finding fields shared by file fallback and durable ingestion. */
3
+ export function findingRowFields(f) {
4
+ return {
5
+ finding_key: f.key,
6
+ path: f.path ?? null,
7
+ line: f.line ?? null,
8
+ lens: f.lens ?? "",
9
+ tier: f.tier ?? null,
10
+ severity: f.severity ?? null,
11
+ confidence: f.confidence ?? null,
12
+ reachability: f.reachability ?? null,
13
+ kind: f.kind ?? null,
14
+ disposition: f.disposition ?? "unknown",
15
+ axis: f.axis ?? null,
16
+ word: f.word ?? null,
17
+ reason: f.reason ?? null,
18
+ evidence: f.evidence ?? null,
19
+ posted_as: f.posted_as ?? null,
20
+ raised_in_round: f.raised_in_round ?? null,
21
+ thread_id: f.thread_id ?? null,
22
+ title: f.title ?? null,
23
+ lens_ids: JSON.stringify(canonicalLensIds(f.lens ?? "")),
24
+ };
25
+ }
26
+ //# sourceMappingURL=finding-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding-row.js","sourceRoot":"","sources":["../../src/finding-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB,CAAC,CAAoB;IACnD,OAAO;QACL,WAAW,EAAE,CAAC,CAAC,GAAG;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;QAClB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC5B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;QAChC,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;QACpC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;QACvC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC5B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;QAC9B,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;QAC1C,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;QAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QACtB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;KACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,99 @@
1
+ /** A record field as a non-empty trimmed string, else null. */
2
+ export declare function recordString(val: unknown): string | null;
3
+ /** The record's entry array: `findings` first, else the legacy `candidates`
4
+ * spelling, else null. The ONE precedence the parser and the renderer share. */
5
+ export declare function recordEntries(rec: Record<string, unknown>): unknown[] | null;
6
+ /** A record field as a number — a finite number, or a decimal string a
7
+ * session wrote (`"0.7"`, `"12"`) — else null. The ONE coercion: the parser
8
+ * stores what the renderer posts, so a value both read must read alike. */
9
+ export declare function recordNumber(val: unknown): number | null;
10
+ /** The diff side a record entry's anchor counts on: `LEFT` in any case, else
11
+ * `RIGHT` (the default). The renderer posts on it and the post-check compares
12
+ * by it, so both read one side. */
13
+ export declare function recordSide(val: unknown): "LEFT" | "RIGHT";
14
+ /**
15
+ * What happened to a candidate finding. Closed set — the record is only
16
+ * countable if the disposition is.
17
+ *
18
+ * - `posted` — it survived validation and went out on the PR (the RAISE side,
19
+ * the half adjudication actually needs).
20
+ * - `killed` — the validator vetoed it.
21
+ * - `downgraded` — the validator moved it (severity, confidence or
22
+ * reachability). A `downgrade` survivor still goes out: recorded with its
23
+ * `posted_as` it reads as posted (`entryDisposition`); without one it
24
+ * is never posted, and the renderer reports it.
25
+ * - `doubted` — the validator could not stand behind the CLAIM (`DOUBT_WORDS`:
26
+ * refuted, unverifiable, bad anchor). A validity veto is a mark, not a
27
+ * deletion — kept here as "may not be valid", never posted on the PR,
28
+ * shown in the TUI for the operator to judge.
29
+ * - `merged` / `folded` — merge-stage attrition: the same defect
30
+ * collapsed into another finding, or a different defect carried as a
31
+ * paragraph under one. Attrition here counts like a kill; it must never
32
+ * vanish silently.
33
+ * - `withheld` — the session itself dropped it before the validator saw it,
34
+ * or the profile's `[posting]` policy kept a survivor off the PR (a word
35
+ * from `WITHHOLD_WORDS`: `over-budget`, `nits-off`, …) — kept, never posted.
36
+ * - `conceded` — REFUTED AND CONCEDED: previously posted, the author refuted
37
+ * it and the reviewer accepted the refutation. This is the state that lets a
38
+ * later round tell "escalating an open finding" (legitimate — blocking late
39
+ * beats never) from "resurrecting a settled one" (not legitimate). Nothing
40
+ * else in the system records it.
41
+ */
42
+ declare const DISPOSITION_VALUES: readonly ["posted", "killed", "doubted", "downgraded", "merged", "folded", "withheld", "conceded"];
43
+ export type FindingDisposition = (typeof DISPOSITION_VALUES)[number] | "unknown";
44
+ /** A disposition as the closed set, under every spelling the aliases fold. */
45
+ export declare function normalizeDisposition(raw: unknown): FindingDisposition;
46
+ /**
47
+ * The disposition a record ENTRY acts on. A validator `downgrade` keeps the
48
+ * finding at the severity it names (packages/pi-plugin/src/templates.ts
49
+ * renderValidatorOutputNote), so a `downgraded` entry that went out under a
50
+ * tag (`posted_as`) is a posted survivor: the downgrade's `word` and `axis`
51
+ * stay on the entry, and it counts, renders and dedups as `posted`. Without a
52
+ * `posted_as` it stays `downgraded`, never posted. Every reader that asks
53
+ * "was this entry posted?" of a raw entry asks it here.
54
+ */
55
+ export declare function entryDisposition(entry: Record<string, unknown>): FindingDisposition;
56
+ /**
57
+ * The per-round key of the record entry at `index` of its `findings` array:
58
+ * the session's own handle (`id`, else `key`), and when it wrote neither, the
59
+ * stable fallback `<lens>@<path>:<line>#<index>`. This IS the parser's rule
60
+ * (`parseFindingsRecord` calls it), so a key computed here from the same
61
+ * record always names the same row.
62
+ */
63
+ export declare function findingRecordKey(entry: Record<string, unknown>, index: number): string;
64
+ /**
65
+ * The hidden marker the live render route appends to an inline comment:
66
+ * `<!-- qcr:f=<round_no>:<finding key> -->`. GitHub renders an HTML comment
67
+ * as nothing, so the reader never sees it. The key is percent-encoded down to
68
+ * `[A-Za-z0-9%._~]`, so no session-written key can close the comment early
69
+ * (`-->`), break the line, or collide with the separator. Never throws: the
70
+ * render route has no catch around it.
71
+ */
72
+ export declare function findingMarker(roundNo: number, key: string): string;
73
+ /** Matches a marker anywhere in a comment body. */
74
+ export declare const FINDING_MARKER_RE: RegExp;
75
+ /**
76
+ * The marker a comment body carries, if any. A malformed one is no marker.
77
+ *
78
+ * The LAST marker in the body is the real one: the render route appends it
79
+ * after the finding's text (`reviewrender.ts`), and that text is the
80
+ * reviewer's, which may quote PR content — a marker-shaped string a PR
81
+ * carries (or this repo's own tests, in a self-review) and the finding
82
+ * quotes comes BEFORE it. Taking the first match would link the comment to
83
+ * whatever finding the quoted text names.
84
+ */
85
+ export declare function parseFindingMarker(body: string | null | undefined): {
86
+ round_no: number;
87
+ key: string;
88
+ } | null;
89
+ /** A body with every marker removed — what the comment reads as without it. */
90
+ export declare function stripFindingMarkers(body: string): string;
91
+ /** A recheck head as the recheck's own key: its first 12 characters,
92
+ * lowercased — so a full sha and its prefix are one head. */
93
+ export declare function recheckHead12(head: string): string;
94
+ /** The `finding_key` prefix of a recheck's own findings at `head`
95
+ * (`recheck:<head12>:`): the recheck writes its rows under it and the learner
96
+ * reads them back by it. */
97
+ export declare function recheckKeyPrefix(head: string): string;
98
+ export {};
99
+ //# sourceMappingURL=findingkey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findingkey.d.ts","sourceRoot":"","sources":["../../src/findingkey.ts"],"names":[],"mappings":"AAWA,+DAA+D;AAC/D,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIxD;AAED;gFACgF;AAChF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,IAAI,CAG5E;AAED;;2EAE2E;AAC3E,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOxD;AAKD;;mCAEmC;AACnC,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,QAAA,MAAM,kBAAkB,oGASd,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AA2BjF,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAKrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAKnF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAElE;AAgBD,mDAAmD;AACnD,eAAO,MAAM,iBAAiB,QAAgD,CAAC;AAI/E;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC9B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW1C;AAKD,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;6DAC6D;AAC7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;4BAE4B;AAC5B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,210 @@
1
+ // A posted finding's identity, shared by the two ends that must agree on it
2
+ // for outcome capture: the findings-record PARSER, which turns the
3
+ // session's record into `round_findings` rows keyed by `(pr, round_no,
4
+ // finding_key)`, and the live RENDER route, which stamps that key into every
5
+ // inline comment it renders so the comment can be linked back to its row.
6
+ // Beside it, the readings of a record entry every consumer must share: its
7
+ // numbers and strings, its disposition (is it `posted`?) and its diff side.
8
+ //
9
+ // A leaf on purpose — no imports. `packages/pi-plugin/src/reviewrender.ts` is also the bench's
10
+ // render step, and the bench must not pull the daemon's modules in with it.
11
+ /** A record field as a non-empty trimmed string, else null. */
12
+ export function recordString(val) {
13
+ if (typeof val !== "string")
14
+ return null;
15
+ const t = val.trim();
16
+ return t.length > 0 ? t : null;
17
+ }
18
+ /** The record's entry array: `findings` first, else the legacy `candidates`
19
+ * spelling, else null. The ONE precedence the parser and the renderer share. */
20
+ export function recordEntries(rec) {
21
+ if (Array.isArray(rec.findings))
22
+ return rec.findings;
23
+ return Array.isArray(rec.candidates) ? rec.candidates : null;
24
+ }
25
+ /** A record field as a number — a finite number, or a decimal string a
26
+ * session wrote (`"0.7"`, `"12"`) — else null. The ONE coercion: the parser
27
+ * stores what the renderer posts, so a value both read must read alike. */
28
+ export function recordNumber(val) {
29
+ if (typeof val === "number" && Number.isFinite(val))
30
+ return val;
31
+ if (typeof val === "string" && /^-?\d+(\.\d+)?$/.test(val.trim())) {
32
+ const number = Number(val.trim());
33
+ return Number.isFinite(number) ? number : null;
34
+ }
35
+ return null;
36
+ }
37
+ const str = recordString;
38
+ const num = recordNumber;
39
+ /** The diff side a record entry's anchor counts on: `LEFT` in any case, else
40
+ * `RIGHT` (the default). The renderer posts on it and the post-check compares
41
+ * by it, so both read one side. */
42
+ export function recordSide(val) {
43
+ return recordString(val)?.toUpperCase() === "LEFT" ? "LEFT" : "RIGHT";
44
+ }
45
+ /**
46
+ * What happened to a candidate finding. Closed set — the record is only
47
+ * countable if the disposition is.
48
+ *
49
+ * - `posted` — it survived validation and went out on the PR (the RAISE side,
50
+ * the half adjudication actually needs).
51
+ * - `killed` — the validator vetoed it.
52
+ * - `downgraded` — the validator moved it (severity, confidence or
53
+ * reachability). A `downgrade` survivor still goes out: recorded with its
54
+ * `posted_as` it reads as posted (`entryDisposition`); without one it
55
+ * is never posted, and the renderer reports it.
56
+ * - `doubted` — the validator could not stand behind the CLAIM (`DOUBT_WORDS`:
57
+ * refuted, unverifiable, bad anchor). A validity veto is a mark, not a
58
+ * deletion — kept here as "may not be valid", never posted on the PR,
59
+ * shown in the TUI for the operator to judge.
60
+ * - `merged` / `folded` — merge-stage attrition: the same defect
61
+ * collapsed into another finding, or a different defect carried as a
62
+ * paragraph under one. Attrition here counts like a kill; it must never
63
+ * vanish silently.
64
+ * - `withheld` — the session itself dropped it before the validator saw it,
65
+ * or the profile's `[posting]` policy kept a survivor off the PR (a word
66
+ * from `WITHHOLD_WORDS`: `over-budget`, `nits-off`, …) — kept, never posted.
67
+ * - `conceded` — REFUTED AND CONCEDED: previously posted, the author refuted
68
+ * it and the reviewer accepted the refutation. This is the state that lets a
69
+ * later round tell "escalating an open finding" (legitimate — blocking late
70
+ * beats never) from "resurrecting a settled one" (not legitimate). Nothing
71
+ * else in the system records it.
72
+ */
73
+ const DISPOSITION_VALUES = [
74
+ "posted",
75
+ "killed",
76
+ "doubted",
77
+ "downgraded",
78
+ "merged",
79
+ "folded",
80
+ "withheld",
81
+ "conceded",
82
+ ];
83
+ const DISPOSITIONS = new Set(DISPOSITION_VALUES);
84
+ /** Spellings a session plausibly writes, folded onto the closed set. Tolerant
85
+ * input, exactly like the verdict file's digit-string coercion — never a
86
+ * rejection reason. */
87
+ const DISPOSITION_ALIASES = {
88
+ post: "posted",
89
+ survive: "posted",
90
+ survived: "posted",
91
+ kill: "killed",
92
+ vetoed: "killed",
93
+ doubt: "doubted",
94
+ "may-not-be-valid": "doubted",
95
+ downgrade: "downgraded",
96
+ demoted: "downgraded",
97
+ capped: "downgraded",
98
+ merge: "merged",
99
+ fold: "folded",
100
+ withhold: "withheld",
101
+ dropped: "withheld",
102
+ concede: "conceded",
103
+ "refuted-and-conceded": "conceded",
104
+ refuted_and_conceded: "conceded",
105
+ };
106
+ /** A disposition as the closed set, under every spelling the aliases fold. */
107
+ export function normalizeDisposition(raw) {
108
+ if (typeof raw !== "string")
109
+ return "unknown";
110
+ const v = raw.trim().toLowerCase().replace(/\s+/g, "-");
111
+ if (DISPOSITIONS.has(v))
112
+ return v;
113
+ return DISPOSITION_ALIASES[v] ?? "unknown";
114
+ }
115
+ /**
116
+ * The disposition a record ENTRY acts on. A validator `downgrade` keeps the
117
+ * finding at the severity it names (packages/pi-plugin/src/templates.ts
118
+ * renderValidatorOutputNote), so a `downgraded` entry that went out under a
119
+ * tag (`posted_as`) is a posted survivor: the downgrade's `word` and `axis`
120
+ * stay on the entry, and it counts, renders and dedups as `posted`. Without a
121
+ * `posted_as` it stays `downgraded`, never posted. Every reader that asks
122
+ * "was this entry posted?" of a raw entry asks it here.
123
+ */
124
+ export function entryDisposition(entry) {
125
+ const d = normalizeDisposition(entry.disposition);
126
+ if (d !== "downgraded")
127
+ return d;
128
+ const tag = entry.posted_as;
129
+ return typeof tag === "string" && tag.trim() !== "" ? "posted" : d;
130
+ }
131
+ /**
132
+ * The per-round key of the record entry at `index` of its `findings` array:
133
+ * the session's own handle (`id`, else `key`), and when it wrote neither, the
134
+ * stable fallback `<lens>@<path>:<line>#<index>`. This IS the parser's rule
135
+ * (`parseFindingsRecord` calls it), so a key computed here from the same
136
+ * record always names the same row.
137
+ */
138
+ export function findingRecordKey(entry, index) {
139
+ const lens = str(entry.lens) ?? str(entry.name) ?? "";
140
+ const path = str(entry.path);
141
+ const line = num(entry.line);
142
+ return str(entry.id) ?? str(entry.key) ?? `${lens || "?"}@${path ?? "?"}:${line ?? "?"}#${index}`;
143
+ }
144
+ /**
145
+ * The hidden marker the live render route appends to an inline comment:
146
+ * `<!-- qcr:f=<round_no>:<finding key> -->`. GitHub renders an HTML comment
147
+ * as nothing, so the reader never sees it. The key is percent-encoded down to
148
+ * `[A-Za-z0-9%._~]`, so no session-written key can close the comment early
149
+ * (`-->`), break the line, or collide with the separator. Never throws: the
150
+ * render route has no catch around it.
151
+ */
152
+ export function findingMarker(roundNo, key) {
153
+ return `<!-- qcr:f=${Math.trunc(roundNo)}:${encodeMarkerKey(key)} -->`;
154
+ }
155
+ /** A lone UTF-16 surrogate — what `encodeURIComponent` throws `URIError` on. */
156
+ const LONE_SURROGATE = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g;
157
+ function encodeMarkerKey(key) {
158
+ // A session-written key (a JSON `"\ud800"` escape parses) may hold a lone
159
+ // surrogate. It becomes U+FFFD first — what `String.prototype.toWellFormed`
160
+ // does, and what the key reads back as from the state database, whose UTF-8
161
+ // storage makes the same replacement — so the marker still names its row.
162
+ return encodeURIComponent(key.replace(LONE_SURROGATE, "�")).replace(/[!'()*-]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase().padStart(2, "0")}`);
163
+ }
164
+ /** Matches a marker anywhere in a comment body. */
165
+ export const FINDING_MARKER_RE = /<!--\s*qcr:f=(\d+):([A-Za-z0-9%._~]+)\s*-->/;
166
+ const FINDING_MARKER_ALL_RE = new RegExp(FINDING_MARKER_RE.source, "g");
167
+ /**
168
+ * The marker a comment body carries, if any. A malformed one is no marker.
169
+ *
170
+ * The LAST marker in the body is the real one: the render route appends it
171
+ * after the finding's text (`reviewrender.ts`), and that text is the
172
+ * reviewer's, which may quote PR content — a marker-shaped string a PR
173
+ * carries (or this repo's own tests, in a self-review) and the finding
174
+ * quotes comes BEFORE it. Taking the first match would link the comment to
175
+ * whatever finding the quoted text names.
176
+ */
177
+ export function parseFindingMarker(body) {
178
+ if (typeof body !== "string")
179
+ return null;
180
+ let m = null;
181
+ for (const hit of body.matchAll(FINDING_MARKER_ALL_RE))
182
+ m = hit;
183
+ if (!m)
184
+ return null;
185
+ try {
186
+ const key = decodeURIComponent(m[2]);
187
+ return key ? { round_no: Number(m[1]), key } : null;
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ }
193
+ /** Every marker in a body, with the newlines the render route put before it. */
194
+ const FINDING_MARKER_STRIP_RE = new RegExp(`\\n*${FINDING_MARKER_RE.source}`, "g");
195
+ /** A body with every marker removed — what the comment reads as without it. */
196
+ export function stripFindingMarkers(body) {
197
+ return body.replace(FINDING_MARKER_STRIP_RE, "");
198
+ }
199
+ /** A recheck head as the recheck's own key: its first 12 characters,
200
+ * lowercased — so a full sha and its prefix are one head. */
201
+ export function recheckHead12(head) {
202
+ return head.slice(0, 12).toLowerCase();
203
+ }
204
+ /** The `finding_key` prefix of a recheck's own findings at `head`
205
+ * (`recheck:<head12>:`): the recheck writes its rows under it and the learner
206
+ * reads them back by it. */
207
+ export function recheckKeyPrefix(head) {
208
+ return `recheck:${recheckHead12(head)}:`;
209
+ }
210
+ //# sourceMappingURL=findingkey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findingkey.js","sourceRoot":"","sources":["../../src/findingkey.ts"],"names":[],"mappings":"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"}