@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,373 @@
1
+ // Django migration-number collision pre-check. Pure functions: the
2
+ // caller supplies the PR's changed files and the migration paths that exist on
3
+ // the base branch at the round's `base_sha`; this module decides whether the PR
4
+ // occupies a number the base already took, and writes the remedy.
5
+ //
6
+ // Why it lives daemon-side rather than in a lens: a leaf-node collision with
7
+ // the base branch is deterministic, machine-checkable without an LLM, has
8
+ // exactly one remedy (renumber + repoint `dependencies`) and carries no design
9
+ // content. Raised as a blocker it would consume the merge gate and cost the
10
+ // author a full re-review round for a mechanical rename. Nothing
11
+ // else in the pipeline catches it (GitHub reports MERGEABLE because the
12
+ // filenames differ, and CI is green), so the check does not get quieter here:
13
+ // it runs every round, deterministically, and is delivered as a COMMENT.
14
+ //
15
+ // This is not a trivial-delta classifier (src/recheck.ts owns that) —
16
+ // detection and comment text only.
17
+ import { codePath, flatControls } from "./codespan.js";
18
+ const MIGRATION_PATH = /^(?:(.*)\/)?migrations\/(\d{2,})_([^/]+)\.py$/;
19
+ /** Parse `…/<app>/migrations/NNNN_name.py`; undefined for anything else
20
+ * (including `__init__.py`, which carries no number). */
21
+ export function parseMigrationPath(path) {
22
+ const m = MIGRATION_PATH.exec(path);
23
+ if (!m)
24
+ return undefined;
25
+ const app = m[1] ?? "";
26
+ const digits = m[2];
27
+ return {
28
+ path,
29
+ app,
30
+ app_label: app.split("/").filter(Boolean).pop() ?? "",
31
+ number: Number(digits),
32
+ digits,
33
+ name: m[3],
34
+ };
35
+ }
36
+ function migrationName(ref) {
37
+ return `${ref.digits}_${ref.name}`;
38
+ }
39
+ export function dependencyTuple(label, name) {
40
+ return `(${label ? JSON.stringify(label) : "<existing app label>"}, ${JSON.stringify(name)})`;
41
+ }
42
+ /** Re-number a ref onto `n`, keeping the on-disk zero-padding width. */
43
+ function renamedTo(ref, n) {
44
+ const digits = String(n).padStart(ref.digits.length, "0");
45
+ const name = `${digits}_${ref.name}`;
46
+ return { name, path: `${ref.app ? `${ref.app}/` : ""}migrations/${name}.py` };
47
+ }
48
+ function escapeRe(s) {
49
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
50
+ }
51
+ /** Whitespace inside a tuple, where a line break in a unified diff carries
52
+ * the next line's `+` prefix. */
53
+ const DIFF_GAP = "(?:[^\\S\\n]|\\n\\+?)*";
54
+ /** The patch as the file reads after the change: its removed lines dropped,
55
+ * so a dependency the PR deletes is never read as one it still holds. */
56
+ function postChange(patch) {
57
+ return patch
58
+ .split("\n")
59
+ .filter((l) => !l.startsWith("-"))
60
+ .join("\n");
61
+ }
62
+ /** Does this file's diff name `(app_label, name)` as a `dependencies` tuple?
63
+ * A cross-app reference must carry the label — a bare `"0001_initial"` in
64
+ * another app is that app's own migration. The tuple may be split across
65
+ * added diff lines and carry a trailing comma. */
66
+ function referencesAppMigration(patch, appLabel, name) {
67
+ if (!patch || !name || !appLabel)
68
+ return false;
69
+ const g = DIFF_GAP;
70
+ return new RegExp(`\\(${g}["']${escapeRe(appLabel)}["']${g},${g}["']${escapeRe(name)}["']${g}(?:,${g})?\\)`).test(postChange(patch));
71
+ }
72
+ /** Same-app follow-up match. A same-app dependency is an `(app_label, name)`
73
+ * tuple, but the label is inferred from the directory and Django's label can
74
+ * differ, and a tuple split across diff lines carries a `+` between its halves
75
+ * — so a bare quoted `name` still counts (the check must never get quieter
76
+ * than a name-only match), except an occurrence that is the second
77
+ * half of a tuple naming another app this PR or the base branch holds: that
78
+ * one is that app's identically named migration. */
79
+ function ownDependencyLabel(patch, ownLabel, name, knownLabels) {
80
+ if (!patch || !name)
81
+ return null;
82
+ if (referencesAppMigration(patch, ownLabel, name))
83
+ return ownLabel;
84
+ const post = postChange(patch);
85
+ const re = new RegExp(`["']${escapeRe(name)}["']`, "g");
86
+ // The tuple's first half, which may sit on an earlier added line.
87
+ const tupleHead = new RegExp(`\\(${DIFF_GAP}["']([^"'\\n]*)["']${DIFF_GAP},${DIFF_GAP}$`);
88
+ for (let m = re.exec(post); m !== null; m = re.exec(post)) {
89
+ const head = tupleHead.exec(post.slice(Math.max(0, m.index - 200), m.index));
90
+ if (head && head[1] !== ownLabel && knownLabels.has(head[1]))
91
+ continue;
92
+ return head?.[1] ?? ownLabel;
93
+ }
94
+ return null;
95
+ }
96
+ /**
97
+ * Migration numbers this PR claims that the base branch already occupies.
98
+ *
99
+ * A collision is "same app, same number, different file" — a PR file that
100
+ * merely edits a migration already on the base (same path) is not one. Deleted
101
+ * PR files are ignored. Collisions are returned in path order per app, and the
102
+ * assigned target numbers form a chain: the first renumbered migration in an
103
+ * app depends on the base branch's leaf, each later one on its predecessor.
104
+ */
105
+ export function detectMigrationCollisions(input) {
106
+ const baseByApp = new Map();
107
+ // Every base migration path. Django names a migration by app + full name, so
108
+ // a merged graph can legitimately hold 0042_a and 0042_b; a PR editing
109
+ // either one edits an existing file and collides with nothing.
110
+ const basePaths = new Set();
111
+ for (const path of input.baseFiles) {
112
+ const ref = parseMigrationPath(path);
113
+ if (!ref)
114
+ continue;
115
+ basePaths.add(ref.path);
116
+ const byNumber = baseByApp.get(ref.app) ?? new Map();
117
+ // Two base migrations on one number (branched history + a merge
118
+ // migration): the higher path is the occupant a new file is told about.
119
+ const prev = byNumber.get(ref.number);
120
+ if (!prev || prev.path < ref.path)
121
+ byNumber.set(ref.number, ref);
122
+ baseByApp.set(ref.app, byNumber);
123
+ }
124
+ const prByApp = new Map();
125
+ for (const f of input.files) {
126
+ if (f.status === "removed")
127
+ continue;
128
+ const ref = parseMigrationPath(f.filename);
129
+ if (!ref)
130
+ continue;
131
+ prByApp.set(ref.app, [
132
+ ...(prByApp.get(ref.app) ?? []),
133
+ { ref, ...(f.patch !== undefined ? { patch: f.patch } : {}) },
134
+ ]);
135
+ }
136
+ // The one deterministic order both passes walk: apps by name, each app's
137
+ // migrations by number then path (the remedy's order, and its fingerprint's).
138
+ const orderedByApp = [...prByApp]
139
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
140
+ .map(([app, entries]) => [
141
+ app,
142
+ [...entries].sort((a, b) => a.ref.number - b.ref.number || (a.ref.path < b.ref.path ? -1 : 1)),
143
+ ]);
144
+ // Every app label either side holds — what tells a same-app bare-name match
145
+ // apart from another app's identically named migration.
146
+ const knownLabels = new Set();
147
+ for (const path of basePaths)
148
+ knownLabels.add(parseMigrationPath(path).app_label);
149
+ for (const entries of prByApp.values())
150
+ for (const { ref } of entries)
151
+ knownLabels.add(ref.app_label);
152
+ knownLabels.delete("");
153
+ // Infer custom labels only from tuples naming migrations this app owns.
154
+ // Multiple incompatible labels remain unresolved rather than choosing one.
155
+ const labelsByApp = new Map();
156
+ for (const [app, ordered] of orderedByApp) {
157
+ const ownNames = new Set([
158
+ ...[...(baseByApp.get(app)?.values() ?? [])].map(migrationName),
159
+ ...ordered.map(({ ref }) => migrationName(ref)),
160
+ ]);
161
+ const labels = new Set();
162
+ for (const { ref, patch } of ordered)
163
+ for (const name of ownNames) {
164
+ const label = ownDependencyLabel(patch, ref.app_label, name, knownLabels);
165
+ if (label !== null && label !== ref.app_label)
166
+ labels.add(label);
167
+ }
168
+ labelsByApp.set(app, labels.size === 1 ? [...labels][0] : ordered[0].ref.app_label);
169
+ }
170
+ const out = [];
171
+ // Every rename the remedy prescribes, per app, for the cross-app follow-up
172
+ // pass below.
173
+ const renamedByApp = new Map();
174
+ for (const [app, ordered] of orderedByApp) {
175
+ const base = baseByApp.get(app) ?? new Map();
176
+ const colliding = ordered.filter(({ ref: r }) => {
177
+ const occupant = base.get(r.number);
178
+ return occupant !== undefined && !basePaths.has(r.path);
179
+ });
180
+ if (colliding.length === 0)
181
+ continue;
182
+ // Free numbers start above everything either side already uses, so the
183
+ // remedy never collides with a sibling migration in the same PR.
184
+ const used = [...base.keys(), ...ordered.map(({ ref: r }) => r.number)];
185
+ let next = Math.max(...used) + 1;
186
+ // The chain root is the base branch's leaf — the highest number the base
187
+ // holds for this app, which is what the renumbered migration must depend on.
188
+ const baseLeaf = [...base.values()].sort((a, b) => a.number - b.number).pop();
189
+ let dependencyName = baseLeaf ? migrationName(baseLeaf) : "";
190
+ const renamed = new Map();
191
+ const collidingPaths = new Set(colliding.map(({ ref }) => ref.path));
192
+ // Include every follow-up before allocating numbers, then process parents
193
+ // before dependants. Numbers usually follow dependency order, but Django
194
+ // permits a lower-numbered migration to depend on a later-numbered one.
195
+ const affected = new Set(colliding.map(({ ref }) => migrationName(ref)));
196
+ let grew = true;
197
+ while (grew) {
198
+ grew = false;
199
+ for (const { ref, patch } of ordered) {
200
+ const name = migrationName(ref);
201
+ if (affected.has(name))
202
+ continue;
203
+ if ([...affected].some((old) => ownDependencyLabel(patch, ref.app_label, old, knownLabels) !== null)) {
204
+ affected.add(name);
205
+ grew = true;
206
+ }
207
+ }
208
+ }
209
+ const remaining = ordered.filter(({ ref }) => affected.has(migrationName(ref)));
210
+ const remedyOrder = [];
211
+ while (remaining.length > 0) {
212
+ const index = remaining.findIndex(({ ref, patch }) => remaining.every(({ ref: other }) => other.path === ref.path ||
213
+ ownDependencyLabel(patch, ref.app_label, migrationName(other), knownLabels) === null));
214
+ // An already-cyclic input has no dependency order; keep its stable path
215
+ // order rather than letting advice generation hang.
216
+ remedyOrder.push(remaining.splice(index < 0 ? 0 : index, 1)[0]);
217
+ }
218
+ for (const { ref, patch } of remedyOrder) {
219
+ const stales = [...renamed.keys()].flatMap((old) => {
220
+ const label = ownDependencyLabel(patch, ref.app_label, old, knownLabels);
221
+ return label === null ? [] : [{ old, label, dep: renamed.get(old) }];
222
+ });
223
+ const collides = collidingPaths.has(ref.path);
224
+ if (!collides && stales.length === 0)
225
+ continue;
226
+ const mustRenumber = collides || stales.some(({ dep }) => ref.number <= dep.number);
227
+ const targetNumber = mustRenumber ? next++ : ref.number;
228
+ const target = mustRenumber
229
+ ? renamedTo(ref, targetNumber)
230
+ : { name: migrationName(ref), path: ref.path };
231
+ if (collides) {
232
+ const label = stales[0]?.label ?? labelsByApp.get(app) ?? ref.app_label;
233
+ out.push({
234
+ app,
235
+ app_label: ref.app_label,
236
+ pr_path: ref.path,
237
+ number: ref.number,
238
+ base_path: base.get(ref.number).path,
239
+ target_number: targetNumber,
240
+ target_path: target.path,
241
+ dependency_name: dependencyName,
242
+ dependency: dependencyTuple(label, dependencyName),
243
+ ...(label !== ref.app_label ? { dependency_app_label: label } : {}),
244
+ kind: "base-collision",
245
+ });
246
+ }
247
+ // A colliding file still owns every original dependency edge. Adding
248
+ // the collision chain edge must not replace its branch dependencies.
249
+ stales.forEach(({ old, label, dep }, i) => {
250
+ out.push({
251
+ app,
252
+ app_label: ref.app_label,
253
+ pr_path: ref.path,
254
+ number: ref.number,
255
+ base_path: "",
256
+ target_number: targetNumber,
257
+ target_path: target.path,
258
+ dependency_name: dep.name,
259
+ dependency: dependencyTuple(label, dep.name),
260
+ dependency_app_label: label,
261
+ kind: "renamed-dependency",
262
+ stale_dependency: old,
263
+ renumber: !collides && mustRenumber && i === 0,
264
+ });
265
+ });
266
+ if (mustRenumber)
267
+ renamed.set(migrationName(ref), { name: target.name, number: targetNumber });
268
+ if (collides)
269
+ dependencyName = target.name;
270
+ }
271
+ renamedByApp.set(app, {
272
+ app_label: labelsByApp.get(app) ?? colliding[0].ref.app_label,
273
+ renamed,
274
+ });
275
+ }
276
+ // Cross-app follow-ups: a PR migration in another app whose `dependencies`
277
+ // name a migration the remedy renames. Numbers are per app, so it never
278
+ // renumbers — only its dependency tuple moves.
279
+ if (renamedByApp.size > 0) {
280
+ for (const [app, ordered] of orderedByApp) {
281
+ // Every PR file, including one the same-app pass already remedied: its
282
+ // own-app entry moving says nothing about a stale tuple naming another
283
+ // app. One entry per stale tuple, across every renamed app.
284
+ for (const { ref, patch } of ordered) {
285
+ for (const [otherApp, { app_label, renamed }] of renamedByApp) {
286
+ if (otherApp === app)
287
+ continue;
288
+ for (const [stale, dep] of renamed) {
289
+ if (!referencesAppMigration(patch, app_label, stale))
290
+ continue;
291
+ out.push({
292
+ app,
293
+ app_label: ref.app_label,
294
+ pr_path: ref.path,
295
+ number: ref.number,
296
+ base_path: "",
297
+ target_number: ref.number,
298
+ target_path: ref.path,
299
+ dependency_name: dep.name,
300
+ dependency: dependencyTuple(app_label, dep.name),
301
+ kind: "renamed-dependency",
302
+ stale_dependency: stale,
303
+ renumber: false,
304
+ dependency_app_label: app_label,
305
+ });
306
+ }
307
+ }
308
+ }
309
+ }
310
+ }
311
+ return out;
312
+ }
313
+ /** The renamed-dependency edit both renderers quote: the stale dependency
314
+ * tuple replaced by the renumbered one. */
315
+ export function renamedDependencyReplacement(c) {
316
+ const stale = c.stale_dependency ?? "";
317
+ return `replace ${codePath(dependencyTuple(c.dependency_app_label ?? c.app_label, stale))} with ${codePath(c.dependency)}`;
318
+ }
319
+ /** A serialization edge is additive: a partial diff cannot enumerate all
320
+ * original parents, and no original edge may be discarded by the remedy. */
321
+ export function collisionDependencyAdvice(c) {
322
+ const unknown = c.dependency_app_label || c.app_label
323
+ ? ""
324
+ : " (use its existing app label; the root path does not establish it)";
325
+ return `in its \`dependencies\`, also include ${codePath(c.dependency)} for the collision chain${unknown} — keep every existing entry, applying the renamed-dependency replacements below where listed`;
326
+ }
327
+ /** Stable identity of a detection result — used to post the comment once per
328
+ * (head sha, collision set) rather than on every round at the same head. */
329
+ export function collisionFingerprint(headSha, collisions) {
330
+ return [headSha, ...collisions.map((c) => `${c.pr_path}→${c.target_path}@${c.dependency}`)].join("|");
331
+ }
332
+ /** The collision comment's heading line; `cliops` recognises the comment by it. */
333
+ export const MIGRATION_COMMENT_HEADING = "### Migration numbering — renumber needed (mechanics, not a blocker)";
334
+ /** The collision comment's closing sentence opener; `cliops` recognises the comment by it. */
335
+ export const MIGRATION_COMMENT_CLOSING = "This is posted as a comment on purpose:";
336
+ /**
337
+ * The comment body. It states the exact target number and the exact
338
+ * `dependencies` value, and says in plain words that this is mechanics — no
339
+ * blocker, no verdict consumed, no re-review round owed. Filename-derived
340
+ * fields are the PR author's and render through `codePath` (see
341
+ * `renderMigrationCollisionsNote`).
342
+ */
343
+ export function renderMigrationCollisionComment(input) {
344
+ const branch = input.base_ref || "the base branch";
345
+ const at = input.base_sha ? ` (\`${input.base_sha.slice(0, 12)}\`)` : "";
346
+ const subject = input.collisions.length === 1
347
+ ? "the migration number this PR claims"
348
+ : "migration numbers this PR claims";
349
+ const lines = [
350
+ MIGRATION_COMMENT_HEADING,
351
+ "",
352
+ `\`${branch}\`${at} already occupies ${subject}. GitHub still reports the PR mergeable ` +
353
+ "(the filenames differ) and CI is green, so nothing else catches this — but the " +
354
+ "migration graph would break on merge.",
355
+ "",
356
+ ];
357
+ for (const c of input.collisions) {
358
+ const targetNumber = String(c.target_number).padStart(4, "0");
359
+ if (c.kind === "renamed-dependency") {
360
+ const stale = c.stale_dependency ?? "";
361
+ lines.push(`- ${codePath(c.pr_path)} — its \`dependencies\` reference ${codePath(`"${stale}"`)}, which the renumber above moves to ${codePath(c.dependency_name)}.`, ` - in its \`dependencies\`, ${renamedDependencyReplacement(c)} — keep every other entry`);
362
+ if (c.renumber)
363
+ lines.push(` - and rename it to ${codePath(c.target_path)} (number **${targetNumber}**) — its current number would sit below its renumbered dependency`);
364
+ continue;
365
+ }
366
+ lines.push(`- ${codePath(c.pr_path)} collides with ${codePath(c.base_path)} on ${flatControls(branch)}.`, ` - rename it to ${codePath(c.target_path)} (number **${targetNumber}**)`, ` - ${collisionDependencyAdvice(c)}`);
367
+ }
368
+ lines.push("", `${MIGRATION_COMMENT_CLOSING} the fix is mechanical, it consumes no ` +
369
+ "review verdict and it does not block the merge gate. Nothing else in this " +
370
+ "round's review depends on it.");
371
+ return lines.join("\n");
372
+ }
373
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /** The OpenAI providers, each the other's twin. */
2
+ export declare const OPENAI_PROVIDERS: readonly string[];
3
+ /** The provider that serves the same models on another OpenAI login, or
4
+ * undefined for a provider outside the family. */
5
+ export declare function twinProvider(provider: string): string | undefined;
6
+ /** A spec taken apart at its first `/`: `provider/rest`, where `rest` is the
7
+ * model id with any `:thinking` suffix left on. Null for a bare id. */
8
+ export declare function splitProvider(spec: string): {
9
+ provider: string;
10
+ rest: string;
11
+ } | null;
12
+ /** The model id of a spec's `rest`: the `:thinking` suffix dropped. */
13
+ export declare function modelIdOf(rest: string): string;
14
+ export interface ProviderProbe {
15
+ /** Does this provider have a usable credential? */
16
+ hasCredential(provider: string): boolean;
17
+ /** Does this provider serve this model id? Omitted: assume it does (the
18
+ * OpenAI twins carry the same catalog). */
19
+ hasModel?(provider: string, modelId: string): boolean;
20
+ }
21
+ /** The provider to run `provider`'s model `modelId` on: `provider` itself when
22
+ * it has a credential (or when nothing better exists), else its OpenAI twin
23
+ * when the twin has one and serves the model. */
24
+ export declare function routeProvider(provider: string, modelId: string, probe: ProviderProbe): string;
25
+ /** A whole spec (`provider/id[:thinking]`) rerouted by `routeProvider`; a spec
26
+ * with no provider prefix is returned as given. */
27
+ export declare function routeModelSpec(spec: string, probe: ProviderProbe): string;
28
+ /** The providers a pi `auth.json` holds a credential for: every entry of type
29
+ * "oauth" or "api_key" (pi's two stored credential shapes; an api_key's `key`
30
+ * may be a literal, an env name or a `!command`, all of which count). An API key
31
+ * in `OPENAI_API_KEY` counts for `openai`, as pi's own env lookup does. Text
32
+ * that does not parse holds nothing. */
33
+ export declare function providersInAuthJson(raw: string | null, env?: Readonly<Record<string, string | undefined>>): Set<string>;
34
+ /** `routeModelSpec` over a login file's text (null: no file) and the env the
35
+ * pi will run with: for a host that starts a CLI pi on a login it holds as a
36
+ * file (a takeover's or a debug round's borrowed copy). */
37
+ export declare function routeModelSpecForLogin(spec: string, authJson: string | null, env?: Readonly<Record<string, string | undefined>>): string;
38
+ //# sourceMappingURL=modelroute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelroute.d.ts","sourceRoot":"","sources":["../../src/modelroute.ts"],"names":[],"mappings":"AAoBA,mDAAmD;AACnD,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA+B,CAAC;AAE9E;kDACkD;AAClD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED;uEACuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIrF;AAED,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC;+CAC2C;IAC3C,QAAQ,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CACvD;AAED;;iDAEiD;AACjD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAM7F;AAED;mDACmD;AACnD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAKzE;AAED;;;;wCAIwC;AACxC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GACrD,GAAG,CAAC,MAAM,CAAC,CAqBb;AAED;;2DAE2D;AAC3D,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GACrD,MAAM,CAGR"}
@@ -0,0 +1,105 @@
1
+ // Which provider a model spec runs on, given the logins that exist.
2
+ //
3
+ // pi offers three OpenAI logins, and they land on two providers:
4
+ // - "OpenAI Codex (legacy)" (an OAuth login) is the provider `openai-codex`;
5
+ // - "Sign in with ChatGPT" (pi 1.4's newer OAuth login) is the provider `openai`;
6
+ // - an OpenAI API key (stored by /login, or OPENAI_API_KEY) is also `openai`.
7
+ // Both providers serve the same model ids (pi-ai's catalogs carry gpt-6.1-sol
8
+ // on each), so one login is as good as the other for a review. The shipped
9
+ // specs name `openai-codex/…`, the route the production install logged in
10
+ // with, and stay that way: this module only reroutes a spec whose named
11
+ // provider has no usable credential while its twin has one. The provider a
12
+ // spec names always wins when its credential exists, so an install that works
13
+ // today runs exactly as before.
14
+ //
15
+ // Pure: the caller says which providers have a credential. The SDK host asks
16
+ // pi's own ModelRuntime (packages/pi-plugin/src/engine/pisdk.ts); a CLI pi is
17
+ // rerouted by its own extension from pi's model registry
18
+ // (extensions/login-route.ts); a host that only has a login FILE (the companion
19
+ // entrypoint's default model) reads it with `providersInAuthJson`.
20
+ /** The OpenAI providers, each the other's twin. */
21
+ export const OPENAI_PROVIDERS = ["openai-codex", "openai"];
22
+ /** The provider that serves the same models on another OpenAI login, or
23
+ * undefined for a provider outside the family. */
24
+ export function twinProvider(provider) {
25
+ if (provider === "openai-codex")
26
+ return "openai";
27
+ if (provider === "openai")
28
+ return "openai-codex";
29
+ return undefined;
30
+ }
31
+ /** A spec taken apart at its first `/`: `provider/rest`, where `rest` is the
32
+ * model id with any `:thinking` suffix left on. Null for a bare id. */
33
+ export function splitProvider(spec) {
34
+ const at = spec.indexOf("/");
35
+ if (at <= 0 || at === spec.length - 1)
36
+ return null;
37
+ return { provider: spec.slice(0, at), rest: spec.slice(at + 1) };
38
+ }
39
+ /** The model id of a spec's `rest`: the `:thinking` suffix dropped. */
40
+ export function modelIdOf(rest) {
41
+ const colon = rest.lastIndexOf(":");
42
+ return colon > 0 ? rest.slice(0, colon) : rest;
43
+ }
44
+ /** The provider to run `provider`'s model `modelId` on: `provider` itself when
45
+ * it has a credential (or when nothing better exists), else its OpenAI twin
46
+ * when the twin has one and serves the model. */
47
+ export function routeProvider(provider, modelId, probe) {
48
+ if (probe.hasCredential(provider))
49
+ return provider;
50
+ const twin = twinProvider(provider);
51
+ if (twin === undefined || !probe.hasCredential(twin))
52
+ return provider;
53
+ if (probe.hasModel && !probe.hasModel(twin, modelId))
54
+ return provider;
55
+ return twin;
56
+ }
57
+ /** A whole spec (`provider/id[:thinking]`) rerouted by `routeProvider`; a spec
58
+ * with no provider prefix is returned as given. */
59
+ export function routeModelSpec(spec, probe) {
60
+ const parts = splitProvider(spec);
61
+ if (parts === null)
62
+ return spec;
63
+ const provider = routeProvider(parts.provider, modelIdOf(parts.rest), probe);
64
+ return provider === parts.provider ? spec : `${provider}/${parts.rest}`;
65
+ }
66
+ /** The providers a pi `auth.json` holds a credential for: every entry of type
67
+ * "oauth" or "api_key" (pi's two stored credential shapes; an api_key's `key`
68
+ * may be a literal, an env name or a `!command`, all of which count). An API key
69
+ * in `OPENAI_API_KEY` counts for `openai`, as pi's own env lookup does. Text
70
+ * that does not parse holds nothing. */
71
+ export function providersInAuthJson(raw, env = {}) {
72
+ const out = new Set();
73
+ if (raw !== null) {
74
+ try {
75
+ const parsed = JSON.parse(raw);
76
+ if (typeof parsed === "object" && parsed !== null)
77
+ for (const [name, v] of Object.entries(parsed)) {
78
+ if (typeof v !== "object" || v === null)
79
+ continue;
80
+ const type = v["type"];
81
+ if (type === "oauth")
82
+ out.add(name);
83
+ else if (type === "api_key") {
84
+ const key = v["key"];
85
+ if (typeof key === "string" && key.trim() !== "")
86
+ out.add(name);
87
+ }
88
+ }
89
+ }
90
+ catch {
91
+ // an unreadable login holds no credential
92
+ }
93
+ }
94
+ if ((env["OPENAI_API_KEY"] ?? "").trim() !== "")
95
+ out.add("openai");
96
+ return out;
97
+ }
98
+ /** `routeModelSpec` over a login file's text (null: no file) and the env the
99
+ * pi will run with: for a host that starts a CLI pi on a login it holds as a
100
+ * file (a takeover's or a debug round's borrowed copy). */
101
+ export function routeModelSpecForLogin(spec, authJson, env = {}) {
102
+ const have = providersInAuthJson(authJson, env);
103
+ return routeModelSpec(spec, { hasCredential: (p) => have.has(p) });
104
+ }
105
+ //# sourceMappingURL=modelroute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelroute.js","sourceRoot":"","sources":["../../src/modelroute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Runtime } from "./engine/port.js";
2
+ import { type RoundResult, type RoundSpec } from "./engine/round.js";
3
+ export { jsonProblem, missingOutputs, PI_RUN_FILES, readJson, unparseableOutputs, } from "./engine/round.js";
4
+ export type { PiRun } from "./engine/port.js";
5
+ export interface OneShotInput extends RoundSpec {
6
+ /** Hosts the pi session: the SDK runtime of the route. */
7
+ runtime: Runtime;
8
+ }
9
+ export type OneShotResult = RoundResult;
10
+ /** Run the review: `runRound` on `runtime`. */
11
+ export declare function runOneShot(i: OneShotInput): Promise<OneShotResult>;
12
+ //# sourceMappingURL=oneshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot.d.ts","sourceRoot":"","sources":["../../src/oneshot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAY,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,+CAA+C;AAC/C,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAGlE"}
@@ -0,0 +1,8 @@
1
+ import { runRound } from "./engine/round.js";
2
+ export { jsonProblem, missingOutputs, PI_RUN_FILES, readJson, unparseableOutputs, } from "./engine/round.js";
3
+ /** Run the review: `runRound` on `runtime`. */
4
+ export function runOneShot(i) {
5
+ const { runtime, ...spec } = i;
6
+ return runRound(spec, runtime);
7
+ }
8
+ //# sourceMappingURL=oneshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../../src/oneshot.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAoC,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EACL,WAAW,EACX,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAU3B,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,CAAe;IACxC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Greedy file groups in input order. An oversized file keeps its own group;
2
+ * files beyond the group cap are returned in left, never discarded. */
3
+ export declare function packByBudget<T>(files: readonly T[], limits: {
4
+ maxGroups: number;
5
+ maxLines: number;
6
+ maxFiles?: number;
7
+ }, pathOf: (file: T) => string, sizeOf: (file: T) => number): {
8
+ groups: string[][];
9
+ left: string[];
10
+ };
11
+ //# sourceMappingURL=packing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packing.d.ts","sourceRoot":"","sources":["../../src/packing.ts"],"names":[],"mappings":"AAAA;uEACuE;AACvE,wBAAgB,YAAY,CAAC,CAAC,EAC5B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAClE,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAC1B;IAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BxC"}
@@ -0,0 +1,31 @@
1
+ /** Greedy file groups in input order. An oversized file keeps its own group;
2
+ * files beyond the group cap are returned in left, never discarded. */
3
+ export function packByBudget(files, limits, pathOf, sizeOf) {
4
+ const groups = [];
5
+ const left = [];
6
+ let current = [];
7
+ let lines = 0;
8
+ for (const file of files) {
9
+ const size = sizeOf(file);
10
+ if (current.length > 0 &&
11
+ (current.length >= (limits.maxFiles ?? Infinity) || lines + size > limits.maxLines)) {
12
+ groups.push(current);
13
+ current = [];
14
+ lines = 0;
15
+ }
16
+ if (groups.length >= limits.maxGroups) {
17
+ left.push(pathOf(file));
18
+ continue;
19
+ }
20
+ current.push(pathOf(file));
21
+ lines += size;
22
+ }
23
+ if (current.length > 0) {
24
+ if (groups.length < limits.maxGroups)
25
+ groups.push(current);
26
+ else
27
+ left.push(...current);
28
+ }
29
+ return { groups, left };
30
+ }
31
+ //# sourceMappingURL=packing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packing.js","sourceRoot":"","sources":["../../src/packing.ts"],"names":[],"mappings":"AAAA;uEACuE;AACvE,MAAM,UAAU,YAAY,CAC1B,KAAmB,EACnB,MAAkE,EAClE,MAA2B,EAC3B,MAA2B;IAE3B,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IACE,OAAO,CAAC,MAAM,GAAG,CAAC;YAClB,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EACnF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,CAAC,CAAC;QACZ,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3B,KAAK,IAAI,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;YACtD,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}