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,242 @@
1
+ /**
2
+ * IR (Intermediate Representation) Zod schemas and inferred TypeScript types.
3
+ *
4
+ * All IR types use relative timestamps (ms since navigationStart) for
5
+ * consistent downstream analysis regardless of the original clock domain.
6
+ *
7
+ * Every schema has a corresponding inferred type exported for use in
8
+ * function signatures and property access without manual type annotations.
9
+ */
10
+ import { z } from 'zod';
11
+ // ---------------------------------------------------------------------------
12
+ // Performance IR
13
+ // ---------------------------------------------------------------------------
14
+ export const PerformanceNavigationSchema = z.object({
15
+ url: z.string(),
16
+ navigationStart: z.number(),
17
+ domContentLoaded: z.number(),
18
+ domContentLoadedEventEnd: z.number(),
19
+ loadEventStart: z.number(),
20
+ loadEventEnd: z.number(),
21
+ domInteractive: z.number(),
22
+ title: z.string().optional(),
23
+ });
24
+ export const CoreWebVitalsSchema = z.object({
25
+ fcp: z.number().optional(),
26
+ lcp: z.number().optional(),
27
+ cls: z.number().optional(),
28
+ tbt: z.number().optional(),
29
+ inp: z.number().optional(),
30
+ });
31
+ export const ThreadActivitySchema = z.object({
32
+ totalMs: z.number(),
33
+ byCategory: z.record(z.string(), z.number()),
34
+ });
35
+ export const TraceSummarySchema = z.object({
36
+ totalDuration: z.number(),
37
+ eventCount: z.number(),
38
+ categories: z.record(z.string(), z.number()),
39
+ threadActivity: ThreadActivitySchema,
40
+ });
41
+ export const PerformanceIRSchema = z.object({
42
+ navigation: PerformanceNavigationSchema,
43
+ coreWebVitals: CoreWebVitalsSchema,
44
+ traceSummary: TraceSummarySchema,
45
+ mainThreadBusyness: z.number().min(0).max(1),
46
+ });
47
+ // ---------------------------------------------------------------------------
48
+ // Network IR
49
+ // ---------------------------------------------------------------------------
50
+ export const NormalizedRequestTimingSchema = z.object({
51
+ dns: z.number().optional(),
52
+ connect: z.number().optional(),
53
+ ssl: z.number().optional(),
54
+ wait: z.number().optional(),
55
+ receive: z.number().optional(),
56
+ });
57
+ export const NormalizedRequestSchema = z.object({
58
+ url: z.string(),
59
+ method: z.string(),
60
+ resourceType: z.string(),
61
+ statusCode: z.number().int(),
62
+ startTime: z.number(),
63
+ endTime: z.number(),
64
+ duration: z.number(),
65
+ bytes: z.number(),
66
+ priority: z.string(),
67
+ initiator: z.string(),
68
+ initiatorUrl: z.string().optional(),
69
+ failed: z.boolean(),
70
+ timing: NormalizedRequestTimingSchema,
71
+ });
72
+ export const NormalizedRequestChainSchema = z.object({
73
+ url: z.string(),
74
+ length: z.number(),
75
+ });
76
+ export const CriticalPathTreeNodeSchema = z.lazy(() => z.object({
77
+ url: z.string(),
78
+ durationMs: z.number().optional(),
79
+ children: z.array(CriticalPathTreeNodeSchema).optional(),
80
+ }));
81
+ export const CriticalPathInfoSchema = z.object({
82
+ tree: CriticalPathTreeNodeSchema,
83
+ depth: z.number().int().nonnegative(),
84
+ urlsOnLongestPath: z.array(z.string()),
85
+ });
86
+ export const NetworkIRSummarySchema = z.object({
87
+ totalRequests: z.number(),
88
+ totalBytes: z.number(),
89
+ byType: z.record(z.string(), z.number()),
90
+ byPriority: z.record(z.string(), z.number()),
91
+ criticalPath: CriticalPathInfoSchema,
92
+ longestChain: NormalizedRequestChainSchema,
93
+ });
94
+ export const NetworkIRSchema = z.object({
95
+ requests: z.array(NormalizedRequestSchema),
96
+ summary: NetworkIRSummarySchema,
97
+ });
98
+ // ---------------------------------------------------------------------------
99
+ // Runtime IR
100
+ // ---------------------------------------------------------------------------
101
+ export const RuntimeIRStatsSchema = z.object({
102
+ totalJSHeapSize: z.number().optional(),
103
+ usedJSHeapSize: z.number().optional(),
104
+ jsHeapSizeLimit: z.number().optional(),
105
+ });
106
+ export const ExecutionContextSchema = z.object({
107
+ id: z.number(),
108
+ origin: z.string(),
109
+ name: z.string().optional(),
110
+ });
111
+ export const EventLoopStatsSchema = z.object({
112
+ totalBlockingDuration: z.number(),
113
+ longTasks: z.number(),
114
+ maxBlockingDuration: z.number(),
115
+ });
116
+ export const HydrationCostSchema = z.object({
117
+ bootupTime: z.number(),
118
+ evaluatedScripts: z.number(),
119
+ });
120
+ export const RuntimeIRSchema = z.object({
121
+ jsHeapStats: RuntimeIRStatsSchema.optional(),
122
+ executionContexts: z.array(ExecutionContextSchema),
123
+ eventLoopStats: EventLoopStatsSchema.optional(),
124
+ hydrationCost: HydrationCostSchema.optional(),
125
+ });
126
+ // ---------------------------------------------------------------------------
127
+ // DOM IR
128
+ // ---------------------------------------------------------------------------
129
+ export const DOMStatsSchema = z.object({
130
+ totalNodes: z.number(),
131
+ elementCount: z.number(),
132
+ maxDepth: z.number(),
133
+ maxChildren: z.number(),
134
+ });
135
+ export const TagCountSchema = z.object({
136
+ tag: z.string(),
137
+ count: z.number(),
138
+ });
139
+ export const LayoutShiftCandidatesSchema = z.object({
140
+ highComplexitySubtrees: z.number(),
141
+ deepNesting: z.number(),
142
+ });
143
+ export const DOMIRSchema = z.object({
144
+ stats: DOMStatsSchema,
145
+ tagDistribution: z.array(TagCountSchema),
146
+ layoutShiftCandidates: LayoutShiftCandidatesSchema,
147
+ });
148
+ // ---------------------------------------------------------------------------
149
+ // Lighthouse IR
150
+ // ---------------------------------------------------------------------------
151
+ export const LighthouseCategorySchema = z.object({
152
+ title: z.string(),
153
+ score: z.number().min(0).max(1),
154
+ });
155
+ export const LighthouseFailedAuditSchema = z.object({
156
+ id: z.string(),
157
+ title: z.string(),
158
+ description: z.string(),
159
+ score: z.number(),
160
+ numericValue: z.number().optional(),
161
+ });
162
+ export const LighthouseScoresSchema = z.object({
163
+ performance: z.number().min(0).max(1).optional(),
164
+ accessibility: z.number().min(0).max(1).optional(),
165
+ bestPractices: z.number().min(0).max(1).optional(),
166
+ seo: z.number().min(0).max(1).optional(),
167
+ });
168
+ export const RenderBlockingResourceSchema = z.object({
169
+ url: z.string(),
170
+ totalBytes: z.number().optional(),
171
+ wastedMs: z.number().optional(),
172
+ resourceType: z.string().optional(),
173
+ });
174
+ export const RenderBlockingInsightSchema = z.object({
175
+ fcpSavingsMs: z.number().optional(),
176
+ lcpSavingsMs: z.number().optional(),
177
+ resources: z.array(RenderBlockingResourceSchema),
178
+ });
179
+ export const LighthouseIRSchema = z.object({
180
+ categories: z.record(z.string(), LighthouseCategorySchema),
181
+ failedAudits: z.array(LighthouseFailedAuditSchema),
182
+ scores: LighthouseScoresSchema,
183
+ /** Lighthouse LCP numeric value in ms (fallback when trace lacks LCP) */
184
+ lcpNumericValue: z.number().optional(),
185
+ /** LCP element selector from lcp-breakdown-insight */
186
+ lcpElementSelector: z.string().optional(),
187
+ /** LCP element snippet from lcp-breakdown-insight */
188
+ lcpElementSnippet: z.string().optional(),
189
+ /** LCP element node label from lcp-breakdown-insight */
190
+ lcpElementNodeLabel: z.string().optional(),
191
+ /** Render-blocking resources with URL, bytes, and wasted ms */
192
+ renderBlockingResources: z.array(RenderBlockingResourceSchema).optional(),
193
+ });
194
+ // ---------------------------------------------------------------------------
195
+ // Lighthouse Insights (v13+ insight audits)
196
+ // ---------------------------------------------------------------------------
197
+ export const LCPBreakdownInsightSchema = z.object({
198
+ timeToFirstByte: z.number(),
199
+ resourceLoadDelay: z.number().optional(),
200
+ resourceLoadTime: z.number().optional(),
201
+ elementRenderDelay: z.number(),
202
+ lcpElementSelector: z.string().optional(),
203
+ lcpElementSnippet: z.string().optional(),
204
+ lcpElementNodeLabel: z.string().optional(),
205
+ source: z.enum(['trace', 'lighthouse', 'mixed']),
206
+ });
207
+ export const NetworkChainNodeSchema = z.lazy(() => z.object({
208
+ url: z.string(),
209
+ navStartToEndTime: z.number(),
210
+ transferSize: z.number().optional(),
211
+ isLongest: z.boolean().optional(),
212
+ children: z.record(z.string(), NetworkChainNodeSchema).optional(),
213
+ }));
214
+ export const NetworkDependencyTreeInsightSchema = z.object({
215
+ chains: z.record(z.string(), NetworkChainNodeSchema).optional(),
216
+ longestChainDuration: z.number().optional(),
217
+ longestChainUrls: z.array(z.string()).optional(),
218
+ preconnectCandidates: z.array(z.string()).optional(),
219
+ });
220
+ export const LighthouseInsightsSchema = z.object({
221
+ lcpBreakdown: LCPBreakdownInsightSchema.optional(),
222
+ renderBlocking: RenderBlockingInsightSchema.optional(),
223
+ networkDependencyTree: NetworkDependencyTreeInsightSchema.optional(),
224
+ });
225
+ // ---------------------------------------------------------------------------
226
+ // IR Bundle
227
+ // ---------------------------------------------------------------------------
228
+ export const IRMetaSchema = z.object({
229
+ url: z.string(),
230
+ fetchedAt: z.string(),
231
+ navigationStart: z.number(),
232
+ irVersion: z.literal('1.0.0'),
233
+ });
234
+ export const IRBundleSchema = z.strictObject({
235
+ meta: IRMetaSchema,
236
+ performance: PerformanceIRSchema,
237
+ network: NetworkIRSchema,
238
+ runtime: RuntimeIRSchema,
239
+ dom: DOMIRSchema,
240
+ lighthouse: LighthouseIRSchema,
241
+ });
242
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/normalize/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Manifest generator — scans a run directory and produces a manifest.toon
3
+ * listing all known artifacts with descriptions, sizes, and recommended read order.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ /** A single artifact entry in the manifest. */
8
+ export interface ManifestEntry {
9
+ /** File name (e.g. "report.toon") */
10
+ filename: string;
11
+ /** Human-readable description of what this artifact contains */
12
+ description: string;
13
+ /** Recommended read order — lower values should be read first */
14
+ readOrder?: number;
15
+ /** File size in bytes, if available */
16
+ sizeBytes?: number;
17
+ }
18
+ /** The full manifest document written as manifest.toon. */
19
+ export interface Manifest {
20
+ /** Absolute path to the run directory */
21
+ runDir: string;
22
+ /** ISO timestamp when the manifest was generated */
23
+ generatedAt: string;
24
+ /** All discovered artifacts */
25
+ artifacts: ManifestEntry[];
26
+ /** Filenames in recommended reading order (subset of artifacts) */
27
+ recommendedReadOrder: string[];
28
+ }
29
+ /**
30
+ * Scan a PerfGraph run directory and write a manifest.toon describing all
31
+ * discovered artifacts.
32
+ *
33
+ * Only files listed in the known-artifacts table are included with
34
+ * descriptions and read-order hints; any other JSON / TOON files present in the
35
+ * directory are listed with their filename and size only.
36
+ *
37
+ * The manifest includes itself after writing, so the `manifest.toon` entry
38
+ * always carries the correct size.
39
+ *
40
+ * @param dir - Absolute or relative path to the run directory
41
+ * @returns Absolute path to the written manifest.toon
42
+ */
43
+ export declare function writeManifest(dir: string): Promise<string>;
44
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/output/manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IACvB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,mEAAmE;IACnE,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AA8HD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+HhE"}
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Manifest generator — scans a run directory and produces a manifest.toon
3
+ * listing all known artifacts with descriptions, sizes, and recommended read order.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ import { readdir, stat, writeFile } from 'node:fs/promises';
8
+ import { join, resolve } from 'node:path';
9
+ import { convertToon } from './toon.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Known artifacts
12
+ // ---------------------------------------------------------------------------
13
+ /** Canonical list of known artifacts with descriptions and suggested read order. */
14
+ const KNOWN_ARTIFACTS = [
15
+ {
16
+ filename: 'insights.toon',
17
+ description: 'Agent-optimized performance summary with Lighthouse scores, LCP breakdown, render-blocking URLs, and top recommendations',
18
+ readOrder: 1,
19
+ },
20
+ {
21
+ filename: 'report.md',
22
+ description: 'Human-readable performance report in Markdown with score summary, issues, causal chains, and recommendations',
23
+ readOrder: 2,
24
+ },
25
+ {
26
+ filename: 'report.toon',
27
+ description: 'Full diagnostic report with issues sorted by severity, causal chains, and remediation text',
28
+ readOrder: 3,
29
+ },
30
+ {
31
+ filename: 'manifest.toon',
32
+ description: 'This file — artifact index with descriptions and sizes',
33
+ readOrder: 3,
34
+ },
35
+ {
36
+ filename: 'features.toon',
37
+ description: 'Raw diagnostic features: LCP breakdown, critical path, TBT, CLS, render-blocking score',
38
+ readOrder: 4,
39
+ },
40
+ {
41
+ filename: 'graph.toon',
42
+ description: 'Causal degradation graph — DAG of performance issues and their relationships',
43
+ readOrder: 5,
44
+ },
45
+ {
46
+ filename: 'ir.json',
47
+ description: 'Normalized Intermediate Representation (IRBundle) — all collected data in a validated schema',
48
+ readOrder: 6,
49
+ },
50
+ {
51
+ filename: 'lighthouse.json',
52
+ description: 'Full Lighthouse v13+ audit results (large — read only for deep dives)',
53
+ readOrder: 7,
54
+ },
55
+ {
56
+ filename: 'network.json',
57
+ description: 'Raw network request data (large — read only for deep dives)',
58
+ readOrder: 8,
59
+ },
60
+ {
61
+ filename: 'network-summary.toon',
62
+ description: 'Top 20 requests by duration, blocking list, initiator chain summary',
63
+ readOrder: 9,
64
+ },
65
+ {
66
+ filename: 'lighthouse-summary.toon',
67
+ description: 'Lighthouse categories and failed insight audits only',
68
+ readOrder: 10,
69
+ },
70
+ {
71
+ filename: 'coverage-summary.toon',
72
+ description: 'Unused bytes by URL, top 10 files',
73
+ readOrder: 11,
74
+ },
75
+ {
76
+ filename: 'trace.json',
77
+ description: 'Raw Chrome trace events (very large — read only for deep dives)',
78
+ readOrder: 12,
79
+ },
80
+ {
81
+ filename: 'performance.json',
82
+ description: 'Performance API metrics from the page',
83
+ readOrder: 13,
84
+ },
85
+ {
86
+ filename: 'runtime.json',
87
+ description: 'JS heap stats, execution contexts, event loop',
88
+ readOrder: 14,
89
+ },
90
+ {
91
+ filename: 'console.json',
92
+ description: 'Captured console log entries',
93
+ readOrder: 15,
94
+ },
95
+ {
96
+ filename: 'dom.json',
97
+ description: 'DOM snapshot and statistics',
98
+ readOrder: 16,
99
+ },
100
+ {
101
+ filename: 'warnings.json',
102
+ description: 'Collection warnings (missing data, incomplete traces)',
103
+ readOrder: 17,
104
+ },
105
+ {
106
+ filename: 'runs-summary.json',
107
+ description: 'Summary across multiple collection runs (only when --runs > 1)',
108
+ readOrder: 18,
109
+ },
110
+ ];
111
+ // ---------------------------------------------------------------------------
112
+ // Public API
113
+ // ---------------------------------------------------------------------------
114
+ /**
115
+ * Scan a PerfGraph run directory and write a manifest.toon describing all
116
+ * discovered artifacts.
117
+ *
118
+ * Only files listed in the known-artifacts table are included with
119
+ * descriptions and read-order hints; any other JSON / TOON files present in the
120
+ * directory are listed with their filename and size only.
121
+ *
122
+ * The manifest includes itself after writing, so the `manifest.toon` entry
123
+ * always carries the correct size.
124
+ *
125
+ * @param dir - Absolute or relative path to the run directory
126
+ * @returns Absolute path to the written manifest.toon
127
+ */
128
+ export async function writeManifest(dir) {
129
+ const resolvedDir = resolve(dir);
130
+ // -----------------------------------------------------------------------
131
+ // 1. Scan the directory (exclude manifest.toon since we're about to write it)
132
+ // -----------------------------------------------------------------------
133
+ const dirEntries = await readdir(resolvedDir, { withFileTypes: true });
134
+ const existingFiles = new Set(dirEntries
135
+ .filter((e) => e.isFile() && e.name !== 'manifest.toon')
136
+ .map((e) => e.name));
137
+ // -----------------------------------------------------------------------
138
+ // 2. Build artifact entries
139
+ // -----------------------------------------------------------------------
140
+ const artifacts = [];
141
+ // 2a. Known artifacts that actually exist
142
+ for (const known of KNOWN_ARTIFACTS) {
143
+ if (known.filename === 'manifest.toon')
144
+ continue; // handled after writing
145
+ if (!existingFiles.has(known.filename))
146
+ continue;
147
+ let sizeBytes;
148
+ try {
149
+ const s = await stat(join(resolvedDir, known.filename));
150
+ sizeBytes = s.size;
151
+ }
152
+ catch {
153
+ // stat failed — skip size
154
+ }
155
+ artifacts.push({
156
+ filename: known.filename,
157
+ description: known.description,
158
+ readOrder: known.readOrder,
159
+ sizeBytes,
160
+ });
161
+ }
162
+ // 2b. Any other JSON / TOON files not in the known list
163
+ for (const filename of existingFiles) {
164
+ if ((!filename.endsWith('.json') && !filename.endsWith('.toon')) ||
165
+ KNOWN_ARTIFACTS.some((a) => a.filename === filename)) {
166
+ continue;
167
+ }
168
+ let sizeBytes;
169
+ try {
170
+ const s = await stat(join(resolvedDir, filename));
171
+ sizeBytes = s.size;
172
+ }
173
+ catch {
174
+ // ignore
175
+ }
176
+ artifacts.push({ filename, description: '', sizeBytes });
177
+ }
178
+ // -----------------------------------------------------------------------
179
+ // 3. Sort — known artifacts by readOrder, unknown artifacts after
180
+ // -----------------------------------------------------------------------
181
+ artifacts.sort((a, b) => {
182
+ const aOrder = a.readOrder ?? 999;
183
+ const bOrder = b.readOrder ?? 999;
184
+ if (aOrder !== bOrder)
185
+ return aOrder - bOrder;
186
+ return a.filename.localeCompare(b.filename);
187
+ });
188
+ const recommendedReadOrder = artifacts
189
+ .filter((a) => a.readOrder !== undefined)
190
+ .sort((a, b) => (a.readOrder ?? 0) - (b.readOrder ?? 0))
191
+ .map((a) => a.filename);
192
+ // -----------------------------------------------------------------------
193
+ // 4. First write (without self-referential manifest.toon entry)
194
+ // -----------------------------------------------------------------------
195
+ const manifestPath = join(resolvedDir, 'manifest.toon');
196
+ await writeFile(manifestPath, await convertToon({
197
+ runDir: resolvedDir,
198
+ generatedAt: new Date().toISOString(),
199
+ artifacts,
200
+ recommendedReadOrder,
201
+ }), 'utf-8');
202
+ // -----------------------------------------------------------------------
203
+ // 5. Add self-referential entry and re-write with correct size
204
+ // -----------------------------------------------------------------------
205
+ const manifestStat = await stat(manifestPath);
206
+ artifacts.push({
207
+ filename: 'manifest.toon',
208
+ description: 'This file — artifact index with descriptions and sizes',
209
+ readOrder: 3,
210
+ sizeBytes: manifestStat.size,
211
+ });
212
+ // Re-sort with the new entry
213
+ artifacts.sort((a, b) => {
214
+ const aOrder = a.readOrder ?? 999;
215
+ const bOrder = b.readOrder ?? 999;
216
+ if (aOrder !== bOrder)
217
+ return aOrder - bOrder;
218
+ return a.filename.localeCompare(b.filename);
219
+ });
220
+ const updatedReadOrder = artifacts
221
+ .filter((a) => a.readOrder !== undefined)
222
+ .sort((a, b) => (a.readOrder ?? 0) - (b.readOrder ?? 0))
223
+ .map((a) => a.filename);
224
+ await writeFile(manifestPath, await convertToon({
225
+ runDir: resolvedDir,
226
+ generatedAt: new Date().toISOString(),
227
+ artifacts,
228
+ recommendedReadOrder: updatedReadOrder,
229
+ }), 'utf-8');
230
+ return manifestPath;
231
+ }
232
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/output/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * TOON format converter — encodes JSON-serializable data to TOON format
3
+ * using @toon-format/toon for token-efficient LLM consumption.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ /**
8
+ * Encode any JSON-serializable value into TOON format string.
9
+ *
10
+ * TOON (Token-Oriented Object Notation) is a compact, human-readable,
11
+ * schema-aware encoding of JSON designed to minimise token usage in
12
+ * LLM prompts. It declares array lengths and field headers once, then
13
+ * streams row values.
14
+ *
15
+ * @param data - Any JSON-serializable value (object, array, primitive)
16
+ * @returns A TOON-formatted string
17
+ */
18
+ export declare function convertToon(data: unknown): Promise<string>;
19
+ //# sourceMappingURL=toon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toon.d.ts","sourceRoot":"","sources":["../../src/output/toon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhE"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * TOON format converter — encodes JSON-serializable data to TOON format
3
+ * using @toon-format/toon for token-efficient LLM consumption.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ import { encode } from '@toon-format/toon';
8
+ /**
9
+ * Encode any JSON-serializable value into TOON format string.
10
+ *
11
+ * TOON (Token-Oriented Object Notation) is a compact, human-readable,
12
+ * schema-aware encoding of JSON designed to minimise token usage in
13
+ * LLM prompts. It declares array lengths and field headers once, then
14
+ * streams row values.
15
+ *
16
+ * @param data - Any JSON-serializable value (object, array, primitive)
17
+ * @returns A TOON-formatted string
18
+ */
19
+ export async function convertToon(data) {
20
+ return encode(data);
21
+ }
22
+ //# sourceMappingURL=toon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toon.js","sourceRoot":"","sources":["../../src/output/toon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAa;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Output writer — creates timestamped directories and writes JSON data.
3
+ */
4
+ /**
5
+ * Create a timestamped output directory under the given base path.
6
+ *
7
+ * Directory format: `perfgraph_<hostname>_<YYYYMMDD_HHmmss>`
8
+ *
9
+ * @param basePath - Base directory for output
10
+ * @param url - Source URL (used to extract hostname for directory naming)
11
+ * @returns Absolute path to the created directory
12
+ */
13
+ export declare function createOutputDir(basePath: string, url: string): Promise<string>;
14
+ /**
15
+ * Write a JSON-serializable value to a file inside the given directory.
16
+ *
17
+ * @param dir - Target directory
18
+ * @param filename - File name (e.g. "trace.json")
19
+ * @param data - Data to serialize as JSON
20
+ * @returns Full path to the written file
21
+ */
22
+ export declare function writeJsonFile(dir: string, filename: string, data: unknown): Promise<string>;
23
+ /**
24
+ * Write a warnings file to the given directory.
25
+ *
26
+ * @param dir - Target directory
27
+ * @param warnings - Array of warning strings
28
+ * @returns Full path to the written file
29
+ */
30
+ export declare function writeWarnings(dir: string, warnings: string[]): Promise<string>;
31
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/output/writer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpF;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAIjG;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAKpF"}