@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,480 @@
1
+ // The posted review rendered from the findings record (`[review]
2
+ // render_outputs`).
3
+ //
4
+ // Without this lever a round ends with the session generating four files token
5
+ // by token: the inline-comments JSON, the review body, the findings record and
6
+ // the verdict. The first two restate the third — every posted comment is a
7
+ // `posted` entry of the record, and the body's sections are one bullet per
8
+ // posted entry — so with this lever the session writes the record ONCE, with
9
+ // the few posting fields only it can write (each posted entry's comment title
10
+ // and body, its side, a follower's lead, whether it goes inline), plus the
11
+ // plain opening paragraph and the lenses line, and this module renders the
12
+ // other two deterministically in the round template's format (step 6:
13
+ // opener → verdict line → lenses line → Blockers / Nits / Questions → For a
14
+ // human to double-check → overflow → details → footer; inline comments as
15
+ // `[tag] title`, body, `_severity · confidence · lens_`).
16
+ //
17
+ // Rendering never decides anything: the tag is the record's `posted_as` (the
18
+ // session's — the validator's — call), nothing is dropped, an inline anchor is
19
+ // whatever the record claims (posting validates it as before), and every
20
+ // problem the input has is returned rather than thrown, so a thin record still
21
+ // renders the review the record describes.
22
+ import { ASK_HUMAN_TAG, bareTag, CHECK_THIS_TAG, DEFERRED_TAG, ordinaryPostTag, SANCTIONED_TAGS, } from "./severity.js";
23
+ import { postCheckRecord } from "./dedup.js";
24
+ import { entryDisposition, findingMarker, findingRecordKey, normalizeDisposition, recordNumber, recordSide, recordEntries, recordString, } from "./findingkey.js";
25
+ import { firstSentence as policyFirstSentence, isDefaultPosting, selectPosted, siteKey, verdictLineFor, } from "./postingpolicy.js";
26
+ /** The standard review footer, naming the configured bot identity
27
+ * (`[github] bot_login`; "" degrades to the role). posting.ts takes its
28
+ * `reviewFooter` from here: posting.ts is the recorded unwired module of
29
+ * tests/fences-reachability.test.ts, so the live route owns the text. */
30
+ export function renderedFooter(botLogin) {
31
+ return (`_Automated review by \`${botLogin?.trim() || "the review bot"}\` (quickreview sandbox). ` +
32
+ "Reply to any comment to discuss; ask for a human reviewer if you want this escalated._");
33
+ }
34
+ /** GitHub caps a single review at 50 inline comments. */
35
+ export const INLINE_COMMENT_CAP = 50;
36
+ /** The closed tag grammar (`severity.ts` `SANCTIONED_TAGS`), bare. */
37
+ const TAGS = SANCTIONED_TAGS.map(bareTag);
38
+ const str = recordString;
39
+ /** The supported record array spellings, in parser precedence order. */
40
+ const entriesOf = recordEntries;
41
+ export function entriesById(entries) {
42
+ const byId = new Map();
43
+ for (const entry of entries) {
44
+ if (typeof entry !== "object" || entry === null)
45
+ continue;
46
+ const record = entry;
47
+ const id = str(record.id);
48
+ if (id !== null)
49
+ byId.set(id, record);
50
+ }
51
+ return byId;
52
+ }
53
+ /** Follow the complete identity chain, including withheld or missing leads.
54
+ * Cycles share their smallest member id so traversal order cannot split them. */
55
+ export function rootCauseId(id, sameAs, byId) {
56
+ const path = [id];
57
+ let current = sameAs;
58
+ while (current !== null) {
59
+ const cycleAt = path.indexOf(current);
60
+ if (cycleAt !== -1)
61
+ return path.slice(cycleAt).sort()[0];
62
+ path.push(current);
63
+ const entry = byId.get(current);
64
+ if (entry === undefined)
65
+ return current;
66
+ const next = str(entry.same_as);
67
+ if (next === null)
68
+ return current;
69
+ current = next;
70
+ }
71
+ return id;
72
+ }
73
+ function effectiveTitle(entry) {
74
+ return str(entry.title) ?? policyFirstSentence(str(entry.reason) ?? "");
75
+ }
76
+ /** Posting identity across all entries, including withheld leads. Both
77
+ * handwritten and rendered outputs enforce repeat-site policy with this key. */
78
+ export function recordPostingKeys(entries) {
79
+ const byId = entriesById(entries);
80
+ const keys = new Map();
81
+ for (const entry of entries) {
82
+ if (typeof entry !== "object" || entry === null)
83
+ continue;
84
+ const e = entry;
85
+ const sameAs = str(e.same_as);
86
+ const root = rootCauseId(str(e.id) ?? "", sameAs, byId);
87
+ const lead = byId.get(root);
88
+ keys.set(e, sameAs !== null && lead === undefined
89
+ ? `same_as:${root}`
90
+ : siteKey(effectiveTitle(lead ?? e)));
91
+ }
92
+ return keys;
93
+ }
94
+ /** The parser's own coercion: a value the record stores is the value posted. */
95
+ const num = recordNumber;
96
+ /** Is this findings-record entry `posted`, under every spelling the record
97
+ * parser folds onto it (packages/pi-plugin/src/findingkey.ts `entryDisposition`)? The
98
+ * one test the posting cut and the renderer both apply. */
99
+ function isPostedEntry(e) {
100
+ return (typeof e === "object" &&
101
+ e !== null &&
102
+ entryDisposition(e) === "posted");
103
+ }
104
+ /** The ordinary tag a posted entry is counted and posted under: its own
105
+ * posting tag; `question` for `[check this]`; for `[ask your human]` and
106
+ * `[deferred]` the tag its severity maps to (a question without one). */
107
+ function severityTagOf(tag, severity, confidence, reachability) {
108
+ return ordinaryPostTag(tag, severity, confidence, reachability);
109
+ }
110
+ /** A findings-record entry's ordinary tag (`severityTagOf`), whichever route
111
+ * renders it — null when its `posted_as` is outside the grammar. */
112
+ export function postedSeverityTag(raw) {
113
+ const tag = bareTag(str(raw.posted_as));
114
+ if (!TAGS.includes(tag))
115
+ return null;
116
+ return severityTagOf(tag, str(raw.severity), recordNumber(raw.confidence), str(raw.reachability));
117
+ }
118
+ function readPosted(raw, i, problems, recordKey) {
119
+ const id = str(raw.id) ?? `#${i + 1}`;
120
+ const rawTag = bareTag(str(raw.posted_as));
121
+ const tag = TAGS.includes(rawTag) ? rawTag : "question";
122
+ if (!TAGS.includes(rawTag))
123
+ problems.push(`${id}: posted_as ${JSON.stringify(raw.posted_as)} is outside the grammar — rendered as a question`);
124
+ const severity = str(raw.severity);
125
+ const confidence = recordNumber(raw.confidence);
126
+ const reachability = str(raw.reachability);
127
+ const sevTag = severityTagOf(tag, severity, confidence, reachability);
128
+ const reason = str(raw.reason) ?? "";
129
+ const title = effectiveTitle(raw);
130
+ if (!str(raw.title))
131
+ problems.push(`${id}: no title — the reason's first sentence stands in`);
132
+ const body = str(raw.body) ?? reason;
133
+ if (!str(raw.body))
134
+ problems.push(`${id}: no body — the reason stands in`);
135
+ const line = recordNumber(raw.line);
136
+ const start = recordNumber(raw.start_line);
137
+ return {
138
+ id,
139
+ recordKey,
140
+ path: str(raw.path),
141
+ line,
142
+ start_line: start !== null && line !== null && start < line ? start : null,
143
+ side: recordSide(raw.side),
144
+ tag,
145
+ sevTag,
146
+ title,
147
+ body,
148
+ severity,
149
+ confidence,
150
+ reachability,
151
+ lens: str(raw.lens) ?? str(raw.name) ?? "unknown",
152
+ same_as: str(raw.same_as),
153
+ inline: raw.inline !== false,
154
+ };
155
+ }
156
+ function head(p) {
157
+ if (p.tag === "check this")
158
+ return `${CHECK_THIS_TAG} ${p.title}`;
159
+ if (p.tag === "ask your human")
160
+ return `${ASK_HUMAN_TAG} [${p.sevTag}] ${p.title}`;
161
+ if (p.tag === "deferred")
162
+ return `${DEFERRED_TAG} [${p.sevTag}] ${p.title}`;
163
+ return `[${p.tag}] ${p.title}`;
164
+ }
165
+ function trailer(p) {
166
+ const parts = [];
167
+ if (p.severity)
168
+ parts.push(p.severity);
169
+ if (p.confidence !== null)
170
+ parts.push(`confidence ${p.confidence.toFixed(2)}`);
171
+ if (p.reachability && p.reachability !== "routine")
172
+ parts.push(p.reachability);
173
+ parts.push(`lens ${p.lens}`);
174
+ return `_${parts.join(" · ")}_`;
175
+ }
176
+ /** One inline comment's text: `[tag] title`, the body, the trailer. */
177
+ function commentText(p) {
178
+ return `${head(p)}\n\n${p.body}\n\n${trailer(p)}`;
179
+ }
180
+ function ref(p) {
181
+ return p.path ? (p.line !== null ? `\`${p.path}:${p.line}\`` : `\`${p.path}\``) : "`(no file)`";
182
+ }
183
+ function bullet(p) {
184
+ const meta = [p.severity, p.confidence !== null ? p.confidence.toFixed(2) : null]
185
+ .filter((x) => x !== null)
186
+ .join("/");
187
+ return `- ${ref(p)} — ${p.title} _(${meta ? `${meta}, ` : ""}${p.lens})_`;
188
+ }
189
+ function verdictLabel(v) {
190
+ return v === "APPROVE" ? "Approved" : v === "REQUEST_CHANGES" ? "Changes requested" : "Commented";
191
+ }
192
+ /** Render the review body and the inline comments from a findings record
193
+ * (the session's JSON, parsed). Pure; never throws on a malformed record. */
194
+ export function renderReviewFromRecord(record, opts = {}) {
195
+ const problems = [];
196
+ const given = (typeof record === "object" && record !== null ? record : {});
197
+ const rec = {
198
+ ...given,
199
+ verdict: given.verdict ?? opts.verdict ?? null,
200
+ summary: given.summary ?? opts.summary ?? null,
201
+ lenses_applied: given.lenses_applied ?? opts.lensesApplied ?? null,
202
+ };
203
+ const entries = entriesOf(rec) ?? [];
204
+ if (entriesOf(rec) === null)
205
+ problems.push("the record has no findings array");
206
+ entries.forEach((e, index) => {
207
+ if (typeof e !== "object" || e === null)
208
+ return;
209
+ const raw = e;
210
+ if (normalizeDisposition(raw.disposition) === "downgraded" &&
211
+ entryDisposition(raw) !== "posted")
212
+ problems.push(`${findingRecordKey(raw, index)}: downgraded with no posted_as — a validator downgrade survivor needs the tag it goes out under; not posted`);
213
+ });
214
+ const posted = entries
215
+ // The index in the WHOLE findings array is what the record parser keys a
216
+ // key-less entry by, so it is taken before the filter.
217
+ .map((e, index) => ({ e, index }))
218
+ .filter((x) => isPostedEntry(x.e))
219
+ .map(({ e, index }, i) => readPosted(e, i, problems, findingRecordKey(e, index)));
220
+ const markers = opts.findingMarkers;
221
+ // Inline: every posted entry with an anchor, unless the record put it in the
222
+ // body; the first 50, the rest overflow to the body (round-first.md step 6).
223
+ const comments = [];
224
+ const overflow = [];
225
+ for (const p of posted) {
226
+ if (!p.inline || p.path === null || p.line === null) {
227
+ overflow.push({
228
+ p,
229
+ why: p.path === null || p.line === null ? "no anchor" : "posted in the body",
230
+ });
231
+ continue;
232
+ }
233
+ if (comments.length >= INLINE_COMMENT_CAP) {
234
+ overflow.push({ p, why: `over the ${INLINE_COMMENT_CAP}-inline-comment cap` });
235
+ continue;
236
+ }
237
+ comments.push({
238
+ path: p.path,
239
+ line: p.line,
240
+ side: p.side,
241
+ ...(p.start_line !== null ? { start_line: p.start_line } : {}),
242
+ body: markers
243
+ ? `${commentText(p)}\n\n${findingMarker(markers.roundNo, p.recordKey)}`
244
+ : commentText(p),
245
+ });
246
+ }
247
+ // Count each root cause under its strongest surviving occurrence. Inline
248
+ // comments still include every posted site, including weaker leads.
249
+ const byId = entriesById(entries);
250
+ const representatives = new Map();
251
+ const strength = (p) => ({ blocker: 3, question: 2, nit: 1 })[p.sevTag] * 2 +
252
+ (p.tag === "check this" || p.tag === "deferred" ? 0 : 1);
253
+ for (const p of posted) {
254
+ const key = rootCauseId(p.id, p.same_as, byId);
255
+ const prior = representatives.get(key);
256
+ if (!prior || strength(p) > strength(prior))
257
+ representatives.set(key, p);
258
+ }
259
+ const leads = [...representatives.values()];
260
+ const of = (t) => leads.filter((p) => p.tag !== "check this" && p.tag !== "deferred" && p.sevTag === t);
261
+ const verdict = str(rec.verdict);
262
+ if (verdict !== "APPROVE" && verdict !== "REQUEST_CHANGES")
263
+ problems.push(`verdict ${JSON.stringify(rec.verdict)} is neither APPROVE nor REQUEST_CHANGES`);
264
+ const verdictLine = verdictLineFor(verdictLabel(verdict), {
265
+ blocker: of("blocker").length,
266
+ nit: of("nit").length,
267
+ question: of("question").length,
268
+ });
269
+ const summary = str(rec.summary);
270
+ if (!summary)
271
+ problems.push("no summary — the body opens on the verdict line");
272
+ const lensesLine = str(rec.lenses_applied);
273
+ if (!lensesLine)
274
+ problems.push("no lenses_applied — the posted lenses stand in");
275
+ if (opts.bodyMode === "verdict") {
276
+ const lines = [verdictLine];
277
+ const one = summary ? policyFirstSentence(summary) : "";
278
+ if (one)
279
+ lines.push("", one);
280
+ if (overflow.length)
281
+ lines.push("", ...overflow.map(({ p }) => `- ${ref(p)} — ${p.title}`));
282
+ return { body: lines.join("\n") + "\n", comments, in_body: overflow.length, problems };
283
+ }
284
+ const out = [];
285
+ if (summary)
286
+ out.push(summary, "");
287
+ out.push(verdictLine, "", `_Lenses applied: ${lensesLine ?? ([...new Set(posted.map((p) => p.lens))].join(", ") || "none recorded")}._`);
288
+ const section = (title, items) => {
289
+ if (items.length)
290
+ out.push("", `### ${title}`, "", ...items);
291
+ };
292
+ section("Blockers", of("blocker").map(bullet));
293
+ section("Nits", of("nit").map(bullet));
294
+ section("Questions", of("question").map(bullet));
295
+ section("Deferred", leads.filter((p) => p.tag === "deferred").map(bullet));
296
+ section("For a human to double-check", leads.filter((p) => p.tag === "check this").map((p) => `- ${ref(p)} — ${p.title}`));
297
+ section("Additional findings (not posted inline)", overflow.map(({ p, why }) => `- ${bullet(p).slice(2)} — _${why}_\n\n ${p.body.replace(/\n/g, "\n ")}`));
298
+ const details = str(rec.details);
299
+ if (details)
300
+ out.push("", details);
301
+ out.push("", renderedFooter(opts.botLogin));
302
+ return { body: out.join("\n") + "\n", comments, in_body: overflow.length, problems };
303
+ }
304
+ export function postedRenderOptions(cfg, fallbacks = {}) {
305
+ return {
306
+ ...(cfg.github?.bot_login ? { botLogin: cfg.github.bot_login } : {}),
307
+ ...fallbacks,
308
+ dedupMerge: cfg.review.dedup_merge === true,
309
+ ...(isDefaultPosting(cfg.posting) ? {} : { policy: cfg.posting }),
310
+ };
311
+ }
312
+ /** A record entry as the posting policy classes it — the class it RENDERS
313
+ * as (`readPosted`): `[check this]` is a check item; `[ask your human]` and
314
+ * `[deferred]` take their severity's tag, so a blocker under a routing marker
315
+ * keeps a blocker's protection; a tag outside the grammar renders, and so
316
+ * counts, as a question. `tagField` names the field holding the tag
317
+ * (`withheld_as` once an entry is withheld). */
318
+ export function postedClassOf(entry, tagField = "posted_as") {
319
+ const tag = bareTag(str(entry[tagField]));
320
+ if (tag === "check this")
321
+ return "check";
322
+ if (!TAGS.includes(tag))
323
+ return "question";
324
+ return severityTagOf(tag, str(entry.severity), num(entry.confidence), str(entry.reachability));
325
+ }
326
+ /** Why a withheld entry is in the record and not on the PR. */
327
+ export const withheldReason = (word) => `Withheld by this repo's posting policy (${word}); kept here, never posted.`;
328
+ /** A posted record entry made `withheld` by the posting policy, in place —
329
+ * its tag kept as `withheld_as`, the word and the reason recorded — as every
330
+ * route records it. */
331
+ export function markWithheld(entry, word) {
332
+ entry.withheld_as = entry.posted_as;
333
+ delete entry.posted_as;
334
+ entry.disposition = "withheld";
335
+ entry.word = word;
336
+ entry.reason =
337
+ `${withheldReason(word)} ${typeof entry.reason === "string" ? entry.reason : ""}`.trim();
338
+ }
339
+ /**
340
+ * The profile's `[posting]` cut over a findings record (packages/pi-plugin/src/postingpolicy.ts
341
+ * `selectPosted`), applied by BOTH render routes — so the live shell route
342
+ * enforces it too, not only the bench (src/bench/benchposting.ts, which the
343
+ * bench still uses when it does not render). Items are the record's posted
344
+ * entries in record order; a follower row (`same_as`) carries its lead's key,
345
+ * so `repeat_sites = false` withholds it. No changed-line ranking: neither
346
+ * route's render step holds the diff, so the two rank identically. Every cut
347
+ * entry becomes `withheld` with its word — nothing is deleted.
348
+ */
349
+ export function applyPostingPolicyToRecord(record, policy) {
350
+ if (isDefaultPosting(policy) || typeof record !== "object" || record === null)
351
+ return { record, withheld: [] };
352
+ const rec = record;
353
+ const rawEntries = entriesOf(rec);
354
+ if (rawEntries === null)
355
+ return { record, withheld: [] };
356
+ const entries = rawEntries.map((e) => typeof e === "object" && e !== null ? { ...e } : e);
357
+ const posted = entries.filter(isPostedEntry);
358
+ // A withheld lead still owns the root-cause identity on later renders.
359
+ const keys = recordPostingKeys(entries);
360
+ const sel = selectPosted(posted, (e) => {
361
+ return {
362
+ cls: postedClassOf(e),
363
+ severity: str(e.severity),
364
+ key: keys.get(e),
365
+ };
366
+ }, policy);
367
+ if (!sel.withheld.length)
368
+ return { record, withheld: [] };
369
+ const withheld = [];
370
+ for (const { item, word } of sel.withheld) {
371
+ markWithheld(item, word);
372
+ const line = recordNumber(item.line);
373
+ const path = typeof item.path === "string" && item.path.trim() ? item.path : null;
374
+ withheld.push({
375
+ id: String(item.id ?? ""),
376
+ word,
377
+ path,
378
+ line,
379
+ cls: postedClassOf(item, "withheld_as"),
380
+ severity: str(item.severity),
381
+ title: effectiveTitle(item),
382
+ inline: path !== null && line !== null && item.inline !== false,
383
+ });
384
+ }
385
+ return { record: { ...rec, findings: entries }, withheld };
386
+ }
387
+ /**
388
+ * The render step both routes run (docs/duplicate-merge.md: the bench
389
+ * matches a live round): the post-check over the record when
390
+ * `dedupMerge` is on, then `renderReviewFromRecord`. Returns the record to
391
+ * write back (the same object when the post-check merged nothing, or when it
392
+ * is off) beside what to post.
393
+ */
394
+ export function renderPostedReview(record, opts = {}) {
395
+ const { dedupMerge, policy, ...renderOpts } = opts;
396
+ const candidates = typeof record === "object" && record !== null && !Array.isArray(record)
397
+ ? recordEntries(record)
398
+ : null;
399
+ const normalized = candidates !== null && !Array.isArray(record.findings)
400
+ ? { ...record, findings: candidates }
401
+ : record;
402
+ const checked = dedupMerge
403
+ ? postCheckRecord(normalized)
404
+ : { record: normalized, merges: [] };
405
+ const cut = applyPostingPolicyToRecord(checked.record, policy);
406
+ const rendered = renderReviewFromRecord(cut.record, {
407
+ ...renderOpts,
408
+ ...(policy?.body === "verdict" ? { bodyMode: "verdict" } : {}),
409
+ });
410
+ let out = cut.record;
411
+ if ((checked.merges.length || cut.withheld.length) && typeof out === "object" && out !== null)
412
+ out = { ...out, comments_posted: rendered.comments.length };
413
+ return { rendered, record: out, merges: checked.merges, withheld: cut.withheld };
414
+ }
415
+ /** The posting fields a rendered round's findings record carries, as the
416
+ * round templates (`{{render_note}}`) and the bench appendix both state them. */
417
+ export const RENDER_RECORD_FIELDS = [
418
+ "On every `posted` entry, besides the fields the record always carries:",
419
+ "`title` (the comment's one-line title, no tag), `body` (the comment body",
420
+ "exactly as it would be posted — a blocker consequence-first and",
421
+ "self-sufficient — WITHOUT the tag line and WITHOUT the severity trailer;",
422
+ "both are rendered from `posted_as`, `severity`, `confidence` and `lens`),",
423
+ "`side` when it is `LEFT`, `start_line` for a multi-line anchor,",
424
+ '`same_as: "<lead id>"` on a follower row of a root cause posted at',
425
+ "several sites (it posts inline but is not counted twice), and",
426
+ "`inline: false` for a finding that belongs in the body only. At the top",
427
+ "level: `verdict`, `summary` (the plain opening paragraph), `lenses_applied`",
428
+ "(the lenses line's text, raises and adds with their reasons) and, when you",
429
+ "have any, `details` (the collapsible verification material, already",
430
+ "wrapped in `<details>`).",
431
+ ].join("\n");
432
+ /** The round prompt's `{{render_note}}` — "" unless the order says this
433
+ * install renders its posted review (`[review] render_outputs`), so a round
434
+ * order without the flag renders the template unchanged. Under the flag the
435
+ * record already carries the verdict's `verdict`, `head_sha` and `summary`, so
436
+ * the note also hands the verdict file to `scripts/commit-verdict.sh
437
+ * --from-record` — the session neither retypes it nor reads the clock, which
438
+ * would otherwise lengthen the round's serial tail. */
439
+ export function renderRenderNote(order) {
440
+ if (!order.render_outputs)
441
+ return "";
442
+ const n = order.pr;
443
+ const k = order.round_no;
444
+ return [
445
+ "",
446
+ "**Rendered posting — do not write the review body or the inline-comments",
447
+ "JSON by hand.** This install renders both from the findings record. Before",
448
+ `posting, write the findings record (step 7's shape) at \`state/findings/pr-${n}-round-${k}.json\``,
449
+ "FIRST, with the posting fields below, then run",
450
+ `\`bash scripts/render-review.sh ${n} ${k}\`: it writes`,
451
+ `\`state/pr-${n}-round-${k}-review.md\` and \`state/pr-${n}-round-${k}-comments.json\``,
452
+ "in this step's format (opener, verdict line, lenses line, sections,",
453
+ "double-check items, overflow, footer; each inline comment as its tag line,",
454
+ "body and trailer). Read what it prints, fix the record if it names a",
455
+ "problem, re-run it, then post those two files exactly as this step says.",
456
+ "In step 7 the findings record is then already written: correct",
457
+ "`comments_posted` if fewer posted, then the ledger, then the verdict file.",
458
+ "",
459
+ RENDER_RECORD_FIELDS,
460
+ "",
461
+ "Only `posted` entries render. Every other disposition, and the record's",
462
+ "`prior` array, is recorded and never rendered: a prior finding that is",
463
+ "still open keeps its existing thread, so it is not a `posted` entry of",
464
+ "this round — say so in `summary` or `details` when the body should.",
465
+ "",
466
+ "**The verdict file comes from the same record — do not retype it.** Put",
467
+ "step 7's `passes` array in the record's top level too (with",
468
+ "`approval_withheld: true` when the approval is withheld, and `sweep` /",
469
+ "`escalations` when the verdict carries them). Then, after the ledger, the",
470
+ `round's last action is \`scripts/commit-verdict.sh --from-record pr-${n}-round-${k}.json\`:`,
471
+ "it builds the verdict file from the record's `verdict`, `head_sha`,",
472
+ "`summary` and those fields, stamps `finished_at`, and publishes it — so you",
473
+ "neither stage the verdict JSON nor look up the time. If it refuses, it names",
474
+ "the missing field and publishes nothing: fix the record and run it again,",
475
+ "or stage the verdict by hand as step 7 says. A `head_moved` outcome is",
476
+ "always staged by hand.",
477
+ "",
478
+ ].join("\n");
479
+ }
480
+ //# sourceMappingURL=reviewrender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewrender.js","sourceRoot":"","sources":["../../src/reviewrender.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { type FindingsRecordEntry } from "./findingsrecord.js";
2
+ import { type PriorFindingsList } from "./priorfindings.js";
3
+ import type { RoundFindingRow } from "./storerows.js";
4
+ export declare const STATE_VERSION = 1;
5
+ /** The target a review is of: the key its state is kept under. */
6
+ export declare function branchTargetKey(repo: string, branch: string): string;
7
+ /** A PR's key: the repo and the PR number, apart from any branch of the repo. */
8
+ export declare function prTargetKey(repo: string, number: number): string;
9
+ /** One review of the target. */
10
+ export interface ReviewRound {
11
+ round_no: number;
12
+ head_sha: string;
13
+ base_sha: string;
14
+ merge_base: string;
15
+ reviewed_at: string;
16
+ verdict: string | null;
17
+ scope: "full" | "delta";
18
+ cost_usd: number | null;
19
+ }
20
+ /** A status a round reported for a prior finding. */
21
+ export interface StoredCheck {
22
+ checked_round: number;
23
+ round_no: number;
24
+ finding_key: string;
25
+ status: string;
26
+ evidence: string | null;
27
+ }
28
+ export interface ReviewState {
29
+ version: typeof STATE_VERSION;
30
+ target: string;
31
+ rounds: ReviewRound[];
32
+ rows: RoundFindingRow[];
33
+ checks: StoredCheck[];
34
+ }
35
+ export declare function emptyState(target: string): ReviewState;
36
+ /** The target's state; null when there is none or it cannot be trusted. */
37
+ export declare function loadState(path: string | null, target: string): ReviewState | null;
38
+ /** Atomic: a crash never leaves half a state. Best-effort by contract — a
39
+ * state that could not be written only costs the next review its delta. */
40
+ export declare function saveState(path: string | null, s: ReviewState): boolean;
41
+ export declare const lastRound: (s: ReviewState) => ReviewRound;
42
+ /** The findings still open for the round after the last one: production's
43
+ * prior-findings list over the state. */
44
+ export declare function openFindings(s: ReviewState | null, nextRound?: number): PriorFindingsList;
45
+ export interface RecordedRound {
46
+ state: ReviewState;
47
+ /** The round's findings that are new to the target. */
48
+ fresh: FindingsRecordEntry[];
49
+ /** Entries that re-raised a finding that was already open. Kept out of the
50
+ * new findings. */
51
+ repeats: FindingsRecordEntry[];
52
+ }
53
+ /**
54
+ * Fold a finished round's findings record into the state. A finding that
55
+ * re-raises one already open (the same key on the same file, a named older round, the same
56
+ * title on the same file, or the same lens on the same line) is a repeat: it
57
+ * is kept in the state as `merged` (auditable) and never reaches the reader as
58
+ * new, whatever the session did. The statuses the round reported for the prior
59
+ * findings are recorded, so the next list shrinks.
60
+ */
61
+ export declare function recordRound(prev: ReviewState | null, target: string, round: ReviewRound, rawRecord: unknown): RecordedRound;
62
+ //# sourceMappingURL=reviewstate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewstate.d.ts","sourceRoot":"","sources":["../../src/reviewstate.ts"],"names":[],"mappings":"AAeA,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAwB,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,gCAAgC;AAChC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,qDAAqD;AACrD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,aAAa,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAEtD;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAmBjF;AAED;2EAC2E;AAC3E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CAWtE;AAED,eAAO,MAAM,SAAS,GAAI,GAAG,WAAW,KAAG,WAA6C,CAAC;AAEzF;yCACyC;AACzC,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,iBAAiB,CASzF;AAgBD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,uDAAuD;IACvD,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B;uBACmB;IACnB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,OAAO,GACjB,aAAa,CAsEf"}