@quickchatai/pi-quickreview 1.1.0 → 1.3.1

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 (241) hide show
  1. package/README.md +79 -27
  2. package/assets/config.example.toml +60 -14
  3. package/assets/prompts/onboarding.md +58 -18
  4. package/assets/schemas/review-result.v1.json +60 -0
  5. package/dist/extensions/quickreview.d.ts +13 -5
  6. package/dist/extensions/quickreview.d.ts.map +1 -1
  7. package/dist/extensions/quickreview.js +77 -25
  8. package/dist/extensions/quickreview.js.map +1 -1
  9. package/dist/src/engine/auth.d.ts +4 -0
  10. package/dist/src/engine/auth.d.ts.map +1 -1
  11. package/dist/src/engine/auth.js +11 -2
  12. package/dist/src/engine/auth.js.map +1 -1
  13. package/dist/src/engine/envmap.d.ts.map +1 -1
  14. package/dist/src/engine/envmap.js +5 -0
  15. package/dist/src/engine/envmap.js.map +1 -1
  16. package/dist/src/engine/lens/activity.d.ts +45 -0
  17. package/dist/src/engine/lens/activity.d.ts.map +1 -0
  18. package/dist/src/engine/lens/activity.js +118 -0
  19. package/dist/src/engine/lens/activity.js.map +1 -0
  20. package/dist/src/engine/lens/runlens.d.ts +7 -0
  21. package/dist/src/engine/lens/runlens.d.ts.map +1 -1
  22. package/dist/src/engine/lens/runlens.js +30 -1
  23. package/dist/src/engine/lens/runlens.js.map +1 -1
  24. package/dist/src/engine/lens/tool.d.ts +7 -0
  25. package/dist/src/engine/lens/tool.d.ts.map +1 -1
  26. package/dist/src/engine/lens/tool.js +101 -18
  27. package/dist/src/engine/lens/tool.js.map +1 -1
  28. package/dist/src/engine/lens/wave.d.ts +6 -0
  29. package/dist/src/engine/lens/wave.d.ts.map +1 -1
  30. package/dist/src/engine/lens/wave.js +16 -0
  31. package/dist/src/engine/lens/wave.js.map +1 -1
  32. package/dist/src/engine/pisdk.d.ts +9 -0
  33. package/dist/src/engine/pisdk.d.ts.map +1 -1
  34. package/dist/src/engine/pisdk.js +29 -4
  35. package/dist/src/engine/pisdk.js.map +1 -1
  36. package/dist/src/githubAuth.d.ts +39 -1
  37. package/dist/src/githubAuth.d.ts.map +1 -1
  38. package/dist/src/githubAuth.js +75 -8
  39. package/dist/src/githubAuth.js.map +1 -1
  40. package/dist/src/guards.d.ts +14 -1
  41. package/dist/src/guards.d.ts.map +1 -1
  42. package/dist/src/guards.js +61 -2
  43. package/dist/src/guards.js.map +1 -1
  44. package/dist/src/homes.js +1 -1
  45. package/dist/src/homes.js.map +1 -1
  46. package/dist/src/identity.d.ts +34 -0
  47. package/dist/src/identity.d.ts.map +1 -0
  48. package/dist/src/identity.js +67 -0
  49. package/dist/src/identity.js.map +1 -0
  50. package/dist/src/live/events.d.ts +3 -0
  51. package/dist/src/live/events.d.ts.map +1 -1
  52. package/dist/src/live/events.js.map +1 -1
  53. package/dist/src/live/lensline.d.ts +20 -0
  54. package/dist/src/live/lensline.d.ts.map +1 -0
  55. package/dist/src/live/lensline.js +70 -0
  56. package/dist/src/live/lensline.js.map +1 -0
  57. package/dist/src/live/projection.d.ts +55 -0
  58. package/dist/src/live/projection.d.ts.map +1 -0
  59. package/dist/src/live/projection.js +465 -0
  60. package/dist/src/live/projection.js.map +1 -0
  61. package/dist/src/live/read.d.ts +24 -0
  62. package/dist/src/live/read.d.ts.map +1 -0
  63. package/dist/src/live/read.js +60 -0
  64. package/dist/src/live/read.js.map +1 -0
  65. package/dist/src/live/writer.d.ts +3 -0
  66. package/dist/src/live/writer.d.ts.map +1 -1
  67. package/dist/src/live/writer.js +6 -1
  68. package/dist/src/live/writer.js.map +1 -1
  69. package/dist/src/localreview.d.ts +18 -8
  70. package/dist/src/localreview.d.ts.map +1 -1
  71. package/dist/src/localreview.js +103 -43
  72. package/dist/src/localreview.js.map +1 -1
  73. package/dist/src/modelroute.d.ts +42 -0
  74. package/dist/src/modelroute.d.ts.map +1 -0
  75. package/dist/src/modelroute.js +126 -0
  76. package/dist/src/modelroute.js.map +1 -0
  77. package/dist/src/plugin/args.d.ts +38 -7
  78. package/dist/src/plugin/args.d.ts.map +1 -1
  79. package/dist/src/plugin/args.js +134 -37
  80. package/dist/src/plugin/args.js.map +1 -1
  81. package/dist/src/plugin/login.d.ts +11 -4
  82. package/dist/src/plugin/login.d.ts.map +1 -1
  83. package/dist/src/plugin/login.js +28 -26
  84. package/dist/src/plugin/login.js.map +1 -1
  85. package/dist/src/plugin/messages.d.ts +7 -0
  86. package/dist/src/plugin/messages.d.ts.map +1 -0
  87. package/dist/src/plugin/messages.js +13 -0
  88. package/dist/src/plugin/messages.js.map +1 -0
  89. package/dist/src/plugin/review.d.ts +52 -6
  90. package/dist/src/plugin/review.d.ts.map +1 -1
  91. package/dist/src/plugin/review.js +269 -99
  92. package/dist/src/plugin/review.js.map +1 -1
  93. package/dist/src/plugin/scan.d.ts +80 -44
  94. package/dist/src/plugin/scan.d.ts.map +1 -1
  95. package/dist/src/plugin/scan.js +450 -233
  96. package/dist/src/plugin/scan.js.map +1 -1
  97. package/dist/src/plugin/scancases.d.ts +33 -0
  98. package/dist/src/plugin/scancases.d.ts.map +1 -0
  99. package/dist/src/plugin/scancases.js +153 -0
  100. package/dist/src/plugin/scancases.js.map +1 -0
  101. package/dist/src/plugin/settings.d.ts +18 -0
  102. package/dist/src/plugin/settings.d.ts.map +1 -0
  103. package/dist/src/plugin/settings.js +47 -0
  104. package/dist/src/plugin/settings.js.map +1 -0
  105. package/dist/src/plugin/setup.d.ts +35 -12
  106. package/dist/src/plugin/setup.d.ts.map +1 -1
  107. package/dist/src/plugin/setup.js +258 -118
  108. package/dist/src/plugin/setup.js.map +1 -1
  109. package/dist/src/plugin/versiongate.js +1 -1
  110. package/dist/src/plugin/versiongate.js.map +1 -1
  111. package/dist/src/profileoverrides.d.ts +3 -0
  112. package/dist/src/profileoverrides.d.ts.map +1 -1
  113. package/dist/src/profileoverrides.js +9 -2
  114. package/dist/src/profileoverrides.js.map +1 -1
  115. package/dist/src/reviewapi.d.ts +22 -31
  116. package/dist/src/reviewapi.d.ts.map +1 -1
  117. package/dist/src/reviewapi.js +90 -66
  118. package/dist/src/reviewapi.js.map +1 -1
  119. package/dist/src/reviewconfig.d.ts +12 -0
  120. package/dist/src/reviewconfig.d.ts.map +1 -1
  121. package/dist/src/reviewconfig.js +9 -1
  122. package/dist/src/reviewconfig.js.map +1 -1
  123. package/dist/src/reviewdest.d.ts +1 -1
  124. package/dist/src/reviewdest.d.ts.map +1 -1
  125. package/dist/src/reviewdest.js +4 -3
  126. package/dist/src/reviewdest.js.map +1 -1
  127. package/dist/src/reviewtarget.d.ts +36 -0
  128. package/dist/src/reviewtarget.d.ts.map +1 -0
  129. package/dist/src/reviewtarget.js +6 -0
  130. package/dist/src/reviewtarget.js.map +1 -0
  131. package/dist/src/round-progress.d.ts +5 -0
  132. package/dist/src/round-progress.d.ts.map +1 -1
  133. package/dist/src/round-progress.js.map +1 -1
  134. package/dist/src/savedpost.d.ts +65 -0
  135. package/dist/src/savedpost.d.ts.map +1 -0
  136. package/dist/src/savedpost.js +131 -0
  137. package/dist/src/savedpost.js.map +1 -0
  138. package/dist/src/scan/caseread.d.ts +84 -0
  139. package/dist/src/scan/caseread.d.ts.map +1 -0
  140. package/dist/src/scan/caseread.js +263 -0
  141. package/dist/src/scan/caseread.js.map +1 -0
  142. package/dist/src/scan/channelfs.d.ts +6 -0
  143. package/dist/src/scan/channelfs.d.ts.map +1 -0
  144. package/dist/src/scan/channelfs.js +27 -0
  145. package/dist/src/scan/channelfs.js.map +1 -0
  146. package/dist/src/scan/cutrender.d.ts +13 -0
  147. package/dist/src/scan/cutrender.d.ts.map +1 -0
  148. package/dist/src/scan/cutrender.js +51 -0
  149. package/dist/src/scan/cutrender.js.map +1 -0
  150. package/dist/src/scan/facts.d.ts +72 -0
  151. package/dist/src/scan/facts.d.ts.map +1 -0
  152. package/dist/src/scan/facts.js +593 -0
  153. package/dist/src/scan/facts.js.map +1 -0
  154. package/dist/src/scan/findings.d.ts +320 -0
  155. package/dist/src/scan/findings.d.ts.map +1 -0
  156. package/dist/src/scan/findings.js +948 -0
  157. package/dist/src/scan/findings.js.map +1 -0
  158. package/dist/src/scan/ledger.d.ts +116 -0
  159. package/dist/src/scan/ledger.d.ts.map +1 -0
  160. package/dist/src/scan/ledger.js +207 -0
  161. package/dist/src/scan/ledger.js.map +1 -0
  162. package/dist/src/scan/presentation.d.ts +19 -0
  163. package/dist/src/scan/presentation.d.ts.map +1 -0
  164. package/dist/src/scan/presentation.js +9 -0
  165. package/dist/src/scan/presentation.js.map +1 -0
  166. package/dist/src/scan/scan.d.ts +354 -0
  167. package/dist/src/scan/scan.d.ts.map +1 -0
  168. package/dist/src/scan/scan.js +725 -0
  169. package/dist/src/scan/scan.js.map +1 -0
  170. package/dist/src/scan/scanagents.d.ts +23 -0
  171. package/dist/src/scan/scanagents.d.ts.map +1 -0
  172. package/dist/src/scan/scanagents.js +99 -0
  173. package/dist/src/scan/scanagents.js.map +1 -0
  174. package/dist/src/scan/scanassemble.d.ts +65 -0
  175. package/dist/src/scan/scanassemble.d.ts.map +1 -0
  176. package/dist/src/scan/scanassemble.js +93 -0
  177. package/dist/src/scan/scanassemble.js.map +1 -0
  178. package/dist/src/scan/scanfs.d.ts +26 -0
  179. package/dist/src/scan/scanfs.d.ts.map +1 -0
  180. package/dist/src/scan/scanfs.js +229 -0
  181. package/dist/src/scan/scanfs.js.map +1 -0
  182. package/dist/src/scan/scanlease.d.ts +50 -0
  183. package/dist/src/scan/scanlease.d.ts.map +1 -0
  184. package/dist/src/scan/scanlease.js +251 -0
  185. package/dist/src/scan/scanlease.js.map +1 -0
  186. package/dist/src/scan/scanleaves.d.ts +55 -0
  187. package/dist/src/scan/scanleaves.d.ts.map +1 -0
  188. package/dist/src/scan/scanleaves.js +258 -0
  189. package/dist/src/scan/scanleaves.js.map +1 -0
  190. package/dist/src/scan/scanports.d.ts +79 -0
  191. package/dist/src/scan/scanports.d.ts.map +1 -0
  192. package/dist/src/scan/scanports.js +8 -0
  193. package/dist/src/scan/scanports.js.map +1 -0
  194. package/dist/src/scan/scanrender.d.ts +128 -0
  195. package/dist/src/scan/scanrender.d.ts.map +1 -0
  196. package/dist/src/scan/scanrender.js +527 -0
  197. package/dist/src/scan/scanrender.js.map +1 -0
  198. package/dist/src/scan/scanreport.d.ts +126 -0
  199. package/dist/src/scan/scanreport.d.ts.map +1 -0
  200. package/dist/src/scan/scanreport.js +289 -0
  201. package/dist/src/scan/scanreport.js.map +1 -0
  202. package/dist/src/scan/scanrun.d.ts +472 -0
  203. package/dist/src/scan/scanrun.d.ts.map +1 -0
  204. package/dist/src/scan/scanrun.js +1733 -0
  205. package/dist/src/scan/scanrun.js.map +1 -0
  206. package/dist/src/scan/scantree.d.ts +21 -0
  207. package/dist/src/scan/scantree.d.ts.map +1 -0
  208. package/dist/src/scan/scantree.js +297 -0
  209. package/dist/src/scan/scantree.js.map +1 -0
  210. package/dist/src/scan/scanverbs.d.ts +208 -0
  211. package/dist/src/scan/scanverbs.d.ts.map +1 -0
  212. package/dist/src/scan/scanverbs.js +689 -0
  213. package/dist/src/scan/scanverbs.js.map +1 -0
  214. package/dist/src/scan/stage2.d.ts +221 -0
  215. package/dist/src/scan/stage2.d.ts.map +1 -0
  216. package/dist/src/scan/stage2.js +617 -0
  217. package/dist/src/scan/stage2.js.map +1 -0
  218. package/dist/src/scan/stage2request.d.ts +125 -0
  219. package/dist/src/scan/stage2request.d.ts.map +1 -0
  220. package/dist/src/scan/stage2request.js +259 -0
  221. package/dist/src/scan/stage2request.js.map +1 -0
  222. package/dist/src/scan/textsniff.d.ts +14 -0
  223. package/dist/src/scan/textsniff.d.ts.map +1 -0
  224. package/dist/src/scan/textsniff.js +88 -0
  225. package/dist/src/scan/textsniff.js.map +1 -0
  226. package/dist/src/scan/unitcut.d.ts +135 -0
  227. package/dist/src/scan/unitcut.d.ts.map +1 -0
  228. package/dist/src/scan/unitcut.js +437 -0
  229. package/dist/src/scan/unitcut.js.map +1 -0
  230. package/dist/src/scan/unitcutstore.d.ts +155 -0
  231. package/dist/src/scan/unitcutstore.d.ts.map +1 -0
  232. package/dist/src/scan/unitcutstore.js +381 -0
  233. package/dist/src/scan/unitcutstore.js.map +1 -0
  234. package/dist/src/setupchecklist.d.ts +240 -0
  235. package/dist/src/setupchecklist.d.ts.map +1 -0
  236. package/dist/src/setupchecklist.js +407 -0
  237. package/dist/src/setupchecklist.js.map +1 -0
  238. package/package.json +7 -3
  239. package/skills/qcr-review/SKILL.md +24 -0
  240. package/skills/qcr-scan/SKILL.md +23 -0
  241. package/skills/qcr-setup/SKILL.md +18 -0
@@ -0,0 +1,354 @@
1
+ import { planKey } from "../plankey.js";
2
+ import { SCAN_DEEP_MAX_SUGGESTIONS, SCAN_PASS } from "../include.js";
3
+ import { type Reachability } from "../severity.js";
4
+ import { isMigrationFile } from "./facts.js";
5
+ import { type CaseBudget, type UnitCut } from "./unitcut.js";
6
+ /** The stage-1 lens (agents/scan/pass-scan.md). */
7
+ export { SCAN_PASS };
8
+ /** Lenses a stage-1 suggestion may NOT name (passes.ts), and the deep lenses
9
+ * stage 1 may point stage 2 at. */
10
+ export { DIFF_ONLY_LENSES, SCAN_DEEP_LENSES } from "../passes.js";
11
+ export { isMigrationFile };
12
+ export type ExclusionReason = "test" | "migration" | "unreadable-kind" | "excluded-glob";
13
+ /** Why stage 1 does not read `path`, or null when it does. */
14
+ export declare function stage1Exclusion(path: string, excluded: (p: string) => boolean): ExclusionReason | null;
15
+ export interface TreeFile {
16
+ path: string;
17
+ /** The git blob hash — the content hash the ledger keys on. */
18
+ blob: string;
19
+ }
20
+ export interface ScanCaseFile {
21
+ path: string;
22
+ blob: string;
23
+ /** Lines this case READS of the file for sizing and price: the whole file,
24
+ * or its `range`'s length. */
25
+ lines: number;
26
+ /** A file over one case is cut into line ranges (`cutRanges`): this case
27
+ * reads the whole file for context but reports only inside `range`. */
28
+ range?: FileRange;
29
+ }
30
+ /** One line range of a file too big for one case — 1-based, inclusive, and
31
+ * `total` the file's own line count (what the ledger's coverage needs). */
32
+ export interface FileRange {
33
+ start: number;
34
+ end: number;
35
+ total: number;
36
+ }
37
+ /** Neighbouring ranges overlap by this many lines at most (a tenth of the
38
+ * window below that), so a finding straddling a cut sits whole in one. */
39
+ export declare const RANGE_OVERLAP_MAX = 40;
40
+ /**
41
+ * Cut a file of `total` lines into windows of at most `maxLines`: each
42
+ * window ends just before a top-level declaration found in its second half
43
+ * when the text is at hand (pulled above that declaration's decorators and
44
+ * comments), else at the limit; the next starts a few lines earlier
45
+ * (`RANGE_OVERLAP_MAX`), so neighbours overlap and nothing falls between
46
+ * them. A file that fits is one window. Deterministic.
47
+ */
48
+ export declare function cutRanges(total: number, maxLines: number, text: string | null): FileRange[];
49
+ /** Does the union of `ranges` cover every line of `start..end`? */
50
+ export declare function rangesCover(ranges: readonly {
51
+ start: number;
52
+ end: number;
53
+ }[], start: number, end: number): boolean;
54
+ export interface ScanCasePlan {
55
+ /** The UNIT's name, never the part's. */
56
+ unit: string;
57
+ /** `<unit>` or `<unit>#<i>` — unitcut.ts's spelling. */
58
+ id: string;
59
+ part: number;
60
+ parts: number;
61
+ files: ScanCaseFile[];
62
+ lines: number;
63
+ }
64
+ export interface Stage1Plan {
65
+ cases: ScanCasePlan[];
66
+ /** Files stage 1 skips, by reason. */
67
+ excluded: Record<ExclusionReason, number>;
68
+ /** Readable files the ledger already covers at this content. */
69
+ covered: number;
70
+ /** Files at this sha no unit of the saved cut owns (the repo outgrew it). */
71
+ unassigned: string[];
72
+ /** Files the tree lists but whose text cannot be read (binary, too big). */
73
+ unreadable: number;
74
+ /** Each of those files and why (`binary`, `too-big`, `unreadable` when the
75
+ * tree cannot say) — reported, never silently absent from coverage. */
76
+ skipped: SkippedFile[];
77
+ /** Delta only: planned files whose content has NOT changed since the last
78
+ * scan but that no complete reading covers at it — never read (the rest of
79
+ * an unfinished scan, or unreadable then and readable now), or read only in
80
+ * part. A delta owes them as much as the changed ones (0 for a full plan). */
81
+ owed: number;
82
+ }
83
+ /** What a delta re-scan compares against. */
84
+ export interface DeltaBasis {
85
+ /** Each path's newest content hash in the ledger for `pass-scan`. */
86
+ read: ReadonlyMap<string, string>;
87
+ /** The tree the last scan read: path → blob. */
88
+ baseline: ReadonlyMap<string, string>;
89
+ }
90
+ /** Has `f`'s content changed since the last scan? Newest read by the ledger
91
+ * at another content, or absent from / different in the last scan's tree.
92
+ * Not what a delta reads by: an unchanged file with no complete reading at
93
+ * this content is owed too (planStage1). */
94
+ export declare function changedSince(f: TreeFile, basis: DeltaBasis): boolean;
95
+ /** Why a listed file has no text for a lens. */
96
+ export type UnreadableReason = "binary" | "too-big" | "unreadable";
97
+ export interface SkippedFile {
98
+ path: string;
99
+ why: UnreadableReason;
100
+ }
101
+ export interface PlanInput {
102
+ cut: UnitCut;
103
+ files: readonly TreeFile[];
104
+ linesOf: (path: string) => number | null;
105
+ /** Why `linesOf` answered null; absent = `unreadable` (the reason unknown). */
106
+ whyUnreadable?: (path: string) => UnreadableReason | null;
107
+ /** `path\0blob` of each file's newest ledger reading for `pass-scan`. */
108
+ covered: ReadonlySet<string>;
109
+ exclude: readonly string[];
110
+ budget: CaseBudget;
111
+ /** A delta re-scan: files changed since the last scan, and every file no
112
+ * complete reading covers at its content (`covered`, `history`). */
113
+ delta?: DeltaBasis;
114
+ /** A file's text, where a range cut looks for declaration boundaries;
115
+ * absent (or null) = fixed windows. */
116
+ textOf?: (path: string) => string | null;
117
+ /** `path\0blob` → the line ranges the ledger's newest, still-incomplete
118
+ * reading holds for `pass-scan`: a range inside them is not read again. */
119
+ partial?: ReadonlyMap<string, readonly {
120
+ start: number;
121
+ end: number;
122
+ }[]>;
123
+ /** path → the ledger's newest `pass-scan` reading of it (any content):
124
+ * what orders the cases. Absent: the plan's own (unit) order stands. */
125
+ history?: ReadonlyMap<string, PriorReading>;
126
+ }
127
+ /** A file's newest reading as the plan orders by it (ledger.ts `readings`). */
128
+ export interface PriorReading {
129
+ blob: string;
130
+ /** Whole file, or ranges covering every line. */
131
+ complete: boolean;
132
+ /** When that reading's newest row was written (ISO): among changed files
133
+ * the stalest reading runs first. */
134
+ at: string;
135
+ }
136
+ /**
137
+ * Coverage first. The hard stop ends a run whose actuals outrun its estimate
138
+ * before the plan's tail, so the tail must not be the same cases every run:
139
+ * a file the ledger never read, or whose newest reading was cut short
140
+ * between ranges, is tier 0; a file read before at other content is tier 1
141
+ * (changed); anything else is tier 2. A case takes its best file's
142
+ * tier; a tier keeps the plan's order.
143
+ */
144
+ export declare function readTier(f: {
145
+ path: string;
146
+ blob: string;
147
+ }, history: ReadonlyMap<string, PriorReading>): 0 | 1 | 2;
148
+ export declare const coverKey: (path: string, blob: string) => string;
149
+ /** Stage 1 over the saved cut at one tree: every readable, uncovered,
150
+ * non-excluded file (a delta the same set, counting what it owes unchanged
151
+ * as `owed`), one case per
152
+ * unit, split to fit — ordered coverage-first by `history` (readTier).
153
+ * Deterministic. */
154
+ export declare function planStage1(input: PlanInput): Stage1Plan;
155
+ /**
156
+ * The calibration pick: one case from each of up to `n` units spread across
157
+ * the size range (by the unit's planned lines), so the measured rate is not
158
+ * the rate of the smallest or the largest code alone. Deterministic.
159
+ */
160
+ export declare function calibrationCases(plan: readonly ScanCasePlan[], n: number): ScanCasePlan[];
161
+ /** A measured stage-1 price: dollars per thousand lines read, from finished
162
+ * cases of the SAME lens, tier, effort and validator setting. */
163
+ export interface ScanRate {
164
+ usd_per_kline: number;
165
+ /** Priced cases it was measured over, and their lines and cost. */
166
+ cases: number;
167
+ lines: number;
168
+ cost_usd: number;
169
+ }
170
+ export declare function caseEstimate(lines: number, rate: Pick<ScanRate, "usd_per_kline">): number;
171
+ /**
172
+ * Run `lanes` copies of `lane` to the end. One that throws aborts the rest
173
+ * and the throw is raised only once EVERY lane has stopped — never while a
174
+ * sibling is still in a paid case, which would otherwise go on spending and
175
+ * writing the run record after the run is settled and its slot released.
176
+ */
177
+ export declare function drainLanes(lanes: number, lane: () => Promise<void>, abort: AbortController): Promise<void>;
178
+ /** What a preview's key covers (packages/pi-plugin/src/plankey.ts, shared with `qcr review`). */
179
+ export { planKey };
180
+ export interface PromptContext {
181
+ /** Absolute path of the tree at the scan sha. */
182
+ root: string;
183
+ sha: string;
184
+ caseId: string;
185
+ }
186
+ /** Where a lens opens a tree file: its absolute path under the root. */
187
+ export declare function treePath(root: string, path: string): string;
188
+ /** The line every scan task carries about paths: the lens runs outside the
189
+ * tree (first-party cwd — the case runner), so a relative path it opens is
190
+ * some other checkout's file, never the scanned one. */
191
+ export declare const TREE_PATHS_NOTE = "Your working directory is NOT the tree: a relative path opens some other checkout's file. Open every file \u2014 focus files, callers, tests \u2014 by its absolute path under the tree root (each focus file below says where). Paths in your answer are relative to the tree root.";
192
+ /** One focus file as a task names it: its repo-relative path (what an
193
+ * answer anchors to), its size or range, and — given the tree root — the
194
+ * absolute path to open it by. */
195
+ export declare function focusLine(f: ScanCaseFile, root?: string): string;
196
+ /** The note a case with a ranged file carries, or none. */
197
+ export declare function rangeNote(files: readonly ScanCaseFile[]): string[];
198
+ /** The stage-1 task string for one case. */
199
+ export declare function scanCasePrompt(c: ScanCasePlan, ctx: PromptContext, deepLenses?: readonly string[]): string;
200
+ /** One candidate as a validator reads it, in the findings grammar — the
201
+ * scan's skeptic and the replay's validator alike. */
202
+ export declare function candidateItem(f: ScanCandidate): string;
203
+ /** The validator's task string over one case's stage-1 candidates. */
204
+ export declare function scanValidatorPrompt(c: ScanCasePlan, candidates: readonly ScanCandidate[], ctx: PromptContext, lens?: string, label?: string): string;
205
+ export declare const SEVERITIES: readonly ["P0", "P1", "P2", "P3", "nit"];
206
+ export type ScanSeverity = (typeof SEVERITIES)[number];
207
+ /** A finding's place: its file, its line range and its kind. */
208
+ interface Placed {
209
+ path: string;
210
+ start: number;
211
+ end: number;
212
+ kind: string;
213
+ }
214
+ /**
215
+ * The candidate a validator's survivor stands for: one not yet `used`, on the
216
+ * same file with overlapping lines — the same kind first. One survivor stands
217
+ * for at most one candidate, so a duplicate on the same lines or a neighbour
218
+ * of another kind is never silently claimed by a survivor that did not mean
219
+ * it. The scan and the replay attribute survivors through this one rule.
220
+ */
221
+ export declare function survivorSource<T extends Placed>(survivor: Placed, candidates: readonly T[], used: ReadonlySet<T>): T | undefined;
222
+ /** A stage-1 candidate as read back, anchored or not yet checked. */
223
+ export interface ScanCandidate {
224
+ path: string;
225
+ start: number;
226
+ end: number;
227
+ kind: string;
228
+ /** After the reachability cap (`capped_from` holds what the lens said). */
229
+ severity: ScanSeverity;
230
+ confidence: number | null;
231
+ /** The lens's `reachability:` field, or null when it wrote none (read as
232
+ * `routine`, exactly as a PR round reads it). */
233
+ reachability: Reachability | null;
234
+ /** The severity the lens wrote, when the reachability axis capped it —
235
+ * the posting map's gate (`reachabilityCappedSeverity`): contrived never
236
+ * blocks, plausible P2 is a question. Null when nothing was capped. */
237
+ capped_from: ScanSeverity | null;
238
+ claim: string;
239
+ evidence: string | null;
240
+ fix: string | null;
241
+ detail: string | null;
242
+ }
243
+ export interface ScanSuggestion {
244
+ lens: string;
245
+ files: string[];
246
+ reason: string;
247
+ }
248
+ export interface ParsedScanAnswer {
249
+ candidates: ScanCandidate[];
250
+ /** Items with no path, claim or line — never repaired. */
251
+ dropped: number;
252
+ suggestions: ScanSuggestion[];
253
+ /** Suggestions naming no allowed lens or no file, or past the cap. */
254
+ suggestions_dropped: number;
255
+ /** The findings block said NONE. */
256
+ none: boolean;
257
+ }
258
+ /** At most this many suggestions per case are kept — `SCAN_DEEP_MAX_SUGGESTIONS`
259
+ * in a deep scan, where every focus file is to be named in one. */
260
+ export declare const MAX_SUGGESTIONS = 5;
261
+ export { SCAN_DEEP_MAX_SUGGESTIONS };
262
+ /** One lowercase word naming the class — the identity half of a kind. */
263
+ export declare function normalizeKind(v: string | undefined): string;
264
+ /**
265
+ * Read a `pass-scan` answer: its findings (line anchors required — a scan
266
+ * finding without lines is dropped, per the scan-mode anchor rule) and its
267
+ * deep-lens suggestions (lenses from `deepLenses` only, files as given — the
268
+ * caller checks they exist; at most `maxSuggestions`, default
269
+ * `MAX_SUGGESTIONS`). `root` strips an absolute tree prefix a lens wrote by
270
+ * mistake.
271
+ */
272
+ export declare function parseScanAnswer(text: string, opts?: {
273
+ root?: string | null;
274
+ deepLenses?: readonly string[];
275
+ maxSuggestions?: number;
276
+ }): ParsedScanAnswer;
277
+ export interface DoubtLine {
278
+ /** The lens the validator named on the line. */
279
+ lens: string;
280
+ path: string;
281
+ line: number | null;
282
+ word: string;
283
+ reason: string;
284
+ /** The false-positive class the skeptic named (`[<slug>]` leading the
285
+ * reason — a SCAN_FALSE_POSITIVE_CLASSES slug), or null. */
286
+ class: string | null;
287
+ }
288
+ /** The slugs a doubt may name as its class — the ONE class list. */
289
+ export declare const SCAN_FALSE_POSITIVE_SLUGS: readonly string[];
290
+ /**
291
+ * Whether a skeptic's scenario is anchored: it cites at least one `path:line`
292
+ * of the path it traced. A `confirmed` scenario told as a prose chain of
293
+ * names and arrows with no `path:line` hides the hop the skeptic did not
294
+ * read — that hop is exactly the one it cannot cite. The engine checks that
295
+ * structure; the rest of the tightening lives in SCAN_SKEPTIC_ADDENDUM.
296
+ */
297
+ export declare function scenarioIsAnchored(scenario: string): boolean;
298
+ /** A survivor as the scan's skeptic sorted it. */
299
+ export interface SkepticSurvivor extends ScanCandidate {
300
+ /** `confirmed` only with a written `scenario:` that cites a `path:line`
301
+ * (scenarioIsAnchored) — a demonstration not written down, or not anchored
302
+ * in the code it traced, is not one; anything else that survived is
303
+ * `likely` (the scenario kept, so the reader sees what was traced). */
304
+ validity: "confirmed" | "likely";
305
+ scenario: string | null;
306
+ }
307
+ /**
308
+ * Read the validator's answer over a scan case — the scan's skeptic: the
309
+ * survivors (its findings block — they carry the lens's anchors), each with
310
+ * its tier (`validity: confirmed` with a `scenario:` citing a `path:line`,
311
+ * else `likely`), its DOUBTED lines,
312
+ * `- <lens> <path:line> — <word>: [<class>] <reason>`, and its KILLED lines
313
+ * in the same shape. In a scan nothing is killed: the caller stores a KILLED
314
+ * line as a doubt exactly like a DOUBTED one (the frozen validator's kill
315
+ * paths — below-bar, restated, duplicate, a confidence under 0.5 — become a
316
+ * doubtful mark, never a deletion).
317
+ */
318
+ export declare function parseValidatorAnswer(text: string, root: string | null): {
319
+ survivors: SkepticSurvivor[];
320
+ dropped: number;
321
+ doubted: DoubtLine[];
322
+ killed: DoubtLine[];
323
+ answered: boolean;
324
+ };
325
+ /** The anchored code, whitespace-normalised: each line's runs of whitespace
326
+ * collapsed, blank lines dropped — so a re-indent or a reflow is the same
327
+ * code, and a changed token is not. */
328
+ export declare function normalizeCode(lines: readonly string[]): string;
329
+ /** Lines `start..end` (1-based, inclusive) of `text`, or null when the range
330
+ * is not inside the file. */
331
+ export declare function anchoredLines(text: string, start: number, end: number): string[] | null;
332
+ /**
333
+ * Does a finding's evidence quote its anchored code? True when the evidence
334
+ * contains a whole anchored line (whitespace-normalised), or a quoted
335
+ * fragment of it — a `backticked` or "double-quoted" run that sits inside one
336
+ * of the anchored lines. An anchor with nothing quotable in it (braces, blank
337
+ * lines) cannot be checked and is not held against the finding. A finding
338
+ * whose evidence quotes only code ABOVE or BELOW its anchor — the function
339
+ * signature for a dereference twelve lines down — is exactly the misanchor
340
+ * this catches.
341
+ */
342
+ export declare function evidenceQuotesAnchor(evidence: string | null, anchored: readonly string[]): boolean;
343
+ /**
344
+ * A scan finding's fingerprint: file + lens + kind + a hash of the
345
+ * anchored code, whitespace-normalised. Stable across a re-scan that only
346
+ * moved the code or re-indented it; different when the code itself changed.
347
+ */
348
+ export declare function findingFingerprint(f: {
349
+ path: string;
350
+ lens: string;
351
+ kind: string;
352
+ code: string;
353
+ }): string;
354
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/scan/scan.ts"],"names":[],"mappings":"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"}