@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,175 @@
1
+ import { DOUBT_WORDS } from "./doubtwords.js";
2
+ import { normalizeDisposition, type FindingDisposition } from "./findingkey.js";
3
+ /** The validator's validity vetoes (packages/pi-plugin/src/doubtwords.ts). */
4
+ export { DOUBT_WORDS };
5
+ /** The disposition vocabulary lives in the leaf `findingkey.ts`, so the
6
+ * renderer and the post-check read "posted" exactly as this parser does. */
7
+ export { normalizeDisposition, type FindingDisposition };
8
+ /** The axis a downgrade moved. `pass-validate`'s addendum requires a downgrade
9
+ * to name one; the record carries it so the move is auditable. */
10
+ export type FindingAxis = "severity" | "confidence" | "reachability" | null;
11
+ /**
12
+ * The closed kill/downgrade vocabulary (`agents/pass-validate.md` plus the
13
+ * `kill-vocabulary` addendum in `packages/pi-plugin/src/include.ts`). Recorded here for QUERIES
14
+ * and for a parse note — never as a validator: the vocabulary grows with the
15
+ * addenda, so an unknown word is noted, kept verbatim, and never a reason to
16
+ * refuse the record.
17
+ */
18
+ export declare const KILL_WORDS: readonly string[];
19
+ export declare const DOWNGRADE_WORDS: readonly string[];
20
+ /** `settled:<thread-id>` is a kill word with a payload, so it is matched by
21
+ * prefix rather than listed. */
22
+ export declare function isKnownVocabularyWord(word: string): boolean;
23
+ /** One candidate finding and why it ended where it did. */
24
+ export interface FindingsRecordEntry {
25
+ /** The session's own handle for the candidate (`f1`, …). Falls back to
26
+ * `<lens>@<path>:<line>#<index>` (`findingRecordKey`) so every entry has a
27
+ * stable per-round identity. */
28
+ key: string;
29
+ path: string | null;
30
+ line: number | null;
31
+ /** WHICH LENS RAISED IT. The one field with no tolerable default. */
32
+ lens: string;
33
+ tier: string | null;
34
+ severity: string | null;
35
+ confidence: number | null;
36
+ reachability: string | null;
37
+ kind: string | null;
38
+ disposition: FindingDisposition;
39
+ axis: FindingAxis;
40
+ /** The closed-vocabulary kill or downgrade word, verbatim. */
41
+ word: string | null;
42
+ /** The reason in the reviewer's OWN WORDS — the thing a bare `below-bar`
43
+ * never carried and the thing adjudication reads. */
44
+ reason: string | null;
45
+ /** The evidence chain behind the raise. */
46
+ evidence: string | null;
47
+ /** How it posted, when it posted: blocker / question / nit / check this. */
48
+ posted_as: string | null;
49
+ /** The round that first raised it, when this entry is about an older
50
+ * finding (a concession, an escalation). Null = raised this round. */
51
+ raised_in_round: number | null;
52
+ thread_id: number | null;
53
+ /** The posted comment's one-line title, as the session wrote it. Null when
54
+ * the entry has none — never derived from the reason. */
55
+ title: string | null;
56
+ }
57
+ export interface FindingsRecordFile {
58
+ pr: number;
59
+ round_no: number;
60
+ head_sha: string | null;
61
+ /** The per-round comment count — how many inline comments this round
62
+ * actually posted. `bot_comments.round_no` is the registry's own answer;
63
+ * this is the session's, and the two disagreeing is itself a signal. */
64
+ comments_posted: number | null;
65
+ findings: FindingsRecordEntry[];
66
+ /** The statuses this round reported for PRIOR findings (the
67
+ * daemon-rendered list's refs). Empty when the record carries none. */
68
+ prior: PriorStatusEntry[];
69
+ }
70
+ /** The status a follow-up round reports for one prior finding.
71
+ * Closed set; `unverifiable` is honest-unknown and counts as unresolved. */
72
+ export declare const PRIOR_STATUSES: readonly ["fixed", "open", "conceded", "settled", "obsolete", "unverifiable"];
73
+ export type PriorStatus = (typeof PRIOR_STATUSES)[number];
74
+ /** The statuses that take a prior finding off the next round's list. */
75
+ export declare const PRIOR_RESOLVED_STATUSES: readonly PriorStatus[];
76
+ /** One entry of the record's top-level `prior` array, parsed. */
77
+ export interface PriorStatusEntry {
78
+ /** The daemon-issued ref, `<round_no>:<finding_key>`, as given. */
79
+ ref: string;
80
+ round_no: number;
81
+ finding_key: string;
82
+ status: PriorStatus;
83
+ evidence: string | null;
84
+ }
85
+ /** Fold a session-written prior status onto the closed set; `fixed@<sha>`
86
+ * is `fixed` (the sha is returned so it can ride the evidence). Null = not
87
+ * a status this parser knows. */
88
+ export declare function normalizePriorStatus(raw: unknown): {
89
+ status: PriorStatus;
90
+ sha: string | null;
91
+ } | null;
92
+ /** Split a ref `<round_no>:<finding_key>` on its FIRST colon (a key may hold
93
+ * colons — `recheck:<sha12>:<id>`). Null when it is not one. */
94
+ export declare function parsePriorRef(raw: unknown): {
95
+ round_no: number;
96
+ finding_key: string;
97
+ } | null;
98
+ export type FindingsRecordStatus = "ok" | "missing" | "unparseable" | "wrong_round" | "no_findings_array";
99
+ /**
100
+ * What the round's POSTED output looked like against the output rules — a tag
101
+ * inside the closed grammar, a nit that names a request, a doubted finding
102
+ * never posted — plus a count of findings restated from earlier rounds.
103
+ *
104
+ * This is measurement over the record already collected — there is no
105
+ * second table and no new mandate beyond one field (`request`) on nit entries.
106
+ * Each list holds the offending entries' keys, so a query can go straight back
107
+ * to the row.
108
+ *
109
+ * It is deliberately NOT a gate. The round is over by the time this runs, the
110
+ * verdict is applied, and a record is never allowed to hold a PR open. The
111
+ * enforcement lives where a finding is still preventable — the lens addendum
112
+ * and the validator — and this is how we find out whether it worked.
113
+ */
114
+ export interface RecordConformance {
115
+ /** Posted with a `posted_as` outside the closed grammar (`[start here 3/5]`,
116
+ * `[verified]`, "blocker, now fixed"). Such a finding escapes every consumer
117
+ * keyed on the real tag — `resolveOwnReviewThread`'s refusals included. */
118
+ ungrammatical_tags: string[];
119
+ /** Posted as a nit while naming no request. A nit that asks for nothing is a
120
+ * remark, not a finding. */
121
+ nits_without_request: string[];
122
+ /** Doubted AND carrying a `posted_as` — a finding the validator could not
123
+ * stand behind that the session says it posted anyway (a doubt is never
124
+ * posted on the PR). */
125
+ doubted_posted: string[];
126
+ /**
127
+ * Posted this round while first raised in an earlier one. NOT automatically
128
+ * a defect: a severity escalation across rounds is legitimate (blocking
129
+ * late beats never). It is also where restated bookkeeping comes from, so
130
+ * it is counted rather than judged, and never killed on this signal alone.
131
+ */
132
+ restated: string[];
133
+ }
134
+ export declare function isConformant(c: RecordConformance): boolean;
135
+ export interface ParsedFindingsRecord {
136
+ status: FindingsRecordStatus;
137
+ record?: FindingsRecordFile;
138
+ /** Shortfalls that did NOT reject the record (entries missing a lens, an
139
+ * unknown vocabulary word, …). A note, never a rejection. */
140
+ note?: string;
141
+ /** The output-rule audit over the posted entries. Present whenever `record`
142
+ * is. */
143
+ conformance?: RecordConformance;
144
+ }
145
+ /**
146
+ * Parse and normalize one record file's already-JSON-decoded content.
147
+ *
148
+ * Tolerant like the verdict parser: digit-string numbers coerce,
149
+ * `candidates` is accepted for `findings`, `name` for `lens`, and an entry the
150
+ * parser cannot fully understand is kept with nulls plus a note rather than
151
+ * dropped. The ONLY rejections are structural — not an object, the wrong
152
+ * round, or no findings array at all — because those are the shapes where
153
+ * there is nothing to record.
154
+ */
155
+ export declare function parseFindingsRecord(raw: unknown, pr: number, roundNo: number): ParsedFindingsRecord;
156
+ /** Read + parse the record file. A missing/unreadable file is `missing`, an
157
+ * undecodable one `unparseable` — enforcement is identical either way; the
158
+ * distinction is for the record. */
159
+ export declare function readFindingsRecord(path: string, pr: number, roundNo: number): ParsedFindingsRecord;
160
+ /** `<root>/state/findings/pr-<n>-round-<k>.json` — the pinned path, same
161
+ * discipline as the verdict file and the round's other scratch paths. */
162
+ export declare function findingsRecordFile(pr: number, roundNo: number): string;
163
+ export declare function findingsRecordPath(findingsDir: string, pr: number, roundNo: number): string;
164
+ /**
165
+ * The re-nudge wake. Bookkeeping-only and explicitly so: it arrives OUTSIDE a
166
+ * round, after the verdict has already landed, and the session must not
167
+ * mistake it for review work — no passes, no posting, no verdict file.
168
+ *
169
+ * It names the pinned scratch paths on purpose: the conversation has been
170
+ * compacted by the time this arrives, but the pass outputs and the review body
171
+ * are still on disk, so the record can be reconstructed from artifacts rather
172
+ * than from memory.
173
+ */
174
+ export declare function findingsRecordWake(pr: number, roundNo: number, relPath: string): string;
175
+ //# sourceMappingURL=findingsrecord.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findingsrecord.d.ts","sourceRoot":"","sources":["../../src/findingsrecord.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,410 @@
1
+ // The durable reasoning record.
2
+ //
3
+ // WHAT THIS IS. `rounds.lenses` records the PLAN and `rounds.executed_passes`
4
+ // records COUNTS — neither says which candidate findings were killed, nor why.
5
+ // Adjudication, the "how often the review backs down" metric and per-round
6
+ // volume all need that reasoning, so the session writes a schema'd file and
7
+ // the daemon parses it into queryable rows.
8
+ //
9
+ // THE SHAPE IS THE LEDGER PATTERN, DELIBERATELY. A prompt mandate alone does
10
+ // not stick. So the daemon parses the file after the round and, on
11
+ // missing/unparseable, emits a queryable anomaly plus EXACTLY ONE re-nudge
12
+ // through `wakeOrHold` telling the session to write only that record. The
13
+ // once-mark is persisted BEFORE the inject, so even a crashed inject can never
14
+ // become a nudge loop.
15
+ //
16
+ // A ROUND IS NEVER HELD OPEN FOR IT. This is a record, not a gate: the verdict
17
+ // has already been applied, the round row is already finished and the PR has
18
+ // already transitioned by the time any of this runs. A record that never
19
+ // arrives costs one anomaly row and one nudge, and nothing else — least of all
20
+ // a wedged PR (rule 9).
21
+ //
22
+ // This module is the record: its vocabulary, its parser and its pinned path,
23
+ // which the review core reads. The daemon's enforcement — the anomaly, the
24
+ // one nudge, storing the rows — is src/findingscheck.ts.
25
+ import { readFileSync } from "node:fs";
26
+ import { join } from "node:path";
27
+ import { carriedToRef } from "./finding-chain.js";
28
+ import { DOUBT_WORDS } from "./doubtwords.js";
29
+ import { entryDisposition, findingRecordKey, normalizeDisposition, recordEntries, recordNumber, recordString, } from "./findingkey.js";
30
+ import { WITHHOLD_WORDS } from "./postingpolicy.js";
31
+ import { bareTag, isSanctionedTag } from "./severity.js";
32
+ /** The validator's validity vetoes (packages/pi-plugin/src/doubtwords.ts). */
33
+ export { DOUBT_WORDS };
34
+ /** The disposition vocabulary lives in the leaf `findingkey.ts`, so the
35
+ * renderer and the post-check read "posted" exactly as this parser does. */
36
+ export { normalizeDisposition };
37
+ function normalizeAxis(raw) {
38
+ if (typeof raw !== "string")
39
+ return null;
40
+ const v = raw.trim().toLowerCase();
41
+ return v === "severity" || v === "confidence" || v === "reachability" ? v : null;
42
+ }
43
+ /**
44
+ * The closed kill/downgrade vocabulary (`agents/pass-validate.md` plus the
45
+ * `kill-vocabulary` addendum in `packages/pi-plugin/src/include.ts`). Recorded here for QUERIES
46
+ * and for a parse note — never as a validator: the vocabulary grows with the
47
+ * addenda, so an unknown word is noted, kept verbatim, and never a reason to
48
+ * refuse the record.
49
+ */
50
+ export const KILL_WORDS = [
51
+ // The validity vetoes are kill words too (folded onto `doubted` at parse).
52
+ ...DOUBT_WORDS,
53
+ "duplicate",
54
+ "out-of-scope",
55
+ "nit-out-of-delta",
56
+ "below-bar",
57
+ // Two of the three unreasoned shapes are kills.
58
+ "nit-no-request",
59
+ "self-narration",
60
+ // Style from any lens but pass-style (the repo's own guide).
61
+ "style-not-in-guide",
62
+ ];
63
+ export const DOWNGRADE_WORDS = [
64
+ "security-demoted",
65
+ "intent-over-cap",
66
+ "design-over-cap",
67
+ "style-over-cap",
68
+ // A profile's `[lenses.<pass>] max_severity` ceiling
69
+ // (packages/pi-plugin/src/lenstuning.ts PROFILE_CAP_WORD).
70
+ "profile-over-cap",
71
+ "inflated",
72
+ "understated",
73
+ "overreachable",
74
+ "understated-reach",
75
+ "feedback-shape",
76
+ // A curated dont-raise lesson's demotion (packages/pi-plugin/src/include.ts
77
+ // LESSON_VALIDATE_ADDENDUM), composed only while lessons are delivered.
78
+ "lesson-shape",
79
+ // The third unreasoned shape is a correction, not a kill: the tag is put back
80
+ // inside the closed grammar and the finding survives.
81
+ "tag-outside-grammar",
82
+ // An ask-your-human candidate at P0–P2 that names no concrete failure,
83
+ // capped to P3 (the ask-human addendum in packages/pi-plugin/src/include.ts).
84
+ "ask-human-unnamed-defect",
85
+ // The mechanism is real, the claimed consequence was wrong — posted with
86
+ // the true consequence instead of killed.
87
+ "restated",
88
+ // (validate-external-semantics) A claim resting on an external
89
+ // tool's or library's behaviour that no read could settle — kept as a
90
+ // question naming the assumption, never doubted away.
91
+ "external-assumption",
92
+ ];
93
+ /** `settled:<thread-id>` is a kill word with a payload, so it is matched by
94
+ * prefix rather than listed. */
95
+ export function isKnownVocabularyWord(word) {
96
+ const w = word.trim().toLowerCase();
97
+ if (w.startsWith("settled:"))
98
+ return true;
99
+ return (KILL_WORDS.includes(w) ||
100
+ DOWNGRADE_WORDS.includes(w) ||
101
+ WITHHOLD_WORDS.includes(w));
102
+ }
103
+ /** Cap on a recorded title — a title is one line, never a body. */
104
+ const TITLE_CAP = 300;
105
+ /** The status a follow-up round reports for one prior finding.
106
+ * Closed set; `unverifiable` is honest-unknown and counts as unresolved. */
107
+ export const PRIOR_STATUSES = [
108
+ "fixed",
109
+ "open",
110
+ "conceded",
111
+ "settled",
112
+ "obsolete",
113
+ "unverifiable",
114
+ ];
115
+ /** The statuses that take a prior finding off the next round's list. */
116
+ export const PRIOR_RESOLVED_STATUSES = [
117
+ "fixed",
118
+ "conceded",
119
+ "settled",
120
+ "obsolete",
121
+ ];
122
+ const PRIOR_STATUS_ALIASES = {
123
+ "still-open": "open",
124
+ still_open: "open",
125
+ unresolved: "open",
126
+ "refuted-and-conceded": "conceded",
127
+ removed: "obsolete",
128
+ gone: "obsolete",
129
+ unknown: "unverifiable",
130
+ };
131
+ /** Fold a session-written prior status onto the closed set; `fixed@<sha>`
132
+ * is `fixed` (the sha is returned so it can ride the evidence). Null = not
133
+ * a status this parser knows. */
134
+ export function normalizePriorStatus(raw) {
135
+ if (typeof raw !== "string")
136
+ return null;
137
+ const v = raw.trim().toLowerCase().replace(/\s+/g, "-");
138
+ const at = /^fixed@([0-9a-f]{4,40})$/.exec(v);
139
+ if (at)
140
+ return { status: "fixed", sha: at[1] };
141
+ if (PRIOR_STATUSES.includes(v))
142
+ return { status: v, sha: null };
143
+ const alias = PRIOR_STATUS_ALIASES[v];
144
+ return alias ? { status: alias, sha: null } : null;
145
+ }
146
+ /** Split a ref `<round_no>:<finding_key>` on its FIRST colon (a key may hold
147
+ * colons — `recheck:<sha12>:<id>`). Null when it is not one. */
148
+ export function parsePriorRef(raw) {
149
+ if (typeof raw !== "string")
150
+ return null;
151
+ const t = raw.trim().replace(/^r(?=\d)/i, "");
152
+ const i = t.indexOf(":");
153
+ if (i <= 0)
154
+ return null;
155
+ const head = t.slice(0, i);
156
+ const key = t.slice(i + 1).trim();
157
+ if (!/^\d+$/.test(head) || !key)
158
+ return null;
159
+ return { round_no: Number(head), finding_key: key };
160
+ }
161
+ /**
162
+ * Parse the record's optional top-level `prior` array. Tolerant like the rest
163
+ * of the record: an entry it cannot use is COUNTED in a note, never a reason
164
+ * to reject the record. A ref naming this round or a later one is unusable
165
+ * (a prior finding is from an earlier round). A ref reported twice keeps the
166
+ * last report.
167
+ */
168
+ function parsePriorArray(v, roundNo) {
169
+ const raw = v.prior ?? v.prior_findings;
170
+ if (raw === undefined || raw === null)
171
+ return { prior: [], notes: [] };
172
+ if (!Array.isArray(raw))
173
+ return { prior: [], notes: ["`prior` is not an array (ignored)"] };
174
+ const byRef = new Map();
175
+ let unusable = 0;
176
+ for (const entry of raw) {
177
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
178
+ unusable++;
179
+ continue;
180
+ }
181
+ const e = entry;
182
+ const ref = parsePriorRef(e.ref ?? e.id);
183
+ const st = normalizePriorStatus(e.status);
184
+ if (!ref || !st || ref.round_no >= roundNo) {
185
+ unusable++;
186
+ continue;
187
+ }
188
+ const written = prose(e.evidence);
189
+ const evidence = st.sha !== null && (written === null || !written.includes(st.sha))
190
+ ? `fixed@${st.sha}${written ? ` — ${written}` : ""}`.slice(0, PROSE_CAP)
191
+ : written;
192
+ const canonical = carriedToRef(ref.round_no, ref.finding_key);
193
+ byRef.delete(canonical);
194
+ byRef.set(canonical, {
195
+ ref: canonical,
196
+ round_no: ref.round_no,
197
+ finding_key: ref.finding_key,
198
+ status: st.status,
199
+ evidence,
200
+ });
201
+ }
202
+ return {
203
+ prior: [...byRef.values()],
204
+ notes: unusable > 0
205
+ ? [
206
+ `${unusable} prior-finding status entr${unusable === 1 ? "y" : "ies"} unusable (ignored)`,
207
+ ]
208
+ : [],
209
+ };
210
+ }
211
+ export function isConformant(c) {
212
+ return (c.ungrammatical_tags.length === 0 &&
213
+ c.nits_without_request.length === 0 &&
214
+ c.doubted_posted.length === 0);
215
+ }
216
+ const num = recordNumber;
217
+ const str = recordString;
218
+ /** Cap on free prose the session writes, per field. The record is evidence,
219
+ * not a transcript — an unbounded `evidence` blob would put a whole pass
220
+ * output into every row. */
221
+ const PROSE_CAP = 4000;
222
+ function prose(val) {
223
+ const s = str(val);
224
+ return s === null ? null : s.slice(0, PROSE_CAP);
225
+ }
226
+ /**
227
+ * Parse and normalize one record file's already-JSON-decoded content.
228
+ *
229
+ * Tolerant like the verdict parser: digit-string numbers coerce,
230
+ * `candidates` is accepted for `findings`, `name` for `lens`, and an entry the
231
+ * parser cannot fully understand is kept with nulls plus a note rather than
232
+ * dropped. The ONLY rejections are structural — not an object, the wrong
233
+ * round, or no findings array at all — because those are the shapes where
234
+ * there is nothing to record.
235
+ */
236
+ export function parseFindingsRecord(raw, pr, roundNo) {
237
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
238
+ return { status: "unparseable" };
239
+ const v = raw;
240
+ const filePr = num(v.pr);
241
+ const fileRound = num(v.round_no);
242
+ // A record for another round is worse than none: it would attribute one
243
+ // round's reasoning to another. Rejected, and the nudge asks for this one.
244
+ if ((filePr !== null && filePr !== pr) || (fileRound !== null && fileRound !== roundNo))
245
+ return { status: "wrong_round" };
246
+ const rawFindings = recordEntries(v);
247
+ if (rawFindings === null)
248
+ return { status: "no_findings_array" };
249
+ const notes = [];
250
+ let noLens = 0;
251
+ let unknownDisposition = 0;
252
+ let unknownWord = 0;
253
+ const findings = [];
254
+ const conformance = {
255
+ ungrammatical_tags: [],
256
+ nits_without_request: [],
257
+ doubted_posted: [],
258
+ restated: [],
259
+ };
260
+ for (const [i, entry] of rawFindings.entries()) {
261
+ if (typeof entry !== "object" || entry === null) {
262
+ noLens++;
263
+ continue;
264
+ }
265
+ const e = entry;
266
+ const lens = str(e.lens) ?? str(e.name) ?? "";
267
+ if (!lens)
268
+ noLens++;
269
+ const path = str(e.path);
270
+ const line = num(e.line);
271
+ const word = str(e.word) ?? str(e.reason_word) ?? null;
272
+ const written = entryDisposition(e);
273
+ if (written === "unknown")
274
+ unknownDisposition++;
275
+ // A validity veto recorded as a kill is still a doubt.
276
+ const disposition = written === "killed" && word !== null && DOUBT_WORDS.includes(word.trim().toLowerCase())
277
+ ? "doubted"
278
+ : written;
279
+ if (word !== null && !isKnownVocabularyWord(word))
280
+ unknownWord++;
281
+ // The ONE key rule (packages/pi-plugin/src/findingkey.ts) — the live render route stamps the
282
+ // same key into the comment it posts, so the two always name one row.
283
+ const key = findingRecordKey(e, i);
284
+ const raisedIn = (() => {
285
+ const r = num(e.raised_in_round);
286
+ return r === null ? null : Math.trunc(r);
287
+ })();
288
+ // Output-rule audit — posted entries only: the three defects are about what
289
+ // reaches the author, and a killed candidate reached nobody.
290
+ if (disposition === "posted") {
291
+ const postedAs = str(e.posted_as);
292
+ if (postedAs !== null && !isSanctionedTag(postedAs))
293
+ conformance.ungrammatical_tags.push(key);
294
+ const bare = bareTag(postedAs);
295
+ // `request` is the field the nit rule asks a lens for: the concrete
296
+ // change the nit asks for. Its ABSENCE is the defect — a nit that names
297
+ // no change is a remark. Alternate spellings are accepted, as everywhere
298
+ // else in this parser.
299
+ const request = str(e.request) ?? str(e.ask) ?? str(e.remedy);
300
+ if (bare === "nit" && request === null)
301
+ conformance.nits_without_request.push(key);
302
+ if (raisedIn !== null && raisedIn < roundNo)
303
+ conformance.restated.push(key);
304
+ }
305
+ if (disposition === "doubted" && str(e.posted_as) !== null)
306
+ conformance.doubted_posted.push(key);
307
+ findings.push({
308
+ key,
309
+ path,
310
+ line: line === null ? null : Math.trunc(line),
311
+ lens,
312
+ tier: str(e.tier),
313
+ severity: str(e.severity),
314
+ confidence: num(e.confidence),
315
+ reachability: str(e.reachability),
316
+ kind: str(e.kind),
317
+ disposition,
318
+ axis: normalizeAxis(e.axis),
319
+ word,
320
+ reason: prose(e.reason),
321
+ evidence: prose(e.evidence),
322
+ posted_as: str(e.posted_as),
323
+ raised_in_round: raisedIn,
324
+ thread_id: (() => {
325
+ const t = num(e.thread_id);
326
+ return t === null ? null : Math.trunc(t);
327
+ })(),
328
+ title: (() => {
329
+ const t = str(e.title);
330
+ return t === null ? null : t.replace(/\s+/g, " ").slice(0, TITLE_CAP);
331
+ })(),
332
+ });
333
+ }
334
+ if (noLens > 0)
335
+ notes.push(`${noLens} entr${noLens === 1 ? "y" : "ies"} without a lens`);
336
+ if (unknownDisposition > 0)
337
+ notes.push(`${unknownDisposition} unrecognised disposition(s)`);
338
+ if (unknownWord > 0)
339
+ notes.push(`${unknownWord} word(s) outside the closed vocabulary`);
340
+ if (conformance.ungrammatical_tags.length > 0)
341
+ notes.push(`${conformance.ungrammatical_tags.length} posted finding(s) tagged outside the grammar`);
342
+ if (conformance.nits_without_request.length > 0)
343
+ notes.push(`${conformance.nits_without_request.length} posted nit(s) asking for nothing`);
344
+ if (conformance.doubted_posted.length > 0)
345
+ notes.push(`${conformance.doubted_posted.length} doubted finding(s) marked as posted`);
346
+ const priorParsed = parsePriorArray(v, roundNo);
347
+ notes.push(...priorParsed.notes);
348
+ const comments = num(v.comments_posted) ?? num(v.posted_comments);
349
+ return {
350
+ status: "ok",
351
+ conformance,
352
+ record: {
353
+ pr,
354
+ round_no: roundNo,
355
+ head_sha: str(v.head_sha),
356
+ comments_posted: comments === null ? null : Math.trunc(comments),
357
+ findings,
358
+ prior: priorParsed.prior,
359
+ },
360
+ ...(notes.length > 0 ? { note: notes.join("; ") } : {}),
361
+ };
362
+ }
363
+ /** Read + parse the record file. A missing/unreadable file is `missing`, an
364
+ * undecodable one `unparseable` — enforcement is identical either way; the
365
+ * distinction is for the record. */
366
+ export function readFindingsRecord(path, pr, roundNo) {
367
+ let text;
368
+ try {
369
+ text = readFileSync(path, "utf8");
370
+ }
371
+ catch {
372
+ return { status: "missing" };
373
+ }
374
+ let decoded;
375
+ try {
376
+ decoded = JSON.parse(text);
377
+ }
378
+ catch {
379
+ return { status: "unparseable" };
380
+ }
381
+ return parseFindingsRecord(decoded, pr, roundNo);
382
+ }
383
+ /** `<root>/state/findings/pr-<n>-round-<k>.json` — the pinned path, same
384
+ * discipline as the verdict file and the round's other scratch paths. */
385
+ export function findingsRecordFile(pr, roundNo) {
386
+ return `pr-${pr}-round-${roundNo}.json`;
387
+ }
388
+ export function findingsRecordPath(findingsDir, pr, roundNo) {
389
+ return join(findingsDir, findingsRecordFile(pr, roundNo));
390
+ }
391
+ /**
392
+ * The re-nudge wake. Bookkeeping-only and explicitly so: it arrives OUTSIDE a
393
+ * round, after the verdict has already landed, and the session must not
394
+ * mistake it for review work — no passes, no posting, no verdict file.
395
+ *
396
+ * It names the pinned scratch paths on purpose: the conversation has been
397
+ * compacted by the time this arrives, but the pass outputs and the review body
398
+ * are still on disk, so the record can be reconstructed from artifacts rather
399
+ * than from memory.
400
+ */
401
+ export function findingsRecordWake(pr, roundNo, relPath) {
402
+ return [
403
+ `FINDINGS RECORD MISSING — PR #${pr} round ${roundNo}`,
404
+ `The round is over and its verdict has been applied, but ${relPath} is missing or unreadable.`,
405
+ "Write ONLY that file now, in this conversation: one entry per candidate finding this round produced — posted, killed, doubted, downgraded, merged, folded, withheld or conceded — each with its lens, severity, confidence, reachability, the closed-vocabulary kill/downgrade word, and the reason in your own words. On a POSTED entry, and on a DOWNGRADED entry the validator kept, also give `posted_as` (one of the sanctioned tags), and on a posted nit the `request` — the concrete change it asked for.",
406
+ `Reconstruct it from the artifacts still on disk: state/pr-${pr}-round-${roundNo}-passes/, state/pr-${pr}-round-${roundNo}-review.md and state/pr-${pr}-round-${roundNo}-comments.json. Record only what those artifacts support — an honest partial record beats an invented complete one.`,
407
+ "Do NOT do any review work, do NOT run passes, do NOT post anything to GitHub, and do NOT write a verdict file — this is a bookkeeping write only. You will not be asked again.",
408
+ ].join("\n");
409
+ }
410
+ //# sourceMappingURL=findingsrecord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findingsrecord.js","sourceRoot":"","sources":["../../src/findingsrecord.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,4EAA4E;AAC5E,4CAA4C;AAC5C,EAAE;AACF,6EAA6E;AAC7E,mEAAmE;AACnE,2EAA2E;AAC3E,0EAA0E;AAC1E,+EAA+E;AAC/E,uBAAuB;AACvB,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,yEAAyE;AACzE,+EAA+E;AAC/E,wBAAwB;AACxB,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,yDAAyD;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,YAAY,GAEb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEzD,8EAA8E;AAC9E,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB;4EAC4E;AAC5E,OAAO,EAAE,oBAAoB,EAA2B,CAAC;AAMzD,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C,2EAA2E;IAC3E,GAAG,WAAW;IACd,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,WAAW;IACX,gDAAgD;IAChD,gBAAgB;IAChB,gBAAgB;IAChB,6DAA6D;IAC7D,oBAAoB;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,qDAAqD;IACrD,2DAA2D;IAC3D,kBAAkB;IAClB,UAAU;IACV,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,gBAAgB;IAChB,4EAA4E;IAC5E,wEAAwE;IACxE,cAAc;IACd,8EAA8E;IAC9E,sDAAsD;IACtD,qBAAqB;IACrB,uEAAuE;IACvE,8EAA8E;IAC9E,0BAA0B;IAC1B,yEAAyE;IACzE,0CAA0C;IAC1C,UAAU;IACV,+DAA+D;IAC/D,sEAAsE;IACtE,sDAAsD;IACtD,qBAAqB;CACtB,CAAC;AAEF;gCACgC;AAChC,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,CACL,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtB,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1B,cAAoC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAClD,CAAC;AACJ,CAAC;AAqCD,mEAAmE;AACnE,MAAM,SAAS,GAAG,GAAG,CAAC;AAgBtB;4EAC4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;IACP,MAAM;IACN,UAAU;IACV,SAAS;IACT,UAAU;IACV,cAAc;CACN,CAAC;AAIX,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,OAAO;IACP,UAAU;IACV,SAAS;IACT,UAAU;CACX,CAAC;AAEF,MAAM,oBAAoB,GAA0C;IAClE,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,MAAM;IAClB,sBAAsB,EAAE,UAAU;IAClC,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,cAAc;CACxB,CAAC;AAYF;;iCAEiC;AACjC,MAAM,UAAU,oBAAoB,CAClC,GAAY;IAEZ,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,EAAE,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC;IAChD,IAAK,cAAoC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,OAAO,EAAE,MAAM,EAAE,CAAgB,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED;gEACgE;AAChE,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CACtB,CAA0B,EAC1B,OAAe;IAEf,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,cAAc,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,mCAAmC,CAAC,EAAE,CAAC;IAC5F,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAClD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,QAAQ,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC3C,QAAQ,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,QAAQ,GACZ,EAAE,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YAChE,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;YACxE,CAAC,CAAC,OAAO,CAAC;QACd,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9D,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxB,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE;YACnB,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,EACH,QAAQ,GAAG,CAAC;YACV,CAAC,CAAC;gBACE,GAAG,QAAQ,6BAA6B,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,qBAAqB;aAC1F;YACH,CAAC,CAAC,EAAE;KACT,CAAC;AACJ,CAAC;AAyCD,MAAM,UAAU,YAAY,CAAC,CAAoB;IAC/C,OAAO,CACL,CAAC,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC;QACjC,CAAC,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC;QACnC,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAC9B,CAAC;AACJ,CAAC;AAaD,MAAM,GAAG,GAAG,YAAY,CAAC;AACzB,MAAM,GAAG,GAAG,YAAY,CAAC;AAEzB;;4BAE4B;AAC5B,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,SAAS,KAAK,CAAC,GAAY;IACzB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAY,EACZ,EAAU,EACV,OAAe;IAEf,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClC,wEAAwE;IACxE,2EAA2E;IAC3E,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,OAAO,CAAC;QACrF,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAEjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAsB;QACrC,kBAAkB,EAAE,EAAE;QACtB,oBAAoB,EAAE,EAAE;QACxB,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE,EAAE;KACb,CAAC;IACF,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAChD,MAAM,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QACvD,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,OAAO,KAAK,SAAS;YAAE,kBAAkB,EAAE,CAAC;QAChD,uDAAuD;QACvD,MAAM,WAAW,GACf,OAAO,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACtF,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC;QACd,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE,WAAW,EAAE,CAAC;QACjE,6FAA6F;QAC7F,sEAAsE;QACtE,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;YACrB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACjC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,EAAE,CAAC;QACL,4EAA4E;QAC5E,6DAA6D;QAC7D,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAAE,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9F,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/B,oEAAoE;YACpE,wEAAwE;YACxE,yEAAyE;YACzE,uBAAuB;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,IAAI,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI;gBAAE,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,GAAG,OAAO;gBAAE,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI;YACxD,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC;YACZ,GAAG;YACH,IAAI;YACJ,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC7C,IAAI;YACJ,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzB,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;YAC7B,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;YACjC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YACjB,WAAW;YACX,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3B,IAAI;YACJ,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YACvB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC3B,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3B,eAAe,EAAE,QAAQ;YACzB,SAAS,EAAE,CAAC,GAAG,EAAE;gBACf,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC3B,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,EAAE;YACJ,KAAK,EAAE,CAAC,GAAG,EAAE;gBACX,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACvB,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC,CAAC,EAAE;SACL,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,CAAC;IACzF,IAAI,kBAAkB,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,kBAAkB,8BAA8B,CAAC,CAAC;IAC5F,IAAI,WAAW,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,wCAAwC,CAAC,CAAC;IACxF,IAAI,WAAW,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAC3C,KAAK,CAAC,IAAI,CACR,GAAG,WAAW,CAAC,kBAAkB,CAAC,MAAM,+CAA+C,CACxF,CAAC;IACJ,IAAI,WAAW,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,oBAAoB,CAAC,MAAM,mCAAmC,CAAC,CAAC;IAC5F,IAAI,WAAW,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,sCAAsC,CAAC,CAAC;IAEzF,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAClE,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,WAAW;QACX,MAAM,EAAE;YACN,EAAE;YACF,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzB,eAAe,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YAChE,QAAQ;YACR,KAAK,EAAE,WAAW,CAAC,KAAK;SACzB;QACD,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;oCAEoC;AACpC,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,EAAU,EACV,OAAe;IAEf,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;IACD,OAAO,mBAAmB,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,OAAe;IAC5D,OAAO,MAAM,EAAE,UAAU,OAAO,OAAO,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,EAAU,EAAE,OAAe;IACjF,OAAO,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,OAAe,EAAE,OAAe;IAC7E,OAAO;QACL,iCAAiC,EAAE,UAAU,OAAO,EAAE;QACtD,2DAA2D,OAAO,4BAA4B;QAC9F,mfAAmf;QACnf,6DAA6D,EAAE,UAAU,OAAO,sBAAsB,EAAE,UAAU,OAAO,2BAA2B,EAAE,UAAU,OAAO,qHAAqH;QAC5R,gLAAgL;KACjL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type CoreConfig } from "./reviewconfig.js";
2
+ /** Production and replay admit delta follow-ups under the same knob/default. */
3
+ export declare function deltaFollowUpEnabled(cfg: Pick<CoreConfig, "review">): boolean;
4
+ //# sourceMappingURL=followup-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followup-mode.d.ts","sourceRoot":"","sources":["../../src/followup-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAErE,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,OAAO,CAE7E"}
@@ -0,0 +1,6 @@
1
+ import { REVIEW_DEFAULTS } from "./reviewconfig.js";
2
+ /** Production and replay admit delta follow-ups under the same knob/default. */
3
+ export function deltaFollowUpEnabled(cfg) {
4
+ return (cfg.review.follow_up ?? REVIEW_DEFAULTS.follow_up) === "delta";
5
+ }
6
+ //# sourceMappingURL=followup-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"followup-mode.js","sourceRoot":"","sources":["../../src/followup-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAErE,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,GAA+B;IAClE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,eAAe,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;AACzE,CAAC"}