perfgraph 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -0
  3. package/dist/causal/builder.d.ts +34 -0
  4. package/dist/causal/builder.d.ts.map +1 -0
  5. package/dist/causal/builder.js +132 -0
  6. package/dist/causal/builder.js.map +1 -0
  7. package/dist/causal/index.d.ts +11 -0
  8. package/dist/causal/index.d.ts.map +1 -0
  9. package/dist/causal/index.js +10 -0
  10. package/dist/causal/index.js.map +1 -0
  11. package/dist/causal/rules/js.d.ts +49 -0
  12. package/dist/causal/rules/js.d.ts.map +1 -0
  13. package/dist/causal/rules/js.js +209 -0
  14. package/dist/causal/rules/js.js.map +1 -0
  15. package/dist/causal/rules/layout.d.ts +39 -0
  16. package/dist/causal/rules/layout.d.ts.map +1 -0
  17. package/dist/causal/rules/layout.js +169 -0
  18. package/dist/causal/rules/layout.js.map +1 -0
  19. package/dist/causal/rules/lcp.d.ts +49 -0
  20. package/dist/causal/rules/lcp.d.ts.map +1 -0
  21. package/dist/causal/rules/lcp.js +250 -0
  22. package/dist/causal/rules/lcp.js.map +1 -0
  23. package/dist/causal/rules/network.d.ts +39 -0
  24. package/dist/causal/rules/network.d.ts.map +1 -0
  25. package/dist/causal/rules/network.js +140 -0
  26. package/dist/causal/rules/network.js.map +1 -0
  27. package/dist/causal/types.d.ts +142 -0
  28. package/dist/causal/types.d.ts.map +1 -0
  29. package/dist/causal/types.js +88 -0
  30. package/dist/causal/types.js.map +1 -0
  31. package/dist/cli/analyze.d.ts +33 -0
  32. package/dist/cli/analyze.d.ts.map +1 -0
  33. package/dist/cli/analyze.js +137 -0
  34. package/dist/cli/analyze.js.map +1 -0
  35. package/dist/cli/collect.d.ts +28 -0
  36. package/dist/cli/collect.d.ts.map +1 -0
  37. package/dist/cli/collect.js +125 -0
  38. package/dist/cli/collect.js.map +1 -0
  39. package/dist/cli/extract.d.ts +31 -0
  40. package/dist/cli/extract.d.ts.map +1 -0
  41. package/dist/cli/extract.js +135 -0
  42. package/dist/cli/extract.js.map +1 -0
  43. package/dist/cli/mcp.d.ts +14 -0
  44. package/dist/cli/mcp.d.ts.map +1 -0
  45. package/dist/cli/mcp.js +53 -0
  46. package/dist/cli/mcp.js.map +1 -0
  47. package/dist/cli/normalize.d.ts +58 -0
  48. package/dist/cli/normalize.d.ts.map +1 -0
  49. package/dist/cli/normalize.js +179 -0
  50. package/dist/cli/normalize.js.map +1 -0
  51. package/dist/cli/report.d.ts +33 -0
  52. package/dist/cli/report.d.ts.map +1 -0
  53. package/dist/cli/report.js +137 -0
  54. package/dist/cli/report.js.map +1 -0
  55. package/dist/cli/run.d.ts +49 -0
  56. package/dist/cli/run.d.ts.map +1 -0
  57. package/dist/cli/run.js +243 -0
  58. package/dist/cli/run.js.map +1 -0
  59. package/dist/collect/buffer-monitor.d.ts +25 -0
  60. package/dist/collect/buffer-monitor.d.ts.map +1 -0
  61. package/dist/collect/buffer-monitor.js +69 -0
  62. package/dist/collect/buffer-monitor.js.map +1 -0
  63. package/dist/collect/console.d.ts +25 -0
  64. package/dist/collect/console.d.ts.map +1 -0
  65. package/dist/collect/console.js +82 -0
  66. package/dist/collect/console.js.map +1 -0
  67. package/dist/collect/coverage.d.ts +26 -0
  68. package/dist/collect/coverage.d.ts.map +1 -0
  69. package/dist/collect/coverage.js +99 -0
  70. package/dist/collect/coverage.js.map +1 -0
  71. package/dist/collect/dom.d.ts +37 -0
  72. package/dist/collect/dom.d.ts.map +1 -0
  73. package/dist/collect/dom.js +118 -0
  74. package/dist/collect/dom.js.map +1 -0
  75. package/dist/collect/lighthouse.d.ts +41 -0
  76. package/dist/collect/lighthouse.d.ts.map +1 -0
  77. package/dist/collect/lighthouse.js +111 -0
  78. package/dist/collect/lighthouse.js.map +1 -0
  79. package/dist/collect/network.d.ts +32 -0
  80. package/dist/collect/network.d.ts.map +1 -0
  81. package/dist/collect/network.js +236 -0
  82. package/dist/collect/network.js.map +1 -0
  83. package/dist/collect/orchestrator.d.ts +23 -0
  84. package/dist/collect/orchestrator.d.ts.map +1 -0
  85. package/dist/collect/orchestrator.js +350 -0
  86. package/dist/collect/orchestrator.js.map +1 -0
  87. package/dist/collect/performance.d.ts +28 -0
  88. package/dist/collect/performance.d.ts.map +1 -0
  89. package/dist/collect/performance.js +108 -0
  90. package/dist/collect/performance.js.map +1 -0
  91. package/dist/collect/runtime.d.ts +26 -0
  92. package/dist/collect/runtime.d.ts.map +1 -0
  93. package/dist/collect/runtime.js +81 -0
  94. package/dist/collect/runtime.js.map +1 -0
  95. package/dist/collect/session.d.ts +58 -0
  96. package/dist/collect/session.d.ts.map +1 -0
  97. package/dist/collect/session.js +162 -0
  98. package/dist/collect/session.js.map +1 -0
  99. package/dist/collect/trace.d.ts +40 -0
  100. package/dist/collect/trace.d.ts.map +1 -0
  101. package/dist/collect/trace.js +127 -0
  102. package/dist/collect/trace.js.map +1 -0
  103. package/dist/collect/types.d.ts +317 -0
  104. package/dist/collect/types.d.ts.map +1 -0
  105. package/dist/collect/types.js +12 -0
  106. package/dist/collect/types.js.map +1 -0
  107. package/dist/distill/insights.d.ts +67 -0
  108. package/dist/distill/insights.d.ts.map +1 -0
  109. package/dist/distill/insights.js +317 -0
  110. package/dist/distill/insights.js.map +1 -0
  111. package/dist/distill/summaries.d.ts +71 -0
  112. package/dist/distill/summaries.d.ts.map +1 -0
  113. package/dist/distill/summaries.js +165 -0
  114. package/dist/distill/summaries.js.map +1 -0
  115. package/dist/extract/critical-path.d.ts +17 -0
  116. package/dist/extract/critical-path.d.ts.map +1 -0
  117. package/dist/extract/critical-path.js +95 -0
  118. package/dist/extract/critical-path.js.map +1 -0
  119. package/dist/extract/index.d.ts +16 -0
  120. package/dist/extract/index.d.ts.map +1 -0
  121. package/dist/extract/index.js +32 -0
  122. package/dist/extract/index.js.map +1 -0
  123. package/dist/extract/js-hotspots.d.ts +15 -0
  124. package/dist/extract/js-hotspots.d.ts.map +1 -0
  125. package/dist/extract/js-hotspots.js +22 -0
  126. package/dist/extract/js-hotspots.js.map +1 -0
  127. package/dist/extract/layout-shifts.d.ts +19 -0
  128. package/dist/extract/layout-shifts.d.ts.map +1 -0
  129. package/dist/extract/layout-shifts.js +47 -0
  130. package/dist/extract/layout-shifts.js.map +1 -0
  131. package/dist/extract/lcp-breakdown.d.ts +19 -0
  132. package/dist/extract/lcp-breakdown.d.ts.map +1 -0
  133. package/dist/extract/lcp-breakdown.js +110 -0
  134. package/dist/extract/lcp-breakdown.js.map +1 -0
  135. package/dist/extract/main-thread.d.ts +16 -0
  136. package/dist/extract/main-thread.d.ts.map +1 -0
  137. package/dist/extract/main-thread.js +41 -0
  138. package/dist/extract/main-thread.js.map +1 -0
  139. package/dist/extract/render-blocking.d.ts +16 -0
  140. package/dist/extract/render-blocking.d.ts.map +1 -0
  141. package/dist/extract/render-blocking.js +79 -0
  142. package/dist/extract/render-blocking.js.map +1 -0
  143. package/dist/extract/third-party.d.ts +15 -0
  144. package/dist/extract/third-party.d.ts.map +1 -0
  145. package/dist/extract/third-party.js +127 -0
  146. package/dist/extract/third-party.js.map +1 -0
  147. package/dist/extract/types.d.ts +183 -0
  148. package/dist/extract/types.d.ts.map +1 -0
  149. package/dist/extract/types.js +118 -0
  150. package/dist/extract/types.js.map +1 -0
  151. package/dist/index.d.ts +20 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +188 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/mcp/handlers.d.ts +72 -0
  156. package/dist/mcp/handlers.d.ts.map +1 -0
  157. package/dist/mcp/handlers.js +285 -0
  158. package/dist/mcp/handlers.js.map +1 -0
  159. package/dist/mcp/progress.d.ts +37 -0
  160. package/dist/mcp/progress.d.ts.map +1 -0
  161. package/dist/mcp/progress.js +51 -0
  162. package/dist/mcp/progress.js.map +1 -0
  163. package/dist/mcp/prompts.d.ts +57 -0
  164. package/dist/mcp/prompts.d.ts.map +1 -0
  165. package/dist/mcp/prompts.js +225 -0
  166. package/dist/mcp/prompts.js.map +1 -0
  167. package/dist/mcp/resources.d.ts +48 -0
  168. package/dist/mcp/resources.d.ts.map +1 -0
  169. package/dist/mcp/resources.js +149 -0
  170. package/dist/mcp/resources.js.map +1 -0
  171. package/dist/mcp/server.d.ts +34 -0
  172. package/dist/mcp/server.d.ts.map +1 -0
  173. package/dist/mcp/server.js +452 -0
  174. package/dist/mcp/server.js.map +1 -0
  175. package/dist/mcp/types.d.ts +47 -0
  176. package/dist/mcp/types.d.ts.map +1 -0
  177. package/dist/mcp/types.js +67 -0
  178. package/dist/mcp/types.js.map +1 -0
  179. package/dist/normalize/clock.d.ts +40 -0
  180. package/dist/normalize/clock.d.ts.map +1 -0
  181. package/dist/normalize/clock.js +96 -0
  182. package/dist/normalize/clock.js.map +1 -0
  183. package/dist/normalize/dom-ir.d.ts +16 -0
  184. package/dist/normalize/dom-ir.d.ts.map +1 -0
  185. package/dist/normalize/dom-ir.js +48 -0
  186. package/dist/normalize/dom-ir.js.map +1 -0
  187. package/dist/normalize/index.d.ts +23 -0
  188. package/dist/normalize/index.d.ts.map +1 -0
  189. package/dist/normalize/index.js +118 -0
  190. package/dist/normalize/index.js.map +1 -0
  191. package/dist/normalize/lighthouse-insights.d.ts +27 -0
  192. package/dist/normalize/lighthouse-insights.d.ts.map +1 -0
  193. package/dist/normalize/lighthouse-insights.js +318 -0
  194. package/dist/normalize/lighthouse-insights.js.map +1 -0
  195. package/dist/normalize/lighthouse-ir.d.ts +25 -0
  196. package/dist/normalize/lighthouse-ir.d.ts.map +1 -0
  197. package/dist/normalize/lighthouse-ir.js +151 -0
  198. package/dist/normalize/lighthouse-ir.js.map +1 -0
  199. package/dist/normalize/network-ir.d.ts +23 -0
  200. package/dist/normalize/network-ir.d.ts.map +1 -0
  201. package/dist/normalize/network-ir.js +180 -0
  202. package/dist/normalize/network-ir.js.map +1 -0
  203. package/dist/normalize/runtime-ir.d.ts +18 -0
  204. package/dist/normalize/runtime-ir.d.ts.map +1 -0
  205. package/dist/normalize/runtime-ir.js +114 -0
  206. package/dist/normalize/runtime-ir.js.map +1 -0
  207. package/dist/normalize/trace-ir.d.ts +20 -0
  208. package/dist/normalize/trace-ir.d.ts.map +1 -0
  209. package/dist/normalize/trace-ir.js +224 -0
  210. package/dist/normalize/trace-ir.js.map +1 -0
  211. package/dist/normalize/types.d.ts +536 -0
  212. package/dist/normalize/types.d.ts.map +1 -0
  213. package/dist/normalize/types.js +242 -0
  214. package/dist/normalize/types.js.map +1 -0
  215. package/dist/output/manifest.d.ts +44 -0
  216. package/dist/output/manifest.d.ts.map +1 -0
  217. package/dist/output/manifest.js +232 -0
  218. package/dist/output/manifest.js.map +1 -0
  219. package/dist/output/toon.d.ts +19 -0
  220. package/dist/output/toon.d.ts.map +1 -0
  221. package/dist/output/toon.js +22 -0
  222. package/dist/output/toon.js.map +1 -0
  223. package/dist/output/writer.d.ts +31 -0
  224. package/dist/output/writer.d.ts.map +1 -0
  225. package/dist/output/writer.js +51 -0
  226. package/dist/output/writer.js.map +1 -0
  227. package/dist/report/analyzer.d.ts +29 -0
  228. package/dist/report/analyzer.d.ts.map +1 -0
  229. package/dist/report/analyzer.js +330 -0
  230. package/dist/report/analyzer.js.map +1 -0
  231. package/dist/report/index.d.ts +13 -0
  232. package/dist/report/index.d.ts.map +1 -0
  233. package/dist/report/index.js +12 -0
  234. package/dist/report/index.js.map +1 -0
  235. package/dist/report/markdown.d.ts +21 -0
  236. package/dist/report/markdown.d.ts.map +1 -0
  237. package/dist/report/markdown.js +182 -0
  238. package/dist/report/markdown.js.map +1 -0
  239. package/dist/report/remediations.d.ts +42 -0
  240. package/dist/report/remediations.d.ts.map +1 -0
  241. package/dist/report/remediations.js +179 -0
  242. package/dist/report/remediations.js.map +1 -0
  243. package/dist/report/scorer.d.ts +35 -0
  244. package/dist/report/scorer.d.ts.map +1 -0
  245. package/dist/report/scorer.js +72 -0
  246. package/dist/report/scorer.js.map +1 -0
  247. package/dist/report/types.d.ts +201 -0
  248. package/dist/report/types.d.ts.map +1 -0
  249. package/dist/report/types.js +149 -0
  250. package/dist/report/types.js.map +1 -0
  251. package/dist/shared/fs-utils.d.ts +12 -0
  252. package/dist/shared/fs-utils.d.ts.map +1 -0
  253. package/dist/shared/fs-utils.js +44 -0
  254. package/dist/shared/fs-utils.js.map +1 -0
  255. package/dist/shared/types.d.ts +69 -0
  256. package/dist/shared/types.d.ts.map +1 -0
  257. package/dist/shared/types.js +18 -0
  258. package/dist/shared/types.js.map +1 -0
  259. package/dist/shared/utils.d.ts +6 -0
  260. package/dist/shared/utils.d.ts.map +1 -0
  261. package/dist/shared/utils.js +9 -0
  262. package/dist/shared/utils.js.map +1 -0
  263. package/package.json +67 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Collector interfaces, result types, and raw data types.
3
+ *
4
+ * Each collector produces a CollectorResult that wraps its domain-specific
5
+ * raw data. RawDataBundle aggregates all collectors' output for a single run.
6
+ *
7
+ * All type definitions live here to avoid circular module dependencies
8
+ * between types.ts and the collector implementations.
9
+ */
10
+ import type { CDPSession } from 'playwright';
11
+ import type { CollectorRunOptions } from '../shared/types.js';
12
+ /** Wrapped result from a collector's stop() method */
13
+ export type CollectorResult<T> = {
14
+ ok: true;
15
+ data: T;
16
+ } | {
17
+ ok: false;
18
+ error: string;
19
+ };
20
+ /** Every collector implements this interface */
21
+ export interface Collector {
22
+ /** Human-readable collector name (e.g. "trace", "network") */
23
+ readonly name: string;
24
+ /**
25
+ * Start collecting data.
26
+ * Called after the CDP session is established but before navigation.
27
+ */
28
+ start(session: CDPSession, options?: CollectorRunOptions): Promise<void>;
29
+ /**
30
+ * Stop collecting data and return the collected payload.
31
+ * Called after the page has finished loading.
32
+ */
33
+ stop(): Promise<CollectorResult<unknown>>;
34
+ }
35
+ /**
36
+ * Aggregated output from all collectors for a single run.
37
+ * Each field is optional — a collector may fail without blocking others.
38
+ */
39
+ export interface RawDataBundle {
40
+ trace?: unknown;
41
+ network?: unknown;
42
+ performance?: unknown;
43
+ runtime?: unknown;
44
+ coverage?: CoverageRawData;
45
+ consoleEntries?: unknown;
46
+ dom?: unknown;
47
+ lighthouse?: unknown;
48
+ warnings?: string[];
49
+ }
50
+ /** A single trace event from the Tracing domain */
51
+ export interface TraceEvent {
52
+ /** Event categories (comma-separated) */
53
+ cat: string;
54
+ /** Event name */
55
+ name: string;
56
+ /** Event phase (B/b=begin, E/e=end, I=instant, etc.) */
57
+ ph: string;
58
+ /** Timestamp in microseconds */
59
+ ts: number;
60
+ /** Process ID */
61
+ pid: number;
62
+ /** Thread ID */
63
+ tid: number;
64
+ /** Event arguments */
65
+ args: Record<string, unknown>;
66
+ /** Duration in microseconds (for complete events) */
67
+ dur?: number;
68
+ /** Thread duration */
69
+ tdur?: number;
70
+ }
71
+ /** Structured output from TraceCollector */
72
+ export interface TraceRawData {
73
+ /** All collected trace events in chronological order */
74
+ events: TraceEvent[];
75
+ /** Collection metadata */
76
+ metadata: {
77
+ /** Categories that were requested for tracing */
78
+ categories: string[];
79
+ /** Total number of events collected */
80
+ totalEvents: number;
81
+ /** Number of dataCollected callbacks received */
82
+ dataCollectedCount: number;
83
+ };
84
+ /** Warnings generated during collection (buffer overflow, missing events, etc.) */
85
+ warnings: string[];
86
+ }
87
+ /** Sample from Tracing.bufferUsage event */
88
+ export interface BufferUsageSample {
89
+ /** Buffer usage value (0.0 – 1.0) */
90
+ value: number;
91
+ /** Wall-clock timestamp when the sample was taken */
92
+ timestamp: number;
93
+ }
94
+ /** Resource timing breakdown from CDP (Network.Response.timing) */
95
+ export interface NetworkTiming {
96
+ requestTime: number;
97
+ proxyStart: number;
98
+ proxyEnd: number;
99
+ dnsStart: number;
100
+ dnsEnd: number;
101
+ connectStart: number;
102
+ connectEnd: number;
103
+ sslStart: number;
104
+ sslEnd: number;
105
+ workerStart: number;
106
+ workerReady: number;
107
+ workerFetchStart: number;
108
+ workerRespondWithSettled: number;
109
+ sendStart: number;
110
+ sendEnd: number;
111
+ pushStart: number;
112
+ pushEnd: number;
113
+ receiveHeadersEnd: number;
114
+ }
115
+ /** Describes a captured network request and its response */
116
+ export interface NetworkRequestEntry {
117
+ /** Unique request identifier from CDP */
118
+ requestId: string;
119
+ /** Request URL (final URL after redirects) */
120
+ url: string;
121
+ /** HTTP method (GET, POST, etc.) */
122
+ method: string;
123
+ /** Resource type (Document, Script, Image, XHR, Fetch, etc.) */
124
+ type?: string;
125
+ /** Request metadata */
126
+ request: {
127
+ headers: Record<string, string>;
128
+ postData?: string;
129
+ initialPriority?: string;
130
+ referrerPolicy?: string;
131
+ };
132
+ /** Response metadata (present if the request completed) */
133
+ response?: {
134
+ status: number;
135
+ statusText: string;
136
+ headers: Record<string, string>;
137
+ mimeType: string;
138
+ /** Resource timing breakdown */
139
+ timing?: NetworkTiming;
140
+ fromDiskCache?: boolean;
141
+ fromServiceWorker?: boolean;
142
+ encodedDataLength: number;
143
+ responseTime?: number;
144
+ protocol?: string;
145
+ remoteIPAddress?: string;
146
+ remotePort?: number;
147
+ };
148
+ /** Whether the request failed */
149
+ failed?: boolean;
150
+ /** Error description (present when failed) */
151
+ errorText?: string;
152
+ /** Whether the request was canceled */
153
+ canceled?: boolean;
154
+ /** Reason the request was blocked */
155
+ blockedReason?: string;
156
+ /** Initiator information */
157
+ initiator?: {
158
+ type: string;
159
+ url?: string;
160
+ lineNumber?: number;
161
+ stack?: {
162
+ callFrames: Array<{
163
+ functionName: string;
164
+ scriptId: string;
165
+ url: string;
166
+ lineNumber: number;
167
+ columnNumber: number;
168
+ }>;
169
+ };
170
+ };
171
+ /** CDP monotonic timestamp (seconds) */
172
+ timestamp: number;
173
+ /** UTC wall time (seconds since epoch) */
174
+ wallTime?: number;
175
+ /** Whether the request was served from cache */
176
+ fromCache?: boolean;
177
+ /** Redirect chain responses (if any redirects occurred) */
178
+ redirectChain?: Array<{
179
+ url: string;
180
+ status: number;
181
+ statusText: string;
182
+ headers: Record<string, string>;
183
+ timing?: NetworkTiming;
184
+ encodedDataLength: number;
185
+ }>;
186
+ }
187
+ /** Structured output from NetworkCollector */
188
+ export interface NetworkRawData {
189
+ /** All captured network requests in chronological order */
190
+ requests: NetworkRequestEntry[];
191
+ /** Collection metadata */
192
+ metadata: {
193
+ totalRequests: number;
194
+ totalFailed: number;
195
+ totalBytes: number;
196
+ startTime: number;
197
+ endTime: number;
198
+ };
199
+ /** Warnings generated during collection */
200
+ warnings: string[];
201
+ }
202
+ /** A single performance metric entry */
203
+ export interface PerformanceMetric {
204
+ name: string;
205
+ value: number;
206
+ }
207
+ /** Structured output from PerformanceCollector */
208
+ export interface PerformanceRawData {
209
+ /** Final snapshot metrics from Performance.getMetrics */
210
+ metrics: PerformanceMetric[];
211
+ /** Timestamp when the metrics snapshot was taken */
212
+ timestamp: number;
213
+ /** Warnings generated during collection */
214
+ warnings: string[];
215
+ }
216
+ /** Information about a single JavaScript execution context */
217
+ export interface RuntimeExecutionContext {
218
+ id: number;
219
+ origin: string;
220
+ name: string;
221
+ }
222
+ /** Runtime metrics evaluated in the page context */
223
+ export interface RuntimeStats {
224
+ jsHeapSize: number;
225
+ domNodeCount: number;
226
+ documentUrl: string;
227
+ }
228
+ /** Structured output from RuntimeCollector */
229
+ export interface RuntimeRawData {
230
+ contexts: RuntimeExecutionContext[];
231
+ stats?: RuntimeStats;
232
+ warnings: string[];
233
+ }
234
+ /** A single covered range within a script or stylesheet */
235
+ export interface CoverageRange {
236
+ startOffset: number;
237
+ endOffset: number;
238
+ count: number;
239
+ }
240
+ /** Coverage data for a single function within a script */
241
+ export interface ScriptFunctionCoverage {
242
+ functionName: string;
243
+ ranges: CoverageRange[];
244
+ isBlockCoverage: boolean;
245
+ }
246
+ /** Coverage data for a single script */
247
+ export interface ScriptCoverage {
248
+ scriptId: string;
249
+ url: string;
250
+ functions: ScriptFunctionCoverage[];
251
+ }
252
+ /** Coverage data for a single stylesheet */
253
+ export interface StyleCoverage {
254
+ styleSheetId: string;
255
+ url: string;
256
+ ranges: CoverageRange[];
257
+ }
258
+ /** Structured output from CoverageCollector */
259
+ export interface CoverageRawData {
260
+ js: ScriptCoverage[];
261
+ css: StyleCoverage[];
262
+ warnings: string[];
263
+ }
264
+ /** Supported console message types */
265
+ export type ConsoleEntryType = 'log' | 'warn' | 'error' | 'info' | 'debug' | 'assert' | 'dir' | 'dirxml' | 'table' | 'trace' | 'clear' | 'startGroup' | 'startGroupCollapsed' | 'endGroup' | 'count' | 'timeEnd' | 'profile' | 'profileEnd';
266
+ /** A single stack frame from the call site */
267
+ export interface ConsoleStackFrame {
268
+ url: string;
269
+ lineNumber: number;
270
+ columnNumber: number;
271
+ functionName?: string;
272
+ }
273
+ /** A single console API call entry */
274
+ export interface ConsoleEntry {
275
+ timestamp: number;
276
+ type: ConsoleEntryType;
277
+ args: unknown[];
278
+ stackTrace?: ConsoleStackFrame[];
279
+ }
280
+ /** Severity counts for all captured console entries */
281
+ export interface ConsoleCounts {
282
+ log: number;
283
+ warn: number;
284
+ error: number;
285
+ info: number;
286
+ debug: number;
287
+ other: number;
288
+ }
289
+ /** Structured output from ConsoleCollector */
290
+ export interface ConsoleRawData {
291
+ entries: ConsoleEntry[];
292
+ counts: ConsoleCounts;
293
+ warnings: string[];
294
+ }
295
+ /** Aggregate DOM statistics */
296
+ export interface DomStats {
297
+ totalNodes: number;
298
+ elementCount: number;
299
+ maxDepth: number;
300
+ textContentLength: number;
301
+ }
302
+ /** Structured output from DOMCollector */
303
+ export interface DomRawData {
304
+ stats: DomStats;
305
+ elementDistribution: Record<string, number>;
306
+ warnings: string[];
307
+ }
308
+ /** Lighthouse category identifiers we audit by default */
309
+ export type LighthouseCategory = 'performance' | 'accessibility' | 'best-practices' | 'seo';
310
+ /** Structured output from LighthouseCollector */
311
+ export interface LighthouseRawData {
312
+ /** Full Lighthouse Result object (LHR) */
313
+ lhr: Record<string, unknown>;
314
+ categories: LighthouseCategory[];
315
+ warnings: string[];
316
+ }
317
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/collect/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Collector interfaces, result types, and raw data types.
3
+ *
4
+ * Each collector produces a CollectorResult that wraps its domain-specific
5
+ * raw data. RawDataBundle aggregates all collectors' output for a single run.
6
+ *
7
+ * All type definitions live here to avoid circular module dependencies
8
+ * between types.ts and the collector implementations.
9
+ */
10
+ export {};
11
+ // (No remaining type stubs — all collector types are now defined above)
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/collect/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;;AA0YH,wEAAwE"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Agent-optimized summary layer that fuses Lighthouse insights,
3
+ * extracted features, and evidence data into a compact Insights structure.
4
+ *
5
+ * The result can be serialized to `insights.toon` (~5-15 KB for a typical SPA).
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { FeatureSet } from '../extract/types.js';
10
+ export interface CriticalPathNode {
11
+ url: string;
12
+ durationMs?: number;
13
+ children?: CriticalPathNode[];
14
+ }
15
+ export interface Insights {
16
+ url: string;
17
+ analyzedAt: string;
18
+ lighthouse: {
19
+ performance?: number;
20
+ accessibility?: number;
21
+ bestPractices?: number;
22
+ seo?: number;
23
+ lcpMs?: number;
24
+ fcpMs?: number;
25
+ cls?: number;
26
+ tbtMs?: number;
27
+ };
28
+ lcpElement?: {
29
+ selector: string;
30
+ snippet?: string;
31
+ nodeLabel?: string;
32
+ renderDelayMs?: number;
33
+ resourceLoadDelayMs?: number;
34
+ resourceLoadTimeMs?: number;
35
+ ttfbMs?: number;
36
+ };
37
+ renderBlocking: Array<{
38
+ url: string;
39
+ bytes?: number;
40
+ wastedMs?: number;
41
+ }>;
42
+ criticalPath?: {
43
+ depth: number;
44
+ longestChainMs?: number;
45
+ tree?: CriticalPathNode;
46
+ };
47
+ warnings: string[];
48
+ topRecommendations: Array<{
49
+ priority: 'critical' | 'high' | 'medium';
50
+ title: string;
51
+ action: string;
52
+ evidence?: string[];
53
+ }>;
54
+ }
55
+ /**
56
+ * Build a compact Insights structure from extracted features and raw
57
+ * Lighthouse data.
58
+ *
59
+ * The result is designed to be serialized as `insights.toon` (~5-15 KB)
60
+ * and consumed by AI agents for quick performance diagnosis.
61
+ *
62
+ * @param features - Extracted feature set from `extract()`
63
+ * @param lighthouseJson - Raw Lighthouse JSON (LighthouseRawData or plain LHR)
64
+ * @returns A compact Insights structure
65
+ */
66
+ export declare function buildInsights(features: FeatureSet, lighthouseJson: unknown): Insights;
67
+ //# sourceMappingURL=insights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../src/distill/insights.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAWtD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE;QACV,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,EAAE,KAAK,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,gBAAgB,CAAC;KACzB,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB,EAAE,KAAK,CAAC;QACxB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,CAAC;CACJ;AA8SD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,UAAU,EACpB,cAAc,EAAE,OAAO,GACtB,QAAQ,CAqFV"}