@quickchatai/pi-quickreview 0.0.0-stage → 1.2.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 (697) 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 +1099 -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 +113 -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 +377 -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 +235 -0
  282. package/dist/src/engine/pisdk.d.ts.map +1 -0
  283. package/dist/src/engine/pisdk.js +577 -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 +70 -0
  382. package/dist/src/githubAuth.d.ts.map +1 -0
  383. package/dist/src/githubAuth.js +183 -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 +106 -0
  394. package/dist/src/guards.d.ts.map +1 -0
  395. package/dist/src/guards.js +365 -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/identity.d.ts +34 -0
  414. package/dist/src/identity.d.ts.map +1 -0
  415. package/dist/src/identity.js +67 -0
  416. package/dist/src/identity.js.map +1 -0
  417. package/dist/src/include.d.ts +435 -0
  418. package/dist/src/include.d.ts.map +1 -0
  419. package/dist/src/include.js +1692 -0
  420. package/dist/src/include.js.map +1 -0
  421. package/dist/src/launchvocab.d.ts +36 -0
  422. package/dist/src/launchvocab.d.ts.map +1 -0
  423. package/dist/src/launchvocab.js +59 -0
  424. package/dist/src/launchvocab.js.map +1 -0
  425. package/dist/src/ledgercarry.d.ts +24 -0
  426. package/dist/src/ledgercarry.d.ts.map +1 -0
  427. package/dist/src/ledgercarry.js +109 -0
  428. package/dist/src/ledgercarry.js.map +1 -0
  429. package/dist/src/lensids.d.ts +7 -0
  430. package/dist/src/lensids.d.ts.map +1 -0
  431. package/dist/src/lensids.js +53 -0
  432. package/dist/src/lensids.js.map +1 -0
  433. package/dist/src/lensplanning.d.ts +8 -0
  434. package/dist/src/lensplanning.d.ts.map +1 -0
  435. package/dist/src/lensplanning.js +126 -0
  436. package/dist/src/lensplanning.js.map +1 -0
  437. package/dist/src/lensresult.d.ts +94 -0
  438. package/dist/src/lensresult.d.ts.map +1 -0
  439. package/dist/src/lensresult.js +162 -0
  440. package/dist/src/lensresult.js.map +1 -0
  441. package/dist/src/lenstuning.d.ts +97 -0
  442. package/dist/src/lenstuning.d.ts.map +1 -0
  443. package/dist/src/lenstuning.js +326 -0
  444. package/dist/src/lenstuning.js.map +1 -0
  445. package/dist/src/lintconfig.d.ts +31 -0
  446. package/dist/src/lintconfig.d.ts.map +1 -0
  447. package/dist/src/lintconfig.js +543 -0
  448. package/dist/src/lintconfig.js.map +1 -0
  449. package/dist/src/live/events.d.ts +188 -0
  450. package/dist/src/live/events.d.ts.map +1 -0
  451. package/dist/src/live/events.js +136 -0
  452. package/dist/src/live/events.js.map +1 -0
  453. package/dist/src/live/writer.d.ts +54 -0
  454. package/dist/src/live/writer.d.ts.map +1 -0
  455. package/dist/src/live/writer.js +516 -0
  456. package/dist/src/live/writer.js.map +1 -0
  457. package/dist/src/localreview.d.ts +128 -0
  458. package/dist/src/localreview.d.ts.map +1 -0
  459. package/dist/src/localreview.js +426 -0
  460. package/dist/src/localreview.js.map +1 -0
  461. package/dist/src/loosenedtests.d.ts +13 -0
  462. package/dist/src/loosenedtests.d.ts.map +1 -0
  463. package/dist/src/loosenedtests.js +188 -0
  464. package/dist/src/loosenedtests.js.map +1 -0
  465. package/dist/src/memoryport.d.ts +264 -0
  466. package/dist/src/memoryport.d.ts.map +1 -0
  467. package/dist/src/memoryport.js +445 -0
  468. package/dist/src/memoryport.js.map +1 -0
  469. package/dist/src/migrations.d.ts +106 -0
  470. package/dist/src/migrations.d.ts.map +1 -0
  471. package/dist/src/migrations.js +373 -0
  472. package/dist/src/migrations.js.map +1 -0
  473. package/dist/src/modelroute.d.ts +38 -0
  474. package/dist/src/modelroute.d.ts.map +1 -0
  475. package/dist/src/modelroute.js +105 -0
  476. package/dist/src/modelroute.js.map +1 -0
  477. package/dist/src/oneshot.d.ts +12 -0
  478. package/dist/src/oneshot.d.ts.map +1 -0
  479. package/dist/src/oneshot.js +8 -0
  480. package/dist/src/oneshot.js.map +1 -0
  481. package/dist/src/packing.d.ts +11 -0
  482. package/dist/src/packing.d.ts.map +1 -0
  483. package/dist/src/packing.js +31 -0
  484. package/dist/src/packing.js.map +1 -0
  485. package/dist/src/passes.d.ts +16 -0
  486. package/dist/src/passes.d.ts.map +1 -0
  487. package/dist/src/passes.js +104 -0
  488. package/dist/src/passes.js.map +1 -0
  489. package/dist/src/passtasks.d.ts +68 -0
  490. package/dist/src/passtasks.d.ts.map +1 -0
  491. package/dist/src/passtasks.js +360 -0
  492. package/dist/src/passtasks.js.map +1 -0
  493. package/dist/src/pathinside.d.ts +5 -0
  494. package/dist/src/pathinside.d.ts.map +1 -0
  495. package/dist/src/pathinside.js +9 -0
  496. package/dist/src/pathinside.js.map +1 -0
  497. package/dist/src/pibuiltins.d.ts +36 -0
  498. package/dist/src/pibuiltins.d.ts.map +1 -0
  499. package/dist/src/pibuiltins.js +83 -0
  500. package/dist/src/pibuiltins.js.map +1 -0
  501. package/dist/src/plankey.d.ts +4 -0
  502. package/dist/src/plankey.d.ts.map +1 -0
  503. package/dist/src/plankey.js +10 -0
  504. package/dist/src/plankey.js.map +1 -0
  505. package/dist/src/planner.d.ts +375 -0
  506. package/dist/src/planner.d.ts.map +1 -0
  507. package/dist/src/planner.js +722 -0
  508. package/dist/src/planner.js.map +1 -0
  509. package/dist/src/plugin/args.d.ts +19 -0
  510. package/dist/src/plugin/args.d.ts.map +1 -0
  511. package/dist/src/plugin/args.js +107 -0
  512. package/dist/src/plugin/args.js.map +1 -0
  513. package/dist/src/plugin/index.d.ts +3 -0
  514. package/dist/src/plugin/index.d.ts.map +1 -0
  515. package/dist/src/plugin/index.js +14 -0
  516. package/dist/src/plugin/index.js.map +1 -0
  517. package/dist/src/plugin/login.d.ts +42 -0
  518. package/dist/src/plugin/login.d.ts.map +1 -0
  519. package/dist/src/plugin/login.js +82 -0
  520. package/dist/src/plugin/login.js.map +1 -0
  521. package/dist/src/plugin/review.d.ts +27 -0
  522. package/dist/src/plugin/review.d.ts.map +1 -0
  523. package/dist/src/plugin/review.js +302 -0
  524. package/dist/src/plugin/review.js.map +1 -0
  525. package/dist/src/plugin/runner.d.ts +6 -0
  526. package/dist/src/plugin/runner.d.ts.map +1 -0
  527. package/dist/src/plugin/runner.js +65 -0
  528. package/dist/src/plugin/runner.js.map +1 -0
  529. package/dist/src/plugin/scan.d.ts +79 -0
  530. package/dist/src/plugin/scan.d.ts.map +1 -0
  531. package/dist/src/plugin/scan.js +348 -0
  532. package/dist/src/plugin/scan.js.map +1 -0
  533. package/dist/src/plugin/session.d.ts +56 -0
  534. package/dist/src/plugin/session.d.ts.map +1 -0
  535. package/dist/src/plugin/session.js +2 -0
  536. package/dist/src/plugin/session.js.map +1 -0
  537. package/dist/src/plugin/setup.d.ts +19 -0
  538. package/dist/src/plugin/setup.d.ts.map +1 -0
  539. package/dist/src/plugin/setup.js +142 -0
  540. package/dist/src/plugin/setup.js.map +1 -0
  541. package/dist/src/plugin/versiongate.d.ts +26 -0
  542. package/dist/src/plugin/versiongate.d.ts.map +1 -0
  543. package/dist/src/plugin/versiongate.js +83 -0
  544. package/dist/src/plugin/versiongate.js.map +1 -0
  545. package/dist/src/postingkey.d.ts +8 -0
  546. package/dist/src/postingkey.d.ts.map +1 -0
  547. package/dist/src/postingkey.js +25 -0
  548. package/dist/src/postingkey.js.map +1 -0
  549. package/dist/src/postingpolicy.d.ts +108 -0
  550. package/dist/src/postingpolicy.d.ts.map +1 -0
  551. package/dist/src/postingpolicy.js +341 -0
  552. package/dist/src/postingpolicy.js.map +1 -0
  553. package/dist/src/pr-identity.d.ts +3 -0
  554. package/dist/src/pr-identity.d.ts.map +1 -0
  555. package/dist/src/pr-identity.js +9 -0
  556. package/dist/src/pr-identity.js.map +1 -0
  557. package/dist/src/prdelta.d.ts +181 -0
  558. package/dist/src/prdelta.d.ts.map +1 -0
  559. package/dist/src/prdelta.js +501 -0
  560. package/dist/src/prdelta.js.map +1 -0
  561. package/dist/src/pricing.d.ts +94 -0
  562. package/dist/src/pricing.d.ts.map +1 -0
  563. package/dist/src/pricing.js +209 -0
  564. package/dist/src/pricing.js.map +1 -0
  565. package/dist/src/priorfindings.d.ts +167 -0
  566. package/dist/src/priorfindings.d.ts.map +1 -0
  567. package/dist/src/priorfindings.js +445 -0
  568. package/dist/src/priorfindings.js.map +1 -0
  569. package/dist/src/priortasks.d.ts +31 -0
  570. package/dist/src/priortasks.d.ts.map +1 -0
  571. package/dist/src/priortasks.js +119 -0
  572. package/dist/src/priortasks.js.map +1 -0
  573. package/dist/src/profilelookup.d.ts +59 -0
  574. package/dist/src/profilelookup.d.ts.map +1 -0
  575. package/dist/src/profilelookup.js +98 -0
  576. package/dist/src/profilelookup.js.map +1 -0
  577. package/dist/src/profileoverrides.d.ts +91 -0
  578. package/dist/src/profileoverrides.d.ts.map +1 -0
  579. package/dist/src/profileoverrides.js +313 -0
  580. package/dist/src/profileoverrides.js.map +1 -0
  581. package/dist/src/profiles.d.ts +144 -0
  582. package/dist/src/profiles.d.ts.map +1 -0
  583. package/dist/src/profiles.js +604 -0
  584. package/dist/src/profiles.js.map +1 -0
  585. package/dist/src/promptdoc.d.ts +3 -0
  586. package/dist/src/promptdoc.d.ts.map +1 -0
  587. package/dist/src/promptdoc.js +18 -0
  588. package/dist/src/promptdoc.js.map +1 -0
  589. package/dist/src/prtarget.d.ts +70 -0
  590. package/dist/src/prtarget.d.ts.map +1 -0
  591. package/dist/src/prtarget.js +181 -0
  592. package/dist/src/prtarget.js.map +1 -0
  593. package/dist/src/recheckorder.d.ts +32 -0
  594. package/dist/src/recheckorder.d.ts.map +1 -0
  595. package/dist/src/recheckorder.js +5 -0
  596. package/dist/src/recheckorder.js.map +1 -0
  597. package/dist/src/reviewapi.d.ts +207 -0
  598. package/dist/src/reviewapi.d.ts.map +1 -0
  599. package/dist/src/reviewapi.js +939 -0
  600. package/dist/src/reviewapi.js.map +1 -0
  601. package/dist/src/reviewbotfindings.d.ts +33 -0
  602. package/dist/src/reviewbotfindings.d.ts.map +1 -0
  603. package/dist/src/reviewbotfindings.js +80 -0
  604. package/dist/src/reviewbotfindings.js.map +1 -0
  605. package/dist/src/reviewconfig.d.ts +753 -0
  606. package/dist/src/reviewconfig.d.ts.map +1 -0
  607. package/dist/src/reviewconfig.js +805 -0
  608. package/dist/src/reviewconfig.js.map +1 -0
  609. package/dist/src/reviewdelta.d.ts +51 -0
  610. package/dist/src/reviewdelta.d.ts.map +1 -0
  611. package/dist/src/reviewdelta.js +119 -0
  612. package/dist/src/reviewdelta.js.map +1 -0
  613. package/dist/src/reviewdest.d.ts +86 -0
  614. package/dist/src/reviewdest.d.ts.map +1 -0
  615. package/dist/src/reviewdest.js +142 -0
  616. package/dist/src/reviewdest.js.map +1 -0
  617. package/dist/src/reviewerstub.d.ts +12 -0
  618. package/dist/src/reviewerstub.d.ts.map +1 -0
  619. package/dist/src/reviewerstub.js +28 -0
  620. package/dist/src/reviewerstub.js.map +1 -0
  621. package/dist/src/reviewhost.d.ts +58 -0
  622. package/dist/src/reviewhost.d.ts.map +1 -0
  623. package/dist/src/reviewhost.js +135 -0
  624. package/dist/src/reviewhost.js.map +1 -0
  625. package/dist/src/reviewpost.d.ts +79 -0
  626. package/dist/src/reviewpost.d.ts.map +1 -0
  627. package/dist/src/reviewpost.js +233 -0
  628. package/dist/src/reviewpost.js.map +1 -0
  629. package/dist/src/reviewrender.d.ts +154 -0
  630. package/dist/src/reviewrender.d.ts.map +1 -0
  631. package/dist/src/reviewrender.js +480 -0
  632. package/dist/src/reviewrender.js.map +1 -0
  633. package/dist/src/reviewstate.d.ts +62 -0
  634. package/dist/src/reviewstate.d.ts.map +1 -0
  635. package/dist/src/reviewstate.js +167 -0
  636. package/dist/src/reviewstate.js.map +1 -0
  637. package/dist/src/reviewstore.d.ts +17 -0
  638. package/dist/src/reviewstore.d.ts.map +1 -0
  639. package/dist/src/reviewstore.js +105 -0
  640. package/dist/src/reviewstore.js.map +1 -0
  641. package/dist/src/round-progress.d.ts +120 -0
  642. package/dist/src/round-progress.d.ts.map +1 -0
  643. package/dist/src/round-progress.js +172 -0
  644. package/dist/src/round-progress.js.map +1 -0
  645. package/dist/src/round-stage-deadlines.d.ts +12 -0
  646. package/dist/src/round-stage-deadlines.d.ts.map +1 -0
  647. package/dist/src/round-stage-deadlines.js +10 -0
  648. package/dist/src/round-stage-deadlines.js.map +1 -0
  649. package/dist/src/session-command.d.ts +19 -0
  650. package/dist/src/session-command.d.ts.map +1 -0
  651. package/dist/src/session-command.js +20 -0
  652. package/dist/src/session-command.js.map +1 -0
  653. package/dist/src/settledread.d.ts +61 -0
  654. package/dist/src/settledread.d.ts.map +1 -0
  655. package/dist/src/settledread.js +135 -0
  656. package/dist/src/settledread.js.map +1 -0
  657. package/dist/src/severity.d.ts +167 -0
  658. package/dist/src/severity.d.ts.map +1 -0
  659. package/dist/src/severity.js +364 -0
  660. package/dist/src/severity.js.map +1 -0
  661. package/dist/src/severityrank.d.ts +8 -0
  662. package/dist/src/severityrank.d.ts.map +1 -0
  663. package/dist/src/severityrank.js +16 -0
  664. package/dist/src/severityrank.js.map +1 -0
  665. package/dist/src/standing-review.d.ts +45 -0
  666. package/dist/src/standing-review.d.ts.map +1 -0
  667. package/dist/src/standing-review.js +43 -0
  668. package/dist/src/standing-review.js.map +1 -0
  669. package/dist/src/storerows.d.ts +225 -0
  670. package/dist/src/storerows.d.ts.map +1 -0
  671. package/dist/src/storerows.js +7 -0
  672. package/dist/src/storerows.js.map +1 -0
  673. package/dist/src/styleguide.d.ts +25 -0
  674. package/dist/src/styleguide.d.ts.map +1 -0
  675. package/dist/src/styleguide.js +272 -0
  676. package/dist/src/styleguide.js.map +1 -0
  677. package/dist/src/sweepstatus.d.ts +42 -0
  678. package/dist/src/sweepstatus.d.ts.map +1 -0
  679. package/dist/src/sweepstatus.js +97 -0
  680. package/dist/src/sweepstatus.js.map +1 -0
  681. package/dist/src/templates.d.ts +243 -0
  682. package/dist/src/templates.d.ts.map +1 -0
  683. package/dist/src/templates.js +847 -0
  684. package/dist/src/templates.js.map +1 -0
  685. package/dist/src/types.d.ts +639 -0
  686. package/dist/src/types.d.ts.map +1 -0
  687. package/dist/src/types.js +90 -0
  688. package/dist/src/types.js.map +1 -0
  689. package/dist/src/unifieddiff.d.ts +22 -0
  690. package/dist/src/unifieddiff.d.ts.map +1 -0
  691. package/dist/src/unifieddiff.js +176 -0
  692. package/dist/src/unifieddiff.js.map +1 -0
  693. package/dist/src/yieldloop.d.ts +2 -0
  694. package/dist/src/yieldloop.d.ts.map +1 -0
  695. package/dist/src/yieldloop.js +14 -0
  696. package/dist/src/yieldloop.js.map +1 -0
  697. package/package.json +60 -4
@@ -0,0 +1,331 @@
1
+ import { parsePrIdentity as parseOwnPr } from "../src/pr-identity.js";
2
+ // ledger-pin — keeps the review ledger alive across pi's native compaction.
3
+ //
4
+ // The PR session maintains a fenced block that starts with "LEDGER PR #<n> @
5
+ // <sha>" (see prompts/conversation-system.md). Compaction is token-driven and
6
+ // would happily summarise it away, so this extension hooks
7
+ // session_before_compact, finds the most recent ledger block in the entries
8
+ // the hook hands it, and returns a REAL compaction: pi's own
9
+ // default summary, produced by calling the package's exported `compact()`
10
+ // (the function pi would have called itself), with the pinned ledger block
11
+ // appended to it VERBATIM. That summary is what pi puts back in front of the
12
+ // model after compaction, so the ledger survives word for word. Any failure
13
+ // on that path (no model, no auth, the summariser threw, a shape we do not
14
+ // recognise) returns nothing, and pi runs its default compaction unchanged:
15
+ // never a cancelled compaction, never a wedged session. The ledger then still
16
+ // comes back through the daemon, because every round order re-hands the
17
+ // mirrored snapshot (packages/pi-plugin/src/ledgercarry.ts).
18
+ //
19
+ // pi 1.0.0 reads only `cancel` and `compaction` from the handler's result, so
20
+ // returning a whole compaction is the only way to pin anything.
21
+ //
22
+ // It also mirrors the newest ledger block to state/ledgers/<session>.md after
23
+ // every turn — that snapshot is what archiveAndClose() copies into
24
+ // archive/pr-<n>/ (the session JSONL alone would need parsing).
25
+ //
26
+ // Only a block whose PR number equals the session's OWN PR (QCR_PR, riding
27
+ // the pi command line per session) is ever mirrored or pinned. Sessions quote
28
+ // sibling PRs' ledger headers when reading their posted reviews for format
29
+ // reference; without the filter a sibling's ledger would be persisted over
30
+ // the session's own. A session with no / garbage
31
+ // QCR_PR (the overseer) mirrors NO PR ledger, ever — fail safe is no mirror.
32
+ //
33
+ // pi is a dependency of this repo, so the pi API is typechecked against its own
34
+ // declarations; what a live session does with it stays VERIFY-ON-PIN.
35
+ // The compaction contract was read out of pi 1.0.0's shipped dist (the
36
+ // `qcr-bench:fast1` image, docker create + docker cp, no container run); each
37
+ // tag below names the file and symbol it was checked against.
38
+ import { backtickFence } from "../src/codespan.js";
39
+ import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
40
+ import { dirname, join } from "node:path";
41
+ import { randomUUID } from "node:crypto";
42
+ // A block runs from its "LEDGER PR #<n>" header to the next fence / blank
43
+ // line + heading / NEXT ledger header / end — the last terminator keeps a
44
+ // quoted sibling header from being swallowed into the preceding block's body.
45
+ const LEDGER_RE = /(^|\n)\s*LEDGER\s+PR\s+#(\d+)[^\n]*\n[\s\S]*?(?=\n```|\n\s*\n\s*#|\n\s*LEDGER\s+PR\s+#|$)/g;
46
+ /** The session's own PR number from QCR_PR — undefined for the overseer (no
47
+ * QCR_PR) and for anything that is not a plain digit string (fail safe). */
48
+ export { parsePrIdentity as parseOwnPr } from "../src/pr-identity.js";
49
+ /** Deep-walk an unknown payload collecting every string that could be message
50
+ * text. // VERIFY-ON-PIN: the event payload shape is undocumented, so this is
51
+ * deliberately shape-agnostic rather than assuming `event.messages`. */
52
+ export function collectText(value, out = [], depth = 0) {
53
+ if (depth > 8 || value == null)
54
+ return out;
55
+ if (typeof value === "string") {
56
+ out.push(value);
57
+ return out;
58
+ }
59
+ if (Array.isArray(value)) {
60
+ for (const v of value)
61
+ collectText(v, out, depth + 1);
62
+ return out;
63
+ }
64
+ if (typeof value === "object") {
65
+ for (const v of Object.values(value))
66
+ collectText(v, out, depth + 1);
67
+ }
68
+ return out;
69
+ }
70
+ // The format's own example in the system prompt (prompts/conversation-system.md
71
+ // renders `LEDGER PR #<n> @ <head-sha>` with the PR's number filled in) names a
72
+ // placeholder where a ledger names its head. A worker that wrote no ledger in a
73
+ // recheck mirrored that example over #6114's real ledger (2026-10-22).
74
+ const PLACEHOLDER_HEAD_RE = /^\s*LEDGER\s+PR\s+#\d+\s*@\s*</;
75
+ /** A block opened right after a fence of four or more backticks runs to that
76
+ * fence's close, so a three-backtick quote inside it stays part of the ledger.
77
+ * undefined when no such fence encloses the header. */
78
+ function wrappedBlock(text, match) {
79
+ const start = (match.index ?? 0) + (match[1] ?? "").length;
80
+ const open = /(?:^|\n)(`{4,})[^\n`]*\n\s*$/.exec(text.slice(0, start));
81
+ if (!open)
82
+ return undefined;
83
+ const rest = text.slice(start);
84
+ const close = new RegExp(`\\n\\s*${open[1]}\`*[ \\t]*(?:\\n|$)`).exec(rest);
85
+ const end = close ? close.index : rest.length;
86
+ return rest.slice(0, end);
87
+ }
88
+ /** The last (most recent) LEDGER block for the session's OWN PR, trimmed.
89
+ * Blocks naming any other PR are ignored (reported via onIgnore) — even when
90
+ * they appear after the own-PR block. With no own PR (overseer / garbage
91
+ * QCR_PR) every block is ignored and nothing is returned. A block whose head is
92
+ * a `<placeholder>` is the format's example, never a ledger, and is skipped. */
93
+ export function extractLedger(texts, ownPr, onIgnore = () => { }) {
94
+ let found;
95
+ for (const text of texts) {
96
+ for (const match of text.matchAll(LEDGER_RE)) {
97
+ const pr = Number(match[2]);
98
+ const block = wrappedBlock(text, match) ?? match[0];
99
+ if (PLACEHOLDER_HEAD_RE.test(block.trim()))
100
+ continue;
101
+ if (ownPr !== undefined && pr === ownPr)
102
+ found = block.trim();
103
+ else
104
+ onIgnore(pr);
105
+ }
106
+ }
107
+ return found;
108
+ }
109
+ export function ledgerSnapshotPath(env, session, cwd) {
110
+ const explicit = env.QCR_LEDGER_FILE?.trim();
111
+ if (explicit)
112
+ return explicit;
113
+ const root = env.QCR_SANDBOX_ROOT?.trim() || cwd;
114
+ return join(root, "state", "ledgers", `${session}.md`);
115
+ }
116
+ function writeSnapshot(path, body) {
117
+ mkdirSync(dirname(path), { recursive: true });
118
+ let previous = "";
119
+ try {
120
+ previous = readFileSync(path, "utf8");
121
+ }
122
+ catch {
123
+ /* first snapshot */
124
+ }
125
+ if (previous.trim() === body.trim())
126
+ return;
127
+ const tmp = `${path}.tmp-${process.pid}-${randomUUID()}`;
128
+ try {
129
+ writeFileSync(tmp, `${body}\n`);
130
+ renameSync(tmp, path);
131
+ }
132
+ finally {
133
+ rmSync(tmp, { force: true });
134
+ }
135
+ }
136
+ /** Sentinels around the pinned block, so the next compaction can strip the
137
+ * previous copy out of `previousSummary` before pi's summariser sees it (it
138
+ * would otherwise paraphrase a stale ledger into the new summary). */
139
+ export const PIN_OPEN = "<!-- qcr:ledger-pin -->";
140
+ export const PIN_CLOSE = "<!-- /qcr:ledger-pin -->";
141
+ /** A fence longer than any backtick run in `body`, so a ledger that quotes
142
+ * code can never close its own fence early. */
143
+ export const fenceFor = backtickFence;
144
+ /** The block appended to the compaction summary: PR meta + the ledger,
145
+ * verbatim, between the sentinels. */
146
+ export function pinnedBlock(meta, ledger) {
147
+ const fence = fenceFor(ledger);
148
+ return [
149
+ PIN_OPEN,
150
+ "PINNED LEDGER — your review ledger exactly as you last wrote it, appended",
151
+ "verbatim to this compaction summary by the ledger-pin extension. It is the",
152
+ "checklist the next round starts from; the summary above is a paraphrase.",
153
+ ...(meta ? ["", meta] : []),
154
+ "",
155
+ fence,
156
+ ledger,
157
+ fence,
158
+ PIN_CLOSE,
159
+ ].join("\n");
160
+ }
161
+ /** `summary` with every pinned block (sentinels inclusive) removed. */
162
+ export function stripPinned(summary) {
163
+ let out = summary;
164
+ for (;;) {
165
+ const open = out.indexOf(PIN_OPEN);
166
+ if (open < 0)
167
+ return out.trimEnd();
168
+ const close = out.indexOf(PIN_CLOSE, open);
169
+ if (close < 0)
170
+ return out.slice(0, open).trimEnd();
171
+ out = out.slice(0, open).trimEnd() + out.slice(close + PIN_CLOSE.length);
172
+ }
173
+ }
174
+ /** Load `compact` from the installed (= pinned) pi package, resolved inside
175
+ * the pi process, so it lands on the running instance
176
+ * (tests/pi-resolution.test.ts). VERIFY-ON-PIN: pi 1.0.0 `dist/index.js` exports `compact`
177
+ * (re-exported from `dist/core/compaction/index.js`). Undefined when the
178
+ * import fails or the export is missing. */
179
+ export async function loadPiCompact() {
180
+ try {
181
+ const pkg = (await import("@earendil-works/pi-coding-agent"));
182
+ return typeof pkg.compact === "function" ? pkg.compact : undefined;
183
+ }
184
+ catch {
185
+ return undefined;
186
+ }
187
+ }
188
+ function isPreparation(value) {
189
+ if (!value || typeof value !== "object")
190
+ return false;
191
+ const p = value;
192
+ return typeof p.firstKeptEntryId === "string" && typeof p.tokensBefore === "number";
193
+ }
194
+ /**
195
+ * The pinned compaction: pi's own default summary with the pinned block
196
+ * appended. It mirrors pi 1.0.0's `AgentSession._runDefaultCompaction`
197
+ * (dist/core/agent-session.js): resolve request auth for the session model,
198
+ * then `compact(preparation, model, apiKey, headers, customInstructions,
199
+ * signal, thinkingLevel, streamFn, env)`. The stream function is the model
200
+ * registry's `streamSimple`, which is what pi's own agent streamFn delegates
201
+ * to (dist/core/sdk.js, `modelRuntime.streamSimple`; ModelRegistry.streamSimple
202
+ * is that same runtime call). Returns undefined on ANY failure, so pi falls
203
+ * back to its default compaction rather than cancelling one.
204
+ * VERIFY-ON-PIN, whole function: every name here is from pi 1.0.0's dist and
205
+ * has not yet run in a live session.
206
+ */
207
+ export async function pinnedCompaction(event, ctx, pinned, compactFn, log = () => { }) {
208
+ const fail = (why) => {
209
+ log(`[ledger-pin] pinned compaction unavailable (${why}); pi runs its default compaction and the ledger returns with the next round order`);
210
+ return undefined;
211
+ };
212
+ if (!compactFn)
213
+ return fail("pi's compact() is not exported by the installed package");
214
+ const preparation = event.preparation;
215
+ if (!isPreparation(preparation))
216
+ return fail("event.preparation has no firstKeptEntryId/tokensBefore");
217
+ const registry = ctx?.modelRegistry;
218
+ const model = ctx?.model;
219
+ if (!registry || typeof registry.getApiKeyAndHeaders !== "function")
220
+ return fail("no model registry");
221
+ if (!model || typeof model !== "object")
222
+ return fail("no session model");
223
+ try {
224
+ const auth = await registry.getApiKeyAndHeaders(model);
225
+ if (!auth.ok)
226
+ return fail(`auth: ${auth.error}`);
227
+ const requestModel = auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model;
228
+ const forSummary = typeof preparation.previousSummary === "string"
229
+ ? { ...preparation, previousSummary: stripPinned(preparation.previousSummary) }
230
+ : preparation;
231
+ const custom = typeof event.customInstructions === "string" ? event.customInstructions : undefined;
232
+ const signal = event.signal instanceof AbortSignal ? event.signal : undefined;
233
+ const result = await compactFn(forSummary, requestModel, auth.apiKey,
234
+ // ProviderHeaders allows null values (a header to drop); compact() types
235
+ // them as strings, and pi hands its own summariser the same object.
236
+ auth.headers, custom, signal, ctx?.thinkingLevel, (m, c, o) => registry.streamSimple(m, c, o), auth.env);
237
+ if (!result ||
238
+ typeof result.summary !== "string" ||
239
+ typeof result.firstKeptEntryId !== "string" ||
240
+ typeof result.tokensBefore !== "number")
241
+ return fail("compact() returned no usable result");
242
+ return {
243
+ compaction: {
244
+ ...result,
245
+ summary: `${stripPinned(result.summary)}\n\n${pinned}`,
246
+ },
247
+ };
248
+ }
249
+ catch (err) {
250
+ return fail(`summariser threw: ${err instanceof Error ? err.message : String(err)}`);
251
+ }
252
+ }
253
+ /** The custom entry type ledger-pin writes into the session file. */
254
+ export const LEDGER_ENTRY_TYPE = "qcr-review-ledger";
255
+ /** The config the env describes (QCR_SESSION_NAME, QCR_PR_META, QCR_PR, and
256
+ * the snapshot path from ledgerSnapshotPath, `cwd` standing in for an absent
257
+ * sandbox root). */
258
+ export function ledgerPinConfigFromEnv(env, cwd, deps = {}) {
259
+ const session = env.QCR_SESSION_NAME?.trim() || "session";
260
+ return {
261
+ prMeta: env.QCR_PR_META?.trim() ?? "",
262
+ ownPr: parseOwnPr(env.QCR_PR),
263
+ snapshotPath: ledgerSnapshotPath(env, session, cwd),
264
+ ...deps,
265
+ };
266
+ }
267
+ /** The factory an SDK session loads. Its env shim is extensions/cli/ledger-pin.ts. */
268
+ export function createLedgerPin(config) {
269
+ return (pi) => {
270
+ registerLedgerPin(pi, config);
271
+ };
272
+ }
273
+ function registerLedgerPin(pi, config) {
274
+ const loadCompact = config.loadCompact ?? loadPiCompact;
275
+ const log = config.log ?? (() => { });
276
+ const { prMeta: meta, ownPr, snapshotPath } = config;
277
+ let lastLedger = "";
278
+ let persistedLedger = "";
279
+ const capture = (source) => {
280
+ const onIgnore = (pr) => {
281
+ const who = ownPr === undefined ? "session has no QCR_PR" : `own PR is #${ownPr}`;
282
+ log(`[ledger-pin] debug: ignoring LEDGER PR #${pr} (${who})`);
283
+ };
284
+ const ledger = extractLedger(collectText(source), ownPr, onIgnore) ?? lastLedger;
285
+ if (ledger)
286
+ lastLedger = ledger;
287
+ if (ledger && ledger !== persistedLedger) {
288
+ try {
289
+ writeSnapshot(snapshotPath, ledger);
290
+ persistedLedger = ledger;
291
+ }
292
+ catch (err) {
293
+ log(`[ledger-pin] snapshot write failed: ${String(err)}`);
294
+ }
295
+ }
296
+ return ledger;
297
+ };
298
+ // VERIFY-ON-PIN: "turn_end". pi 1.0.0 `TurnEndEvent` (dist/core/extensions/
299
+ // types.d.ts) carries the turn's `message` and `toolResults`; the walk stays
300
+ // shape-agnostic.
301
+ pi.on("turn_end", (event) => {
302
+ capture(event);
303
+ });
304
+ // VERIFY-ON-PIN: pi 1.0.0 `SessionBeforeCompactEvent` (dist/core/extensions/
305
+ // types.d.ts) is { preparation, branchEntries, customInstructions?, reason,
306
+ // willRetry, signal }. The handler gets (event, ctx: ExtensionContext) and
307
+ // may return `SessionBeforeCompactResult` = { cancel?, compaction? }, the
308
+ // only two keys `dist/core/agent-session.js` reads (both `compact()` and
309
+ // `_runAutoCompaction()`). The ledger is looked for in `branchEntries`
310
+ // (oldest first, so the newest own block wins), falling back to the whole
311
+ // event if that field is ever missing.
312
+ pi.on("session_before_compact", async (event, ctx) => {
313
+ const ledger = capture(Array.isArray(event.branchEntries) ? event.branchEntries : event);
314
+ if (!ledger)
315
+ return;
316
+ // Persist it into the session file too, so archival never depends on the
317
+ // summariser. VERIFY-ON-PIN: pi 1.0.0 `ExtensionAPI.appendEntry<T>(
318
+ // customType: string, data?: T): void` (dist/core/extensions/types.d.ts),
319
+ // implemented in dist/core/agent-session.js as
320
+ // `sessionManager.appendCustomEntry(customType, data)`: a `custom` entry,
321
+ // never sent to the model.
322
+ try {
323
+ pi.appendEntry?.(LEDGER_ENTRY_TYPE, { pr: ownPr, ledger, meta });
324
+ }
325
+ catch (err) {
326
+ log(`[ledger-pin] appendEntry failed: ${String(err)}`);
327
+ }
328
+ return pinnedCompaction(event, ctx, pinnedBlock(meta, ledger), await loadCompact(), log);
329
+ });
330
+ }
331
+ //# sourceMappingURL=ledger-pin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger-pin.js","sourceRoot":"","sources":["../../extensions/ledger-pin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { ExtensionFactory, ToolDefinition } from "@earendil-works/pi-coding-agent";
2
+ import { type AgentRegistry } from "../src/engine/lens/registry.js";
3
+ import { type LensRunConfig } from "../src/engine/lens/runlens.js";
4
+ import { LENS_TOOL, LENS_WAVE_TOOL, type LensToolDeps } from "../src/engine/lens/tool.js";
5
+ import { LensWave } from "../src/engine/lens/wave.js";
6
+ import { PiHost } from "../src/engine/pisdk.js";
7
+ export { LENS_TOOL, LENS_WAVE_TOOL };
8
+ /** The two tools as pi ToolDefinitions, over `deps`. */
9
+ export declare function lensTools(deps: LensToolDeps): ToolDefinition[];
10
+ /** The factory that registers `lens` and `lens_wave` on a pi. */
11
+ export declare function createLens(deps: LensToolDeps): ExtensionFactory;
12
+ /** The runner of an interactive pi, from its environment. Exported so the shim's
13
+ * wiring can be tested with a host of its own, and so an engine route (the bench)
14
+ * can build its round's runner the same way over agents it keeps elsewhere
15
+ * (`registry`; omitted: the agent dir's own `agents`). */
16
+ export declare function lensRunConfigFromEnv(env: Readonly<Record<string, string | undefined>>, host: PiHost, cwd: string, registry?: AgentRegistry): LensRunConfig;
17
+ /** The interactive pi's lens tools and the board and runner behind them. */
18
+ export interface InteractiveLens {
19
+ /** Registers `lens` and `lens_wave` on a pi. */
20
+ factory: ExtensionFactory;
21
+ /** The runner a pass starts on (builds the host on its first pass). */
22
+ runner: LensToolDeps["runner"];
23
+ /** The rows in flight: what `lens_wave` joins. A round's wave starts on it. */
24
+ wave: LensWave;
25
+ }
26
+ /** The interactive pi's lens tools over `makeHost`, which builds the PiHost on
27
+ * the first pass. Exported so a test can hand it a host of its own, and so the
28
+ * debug round (extensions/debug-round.ts) can start its planned wave on the very
29
+ * board and runner the session's `lens_wave` reads. */
30
+ export declare function interactiveLensBoard(env: Readonly<Record<string, string | undefined>>, cwd: () => string, makeHost: (agentDir: string) => Promise<PiHost>,
31
+ /** Final say on the runner's config (the debug round adds the reviewer stub,
32
+ * the bash env allowlist and the context pack). */
33
+ adjust?: (config: LensRunConfig) => LensRunConfig): InteractiveLens;
34
+ export declare function interactiveLens(env: Readonly<Record<string, string | undefined>>, cwd: () => string, makeHost: (agentDir: string) => Promise<PiHost>,
35
+ /** Where the runner's warnings go (`[lens] …`), one line each: the host's.
36
+ * Omitted: nowhere. */
37
+ warn?: (line: string) => void): ExtensionFactory;
38
+ /** A runner config adjustment that sends its warnings to `warn`, prefixed. */
39
+ export declare function lensWarnTo(warn: ((line: string) => void) | undefined): (config: LensRunConfig) => LensRunConfig;
40
+ /** The host an interactive pi's lens passes run on, from its env. `homeDir` is
41
+ * the user's home the host resolved (the tool fence keeps its `.pi` out). */
42
+ export declare function interactiveHostFor(env: Readonly<Record<string, string | undefined>>, homeDir?: string): (agentDir: string) => Promise<PiHost>;
43
+ //# sourceMappingURL=lens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lens.d.ts","sourceRoot":"","sources":["../../extensions/lens.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAEV,gBAAgB,EAChB,cAAc,EACf,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACrF,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,SAAS,EACT,cAAc,EAEd,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAShD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAErC,wDAAwD;AACxD,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,EAAE,CAE9D;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,CAI/D;AAcD;;;0DAG0D;AAC1D,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,aAAa,GACvB,aAAa,CAqBf;AA6CD,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,uEAAuE;IACvE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/B,+EAA+E;IAC/E,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED;;;uDAGuD;AACvD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,GAAG,EAAE,MAAM,MAAM,EACjB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;AAC/C;mDACmD;AACnD,MAAM,GAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAwB,GAC1D,eAAe,CAIjB;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,GAAG,EAAE,MAAM,MAAM,EACjB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;AAC/C;uBACuB;AACvB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC5B,gBAAgB,CAElB;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CACxB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,GACzC,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,CAE1C;AAED;6EAC6E;AAC7E,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACjD,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAEvC"}
@@ -0,0 +1,150 @@
1
+ // lens — our lens tools (`lens`, `lens_wave`) as a pi extension, the interactive
2
+ // pi's way to run lenses in-process on the SDK.
3
+ //
4
+ // The tools themselves are packages/pi-plugin/src/engine/lens/tool.ts; this file gives them to pi,
5
+ // in the two shapes the hosts want:
6
+ //
7
+ // lensTools(deps) the two ToolDefinitions, for an SDK main session's
8
+ // `customTools` (the engine routes hand them over data,
9
+ // packages/pi-plugin/src/engine/lens/engine-tools.ts)
10
+ // createLens(deps) the factory that registers them on a pi
11
+ // extensions/cli/lens.ts the env shim for an interactive pi (a debug round, the
12
+ // companion): it builds the lens runner on first use
13
+ //
14
+ // The tmux bot does NOT load this file. pi's native `subagent` and the glue's
15
+ // `launch_plan` (extensions/subagents.ts) are retired. A lens session is
16
+ // never given either of these tools (the runner refuses an agent file that
17
+ // lists one, include.ts strips them at build time), so a pass cannot fan out.
18
+ // They ride the session's own extension list, never the global settings.json.
19
+ //
20
+ // The shim's lens sessions are SDK sessions of this pi process. It builds a
21
+ // PiHost over the pi's own agent dir (`PI_CODING_AGENT_DIR`) with a read-only
22
+ // copy of its login, and leaves the HTTP dispatcher to the CLI pi
23
+ // (`ownsProcess` false). The host is built when the first lens is asked for, so
24
+ // a missing login fails that call, never the pi's start-up. This is the one
25
+ // extension that may reach packages/pi-plugin/src/engine/pisdk.ts (tests/helpers/engine-fences.ts).
26
+ //
27
+ // VERIFY-ON-PIN: defineTool's and registerTool's definition shape, as in
28
+ // finding-clusters.ts.
29
+ import { dirname, isAbsolute, join } from "node:path";
30
+ import { defineTool } from "@earendil-works/pi-coding-agent";
31
+ import { agentDirSettings } from "../src/engine/agentdir.js";
32
+ import { applyEnvApiKeys, engineCredentials } from "../src/engine/auth.js";
33
+ import { LENS_LEDGER_FILE, LENS_SESSIONS_DIR } from "../src/engine/openable.js";
34
+ import { resolvePassDeadlineMs } from "../src/engine/lens/deadline.js";
35
+ import { loadBuiltAgents } from "../src/engine/lens/registry.js";
36
+ import { createLensRunner, } from "../src/engine/lens/runlens.js";
37
+ import { LENS_TOOL, LENS_WAVE_TOOL, lensToolDefinitions, } from "../src/engine/lens/tool.js";
38
+ import { LensWave } from "../src/engine/lens/wave.js";
39
+ import { PiHost } from "../src/engine/pisdk.js";
40
+ import { bashGuardConfigFromEnv, createBashGuard } from "./bash-guard.js";
41
+ import { toPiTool } from "./pi-tool.js";
42
+ import { resolveCacheGroup, resolveCacheStagger, resolveMaxConcurrency, } from "../src/engine/lens/env.js";
43
+ export { LENS_TOOL, LENS_WAVE_TOOL };
44
+ /** The two tools as pi ToolDefinitions, over `deps`. */
45
+ export function lensTools(deps) {
46
+ return lensToolDefinitions(deps).map((t) => defineTool(toPiTool(t)));
47
+ }
48
+ /** The factory that registers `lens` and `lens_wave` on a pi. */
49
+ export function createLens(deps) {
50
+ return (pi) => {
51
+ for (const tool of lensTools(deps))
52
+ pi.registerTool(tool);
53
+ };
54
+ }
55
+ /** How long a lens session has before its login must not expire: the
56
+ * longest a round runs. */
57
+ const LOGIN_WINDOW_MS = 90 * 60_000;
58
+ /** The agent dir an interactive pi runs over; anything but an absolute path is refused. */
59
+ function requireAgentDir(env) {
60
+ const agentDir = env["PI_CODING_AGENT_DIR"];
61
+ if (agentDir === undefined || !isAbsolute(agentDir))
62
+ throw new Error(`lens: PI_CODING_AGENT_DIR is not an absolute path (${String(agentDir)})`);
63
+ return agentDir;
64
+ }
65
+ /** The runner of an interactive pi, from its environment. Exported so the shim's
66
+ * wiring can be tested with a host of its own, and so an engine route (the bench)
67
+ * can build its round's runner the same way over agents it keeps elsewhere
68
+ * (`registry`; omitted: the agent dir's own `agents`). */
69
+ export function lensRunConfigFromEnv(env, host, cwd, registry) {
70
+ const agentDir = requireAgentDir(env);
71
+ const ledger = env["QCR_LEDGER_FILE"];
72
+ const group = resolveCacheGroup({ ...env });
73
+ const deadlineMs = resolvePassDeadlineMs({ ...env });
74
+ return {
75
+ host,
76
+ permits: resolveMaxConcurrency({ ...env }),
77
+ registry: registry ?? loadBuiltAgents(join(agentDir, "agents")),
78
+ cwd,
79
+ env,
80
+ bashGuard: createBashGuard(bashGuardConfigFromEnv(env, cwd)),
81
+ ledgerPath: join(ledger ? dirname(ledger) : agentDir, LENS_LEDGER_FILE),
82
+ // A round's lens sessions are kept beside its ledger; an interactive pi
83
+ // with no round keeps none, and never writes into its own agent dir.
84
+ ...(ledger ? { sessionsDir: join(dirname(ledger), LENS_SESSIONS_DIR) } : {}),
85
+ ...(deadlineMs !== undefined ? { deadlineMs } : {}),
86
+ // The round's context pack belongs to a wave the engine launches; an
87
+ // interactive pi's groups are warmed by the stagger.
88
+ ...(group > 0 ? { cache: { size: group, staggerMs: resolveCacheStagger({ ...env }) } } : {}),
89
+ };
90
+ }
91
+ /** The shim's runner: the host and the runner are built by the first pass. */
92
+ function lazyRunner(env, cwd, makeHost, adjust) {
93
+ let built;
94
+ const ensure = () => {
95
+ built ??= (async () => {
96
+ const agentDir = requireAgentDir(env);
97
+ const host = await makeHost(agentDir);
98
+ return createLensRunner(adjust(lensRunConfigFromEnv(env, host, cwd())));
99
+ })();
100
+ // A host that failed to build is not kept: the next ask tries again.
101
+ built.catch(() => {
102
+ built = undefined;
103
+ });
104
+ return built;
105
+ };
106
+ return { run: async (request) => (await ensure()).run(request) };
107
+ }
108
+ /** A PiHost over the interactive pi's own agent dir: a read-only copy of its
109
+ * login, pi's dispatcher left alone. */
110
+ async function interactiveHost(agentDir, env, homeDir) {
111
+ const auth = engineCredentials({ srcDir: agentDir, needMs: LOGIN_WINDOW_MS });
112
+ return PiHost.create({
113
+ agentDir,
114
+ ownsProcess: false,
115
+ ...(homeDir !== undefined ? { homeDir } : {}),
116
+ credentials: auth.credentials,
117
+ settings: agentDirSettings(agentDir),
118
+ configureModels: async (runtime) => {
119
+ await applyEnvApiKeys(runtime, env);
120
+ },
121
+ });
122
+ }
123
+ /** The interactive pi's lens tools over `makeHost`, which builds the PiHost on
124
+ * the first pass. Exported so a test can hand it a host of its own, and so the
125
+ * debug round (extensions/debug-round.ts) can start its planned wave on the very
126
+ * board and runner the session's `lens_wave` reads. */
127
+ export function interactiveLensBoard(env, cwd, makeHost,
128
+ /** Final say on the runner's config (the debug round adds the reviewer stub,
129
+ * the bash env allowlist and the context pack). */
130
+ adjust = (c) => c) {
131
+ const runner = lazyRunner(env, cwd, makeHost, adjust);
132
+ const wave = new LensWave();
133
+ return { factory: createLens({ runner, wave, env, cwd }), runner, wave };
134
+ }
135
+ export function interactiveLens(env, cwd, makeHost,
136
+ /** Where the runner's warnings go (`[lens] …`), one line each: the host's.
137
+ * Omitted: nowhere. */
138
+ warn) {
139
+ return interactiveLensBoard(env, cwd, makeHost, lensWarnTo(warn)).factory;
140
+ }
141
+ /** A runner config adjustment that sends its warnings to `warn`, prefixed. */
142
+ export function lensWarnTo(warn) {
143
+ return (c) => (warn ? { ...c, warn: (m) => warn(`[lens] ${m}`) } : c);
144
+ }
145
+ /** The host an interactive pi's lens passes run on, from its env. `homeDir` is
146
+ * the user's home the host resolved (the tool fence keeps its `.pi` out). */
147
+ export function interactiveHostFor(env, homeDir) {
148
+ return (dir) => interactiveHost(dir, env, homeDir);
149
+ }
150
+ //# sourceMappingURL=lens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lens.js","sourceRoot":"","sources":["../../extensions/lens.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,gDAAgD;AAChD,EAAE;AACF,mGAAmG;AACnG,oCAAoC;AACpC,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,2EAA2E;AAC3E,+DAA+D;AAC/D,mFAAmF;AACnF,0EAA0E;AAC1E,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,kEAAkE;AAClE,gFAAgF;AAChF,4EAA4E;AAC5E,oGAAoG;AACpG,EAAE;AACF,yEAAyE;AACzE,uBAAuB;AACvB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAM7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAsB,MAAM,gCAAgC,CAAC;AACrF,OAAO,EACL,gBAAgB,GAGjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,SAAS,EACT,cAAc,EACd,mBAAmB,GAEpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAErC,wDAAwD;AACxD,MAAM,UAAU,SAAS,CAAC,IAAkB;IAC1C,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,UAAU,CAAC,IAAkB;IAC3C,OAAO,CAAC,EAAgB,EAAQ,EAAE;QAChC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC;AACJ,CAAC;AAED;2BAC2B;AAC3B,MAAM,eAAe,GAAG,EAAE,GAAG,MAAM,CAAC;AAEpC,2FAA2F;AAC3F,SAAS,eAAe,CAAC,GAAiD;IACxE,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,sDAAsD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;0DAG0D;AAC1D,MAAM,UAAU,oBAAoB,CAClC,GAAiD,EACjD,IAAY,EACZ,GAAW,EACX,QAAwB;IAExB,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACrD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,qBAAqB,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1C,QAAQ,EAAE,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/D,GAAG;QACH,GAAG;QACH,SAAS,EAAE,eAAe,CAAC,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5D,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,qEAAqE;QACrE,qDAAqD;QACrD,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7F,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,SAAS,UAAU,CACjB,GAAiD,EACjD,GAAiB,EACjB,QAA+C,EAC/C,MAAgD;IAEhD,IAAI,KAAsC,CAAC;IAC3C,MAAM,MAAM,GAAG,GAAwB,EAAE;QACvC,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE;YACpB,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACtC,OAAO,gBAAgB,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,EAAE,CAAC;QACL,qEAAqE;QACrE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACf,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AACnE,CAAC;AAED;wCACwC;AACxC,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,GAAiD,EACjD,OAA2B;IAE3B,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ;QACR,WAAW,EAAE,KAAK;QAClB,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC;QACpC,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACjC,MAAM,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAYD;;;uDAGuD;AACvD,MAAM,UAAU,oBAAoB,CAClC,GAAiD,EACjD,GAAiB,EACjB,QAA+C;AAC/C;mDACmD;AACnD,SAAmD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAiD,EACjD,GAAiB,EACjB,QAA+C;AAC/C;uBACuB;AACvB,IAA6B;IAE7B,OAAO,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5E,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CACxB,IAA0C;IAE1C,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;6EAC6E;AAC7E,MAAM,UAAU,kBAAkB,CAChC,GAAiD,EACjD,OAAgB;IAEhB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { AgentToolResult, ExtensionAPI, ExtensionToolContext, ToolDefinition } from "@earendil-works/pi-coding-agent";
2
+ /** What a tool hands back to the model: text only, which is all ours emit. */
3
+ export type QcrToolResult = Omit<AgentToolResult<Record<string, unknown> | undefined>, "content"> & {
4
+ content: Array<{
5
+ type: "text";
6
+ text: string;
7
+ }>;
8
+ };
9
+ export type QcrTool = Omit<ToolDefinition, "execute"> & {
10
+ execute(id: string, params: Record<string, unknown>, signal?: AbortSignal, onUpdate?: unknown, ctx?: ExtensionToolContext): QcrToolResult | Promise<QcrToolResult>;
11
+ };
12
+ /** A text-only tool result; `details` rides along only when given. */
13
+ export declare function textResult(text: string, details?: Record<string, unknown>): QcrToolResult;
14
+ /** A refused setup call as the tool result: what was asked, then one line per error. */
15
+ export declare function refusedResult(what: string, r: {
16
+ errors: readonly string[];
17
+ }): QcrToolResult;
18
+ /** `tool` as pi's contract has it: a synchronous `execute` awaited into the
19
+ * Promise pi asks for. */
20
+ export declare function toPiTool(tool: QcrTool): ToolDefinition;
21
+ export declare function registerQcrTool(pi: ExtensionAPI, tool: QcrTool): void;
22
+ //# sourceMappingURL=pi-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tool.d.ts","sourceRoot":"","sources":["../../extensions/pi-tool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACf,MAAM,iCAAiC,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,EACpD,SAAS,CACV,GAAG;IACF,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG;IACtD,OAAO,CACL,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,oBAAoB,GACzB,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC3C,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAEzF;AAED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG,aAAa,CAE3F;AAED;0BAC0B;AAC1B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAMtD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAErE"}
@@ -0,0 +1,20 @@
1
+ /** A text-only tool result; `details` rides along only when given. */
2
+ export function textResult(text, details) {
3
+ return { content: [{ type: "text", text }], details };
4
+ }
5
+ /** A refused setup call as the tool result: what was asked, then one line per error. */
6
+ export function refusedResult(what, r) {
7
+ return textResult(`${what} refused:\n${r.errors.map((e) => `✗ ${e}`).join("\n")}`);
8
+ }
9
+ /** `tool` as pi's contract has it: a synchronous `execute` awaited into the
10
+ * Promise pi asks for. */
11
+ export function toPiTool(tool) {
12
+ return {
13
+ ...tool,
14
+ execute: async (id, params, signal, onUpdate, ctx) => tool.execute(id, params, signal, onUpdate, ctx),
15
+ };
16
+ }
17
+ export function registerQcrTool(pi, tool) {
18
+ pi.registerTool(toPiTool(tool));
19
+ }
20
+ //# sourceMappingURL=pi-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tool.js","sourceRoot":"","sources":["../../extensions/pi-tool.ts"],"names":[],"mappings":"AA8BA,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAiC;IACxE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,CAAgC;IAC1E,OAAO,UAAU,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED;0BAC0B;AAC1B,MAAM,UAAU,QAAQ,CAAC,IAAa;IACpC,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CACnD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAiC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAgB,EAAE,IAAa;IAC7D,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import type { Runner } from "../src/plugin/session.js";
3
+ /** What the host entry hands the plugin. */
4
+ export interface QuickReviewConfig {
5
+ /** The process environment, read once by the host entry. */
6
+ env: NodeJS.ProcessEnv;
7
+ /** The user's home. */
8
+ home: string;
9
+ runner: Runner;
10
+ /** Standard output (pi's print mode shows a command's result there). */
11
+ print: (text: string) => void;
12
+ /** Test seams: the running pi's version, its agent dir, the range. */
13
+ piVersion?: string;
14
+ agentDir?: string;
15
+ range?: string;
16
+ }
17
+ /** The commands, in the order /qcr-setup names them. */
18
+ export declare const QUICKREVIEW_COMMANDS: readonly ["review", "scan", "qcr-setup", "selfimprove"];
19
+ /** The plugin's extension factory over `config`. */
20
+ export declare function createQuickReview(config: QuickReviewConfig): (pi: ExtensionAPI) => void;
21
+ //# sourceMappingURL=quickreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickreview.d.ts","sourceRoot":"","sources":["../../extensions/quickreview.ts"],"names":[],"mappings":"AAYA,OAAO,EAGL,KAAK,YAAY,EAElB,MAAM,iCAAiC,CAAC;AAOzC,OAAO,KAAK,EAAc,MAAM,EAAa,MAAM,0BAA0B,CAAC;AAI9E,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,yDAA0D,CAAC;AAoE5F,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAuEvF"}