@perfonext/render-mcp 0.3.0 → 0.3.2
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.
- package/README.md +78 -81
- package/dist/index.js +1 -1
- package/dist/ingest/server.d.ts +1 -0
- package/dist/ingest/server.d.ts.map +1 -1
- package/dist/ingest/server.js +15 -12
- package/dist/ingest/server.js.map +1 -1
- package/dist/parser/analysis.d.ts +4 -0
- package/dist/parser/analysis.d.ts.map +1 -1
- package/dist/parser/analysis.js +120 -54
- package/dist/parser/analysis.js.map +1 -1
- package/dist/parser/react-profile.d.ts.map +1 -1
- package/dist/parser/react-profile.js +2 -3
- package/dist/parser/react-profile.js.map +1 -1
- package/dist/parser/react-scan-lite.d.ts.map +1 -1
- package/dist/parser/react-scan-lite.js +72 -2
- package/dist/parser/react-scan-lite.js.map +1 -1
- package/dist/parser/types.d.ts +23 -0
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/store.js +1 -1
- package/dist/store.js.map +1 -1
- package/dist/tools/begin-render-analysis.d.ts.map +1 -1
- package/dist/tools/begin-render-analysis.js +1 -1
- package/dist/tools/begin-render-analysis.js.map +1 -1
- package/dist/tools/compare-renders.d.ts.map +1 -1
- package/dist/tools/compare-renders.js +16 -4
- package/dist/tools/compare-renders.js.map +1 -1
- package/dist/tools/get-captured-renders.d.ts.map +1 -1
- package/dist/tools/get-captured-renders.js +8 -2
- package/dist/tools/get-captured-renders.js.map +1 -1
- package/dist/tools/get-hot-commits.d.ts.map +1 -1
- package/dist/tools/get-hot-commits.js +24 -7
- package/dist/tools/get-hot-commits.js.map +1 -1
- package/dist/tools/get-render-summary.d.ts.map +1 -1
- package/dist/tools/get-render-summary.js +23 -10
- package/dist/tools/get-render-summary.js.map +1 -1
- package/dist/tools/get-rerender-causes.d.ts.map +1 -1
- package/dist/tools/get-rerender-causes.js +25 -18
- package/dist/tools/get-rerender-causes.js.map +1 -1
- package/dist/tools/get-slow-components.d.ts.map +1 -1
- package/dist/tools/get-slow-components.js +20 -5
- package/dist/tools/get-slow-components.js.map +1 -1
- package/dist/tools/load-render-profile.d.ts.map +1 -1
- package/dist/tools/load-render-profile.js +7 -3
- package/dist/tools/load-render-profile.js.map +1 -1
- package/dist/tools/run-render-capture.d.ts.map +1 -1
- package/dist/tools/run-render-capture.js +11 -5
- package/dist/tools/run-render-capture.js.map +1 -1
- package/dist/tools/stop-render-capture.d.ts.map +1 -1
- package/dist/tools/stop-render-capture.js +22 -4
- package/dist/tools/stop-render-capture.js.map +1 -1
- package/package.json +17 -5
|
@@ -3,7 +3,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
3
3
|
// Internal helpers
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
function buildMeasurements(fibers, rootId, commitIndex, commitTime) {
|
|
6
|
-
return fibers.map(fiber => ({
|
|
6
|
+
return fibers.map((fiber) => ({
|
|
7
7
|
fiberId: fiber.fiberId,
|
|
8
8
|
rootId,
|
|
9
9
|
componentName: fiber.name?.trim() || `(fiber:${fiber.fiberId})`,
|
|
@@ -19,7 +19,7 @@ function buildMeasurements(fibers, rootId, commitIndex, commitTime) {
|
|
|
19
19
|
}
|
|
20
20
|
function buildFiberNodes(fibers, rootId) {
|
|
21
21
|
// Wire format has no explicit parent IDs; parentFiberId and childFiberIds are always null/empty.
|
|
22
|
-
return fibers.map(fiber => ({
|
|
22
|
+
return fibers.map((fiber) => ({
|
|
23
23
|
fiberId: fiber.fiberId,
|
|
24
24
|
rootId,
|
|
25
25
|
componentName: fiber.name?.trim() || `(fiber:${fiber.fiberId})`,
|
|
@@ -97,6 +97,75 @@ export function adaptReactScanEvents(rawCommits, sessionId) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
const components = buildComponentStats(commits);
|
|
100
|
+
// Single pass over raw fibers to collect source, changeCauses, and hasChangeDescriptions.
|
|
101
|
+
const sourceMap = new Map();
|
|
102
|
+
const changeCausesMap = new Map();
|
|
103
|
+
let hasChangeDescriptions = false;
|
|
104
|
+
for (const raw of rawCommits) {
|
|
105
|
+
for (const fiber of raw.fibers ?? []) {
|
|
106
|
+
const name = fiber.name?.trim() || `(fiber:${fiber.fiberId})`;
|
|
107
|
+
if (fiber.source && !sourceMap.has(name)) {
|
|
108
|
+
sourceMap.set(name, {
|
|
109
|
+
fileName: fiber.source.fileName,
|
|
110
|
+
lineNumber: fiber.source.lineNumber,
|
|
111
|
+
columnNumber: fiber.source.columnNumber,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
const cd = fiber.changeDescription;
|
|
115
|
+
if (cd == null || cd.isFirstMount)
|
|
116
|
+
continue;
|
|
117
|
+
// Count as "exact" only when at least one diff field carries real data.
|
|
118
|
+
const hasRealDiff = (cd.props?.length ?? 0) > 0 ||
|
|
119
|
+
cd.state !== null ||
|
|
120
|
+
cd.context !== null ||
|
|
121
|
+
(cd.hooks?.length ?? 0) > 0;
|
|
122
|
+
if (hasRealDiff)
|
|
123
|
+
hasChangeDescriptions = true;
|
|
124
|
+
// Aggregate per-component causes (even parent-only renders are tracked).
|
|
125
|
+
let causes = changeCausesMap.get(name);
|
|
126
|
+
if (!causes) {
|
|
127
|
+
causes = {
|
|
128
|
+
props: new Set(),
|
|
129
|
+
stateChanged: false,
|
|
130
|
+
contextChanged: false,
|
|
131
|
+
hooks: new Set(),
|
|
132
|
+
parentTriggered: false,
|
|
133
|
+
};
|
|
134
|
+
changeCausesMap.set(name, causes);
|
|
135
|
+
}
|
|
136
|
+
for (const p of cd.props ?? [])
|
|
137
|
+
causes.props.add(p);
|
|
138
|
+
if (cd.state !== null)
|
|
139
|
+
causes.stateChanged = true;
|
|
140
|
+
if (cd.context !== null)
|
|
141
|
+
causes.contextChanged = true;
|
|
142
|
+
for (const h of cd.hooks ?? [])
|
|
143
|
+
causes.hooks.add(h);
|
|
144
|
+
if (cd.parent === true)
|
|
145
|
+
causes.parentTriggered = true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const component of components) {
|
|
149
|
+
const src = sourceMap.get(component.componentName);
|
|
150
|
+
if (src)
|
|
151
|
+
component.source = src;
|
|
152
|
+
const raw = changeCausesMap.get(component.componentName);
|
|
153
|
+
if (raw &&
|
|
154
|
+
(raw.props.size > 0 ||
|
|
155
|
+
raw.stateChanged ||
|
|
156
|
+
raw.contextChanged ||
|
|
157
|
+
raw.hooks.size > 0 ||
|
|
158
|
+
raw.parentTriggered)) {
|
|
159
|
+
const changeCauses = {
|
|
160
|
+
props: Array.from(raw.props),
|
|
161
|
+
stateChanged: raw.stateChanged,
|
|
162
|
+
contextChanged: raw.contextChanged,
|
|
163
|
+
hooks: Array.from(raw.hooks),
|
|
164
|
+
parentTriggered: raw.parentTriggered,
|
|
165
|
+
};
|
|
166
|
+
component.changeCauses = changeCauses;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
100
169
|
const totalCommitDuration = commits.reduce((sum, c) => sum + c.duration, 0);
|
|
101
170
|
const totalRenderDuration = commits.reduce((sum, c) => sum + c.measurements.reduce((ms, m) => ms + m.actualDuration, 0), 0);
|
|
102
171
|
return {
|
|
@@ -109,6 +178,7 @@ export function adaptReactScanEvents(rawCommits, sessionId) {
|
|
|
109
178
|
components,
|
|
110
179
|
totalCommitDuration,
|
|
111
180
|
totalRenderDuration,
|
|
181
|
+
hasChangeDescriptions,
|
|
112
182
|
};
|
|
113
183
|
}
|
|
114
184
|
//# sourceMappingURL=react-scan-lite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-scan-lite.js","sourceRoot":"","sources":["../../src/parser/react-scan-lite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"react-scan-lite.js","sourceRoot":"","sources":["../../src/parser/react-scan-lite.ts"],"names":[],"mappings":"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"}
|
package/dist/parser/types.d.ts
CHANGED
|
@@ -27,6 +27,22 @@ export interface FiberNode {
|
|
|
27
27
|
parentFiberId: number | null;
|
|
28
28
|
childFiberIds: number[];
|
|
29
29
|
}
|
|
30
|
+
export interface ComponentSource {
|
|
31
|
+
fileName: string;
|
|
32
|
+
lineNumber: number;
|
|
33
|
+
columnNumber?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Aggregated exact causes derived from react-scan/lite changeDescription data. */
|
|
36
|
+
export interface ChangeCauses {
|
|
37
|
+
/** Unique prop names that changed across all update renders. */
|
|
38
|
+
props: string[];
|
|
39
|
+
stateChanged: boolean;
|
|
40
|
+
contextChanged: boolean;
|
|
41
|
+
/** Unique hook identifiers (e.g. "hook[0]") that fired. */
|
|
42
|
+
hooks: string[];
|
|
43
|
+
/** True if at least one render was triggered by a parent re-render (no own prop/state change). */
|
|
44
|
+
parentTriggered: boolean;
|
|
45
|
+
}
|
|
30
46
|
export interface ComponentStats {
|
|
31
47
|
componentName: string;
|
|
32
48
|
renderCount: number;
|
|
@@ -37,6 +53,9 @@ export interface ComponentStats {
|
|
|
37
53
|
totalSelfDuration: number;
|
|
38
54
|
maxActualDuration: number;
|
|
39
55
|
commitIndices: number[];
|
|
56
|
+
source?: ComponentSource;
|
|
57
|
+
/** Present only when react-scan/lite captured actual changeDescription data in a real browser. */
|
|
58
|
+
changeCauses?: ChangeCauses;
|
|
40
59
|
}
|
|
41
60
|
export interface ParsedRenderProfile {
|
|
42
61
|
id: string;
|
|
@@ -48,6 +67,8 @@ export interface ParsedRenderProfile {
|
|
|
48
67
|
components: ComponentStats[];
|
|
49
68
|
totalCommitDuration: number;
|
|
50
69
|
totalRenderDuration: number;
|
|
70
|
+
/** True when at least one fiber carried changeDescription data (react-scan/lite in-browser capture). */
|
|
71
|
+
hasChangeDescriptions: boolean;
|
|
51
72
|
}
|
|
52
73
|
export interface RenderSummaryEntry {
|
|
53
74
|
componentName: string;
|
|
@@ -59,6 +80,7 @@ export interface RenderSummaryEntry {
|
|
|
59
80
|
averageActualDuration: number;
|
|
60
81
|
maxActualDuration: number;
|
|
61
82
|
commitCount: number;
|
|
83
|
+
source?: ComponentSource;
|
|
62
84
|
}
|
|
63
85
|
export interface HotCommitComponentSummary {
|
|
64
86
|
componentName: string;
|
|
@@ -128,6 +150,7 @@ export interface RerenderCause {
|
|
|
128
150
|
confidence: RerenderConfidence;
|
|
129
151
|
evidence: RerenderEvidence[];
|
|
130
152
|
likelyCauses: string[];
|
|
153
|
+
source?: ComponentSource;
|
|
131
154
|
}
|
|
132
155
|
export type RenderIssueType = 'rerender-storm' | 'commit-spike' | 'cascading-render';
|
|
133
156
|
export type RenderIssueSeverity = 'low' | 'medium' | 'high';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
package/dist/store.js
CHANGED
|
@@ -6,7 +6,7 @@ export function getRenderProfile(id) {
|
|
|
6
6
|
return profiles.get(id);
|
|
7
7
|
}
|
|
8
8
|
export function listRenderProfiles() {
|
|
9
|
-
return Array.from(profiles.values()).map(profile => ({
|
|
9
|
+
return Array.from(profiles.values()).map((profile) => ({
|
|
10
10
|
id: profile.id,
|
|
11
11
|
filename: profile.filename,
|
|
12
12
|
commitCount: profile.commits.length,
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAOhC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;AAExD,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAOhC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrD,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;QACnC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM;QACzC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;KACjD,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"begin-render-analysis.d.ts","sourceRoot":"","sources":["../../src/tools/begin-render-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"begin-render-analysis.d.ts","sourceRoot":"","sources":["../../src/tools/begin-render-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6EnE"}
|
|
@@ -36,7 +36,7 @@ export function registerBeginRenderAnalysis(server) {
|
|
|
36
36
|
'1. npm install --save-dev react-scan',
|
|
37
37
|
'2. Create (or overwrite) instrumentation-client.js at your project root with the content in `snippet`.',
|
|
38
38
|
' The ingest server runs on a fixed port (7721 by default), so only the sessionId line changes between runs.',
|
|
39
|
-
|
|
39
|
+
"3. Import it from your app's client-side entry point (e.g. _app.tsx, root layout, main.tsx)",
|
|
40
40
|
' — inspect the project structure to find the right file.',
|
|
41
41
|
' The import must run on the client (add "use client" if the entry is a Server Component).',
|
|
42
42
|
].join('\n'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"begin-render-analysis.js","sourceRoot":"","sources":["../../src/tools/begin-render-analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"begin-render-analysis.js","sourceRoot":"","sources":["../../src/tools/begin-render-analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IAC3D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,yDAAyD;YACzD,uHAAuH;YACvH,oHAAoH;YACpH,mEAAmE;QACrE,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC;iBACR,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;iBACxB,QAAQ,CACP,yEAAyE;gBACvE,4EAA4E,CAC/E;SACJ;KACF,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAE7C,MAAM,OAAO,GAAG;gBACd,+CAA+C;gBAC/C,cAAc;gBACd,gBAAgB,OAAO,CAAC,QAAQ,IAAI;gBACpC,iBAAiB,OAAO,CAAC,SAAS,IAAI;gBACtC,mCAAmC;gBACnC,6BAA6B;gBAC7B,+BAA+B;gBAC/B,KAAK;aACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,MAAM,MAAM,GAAG;gBACb,QAAQ,EAAE,MAAM;gBAChB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO;gBACP,WAAW,EAAE,2BAA2B;gBACxC,KAAK,EAAE;oBACL,sCAAsC;oBACtC,wGAAwG;oBACxG,+GAA+G;oBAC/G,6FAA6F;oBAC7F,4DAA4D;oBAC5D,6FAA6F;iBAC9F,CAAC,IAAI,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,oCAAoC,OAAO,CAAC,SAAS,8BAA8B;aAC9F,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAC5E,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,MAAM,GAAG;YACb,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE;gBACL,uFAAuF;gBACvF,2CAA2C;gBAC3C,mEAAmE;gBACnE,kEAAkE;gBAClE,yEAAyE;gBACzE,oDAAoD;gBACpD,4GAA4G;gBAC5G,kFAAkF;aACnF,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,QAAQ,EAAE,8DAA8D;SACzE,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-renders.d.ts","sourceRoot":"","sources":["../../src/tools/compare-renders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"compare-renders.d.ts","sourceRoot":"","sources":["../../src/tools/compare-renders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4BpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2D9D"}
|
|
@@ -20,8 +20,18 @@ export function registerCompareRenders(server) {
|
|
|
20
20
|
inputSchema: {
|
|
21
21
|
baseProfileId: z.string().describe('Baseline profile ID from load_render_profile'),
|
|
22
22
|
currentProfileId: z.string().describe('Current profile ID from load_render_profile'),
|
|
23
|
-
limit: z
|
|
24
|
-
|
|
23
|
+
limit: z
|
|
24
|
+
.number()
|
|
25
|
+
.int()
|
|
26
|
+
.positive()
|
|
27
|
+
.max(25)
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('How many changed components to include. Defaults to 10.'),
|
|
30
|
+
minDeltaMs: z
|
|
31
|
+
.number()
|
|
32
|
+
.nonnegative()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Minimum absolute total render delta in ms for changed components. Defaults to 0.'),
|
|
25
35
|
},
|
|
26
36
|
}, async ({ baseProfileId, currentProfileId, limit, minDeltaMs }) => {
|
|
27
37
|
const baseProfile = getRenderProfile(baseProfileId);
|
|
@@ -34,7 +44,8 @@ export function registerCompareRenders(server) {
|
|
|
34
44
|
}
|
|
35
45
|
const comparison = compareRenders(baseProfile, currentProfile, limit ?? 10, minDeltaMs ?? 0);
|
|
36
46
|
return {
|
|
37
|
-
content: [
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
38
49
|
type: 'text',
|
|
39
50
|
text: JSON.stringify({
|
|
40
51
|
...comparison,
|
|
@@ -43,7 +54,8 @@ export function registerCompareRenders(server) {
|
|
|
43
54
|
added: comparison.added.map(formatDiffEntry),
|
|
44
55
|
removed: comparison.removed.map(formatDiffEntry),
|
|
45
56
|
}, null, 2),
|
|
46
|
-
}
|
|
57
|
+
},
|
|
58
|
+
],
|
|
47
59
|
};
|
|
48
60
|
});
|
|
49
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compare-renders.js","sourceRoot":"","sources":["../../src/tools/compare-renders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,eAAe,
|
|
1
|
+
{"version":3,"file":"compare-renders.js","sourceRoot":"","sources":["../../src/tools/compare-renders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,eAAe,CAStB,KAAQ;IACR,OAAO;QACL,GAAG,KAAK;QACR,uBAAuB,EAAE,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC;QAChE,0BAA0B,EAAE,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC;QACtE,wBAAwB,EAAE,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC;QAClE,0BAA0B,EAAE,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC;QACtE,sBAAsB,EAAE,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;QAC9D,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;KACzF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,0GAA0G;QAC5G,WAAW,EAAE;YACX,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAClF,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YACpF,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,yDAAyD,CAAC;YACtE,UAAU,EAAE,CAAC;iBACV,MAAM,EAAE;iBACR,WAAW,EAAE;iBACb,QAAQ,EAAE;iBACV,QAAQ,CACP,kFAAkF,CACnF;SACJ;KACF,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/D,MAAM,WAAW,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,aAAa,cAAc,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,oBAAoB,gBAAgB,cAAc,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;QAE7F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,GAAG,UAAU;wBACb,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;wBACxD,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC;wBAC1D,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC;wBAC5C,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;qBACjD,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-captured-renders.d.ts","sourceRoot":"","sources":["../../src/tools/get-captured-renders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-captured-renders.d.ts","sourceRoot":"","sources":["../../src/tools/get-captured-renders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6FlE"}
|
|
@@ -14,7 +14,12 @@ export function registerGetCapturedRenders(server) {
|
|
|
14
14
|
const session = getCaptureSession(sessionId);
|
|
15
15
|
if (!session) {
|
|
16
16
|
return {
|
|
17
|
-
content: [
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
type: 'text',
|
|
20
|
+
text: JSON.stringify({ error: `Session "${sessionId}" not found` }, null, 2),
|
|
21
|
+
},
|
|
22
|
+
],
|
|
18
23
|
isError: true,
|
|
19
24
|
};
|
|
20
25
|
}
|
|
@@ -51,7 +56,8 @@ export function registerGetCapturedRenders(server) {
|
|
|
51
56
|
profilingStatus = 'available';
|
|
52
57
|
}
|
|
53
58
|
else {
|
|
54
|
-
profilingStatus =
|
|
59
|
+
profilingStatus =
|
|
60
|
+
'unavailable — app may be running a production build; switch to `next dev`';
|
|
55
61
|
}
|
|
56
62
|
const diagnosis = unknownEvents > 0 && commitCount === 0
|
|
57
63
|
? `${unknownEvents} unrecognized POST(s) received — the instrumentation snippet may not be imported correctly, or it is running server-side. Check that the import is in a client-side entry point and the file path is correct.`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-captured-renders.js","sourceRoot":"","sources":["../../src/tools/get-captured-renders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"get-captured-renders.js","sourceRoot":"","sources":["../../src/tools/get-captured-renders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,kGAAkG;YAClG,oGAAoG;YACpG,iEAAiE;YACjE,iGAAiG;QACnG,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;SACjF;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,YAAY,SAAS,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC7E;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAE9B,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,IAAI;oBAAE,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC;oBAAE,iBAAiB,GAAG,IAAI,CAAC;YAChE,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACtD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,UAAU,KAAK,CAAC,OAAO,GAAG,CAAC;gBACtD,mBAAmB,CAAC,GAAG,CACrB,IAAI,EACJ,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC,CACnE,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;aAC5D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;QAE3F,IAAI,eAAuB,CAAC;QAC5B,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACxC,eAAe,GAAG,wDAAwD,CAAC;QAC7E,CAAC;aAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACtC,eAAe,GAAG,WAAW,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,eAAe;gBACb,2EAA2E,CAAC;QAChF,CAAC;QAED,MAAM,SAAS,GACb,aAAa,GAAG,CAAC,IAAI,WAAW,KAAK,CAAC;YACpC,CAAC,CAAC,GAAG,aAAa,+MAA+M;YACjO,CAAC,CAAC,IAAI,CAAC;QAEX,MAAM,MAAM,GAAG;YACb,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW;YACX,cAAc,EAAE,cAAc,CAAC,IAAI;YACnC,iBAAiB;YACjB,eAAe;YACf,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,aAAa;YACb,QAAQ,EACN,OAAO,CAAC,MAAM,KAAK,QAAQ;gBACzB,CAAC,CAAC,0CAA0C,SAAS,wBAAwB;gBAC7E,CAAC,CAAC,+DAA+D,SAAS,kBAAkB;SACjG,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-hot-commits.d.ts","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-hot-commits.d.ts","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2E7D"}
|
|
@@ -8,20 +8,35 @@ export function registerGetHotCommits(server) {
|
|
|
8
8
|
description: 'Rank the most expensive commits in a loaded render profile and show the top components inside each spike.',
|
|
9
9
|
inputSchema: {
|
|
10
10
|
profileId: z.string().describe('Profile ID from load_render_profile'),
|
|
11
|
-
limit: z
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
limit: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.positive()
|
|
15
|
+
.max(25)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('How many commits to include. Defaults to 10.'),
|
|
18
|
+
componentLimit: z
|
|
19
|
+
.number()
|
|
20
|
+
.int()
|
|
21
|
+
.positive()
|
|
22
|
+
.max(10)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('How many top components to include per commit. Defaults to 3.'),
|
|
25
|
+
priorityLevel: z
|
|
26
|
+
.string()
|
|
27
|
+
.optional()
|
|
28
|
+
.describe('Filter to commits with this priority level only. Common values: "Immediate" (synchronous, input-blocking), "Normal" (async, e.g. API responses). Omit to include all priorities.'),
|
|
14
29
|
},
|
|
15
30
|
}, async ({ profileId, limit, componentLimit, priorityLevel }) => {
|
|
16
31
|
const profile = getRenderProfile(profileId);
|
|
17
32
|
if (!profile) {
|
|
18
33
|
throw new Error(`Profile "${profileId}" not found. Call get_render_summary without a profileId to list all loaded profiles.`);
|
|
19
34
|
}
|
|
20
|
-
const hotCommits = getHotCommits(profile, limit ?? 10, componentLimit ?? 3, priorityLevel).map(commit => ({
|
|
35
|
+
const hotCommits = getHotCommits(profile, limit ?? 10, componentLimit ?? 3, priorityLevel).map((commit) => ({
|
|
21
36
|
...commit,
|
|
22
37
|
duration: formatMs(commit.duration),
|
|
23
38
|
totalActualDuration: formatMs(commit.totalActualDuration),
|
|
24
|
-
topComponents: commit.topComponents.map(component => ({
|
|
39
|
+
topComponents: commit.topComponents.map((component) => ({
|
|
25
40
|
...component,
|
|
26
41
|
actualDuration: formatMs(component.actualDuration),
|
|
27
42
|
selfDuration: formatMs(component.selfDuration),
|
|
@@ -29,14 +44,16 @@ export function registerGetHotCommits(server) {
|
|
|
29
44
|
})),
|
|
30
45
|
}));
|
|
31
46
|
return {
|
|
32
|
-
content: [
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
33
49
|
type: 'text',
|
|
34
50
|
text: JSON.stringify({
|
|
35
51
|
profileId,
|
|
36
52
|
timestampNote: 'timestamp values are milliseconds since the profiling session started, not Unix epoch',
|
|
37
53
|
hotCommits,
|
|
38
54
|
}, null, 2),
|
|
39
|
-
}
|
|
55
|
+
},
|
|
56
|
+
],
|
|
40
57
|
};
|
|
41
58
|
});
|
|
42
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-hot-commits.js","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"get-hot-commits.js","sourceRoot":"","sources":["../../src/tools/get-hot-commits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,kLAAkL,CACnL;SACJ;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,YAAY,SAAS,uFAAuF,CAC7G,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAC9B,OAAO,EACP,KAAK,IAAI,EAAE,EACX,cAAc,IAAI,CAAC,EACnB,aAAa,CACd,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACjB,GAAG,MAAM;YACT,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnC,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACzD,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBACtD,GAAG,SAAS;gBACZ,cAAc,EAAE,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC;gBAClD,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC;gBAC9C,iBAAiB,EAAE,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC;aAC1D,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,SAAS;wBACT,aAAa,EACX,uFAAuF;wBACzF,UAAU;qBACX,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-render-summary.d.ts","sourceRoot":"","sources":["../../src/tools/get-render-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-render-summary.d.ts","sourceRoot":"","sources":["../../src/tools/get-render-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsFhE"}
|
|
@@ -7,21 +7,32 @@ export function registerGetRenderSummary(server) {
|
|
|
7
7
|
title: 'Get Render Summary',
|
|
8
8
|
description: 'Summarize the loaded Next.js render profile, including top components by render cost and detected render issues (rerender storms, commit spikes).',
|
|
9
9
|
inputSchema: {
|
|
10
|
-
profileId: z
|
|
11
|
-
|
|
10
|
+
profileId: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('Profile ID from load_render_profile. Omit to list loaded profiles.'),
|
|
14
|
+
limit: z
|
|
15
|
+
.number()
|
|
16
|
+
.int()
|
|
17
|
+
.positive()
|
|
18
|
+
.max(25)
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('How many top components to include. Defaults to 10.'),
|
|
12
21
|
},
|
|
13
22
|
}, async ({ profileId, limit }) => {
|
|
14
23
|
if (!profileId) {
|
|
15
24
|
return {
|
|
16
|
-
content: [
|
|
25
|
+
content: [
|
|
26
|
+
{
|
|
17
27
|
type: 'text',
|
|
18
28
|
text: JSON.stringify({
|
|
19
|
-
profiles: listRenderProfiles().map(profile => ({
|
|
29
|
+
profiles: listRenderProfiles().map((profile) => ({
|
|
20
30
|
...profile,
|
|
21
31
|
totalCommitDuration: `${profile.totalCommitDuration.toFixed(2)}ms`,
|
|
22
32
|
})),
|
|
23
33
|
}, null, 2),
|
|
24
|
-
}
|
|
34
|
+
},
|
|
35
|
+
],
|
|
25
36
|
};
|
|
26
37
|
}
|
|
27
38
|
const profile = getRenderProfile(profileId);
|
|
@@ -30,23 +41,24 @@ export function registerGetRenderSummary(server) {
|
|
|
30
41
|
}
|
|
31
42
|
const summary = summarizeRenderProfile(profile, limit ?? 10);
|
|
32
43
|
return {
|
|
33
|
-
content: [
|
|
44
|
+
content: [
|
|
45
|
+
{
|
|
34
46
|
type: 'text',
|
|
35
47
|
text: JSON.stringify({
|
|
36
48
|
...summary,
|
|
37
49
|
totalCommitDuration: formatMs(summary.totalCommitDuration),
|
|
38
50
|
totalRenderDuration: formatMs(summary.totalRenderDuration),
|
|
39
|
-
topComponents: summary.topComponents.map(component => ({
|
|
51
|
+
topComponents: summary.topComponents.map((component) => ({
|
|
40
52
|
...component,
|
|
41
53
|
totalActualDuration: formatMs(component.totalActualDuration),
|
|
42
54
|
averageActualDuration: formatMs(component.averageActualDuration),
|
|
43
55
|
maxActualDuration: formatMs(component.maxActualDuration),
|
|
44
56
|
})),
|
|
45
|
-
hotCommits: summary.hotCommits.map(commit => ({
|
|
57
|
+
hotCommits: summary.hotCommits.map((commit) => ({
|
|
46
58
|
...commit,
|
|
47
59
|
duration: formatMs(commit.duration),
|
|
48
60
|
totalActualDuration: formatMs(commit.totalActualDuration),
|
|
49
|
-
topComponents: commit.topComponents.map(component => ({
|
|
61
|
+
topComponents: commit.topComponents.map((component) => ({
|
|
50
62
|
...component,
|
|
51
63
|
actualDuration: formatMs(component.actualDuration),
|
|
52
64
|
selfDuration: formatMs(component.selfDuration),
|
|
@@ -54,7 +66,8 @@ export function registerGetRenderSummary(server) {
|
|
|
54
66
|
})),
|
|
55
67
|
})),
|
|
56
68
|
}, null, 2),
|
|
57
|
-
}
|
|
69
|
+
},
|
|
70
|
+
],
|
|
58
71
|
};
|
|
59
72
|
});
|
|
60
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-render-summary.js","sourceRoot":"","sources":["../../src/tools/get-render-summary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"get-render-summary.js","sourceRoot":"","sources":["../../src/tools/get-render-summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-rerender-causes.d.ts","sourceRoot":"","sources":["../../src/tools/get-rerender-causes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-rerender-causes.d.ts","sourceRoot":"","sources":["../../src/tools/get-rerender-causes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoEjE"}
|
|
@@ -8,42 +8,49 @@ export function registerGetRerenderCauses(server) {
|
|
|
8
8
|
description: 'Highlight components with repeated rerenders and explain likely causes using heuristics derived from the exported profile.',
|
|
9
9
|
inputSchema: {
|
|
10
10
|
profileId: z.string().describe('Profile ID from load_render_profile'),
|
|
11
|
-
limit: z
|
|
12
|
-
|
|
11
|
+
limit: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.positive()
|
|
15
|
+
.max(25)
|
|
16
|
+
.optional()
|
|
17
|
+
.describe('How many components to include. Defaults to 10.'),
|
|
18
|
+
minDuration: z
|
|
19
|
+
.number()
|
|
20
|
+
.nonnegative()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Minimum total actual duration in ms for a component to appear. Filters sub-millisecond noise. Defaults to 0.'),
|
|
13
23
|
},
|
|
14
24
|
}, async ({ profileId, limit, minDuration }) => {
|
|
15
25
|
const profile = getRenderProfile(profileId);
|
|
16
26
|
if (!profile) {
|
|
17
27
|
throw new Error(`Profile "${profileId}" not found. Call get_render_summary without a profileId to list all loaded profiles.`);
|
|
18
28
|
}
|
|
19
|
-
const causes = getRerenderCauses(profile, limit ?? 10, minDuration ?? 0).map(cause => ({
|
|
29
|
+
const causes = getRerenderCauses(profile, limit ?? 10, minDuration ?? 0).map((cause) => ({
|
|
20
30
|
...cause,
|
|
21
31
|
score: Number(cause.score.toFixed(1)),
|
|
22
32
|
totalActualDuration: formatMs(cause.totalActualDuration),
|
|
23
33
|
}));
|
|
34
|
+
const dataQuality = profile.hasChangeDescriptions ? 'exact' : 'heuristic';
|
|
35
|
+
const qualityNote = profile.hasChangeDescriptions
|
|
36
|
+
? 'Causes are based on exact prop/state changeDescription data from react-scan/lite.'
|
|
37
|
+
: 'Causes are heuristic — no prop/state diff data available. Run live capture (begin_render_analysis, approach: live) in a real browser to get exact change descriptions.';
|
|
24
38
|
return {
|
|
25
|
-
content: [
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
26
41
|
type: 'text',
|
|
27
42
|
text: JSON.stringify({
|
|
28
43
|
profileId,
|
|
29
|
-
|
|
44
|
+
dataQuality,
|
|
45
|
+
note: qualityNote,
|
|
30
46
|
scoreDocumentation: {
|
|
31
|
-
meaning: '0-10
|
|
32
|
-
thresholds: {
|
|
33
|
-
low: '0.0-2.9',
|
|
34
|
-
medium: '3.0-5.9',
|
|
35
|
-
high: '6.0-10.0',
|
|
36
|
-
},
|
|
37
|
-
factors: [
|
|
38
|
-
'Repeated update-phase renders',
|
|
39
|
-
'Nested update propagation (component listed as updater for its own commit)',
|
|
40
|
-
'Presence across many commits',
|
|
41
|
-
'Self-intensive render (high self-to-actual ratio, low child delegation)',
|
|
42
|
-
],
|
|
47
|
+
meaning: '0-10 rerender risk score. Factors: update frequency, nested updates, commit spread, self-intensive render, average render duration.',
|
|
48
|
+
thresholds: { low: '0.0-2.9', medium: '3.0-5.9', high: '6.0-10.0' },
|
|
43
49
|
},
|
|
44
50
|
causes,
|
|
45
51
|
}, null, 2),
|
|
46
|
-
}
|
|
52
|
+
},
|
|
53
|
+
],
|
|
47
54
|
};
|
|
48
55
|
});
|
|
49
56
|
}
|