harnery 0.37.0 → 0.38.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 (184) hide show
  1. package/dist/commander.d.ts +9 -0
  2. package/dist/commander.d.ts.map +1 -1
  3. package/dist/commander.js +7 -2
  4. package/dist/commands/admission.d.ts +21 -0
  5. package/dist/commands/admission.d.ts.map +1 -0
  6. package/dist/commands/admission.js +565 -0
  7. package/dist/commands/agents.d.ts +7 -0
  8. package/dist/commands/agents.d.ts.map +1 -1
  9. package/dist/commands/agents.js +61 -1
  10. package/dist/commands/artifacts.d.ts.map +1 -1
  11. package/dist/commands/artifacts.js +48 -2
  12. package/dist/commands/browse-ai.d.ts +2 -2
  13. package/dist/commands/browse-ai.d.ts.map +1 -1
  14. package/dist/commands/browse-ai.js +6 -4
  15. package/dist/commands/browse.d.ts.map +1 -1
  16. package/dist/commands/browse.js +349 -21
  17. package/dist/commands/fetch.js +1 -0
  18. package/dist/commands/qa-record.d.ts +144 -0
  19. package/dist/commands/qa-record.d.ts.map +1 -0
  20. package/dist/commands/qa-record.js +0 -0
  21. package/dist/commands/qa-run.d.ts +7 -3
  22. package/dist/commands/qa-run.d.ts.map +1 -1
  23. package/dist/commands/qa-run.js +268 -13
  24. package/dist/commands/qa-status.d.ts +71 -0
  25. package/dist/commands/qa-status.d.ts.map +1 -0
  26. package/dist/commands/qa-status.js +490 -0
  27. package/dist/commands/qa-verify.d.ts +40 -0
  28. package/dist/commands/qa-verify.d.ts.map +1 -0
  29. package/dist/commands/qa-verify.js +180 -0
  30. package/dist/commands/review-pack.d.ts +4 -0
  31. package/dist/commands/review-pack.d.ts.map +1 -0
  32. package/dist/commands/review-pack.js +1001 -0
  33. package/dist/core/agents/qa-signal.d.ts +111 -0
  34. package/dist/core/agents/qa-signal.d.ts.map +1 -0
  35. package/dist/core/agents/qa-signal.js +231 -0
  36. package/dist/core/agents/session-name-display.d.ts +20 -5
  37. package/dist/core/agents/session-name-display.d.ts.map +1 -1
  38. package/dist/core/agents/session-name-display.js +67 -7
  39. package/dist/core/agents/state/heartbeat-reader.d.ts +7 -0
  40. package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
  41. package/dist/core/agents/state/heartbeat-writer.d.ts +11 -0
  42. package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
  43. package/dist/core/agents/state/heartbeat-writer.js +17 -0
  44. package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
  45. package/dist/core/agents/state/live-coordination-view.js +1 -0
  46. package/dist/core/agents/state/live-coordination-writer.js +5 -0
  47. package/dist/core/artifacts/constants.d.ts +1 -1
  48. package/dist/core/artifacts/constants.js +1 -1
  49. package/dist/core/artifacts/index.d.ts +57 -6
  50. package/dist/core/artifacts/index.d.ts.map +1 -1
  51. package/dist/core/artifacts/index.js +265 -10
  52. package/dist/core/config.d.ts +8 -0
  53. package/dist/core/config.d.ts.map +1 -1
  54. package/dist/core/config.js +16 -0
  55. package/dist/core/diagnostics/bundle.d.ts +16 -0
  56. package/dist/core/diagnostics/bundle.d.ts.map +1 -1
  57. package/dist/core/diagnostics/bundle.js +101 -7
  58. package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
  59. package/dist/core/events/v3/bootstrap.js +10 -0
  60. package/dist/core/events/v3/coordination-view.d.ts +3 -0
  61. package/dist/core/events/v3/coordination-view.d.ts.map +1 -1
  62. package/dist/core/events/v3/coordination-view.js +69 -8
  63. package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
  64. package/dist/core/events/v3/producers/intake.js +9 -2
  65. package/dist/core/events/v3/producers/recorder.d.ts +23 -0
  66. package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
  67. package/dist/core/events/v3/producers/recorder.js +264 -18
  68. package/dist/core/hooks/cli.js +120 -27
  69. package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
  70. package/dist/core/hooks/resolve/transcript.js +10 -3
  71. package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
  72. package/dist/core/hooks/session-name-presence.js +4 -1
  73. package/dist/core/qa-artifacts.d.ts +20 -0
  74. package/dist/core/qa-artifacts.d.ts.map +1 -0
  75. package/dist/core/qa-artifacts.js +110 -0
  76. package/dist/core/resources/contract.d.ts +6 -0
  77. package/dist/core/resources/contract.d.ts.map +1 -1
  78. package/dist/core/resources/sampler.d.ts +7 -0
  79. package/dist/core/resources/sampler.d.ts.map +1 -1
  80. package/dist/core/resources/sampler.js +106 -5
  81. package/dist/lib/admission.d.ts +71 -0
  82. package/dist/lib/admission.d.ts.map +1 -0
  83. package/dist/lib/admission.js +264 -0
  84. package/dist/lib/agent-browser/client.d.ts +1 -1
  85. package/dist/lib/agent-browser/client.d.ts.map +1 -1
  86. package/dist/lib/agent-browser/client.js +1 -5
  87. package/dist/lib/browser/capture-fidelity.d.ts +39 -0
  88. package/dist/lib/browser/capture-fidelity.d.ts.map +1 -0
  89. package/dist/lib/browser/capture-fidelity.js +84 -0
  90. package/dist/lib/browser/client.d.ts +41 -1
  91. package/dist/lib/browser/client.d.ts.map +1 -1
  92. package/dist/lib/browser/client.js +167 -9
  93. package/dist/lib/browser/critique.d.ts +38 -1
  94. package/dist/lib/browser/critique.d.ts.map +1 -1
  95. package/dist/lib/browser/critique.js +34 -6
  96. package/dist/lib/browser/index.d.ts +4 -2
  97. package/dist/lib/browser/index.d.ts.map +1 -1
  98. package/dist/lib/browser/index.js +2 -0
  99. package/dist/lib/browser/page-review-judge.d.ts +64 -0
  100. package/dist/lib/browser/page-review-judge.d.ts.map +1 -0
  101. package/dist/lib/browser/page-review-judge.js +270 -0
  102. package/dist/lib/browser/page-review-pack.d.ts +613 -0
  103. package/dist/lib/browser/page-review-pack.d.ts.map +1 -0
  104. package/dist/lib/browser/page-review-pack.js +1751 -0
  105. package/dist/lib/browser/qa-run-contracts.d.ts +214 -10
  106. package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
  107. package/dist/lib/browser/qa-run-contracts.js +136 -1
  108. package/dist/lib/browser/qa-run.d.ts +100 -10
  109. package/dist/lib/browser/qa-run.d.ts.map +1 -1
  110. package/dist/lib/browser/qa-run.js +768 -169
  111. package/dist/lib/browser/request-diagnostics.d.ts +13 -0
  112. package/dist/lib/browser/request-diagnostics.d.ts.map +1 -0
  113. package/dist/lib/browser/request-diagnostics.js +18 -0
  114. package/dist/lib/browser/tiling.d.ts +19 -0
  115. package/dist/lib/browser/tiling.d.ts.map +1 -1
  116. package/dist/lib/browser/tiling.js +28 -0
  117. package/dist/lib/cookies/client.d.ts +9 -0
  118. package/dist/lib/cookies/client.d.ts.map +1 -1
  119. package/dist/lib/cookies/client.js +197 -44
  120. package/dist/lib/cookies/extra.d.ts +18 -0
  121. package/dist/lib/cookies/extra.d.ts.map +1 -0
  122. package/dist/lib/cookies/extra.js +14 -0
  123. package/dist/lib/cookies/index.d.ts +2 -1
  124. package/dist/lib/cookies/index.d.ts.map +1 -1
  125. package/dist/lib/cookies/index.js +2 -1
  126. package/dist/lib/durable-job.d.ts +124 -0
  127. package/dist/lib/durable-job.d.ts.map +1 -0
  128. package/dist/lib/durable-job.js +296 -0
  129. package/dist/lib/http/client.d.ts +7 -1
  130. package/dist/lib/http/client.d.ts.map +1 -1
  131. package/dist/lib/http/client.js +2 -0
  132. package/dist/lib/instructions/templates.d.ts.map +1 -1
  133. package/dist/lib/instructions/templates.js +5 -2
  134. package/package.json +8 -2
  135. package/src/commander.ts +50 -2
  136. package/src/commands/admission.ts +699 -0
  137. package/src/commands/agents.ts +87 -1
  138. package/src/commands/artifacts.ts +97 -21
  139. package/src/commands/browse-ai.ts +10 -5
  140. package/src/commands/browse.ts +481 -20
  141. package/src/commands/fetch.ts +1 -0
  142. package/src/commands/qa-record.ts +682 -0
  143. package/src/commands/qa-run.ts +335 -16
  144. package/src/commands/qa-status.ts +608 -0
  145. package/src/commands/qa-verify.ts +238 -0
  146. package/src/commands/review-pack.ts +1281 -0
  147. package/src/core/agents/qa-signal.ts +261 -0
  148. package/src/core/agents/session-name-display.ts +78 -7
  149. package/src/core/agents/state/heartbeat-reader.ts +7 -0
  150. package/src/core/agents/state/heartbeat-writer.ts +23 -0
  151. package/src/core/agents/state/live-coordination-view.ts +1 -0
  152. package/src/core/agents/state/live-coordination-writer.ts +5 -0
  153. package/src/core/artifacts/constants.ts +1 -1
  154. package/src/core/artifacts/index.ts +370 -21
  155. package/src/core/config.ts +23 -0
  156. package/src/core/diagnostics/bundle.ts +119 -11
  157. package/src/core/events/v3/bootstrap.ts +10 -0
  158. package/src/core/events/v3/coordination-view.ts +100 -11
  159. package/src/core/events/v3/producers/intake.ts +9 -2
  160. package/src/core/events/v3/producers/recorder.ts +312 -18
  161. package/src/core/hooks/cli.ts +140 -32
  162. package/src/core/hooks/resolve/transcript.ts +10 -3
  163. package/src/core/hooks/session-name-presence.ts +6 -1
  164. package/src/core/qa-artifacts.ts +126 -0
  165. package/src/core/resources/contract.ts +7 -0
  166. package/src/core/resources/sampler.ts +138 -6
  167. package/src/lib/admission.ts +347 -0
  168. package/src/lib/agent-browser/client.ts +2 -10
  169. package/src/lib/browser/capture-fidelity.ts +98 -0
  170. package/src/lib/browser/client.ts +206 -10
  171. package/src/lib/browser/critique.ts +62 -7
  172. package/src/lib/browser/index.ts +36 -0
  173. package/src/lib/browser/page-review-judge.ts +360 -0
  174. package/src/lib/browser/page-review-pack.ts +2384 -0
  175. package/src/lib/browser/qa-run-contracts.ts +366 -3
  176. package/src/lib/browser/qa-run.ts +868 -190
  177. package/src/lib/browser/request-diagnostics.ts +27 -0
  178. package/src/lib/browser/tiling.ts +32 -0
  179. package/src/lib/cookies/client.ts +228 -42
  180. package/src/lib/cookies/extra.ts +28 -0
  181. package/src/lib/cookies/index.ts +2 -0
  182. package/src/lib/durable-job.ts +407 -0
  183. package/src/lib/http/client.ts +13 -1
  184. package/src/lib/instructions/templates.ts +5 -2
@@ -0,0 +1,613 @@
1
+ import type { CritiqueCoverage, CritiqueFinding, CritiqueTile } from "./critique.js";
2
+ import type { QaContext, QaSignature } from "./qa-plan.js";
3
+ export declare const PAGE_REVIEW_PACK_SCHEMA = "harnery-page-review/v1";
4
+ export declare const PAGE_REVIEW_FINDINGS_SCHEMA = "harnery-page-review-findings/v3";
5
+ /** Directory name a qa-run gives its pack inside the run directory. */
6
+ export declare const PAGE_REVIEW_PACK_DIRNAME = "pack";
7
+ export declare const PAGE_REVIEW_MANIFEST_FILENAME = "manifest.json";
8
+ export declare const PAGE_REVIEW_REVIEW_FILENAME = "review.md";
9
+ export declare const PAGE_REVIEW_FINDINGS_FILENAME = "findings.json";
10
+ export declare const PAGE_REVIEW_FINDINGS_SCHEMA_FILENAME = "findings.schema.json";
11
+ /** How long a pack lives after its judge (or its capture, when no judge
12
+ * runs) before the whole directory is deleted. Ruled 2026-09-02. */
13
+ export declare const PAGE_REVIEW_DEFAULT_RETENTION_MINUTES = 90;
14
+ /** The only file left behind when an expired pack is deleted. */
15
+ export declare const PAGE_REVIEW_EXPIRED_STUB_FILENAME = "pack-expired.json";
16
+ /** Reviewer dispositions a machine finding can carry in `findings.json`. */
17
+ export declare const PAGE_REVIEW_DISPOSITIONS: readonly ["confirmed", "artifact", "not-a-defect", "duplicate-of-gate"];
18
+ export type PageReviewDisposition = (typeof PAGE_REVIEW_DISPOSITIONS)[number];
19
+ /** Schema id and file name of the reviewed-outcome record `review-pack verdict` writes. */
20
+ export declare const PAGE_REVIEW_VERDICT_SCHEMA = "harnery-page-review-verdict/v2";
21
+ export declare const PAGE_REVIEW_VERDICT_FILENAME = "verdict.json";
22
+ export declare const PAGE_REVIEW_FINDING_SEVERITIES: readonly ["critical", "high", "medium", "low", "info"];
23
+ export type PageReviewFindingSeverity = (typeof PAGE_REVIEW_FINDING_SEVERITIES)[number];
24
+ export declare const PAGE_REVIEW_FINDING_CATEGORIES: readonly ["layout", "typography", "contrast", "content", "image", "interaction", "accessibility", "responsiveness", "render-artifact", "coverage", "other"];
25
+ export type PageReviewFindingCategory = (typeof PAGE_REVIEW_FINDING_CATEGORIES)[number];
26
+ export declare const PAGE_REVIEW_SUBAGENT_MODELS: readonly ["GPT-5.6 Luna", "Composer 2.5", "Haiku 4.5"];
27
+ export type PageReviewSubagentModel = (typeof PAGE_REVIEW_SUBAGENT_MODELS)[number];
28
+ /** One review-subagent finding in `findings.json`. */
29
+ export interface PageReviewReviewerFinding {
30
+ id: string;
31
+ severity: PageReviewFindingSeverity;
32
+ category: PageReviewFindingCategory;
33
+ context_id: string;
34
+ /** Tile ids (`T012`) or pack-relative file paths; never empty. */
35
+ evidence: string[];
36
+ observation: string;
37
+ recommendation?: string;
38
+ confidence?: number;
39
+ }
40
+ /** A reviewer's verdict on one machine finding in `evidence/critique.json`. */
41
+ export interface PageReviewDispositionRecord {
42
+ /** `<context-id>/<tile-id>#<n>`, n = 0-based position among the tile's findings. */
43
+ target: string;
44
+ disposition: PageReviewDisposition;
45
+ note?: string;
46
+ by?: string;
47
+ at?: string;
48
+ }
49
+ /** One review subagent's assigned and completed primary-tile work. */
50
+ export interface PageReviewDelegatedReviewRecord {
51
+ reviewer: string;
52
+ model: PageReviewSubagentModel;
53
+ /** `<context-id>/<tile-id>` entries assigned to this subagent. */
54
+ assigned_tiles: string[];
55
+ /** Assigned entries the subagent actually opened at native pixels. */
56
+ completed_tiles: string[];
57
+ status: "complete" | "incomplete";
58
+ }
59
+ /** The delegated-review `findings.json` document. */
60
+ export interface PageReviewFindingsDocument {
61
+ schema: string;
62
+ schema_path?: string;
63
+ target: string;
64
+ reviewer: string | null;
65
+ reviewed_at: string | null;
66
+ delegated_reviews: PageReviewDelegatedReviewRecord[];
67
+ findings: PageReviewReviewerFinding[];
68
+ dispositions?: PageReviewDispositionRecord[];
69
+ }
70
+ /** What `resolvePackVerdict` derives from the machine critique plus the reviewer's file. */
71
+ export interface PageReviewVerdict {
72
+ machine_outcome: "pass" | "fail" | "skipped" | "incomplete";
73
+ reviewed_outcome: "pass" | "fail" | "skipped" | "incomplete";
74
+ /** Machine `high` findings across every judged context. */
75
+ high_total: number;
76
+ high_confirmed: number;
77
+ /** Highs dispositioned `artifact`, `not-a-defect`, or `duplicate-of-gate`. */
78
+ high_dismissed: number;
79
+ /** Highs with no disposition; they still count against the page. */
80
+ high_open: number;
81
+ /** Review-subagent findings at `critical` or `high`; each counts against the page. */
82
+ reviewer_high: number;
83
+ /** Dispositions whose target matched a machine finding. */
84
+ dispositions_applied: number;
85
+ /** Disposition targets that name no machine finding in the critique. */
86
+ unmatched_dispositions: string[];
87
+ /** Primary tiles the inspection plan requires. */
88
+ primary_tiles_total: number;
89
+ /** Required tiles covered by a completed review-subagent record. */
90
+ primary_tiles_reviewed: number;
91
+ /** Required `<context-id>/<tile-id>` entries with no completed subagent review. */
92
+ uncovered_primary_tiles: string[];
93
+ }
94
+ export interface PageReviewVerdictDocument extends PageReviewVerdict {
95
+ schema: string;
96
+ reviewed_at: string;
97
+ }
98
+ /** How a context's tiles were cut: from one full-page screenshot (the
99
+ * default) or from per-band scrolled viewport captures (the fallback when the
100
+ * fidelity probe proved the full-page screenshot wrong). */
101
+ export interface PageReviewCaptureFidelity {
102
+ source: "full-page" | "scrolled-bands";
103
+ /** Bands re-shot by scroll-and-clip and compared with the full-page capture. */
104
+ probed: Array<{
105
+ tile_id: string;
106
+ scrollY: number;
107
+ height: number;
108
+ mismatch_ratio: number;
109
+ }>;
110
+ /** Tile ids whose probe exceeded the mismatch threshold. */
111
+ mismatched: string[];
112
+ mismatch_threshold: number;
113
+ }
114
+ /** Pack expiry as written into the manifest. `managed` is false for a pack
115
+ * written to an explicit `--out`; such a pack is never deleted automatically. */
116
+ export interface PageReviewRetention {
117
+ expires_at: string;
118
+ managed: boolean;
119
+ }
120
+ /** One tile as stored in the pack. `id` is stable within its context
121
+ * (`T001`, `T002`, …) and is what a finding cites. `file` is pack-relative. */
122
+ export interface PageReviewTileRecord {
123
+ id: string;
124
+ /** Tiler index (position in the capture's tile list). */
125
+ index: number;
126
+ label: string;
127
+ /** Selector the tile was cut for; absent for full-page bands. */
128
+ scope?: string;
129
+ /** `band` (full-page band), `scope` (selector tile), or `hit-band` (a band
130
+ * captured past the tile cap because a gate hit lands in it). Absent on
131
+ * packs written before this field existed; treat as `band`/`scope` by
132
+ * whether `scope` is set. */
133
+ kind?: "band" | "scope" | "hit-band";
134
+ x: number;
135
+ scrollY: number;
136
+ width: number;
137
+ height: number;
138
+ file: string;
139
+ sha256: string;
140
+ bytes: number;
141
+ }
142
+ /** One tile region re-captured at a higher device scale factor after the
143
+ * original capture (`review-pack expand`). The source tile is untouched; this
144
+ * record sits beside it. `file` is pack-relative. Optional and additive on the
145
+ * v1 context record. */
146
+ export interface PageReviewExpandedTileRecord {
147
+ /** Source tile id (`T012`). */
148
+ tile: string;
149
+ /** Device scale factor the region was rendered at (2 = twice the pixels). */
150
+ dpr: number;
151
+ /** Pixel size of the expanded PNG (source tile size × dpr, clamped). */
152
+ width: number;
153
+ height: number;
154
+ file: string;
155
+ sha256: string;
156
+ bytes: number;
157
+ captured_at: string;
158
+ }
159
+ /** The per-context contact sheet: every tile downscaled into one grid PNG
160
+ * for orientation. Reading order is row-major (left to right, then top to
161
+ * bottom) in tile id order; each cell carries its tile id stamped in its
162
+ * label band. Optional and additive on the v1 context record. */
163
+ export interface PageReviewContactSheetRecord {
164
+ file: string;
165
+ sha256: string;
166
+ bytes: number;
167
+ width: number;
168
+ height: number;
169
+ columns: number;
170
+ rows: number;
171
+ cell_width: number;
172
+ cell_height: number;
173
+ order: "row-major";
174
+ }
175
+ export interface PageReviewContextRecord {
176
+ id: string;
177
+ viewport: string;
178
+ theme: "light" | "dark";
179
+ state: string;
180
+ /** Rendered URL after navigation. */
181
+ url: string;
182
+ title?: string;
183
+ captured_at: string;
184
+ page: {
185
+ width: number;
186
+ height: number;
187
+ };
188
+ /** Full-page band coverage (what the tiler kept of the page). */
189
+ coverage: CritiqueCoverage;
190
+ scopes: Array<{
191
+ selector: string;
192
+ tiles: number;
193
+ }>;
194
+ /** Pack-relative file paths. `dom` ends in `.gz` (gzip) for packs written
195
+ * after the footprint change and in `.html` (plain) for older packs. */
196
+ files: {
197
+ full_page: string;
198
+ dom: string;
199
+ signature: string;
200
+ tiles: string;
201
+ context: string;
202
+ };
203
+ dom_sha256: string;
204
+ tiles: PageReviewTileRecord[];
205
+ /** Higher-DPR re-captures of single tiles, in the order they were made. */
206
+ expanded?: PageReviewExpandedTileRecord[];
207
+ /** Downscaled grid of every tile (`contacts.png`); absent for a context with no tiles. */
208
+ contact_sheet?: PageReviewContactSheetRecord;
209
+ /** Where the tiles came from and what the fidelity probe saw. Absent on
210
+ * packs written before the probe existed (tiles came from the full page). */
211
+ capture_fidelity?: PageReviewCaptureFidelity;
212
+ /** Bands captured past the tile cap because a gate hit lands in them. */
213
+ hit_bands?: number;
214
+ }
215
+ /** What a capture hands the pack for one context. `tiles` are the full-page
216
+ * bands; `scopeTiles` are selector tiles, one entry per selector. */
217
+ export interface PageReviewContextCapture {
218
+ context: QaContext & {
219
+ id?: string;
220
+ };
221
+ url: string;
222
+ title?: string;
223
+ fullPage: Buffer;
224
+ pageWidth: number;
225
+ pageHeight: number;
226
+ tiles: CritiqueTile[];
227
+ coverage: CritiqueCoverage;
228
+ scopeTiles?: Array<{
229
+ selector: string;
230
+ tiles: CritiqueTile[];
231
+ }>;
232
+ signature: QaSignature;
233
+ domHtml: string;
234
+ capturedAt?: string;
235
+ /** Result of the capture-fidelity probe (capture-fidelity.ts); absent when
236
+ * the capture did not probe. Copied onto the record as `capture_fidelity`. */
237
+ captureFidelity?: PageReviewCaptureFidelity;
238
+ /** Bands cut past the tile cap because a gate hit lands in them (their
239
+ * tiles sit in `tiles` after the kept bands, labelled `hit band N`). */
240
+ hitBands?: number;
241
+ }
242
+ /** One context's machine critique, as the judge records it into the pack. */
243
+ export interface PageReviewCritiqueRecord {
244
+ context_id: string;
245
+ provider: string;
246
+ tiles_total: number;
247
+ tiles_reviewed: number;
248
+ tiles_reused: number;
249
+ outcome: "pass" | "fail" | "skipped" | "incomplete";
250
+ findings: Array<CritiqueFinding & {
251
+ tile_id: string;
252
+ }>;
253
+ coverage: CritiqueCoverage;
254
+ error?: string;
255
+ }
256
+ export interface PageReviewRect {
257
+ x: number;
258
+ y: number;
259
+ width: number;
260
+ height: number;
261
+ }
262
+ /** One gate finding that carries a document-space rectangle (CSS px at the
263
+ * capture's device scale factor 1, the same space as tile `x`/`scrollY`). */
264
+ export interface PageReviewGateHit {
265
+ /** Check family the hit came from: runts, contrast, truncation, clip, … */
266
+ rule: string;
267
+ /** Short locator: the element label plus the check's own detail. */
268
+ label: string;
269
+ rect: PageReviewRect;
270
+ }
271
+ export interface PageReviewGateRecord {
272
+ context_id: string;
273
+ check_id: string;
274
+ outcome: "passed" | "failed" | "unknown";
275
+ failures: string[];
276
+ /** Rectangles the gate's envelope recorded; optional and additive. */
277
+ hits?: PageReviewGateHit[];
278
+ }
279
+ export interface PageReviewInspectionGateHit extends PageReviewGateHit {
280
+ check_id: string;
281
+ /** Tile ids whose rect intersects the hit; empty when no tile covers it. */
282
+ tiles: string[];
283
+ }
284
+ export interface PageReviewInspectionPlan {
285
+ schema: string;
286
+ purpose: string;
287
+ contexts: Array<{
288
+ context_id: string;
289
+ full_page: string;
290
+ /** Tiles review subagents must open for a complete review; everything else is drill-down. */
291
+ primary_tiles: Array<{
292
+ id: string;
293
+ file: string;
294
+ reason: string;
295
+ }>;
296
+ drilldown_tiles: number;
297
+ /** Every gate hit with a rectangle, mapped to the tiles that show it. */
298
+ gate_hits: PageReviewInspectionGateHit[];
299
+ }>;
300
+ }
301
+ export interface PageReviewPackManifest {
302
+ schema: string;
303
+ created_at: string;
304
+ target: string;
305
+ tested_revision?: string;
306
+ tool: {
307
+ name: string;
308
+ version?: string;
309
+ };
310
+ contexts: PageReviewContextRecord[];
311
+ gates: PageReviewGateRecord[];
312
+ critique: PageReviewCritiqueRecord[] | null;
313
+ pool?: {
314
+ concurrency: number;
315
+ wall_time_ms: number;
316
+ provider: string;
317
+ };
318
+ not_checked: Array<{
319
+ check: string;
320
+ reason: string;
321
+ }>;
322
+ warnings: string[];
323
+ /** Pack expiry; absent until the writer knows when the judge finished. */
324
+ retention?: PageReviewRetention;
325
+ /** Bytes on disk across every file in the pack at finalize time. */
326
+ size_bytes?: number;
327
+ files: {
328
+ review: string;
329
+ findings: string;
330
+ findings_schema: string;
331
+ inspection_plan: string;
332
+ coverage: string;
333
+ index: string;
334
+ inventory: string;
335
+ critique: string;
336
+ };
337
+ }
338
+ export declare function packPaths(packDir: string): {
339
+ dir: string;
340
+ manifest: string;
341
+ review: string;
342
+ findings: string;
343
+ findingsSchema: string;
344
+ evidenceDir: string;
345
+ inspectionPlan: string;
346
+ coverage: string;
347
+ index: string;
348
+ inventory: string;
349
+ critique: string;
350
+ verdict: string;
351
+ contextsDir: string;
352
+ contextDir: (contextId: string) => string;
353
+ };
354
+ export declare function sha256Hex(buffer: Buffer | string): string;
355
+ export declare function tileId(position: number): string;
356
+ /** Deterministic file name for an expanded tile: `T012@2x.png`. */
357
+ export declare function expandedTileFilename(tileId: string, dpr: number): string;
358
+ /**
359
+ * Crop one region out of a PNG buffer in pixel space. The rect is clamped to
360
+ * the image so an off-by-one never throws; the result is at least 1×1.
361
+ */
362
+ export declare function cropPngRegion(buffer: Buffer, rect: {
363
+ x: number;
364
+ y: number;
365
+ width: number;
366
+ height: number;
367
+ }): {
368
+ png: Buffer;
369
+ width: number;
370
+ height: number;
371
+ };
372
+ /**
373
+ * Locate one tile across a pack's contexts. With `contextId` the lookup is
374
+ * exact; without it the tile id must be unique across the given contexts,
375
+ * otherwise the caller has to name the context.
376
+ */
377
+ export declare function findPackTile(contexts: PageReviewContextRecord[], tileId: string, contextId?: string): {
378
+ context: PageReviewContextRecord;
379
+ tile: PageReviewTileRecord;
380
+ };
381
+ /**
382
+ * Write one tile region re-rendered at `dpr` into an existing context:
383
+ * `tiles/<tile>@<dpr>x.png` cropped from `fullPage` (a screenshot of the same
384
+ * page at that device scale factor, so the source tile's CSS-pixel rect is
385
+ * multiplied by `dpr`). Existing tiles are never touched; the context record
386
+ * gains or replaces one `expanded` entry for that tile + dpr and is rewritten.
387
+ */
388
+ export declare function writePackExpandedTile(packDir: string, contextId: string, input: {
389
+ tileId: string;
390
+ dpr: number;
391
+ capturedAt?: string;
392
+ } & ({
393
+ fullPage: Buffer;
394
+ region?: undefined;
395
+ } | {
396
+ fullPage?: undefined;
397
+ /** The tile's region already rendered at `dpr` (a scrolled viewport
398
+ * capture, `Browser.captureRegionByScroll`); written as is. */
399
+ region: Buffer;
400
+ })): {
401
+ record: PageReviewContextRecord;
402
+ expanded: PageReviewExpandedTileRecord;
403
+ };
404
+ /**
405
+ * Write one context's capture into the pack: `full-page.png`, `dom.html.gz`,
406
+ * `signature.json`, `tiles/T001.png…`, `tiles.json`, and `context.json`.
407
+ * Full-page bands come first, then each scope's tiles in selector order, so
408
+ * tile ids are stable for a given capture. Returns the record written.
409
+ */
410
+ export declare function writePackContext(packDir: string, capture: PageReviewContextCapture): PageReviewContextRecord;
411
+ export declare const CONTACT_SHEET_FILENAME = "contacts.png";
412
+ /** Tiles per row. Four 320 px cells plus gutters stay under a 1600 px sheet. */
413
+ export declare const CONTACT_SHEET_COLUMNS = 4;
414
+ /**
415
+ * Build one contact sheet from tile PNGs, in the order given: a fixed grid of
416
+ * `CONTACT_SHEET_COLUMNS` cells per row, each cell a label band stamped with
417
+ * the tile id above the tile downscaled (box filter, aspect kept, never
418
+ * upscaled) to fit the cell. Row-major reading order.
419
+ */
420
+ export declare function buildContactSheet(tiles: Array<{
421
+ id: string;
422
+ png: Buffer;
423
+ }>): {
424
+ png: Buffer;
425
+ width: number;
426
+ height: number;
427
+ columns: number;
428
+ rows: number;
429
+ cell_width: number;
430
+ cell_height: number;
431
+ };
432
+ /**
433
+ * Write (or rewrite) a context's `contacts.png` from its tiles and record it
434
+ * on the context. Tile bytes are read from the pack unless supplied. A
435
+ * context with no tiles gets no sheet and its record is returned unchanged.
436
+ */
437
+ export declare function writePackContactSheet(packDir: string, record: PageReviewContextRecord, tilePngs?: Map<string, Buffer>): PageReviewContextRecord;
438
+ /** Context ids present in the pack, in directory order. */
439
+ export declare function listPackContexts(packDir: string): string[];
440
+ export declare function readPackContext(packDir: string, contextId: string): PageReviewContextRecord;
441
+ /**
442
+ * Load a context's tiles back as `CritiqueTile`s (PNG bytes read from disk
443
+ * and base64-encoded), verifying each file against its recorded digest so a
444
+ * judge never reviews a tile that was altered after capture.
445
+ */
446
+ export declare function readPackTiles(packDir: string, record: PageReviewContextRecord): Array<CritiqueTile & {
447
+ id: string;
448
+ scope?: string;
449
+ }>;
450
+ export declare function readPackFullPage(packDir: string, record: PageReviewContextRecord): Buffer;
451
+ export declare function readPackSignature(packDir: string, record: PageReviewContextRecord): QaSignature;
452
+ /** Read a context's serialized DOM, inflating a gzip-compressed `dom.html.gz`
453
+ * and reading an older plain `dom.html` as-is. */
454
+ export declare function readPackDom(packDir: string, record: PageReviewContextRecord): string;
455
+ export declare function readPackManifest(packDir: string): PageReviewPackManifest;
456
+ /** Read the bounded primary-tile plan used to prove delegated review coverage. */
457
+ export declare function readPackInspectionPlan(packDir: string): PageReviewInspectionPlan;
458
+ export declare function readPackFindings(packDir: string): PageReviewFindingsDocument;
459
+ /** Write `findings.json` atomically: a temp file beside it, then a rename. */
460
+ export declare function writePackFindings(packDir: string, doc: PageReviewFindingsDocument): void;
461
+ /**
462
+ * Check a findings document against the rules `findingsSchemaDocument()`
463
+ * states, by hand so the toolkit tier carries no validator dependency.
464
+ * Returns every violation found; an empty array means the document is valid.
465
+ */
466
+ export declare function validateFindingsDocument(doc: unknown): string[];
467
+ /** `<context-id>/<tile-id>#<n>` for the n-th finding of a tile in one context. */
468
+ export declare function dispositionTarget(contextId: string, tileId: string, n: number): string;
469
+ /**
470
+ * Every machine finding in the critique, keyed by its disposition target.
471
+ * `n` counts a tile's findings in critique order, all severities included, so
472
+ * a reviewer can point at the second finding on T006 as `ctx/T006#1`.
473
+ */
474
+ export declare function machineFindingTargets(critique: PageReviewCritiqueRecord[] | null): Map<string, CritiqueFinding & {
475
+ tile_id: string;
476
+ context_id: string;
477
+ }>;
478
+ /**
479
+ * Combine the immutable machine critique with the reviewer's dispositions and
480
+ * findings into one reviewed outcome. A machine `high` counts against the page
481
+ * unless a reviewer dispositioned it `artifact`, `not-a-defect`, or
482
+ * `duplicate-of-gate`; `confirmed` and undispositioned highs count; so does a
483
+ * review-subagent finding at `critical` or `high`. Nothing here rewrites the
484
+ * critique: `evidence/critique.json` stays the machine record.
485
+ */
486
+ export declare function resolvePackVerdict(manifest: Pick<PageReviewPackManifest, "critique">, inspectionPlan: PageReviewInspectionPlan, findings: PageReviewFindingsDocument): PageReviewVerdict;
487
+ /** The verdict a previous `review-pack verdict` wrote, or undefined when none exists. */
488
+ export declare function readPackVerdict(packDir: string): PageReviewVerdictDocument | undefined;
489
+ export interface FinalizePageReviewPackInput {
490
+ packDir: string;
491
+ target: string;
492
+ tested_revision?: string;
493
+ contexts: PageReviewContextRecord[];
494
+ gates?: PageReviewGateRecord[];
495
+ /** Null or absent until the judge has run. */
496
+ critique?: PageReviewCritiqueRecord[] | null;
497
+ pool?: {
498
+ concurrency: number;
499
+ wall_time_ms: number;
500
+ provider: string;
501
+ };
502
+ not_checked?: Array<{
503
+ check: string;
504
+ reason: string;
505
+ }>;
506
+ warnings?: string[];
507
+ tool?: {
508
+ name: string;
509
+ version?: string;
510
+ };
511
+ /** Command the reader can run to judge the pack, shown in review.md. */
512
+ judgeCommand?: string;
513
+ createdAt?: string;
514
+ /** Pack expiry to record; omit to keep whatever the manifest already says. */
515
+ retention?: PageReviewRetention;
516
+ }
517
+ export declare function findingsSchemaDocument(): Record<string, unknown>;
518
+ /** Most hits one envelope contributes; a runaway sweep must not bloat the pack. */
519
+ export declare const GATE_HITS_PER_ENVELOPE = 50;
520
+ /**
521
+ * Pull every rectangle-bearing finding out of a `browse` JSON envelope so the
522
+ * inspection plan can point at the tiles that show it. Covers the checks
523
+ * whose results carry a document-space rect: runts, truncation, contrast,
524
+ * placeholder, image, clip, overlap, crowd, align, gap, overflow, and
525
+ * target-size (`hit`). Anything without a rect is skipped; the gate's
526
+ * `failures` lines still describe it. Capped at `GATE_HITS_PER_ENVELOPE`.
527
+ */
528
+ export declare function gateHitsFromEnvelope(envelope: Record<string, unknown> | undefined): PageReviewGateHit[];
529
+ /** Tile ids whose rect intersects `rect` (both in document-space px). */
530
+ export declare function tilesCoveringRect(tiles: PageReviewTileRecord[], rect: PageReviewRect): string[];
531
+ export declare function buildInspectionPlan(contexts: PageReviewContextRecord[], critique: PageReviewCritiqueRecord[] | null | undefined, gates?: PageReviewGateRecord[]): PageReviewInspectionPlan;
532
+ /**
533
+ * Write the pack's navigation layer: manifest, evidence files, the findings
534
+ * skeleton and schema (never overwriting a findings file a reviewer already
535
+ * filled), and `review.md`. Safe to call twice: once after capture, again
536
+ * after the judge so machine findings land in the plan and the review.
537
+ */
538
+ export declare function finalizePageReviewPack(input: FinalizePageReviewPackInput): {
539
+ manifest: string;
540
+ review: string;
541
+ };
542
+ export declare function renderReviewMarkdown(manifest: PageReviewPackManifest, plan: PageReviewInspectionPlan, judgeCommand?: string, verdict?: PageReviewVerdictDocument): string;
543
+ /** Schema of the stub left behind when an expired pack is deleted. */
544
+ export declare const PAGE_REVIEW_EXPIRED_SCHEMA = "harnery-page-review-expired/v1";
545
+ /** What remains of a deleted pack: enough for a result document's
546
+ * `review_pack.dir` to explain itself without the evidence. */
547
+ export interface PageReviewExpiredStub {
548
+ schema: typeof PAGE_REVIEW_EXPIRED_SCHEMA;
549
+ target: string;
550
+ created_at: string;
551
+ expires_at: string;
552
+ deleted_at: string;
553
+ /** Contexts the pack held before deletion. */
554
+ contexts: number;
555
+ /** Aggregate of the manifest's critique outcomes; null when no judge ran. */
556
+ machine_outcome: PageReviewCritiqueRecord["outcome"] | null;
557
+ }
558
+ /** One pack as seen by the expiry sweep. `expires_at`, `size_bytes`, and
559
+ * `managed` are null when the manifest does not carry them; such a pack is
560
+ * never deleted. */
561
+ export interface PageReviewPackRow {
562
+ dir: string;
563
+ target: string;
564
+ created_at: string;
565
+ expires_at: string | null;
566
+ size_bytes: number | null;
567
+ managed: boolean | null;
568
+ /** `retention.expires_at` is in the past (at the sweep's `now`). */
569
+ expired: boolean;
570
+ }
571
+ export interface DeleteExpiredPacksInput {
572
+ /** Directories to search; see `findPageReviewPacks` for the shape searched. */
573
+ roots: string[];
574
+ /** Sweep clock (default: the wall clock). */
575
+ now?: Date;
576
+ /** Also delete packs whose manifest says `managed: false` (an explicit
577
+ * `--out`). Default false: only the store's own packs are touched. */
578
+ includeUnmanaged?: boolean;
579
+ /** Report without touching the filesystem. */
580
+ dryRun: boolean;
581
+ }
582
+ export interface DeleteExpiredPacksResult {
583
+ /** Every pack found under the roots, deletable or not. */
584
+ candidates: PageReviewPackRow[];
585
+ /** Packs removed by this call; under `dryRun`, the packs that would be. */
586
+ deleted: PageReviewPackRow[];
587
+ }
588
+ /**
589
+ * Every page review pack under the given roots. A pack is a directory whose
590
+ * `manifest.json` carries the pack schema. Each root is searched as: the root
591
+ * itself, each immediate child workspace, and `run-<id>/pack` under the root and
592
+ * under each workspace (the layout of the managed artifact store, where a
593
+ * `review-pack` workspace is itself the pack and a `qa-run` workspace holds
594
+ * one pack per run). Nothing deeper is walked.
595
+ */
596
+ export declare function findPageReviewPacks(roots: string[]): string[];
597
+ /** Whether the sweep may delete this pack: expired, and either managed by the
598
+ * store or explicitly included. A pack without retention never qualifies. */
599
+ export declare function isPackDeletable(row: PageReviewPackRow, includeUnmanaged?: boolean): boolean;
600
+ /** One verdict for the whole pack from its per-context critique rows: any
601
+ * fail is a fail, otherwise the weakest non-pass outcome, otherwise pass. */
602
+ export declare function aggregateMachineOutcome(critique: PageReviewCritiqueRecord[] | null | undefined): PageReviewCritiqueRecord["outcome"] | null;
603
+ /**
604
+ * Delete every expired pack under the roots and leave `pack-expired.json` in
605
+ * its place. Deletion removes every entry inside the pack directory except
606
+ * the artifact store's own `.harnery-artifact.json` (a standalone review-pack
607
+ * workspace is the pack, and the store still owns the workspace). Nothing
608
+ * outside the pack directory is touched. Only a pack whose manifest carries
609
+ * `retention.expires_at` in the past is eligible, and an unmanaged pack
610
+ * (explicit `--out`) only when `includeUnmanaged` is set.
611
+ */
612
+ export declare function deleteExpiredPacks(input: DeleteExpiredPacksInput): DeleteExpiredPacksResult;
613
+ //# sourceMappingURL=page-review-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-review-pack.d.ts","sourceRoot":"","sources":["../../../src/lib/browser/page-review-pack.ts"],"names":[],"mappings":"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"}