@perfonext/render-mcp 0.1.0 → 0.3.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.
- package/README.md +77 -22
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/ingest/server.d.ts +53 -0
- package/dist/ingest/server.d.ts.map +1 -0
- package/dist/ingest/server.js +211 -0
- package/dist/ingest/server.js.map +1 -0
- package/dist/parser/analysis.d.ts +7 -2
- package/dist/parser/analysis.d.ts.map +1 -1
- package/dist/parser/analysis.js +359 -3
- package/dist/parser/analysis.js.map +1 -1
- package/dist/parser/react-profile.d.ts.map +1 -1
- package/dist/parser/react-profile.js +48 -2
- package/dist/parser/react-profile.js.map +1 -1
- package/dist/parser/react-scan-lite.d.ts +8 -0
- package/dist/parser/react-scan-lite.d.ts.map +1 -0
- package/dist/parser/react-scan-lite.js +114 -0
- package/dist/parser/react-scan-lite.js.map +1 -0
- package/dist/parser/types.d.ts +75 -0
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/tools/begin-render-analysis.d.ts +3 -0
- package/dist/tools/begin-render-analysis.d.ts.map +1 -0
- package/dist/tools/begin-render-analysis.js +69 -0
- package/dist/tools/begin-render-analysis.js.map +1 -0
- package/dist/tools/compare-renders.d.ts +3 -0
- package/dist/tools/compare-renders.d.ts.map +1 -0
- package/dist/tools/compare-renders.js +50 -0
- package/dist/tools/compare-renders.js.map +1 -0
- package/dist/tools/get-captured-renders.d.ts +3 -0
- package/dist/tools/get-captured-renders.d.ts.map +1 -0
- package/dist/tools/get-captured-renders.js +77 -0
- package/dist/tools/get-captured-renders.js.map +1 -0
- package/dist/tools/get-hot-commits.d.ts.map +1 -1
- package/dist/tools/get-hot-commits.js +3 -2
- package/dist/tools/get-hot-commits.js.map +1 -1
- package/dist/tools/get-render-summary.js +1 -1
- package/dist/tools/get-render-summary.js.map +1 -1
- package/dist/tools/load-render-profile.d.ts.map +1 -1
- package/dist/tools/load-render-profile.js +3 -1
- package/dist/tools/load-render-profile.js.map +1 -1
- package/dist/tools/run-render-capture.d.ts +3 -0
- package/dist/tools/run-render-capture.d.ts.map +1 -0
- package/dist/tools/run-render-capture.js +59 -0
- package/dist/tools/run-render-capture.js.map +1 -0
- package/dist/tools/stop-render-capture.d.ts +3 -0
- package/dist/tools/stop-render-capture.d.ts.map +1 -0
- package/dist/tools/stop-render-capture.js +61 -0
- package/dist/tools/stop-render-capture.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Internal helpers
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
function buildMeasurements(fibers, rootId, commitIndex, commitTime) {
|
|
6
|
+
return fibers.map(fiber => ({
|
|
7
|
+
fiberId: fiber.fiberId,
|
|
8
|
+
rootId,
|
|
9
|
+
componentName: fiber.name?.trim() || `(fiber:${fiber.fiberId})`,
|
|
10
|
+
phase: fiber.changeDescription?.isFirstMount === true ? 'mount' : 'update',
|
|
11
|
+
actualDuration: fiber.actualDuration ?? 0,
|
|
12
|
+
selfDuration: fiber.selfDuration ?? 0,
|
|
13
|
+
startTime: commitTime,
|
|
14
|
+
commitTime,
|
|
15
|
+
renderCount: 1,
|
|
16
|
+
commitIndex,
|
|
17
|
+
isNestedUpdate: false,
|
|
18
|
+
}));
|
|
19
|
+
}
|
|
20
|
+
function buildFiberNodes(fibers, rootId) {
|
|
21
|
+
// Wire format has no explicit parent IDs; parentFiberId and childFiberIds are always null/empty.
|
|
22
|
+
return fibers.map(fiber => ({
|
|
23
|
+
fiberId: fiber.fiberId,
|
|
24
|
+
rootId,
|
|
25
|
+
componentName: fiber.name?.trim() || `(fiber:${fiber.fiberId})`,
|
|
26
|
+
parentFiberId: null,
|
|
27
|
+
childFiberIds: [],
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
function buildComponentStats(commits) {
|
|
31
|
+
const statsMap = new Map();
|
|
32
|
+
for (const commit of commits) {
|
|
33
|
+
for (const m of commit.measurements) {
|
|
34
|
+
let stats = statsMap.get(m.componentName);
|
|
35
|
+
if (!stats) {
|
|
36
|
+
stats = {
|
|
37
|
+
componentName: m.componentName,
|
|
38
|
+
renderCount: 0,
|
|
39
|
+
mountCount: 0,
|
|
40
|
+
updateCount: 0,
|
|
41
|
+
nestedUpdateCount: 0,
|
|
42
|
+
totalActualDuration: 0,
|
|
43
|
+
totalSelfDuration: 0,
|
|
44
|
+
maxActualDuration: 0,
|
|
45
|
+
commitIndices: [],
|
|
46
|
+
};
|
|
47
|
+
statsMap.set(m.componentName, stats);
|
|
48
|
+
}
|
|
49
|
+
stats.renderCount++;
|
|
50
|
+
if (m.phase === 'mount') {
|
|
51
|
+
stats.mountCount++;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
stats.updateCount++;
|
|
55
|
+
}
|
|
56
|
+
if (m.isNestedUpdate)
|
|
57
|
+
stats.nestedUpdateCount++;
|
|
58
|
+
stats.totalActualDuration += m.actualDuration;
|
|
59
|
+
stats.totalSelfDuration += m.selfDuration;
|
|
60
|
+
if (m.actualDuration > stats.maxActualDuration) {
|
|
61
|
+
stats.maxActualDuration = m.actualDuration;
|
|
62
|
+
}
|
|
63
|
+
if (!stats.commitIndices.includes(m.commitIndex)) {
|
|
64
|
+
stats.commitIndices.push(m.commitIndex);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return Array.from(statsMap.values());
|
|
69
|
+
}
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// Public adapter
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
/**
|
|
74
|
+
* Convert an array of raw react-scan/lite commit events into the internal
|
|
75
|
+
* ParsedRenderProfile model used by all analysis tools.
|
|
76
|
+
*/
|
|
77
|
+
export function adaptReactScanEvents(rawCommits, sessionId) {
|
|
78
|
+
const commits = rawCommits.map((raw, idx) => ({
|
|
79
|
+
index: idx,
|
|
80
|
+
rootId: raw.rootId ?? 1,
|
|
81
|
+
duration: raw.duration ?? 0,
|
|
82
|
+
timestamp: raw.timestamp ?? 0,
|
|
83
|
+
priorityLevel: raw.priorityName ?? null,
|
|
84
|
+
measurements: buildMeasurements(raw.fibers ?? [], raw.rootId ?? 1, idx, raw.timestamp ?? 0),
|
|
85
|
+
updaterComponentNames: raw.updaterNames ?? [],
|
|
86
|
+
}));
|
|
87
|
+
// Deduplicate fibers across commits by fiberId (use first occurrence).
|
|
88
|
+
const seenFiberIds = new Set();
|
|
89
|
+
const fiberNodes = [];
|
|
90
|
+
for (const raw of rawCommits) {
|
|
91
|
+
const rootId = raw.rootId ?? 1;
|
|
92
|
+
for (const fe of raw.fibers ?? []) {
|
|
93
|
+
if (!seenFiberIds.has(fe.fiberId)) {
|
|
94
|
+
seenFiberIds.add(fe.fiberId);
|
|
95
|
+
fiberNodes.push(...buildFiberNodes([fe], rootId));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const components = buildComponentStats(commits);
|
|
100
|
+
const totalCommitDuration = commits.reduce((sum, c) => sum + c.duration, 0);
|
|
101
|
+
const totalRenderDuration = commits.reduce((sum, c) => sum + c.measurements.reduce((ms, m) => ms + m.actualDuration, 0), 0);
|
|
102
|
+
return {
|
|
103
|
+
id: randomUUID(),
|
|
104
|
+
filename: `react-scan-session:${sessionId}`,
|
|
105
|
+
version: '5',
|
|
106
|
+
rendererId: null,
|
|
107
|
+
commits,
|
|
108
|
+
fiberNodes,
|
|
109
|
+
components,
|
|
110
|
+
totalCommitDuration,
|
|
111
|
+
totalRenderDuration,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=react-scan-lite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export interface RenderMeasurement {
|
|
2
|
+
fiberId: number;
|
|
3
|
+
rootId: number;
|
|
2
4
|
componentName: string;
|
|
3
5
|
phase: string;
|
|
4
6
|
actualDuration: number;
|
|
@@ -11,12 +13,20 @@ export interface RenderMeasurement {
|
|
|
11
13
|
}
|
|
12
14
|
export interface RenderCommit {
|
|
13
15
|
index: number;
|
|
16
|
+
rootId: number;
|
|
14
17
|
duration: number;
|
|
15
18
|
timestamp: number;
|
|
16
19
|
priorityLevel: string | null;
|
|
17
20
|
measurements: RenderMeasurement[];
|
|
18
21
|
updaterComponentNames: string[];
|
|
19
22
|
}
|
|
23
|
+
export interface FiberNode {
|
|
24
|
+
fiberId: number;
|
|
25
|
+
rootId: number;
|
|
26
|
+
componentName: string;
|
|
27
|
+
parentFiberId: number | null;
|
|
28
|
+
childFiberIds: number[];
|
|
29
|
+
}
|
|
20
30
|
export interface ComponentStats {
|
|
21
31
|
componentName: string;
|
|
22
32
|
renderCount: number;
|
|
@@ -34,6 +44,7 @@ export interface ParsedRenderProfile {
|
|
|
34
44
|
version: string;
|
|
35
45
|
rendererId: number | null;
|
|
36
46
|
commits: RenderCommit[];
|
|
47
|
+
fiberNodes: FiberNode[];
|
|
37
48
|
components: ComponentStats[];
|
|
38
49
|
totalCommitDuration: number;
|
|
39
50
|
totalRenderDuration: number;
|
|
@@ -58,6 +69,7 @@ export interface HotCommitComponentSummary {
|
|
|
58
69
|
}
|
|
59
70
|
export interface HotCommitSummary {
|
|
60
71
|
commitIndex: number;
|
|
72
|
+
rootId: number;
|
|
61
73
|
duration: number;
|
|
62
74
|
totalActualDuration: number;
|
|
63
75
|
timestamp: number;
|
|
@@ -66,6 +78,37 @@ export interface HotCommitSummary {
|
|
|
66
78
|
topComponents: HotCommitComponentSummary[];
|
|
67
79
|
updaterComponentNames: string[];
|
|
68
80
|
}
|
|
81
|
+
export interface CommitBreakdownComponentSummary extends HotCommitComponentSummary {
|
|
82
|
+
mountCount: number;
|
|
83
|
+
updateCount: number;
|
|
84
|
+
nestedUpdateCount: number;
|
|
85
|
+
}
|
|
86
|
+
export interface CommitBreakdown {
|
|
87
|
+
commitIndex: number;
|
|
88
|
+
rootId: number;
|
|
89
|
+
duration: number;
|
|
90
|
+
totalActualDuration: number;
|
|
91
|
+
timestamp: number;
|
|
92
|
+
priorityLevel: string | null;
|
|
93
|
+
measurementCount: number;
|
|
94
|
+
updaterComponentNames: string[];
|
|
95
|
+
topComponents: CommitBreakdownComponentSummary[];
|
|
96
|
+
concentration: {
|
|
97
|
+
topComponentShare: number;
|
|
98
|
+
topThreeShare: number;
|
|
99
|
+
};
|
|
100
|
+
interpretation: string;
|
|
101
|
+
}
|
|
102
|
+
export interface RenderPropagationPath {
|
|
103
|
+
commitIndex: number;
|
|
104
|
+
rootId: number;
|
|
105
|
+
fiberPath: number[];
|
|
106
|
+
componentPath: string[];
|
|
107
|
+
depth: number;
|
|
108
|
+
totalActualDuration: number;
|
|
109
|
+
leafActualDuration: number;
|
|
110
|
+
includesUpdater: boolean;
|
|
111
|
+
}
|
|
69
112
|
export interface RerenderEvidence {
|
|
70
113
|
signal: string;
|
|
71
114
|
observed: number | string;
|
|
@@ -86,4 +129,36 @@ export interface RerenderCause {
|
|
|
86
129
|
evidence: RerenderEvidence[];
|
|
87
130
|
likelyCauses: string[];
|
|
88
131
|
}
|
|
132
|
+
export type RenderIssueType = 'rerender-storm' | 'commit-spike' | 'cascading-render';
|
|
133
|
+
export type RenderIssueSeverity = 'low' | 'medium' | 'high';
|
|
134
|
+
export interface RenderIssue {
|
|
135
|
+
type: RenderIssueType;
|
|
136
|
+
severity: RenderIssueSeverity;
|
|
137
|
+
title: string;
|
|
138
|
+
summary: string;
|
|
139
|
+
componentName?: string;
|
|
140
|
+
commitIndex?: number;
|
|
141
|
+
evidence: RerenderEvidence[];
|
|
142
|
+
}
|
|
143
|
+
export type RenderDiffChangeType = 'regression' | 'improvement' | 'added' | 'removed';
|
|
144
|
+
export interface RenderDiffEntry {
|
|
145
|
+
componentName: string;
|
|
146
|
+
changeType: RenderDiffChangeType;
|
|
147
|
+
baseTotalActualDuration: number;
|
|
148
|
+
currentTotalActualDuration: number;
|
|
149
|
+
totalActualDurationDelta: number;
|
|
150
|
+
averageActualDurationDelta: number;
|
|
151
|
+
maxActualDurationDelta: number;
|
|
152
|
+
renderCountDelta: number;
|
|
153
|
+
commitCountDelta: number;
|
|
154
|
+
percentChange: number | null;
|
|
155
|
+
}
|
|
156
|
+
export interface RenderComparison {
|
|
157
|
+
baseProfileId: string;
|
|
158
|
+
currentProfileId: string;
|
|
159
|
+
regressions: RenderDiffEntry[];
|
|
160
|
+
improvements: RenderDiffEntry[];
|
|
161
|
+
added: RenderDiffEntry[];
|
|
162
|
+
removed: RenderDiffEntry[];
|
|
163
|
+
}
|
|
89
164
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/parser/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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,CAyEnE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createCaptureSession } from '../ingest/server.js';
|
|
3
|
+
export function registerBeginRenderAnalysis(server) {
|
|
4
|
+
server.registerTool('begin_render_analysis', {
|
|
5
|
+
title: 'Begin Render Analysis',
|
|
6
|
+
description: 'Entry point for render profiling. Choose an approach:\n' +
|
|
7
|
+
' live — react-scan/lite streams events in real time; exact rerender causes, source locations, changeDescription.\n' +
|
|
8
|
+
' manual — no install needed; user exports a JSON from the React DevTools Profiler tab and shares the file path.\n' +
|
|
9
|
+
'Ask the user which approach they prefer before calling this tool.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
approach: z
|
|
12
|
+
.enum(['live', 'manual'])
|
|
13
|
+
.describe('"live": react-scan/lite live capture (richer data, needs npm install). ' +
|
|
14
|
+
'"manual": React DevTools Profiler JSON export (no install, less detailed).'),
|
|
15
|
+
},
|
|
16
|
+
}, async ({ approach }) => {
|
|
17
|
+
if (approach === 'live') {
|
|
18
|
+
const session = await createCaptureSession();
|
|
19
|
+
const snippet = [
|
|
20
|
+
`import { instrument } from "react-scan/lite";`,
|
|
21
|
+
`instrument({`,
|
|
22
|
+
` endpoint: "${session.endpoint}",`,
|
|
23
|
+
` sessionId: "${session.sessionId}",`,
|
|
24
|
+
` recordChangeDescriptions: true,`,
|
|
25
|
+
` includeFiberSource: true,`,
|
|
26
|
+
` includeFiberIdentity: true,`,
|
|
27
|
+
`});`,
|
|
28
|
+
].join('\n');
|
|
29
|
+
const result = {
|
|
30
|
+
approach: 'live',
|
|
31
|
+
sessionId: session.sessionId,
|
|
32
|
+
endpoint: session.endpoint,
|
|
33
|
+
snippet,
|
|
34
|
+
snippetFile: 'instrumentation-client.js',
|
|
35
|
+
setup: [
|
|
36
|
+
'1. npm install --save-dev react-scan',
|
|
37
|
+
'2. Create (or overwrite) instrumentation-client.js at your project root with the content in `snippet`.',
|
|
38
|
+
' The ingest server runs on a fixed port (7721 by default), so only the sessionId line changes between runs.',
|
|
39
|
+
'3. Import it from your app\'s client-side entry point (e.g. _app.tsx, root layout, main.tsx)',
|
|
40
|
+
' — inspect the project structure to find the right file.',
|
|
41
|
+
' The import must run on the client (add "use client" if the entry is a Server Component).',
|
|
42
|
+
].join('\n'),
|
|
43
|
+
nextStep: `run_render_capture({ sessionId: "${session.sessionId}", method: <ask the user> })`,
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// manual path — no session created
|
|
50
|
+
const result = {
|
|
51
|
+
approach: 'manual',
|
|
52
|
+
setup: [
|
|
53
|
+
'1. Install the React DevTools browser extension if not already (Chrome/Firefox/Edge).',
|
|
54
|
+
'2. Run your app (next dev or next start).',
|
|
55
|
+
'3. Open browser DevTools → React DevTools panel → "Profiler" tab.',
|
|
56
|
+
'4. Click the Record button (filled circle ●) to start profiling.',
|
|
57
|
+
'5. Interact with your app — navigate pages, trigger state changes, etc.',
|
|
58
|
+
'6. Click the Stop button (■) to end the recording.',
|
|
59
|
+
'7. Click the Export icon (download arrow ↓ in the top-right of the Profiler panel) and save the JSON file.',
|
|
60
|
+
'8. Share the saved file path — Copilot will call load_render_profile to load it.',
|
|
61
|
+
].join('\n'),
|
|
62
|
+
nextStep: 'load_render_profile({ filePath: "<path-to-exported-json>" })',
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=begin-render-analysis.js.map
|
|
@@ -0,0 +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,CAAC,uBAAuB,EAAE;QAC3C,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;gBACzE,4EAA4E,CAC7E;SACJ;KACF,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxB,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,8FAA8F;oBAC9F,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,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +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;AA0BpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoC9D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { formatMs } from '../format.js';
|
|
3
|
+
import { compareRenders } from '../parser/analysis.js';
|
|
4
|
+
import { getRenderProfile } from '../store.js';
|
|
5
|
+
function formatDiffEntry(entry) {
|
|
6
|
+
return {
|
|
7
|
+
...entry,
|
|
8
|
+
baseTotalActualDuration: formatMs(entry.baseTotalActualDuration),
|
|
9
|
+
currentTotalActualDuration: formatMs(entry.currentTotalActualDuration),
|
|
10
|
+
totalActualDurationDelta: formatMs(entry.totalActualDurationDelta),
|
|
11
|
+
averageActualDurationDelta: formatMs(entry.averageActualDurationDelta),
|
|
12
|
+
maxActualDurationDelta: formatMs(entry.maxActualDurationDelta),
|
|
13
|
+
percentChange: entry.percentChange == null ? null : `${entry.percentChange.toFixed(1)}%`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function registerCompareRenders(server) {
|
|
17
|
+
server.registerTool('compare_renders', {
|
|
18
|
+
title: 'Compare Renders',
|
|
19
|
+
description: 'Diff two loaded render profiles and rank the biggest regressions, improvements, additions, and removals.',
|
|
20
|
+
inputSchema: {
|
|
21
|
+
baseProfileId: z.string().describe('Baseline profile ID from load_render_profile'),
|
|
22
|
+
currentProfileId: z.string().describe('Current profile ID from load_render_profile'),
|
|
23
|
+
limit: z.number().int().positive().max(25).optional().describe('How many changed components to include. Defaults to 10.'),
|
|
24
|
+
minDeltaMs: z.number().nonnegative().optional().describe('Minimum absolute total render delta in ms for changed components. Defaults to 0.'),
|
|
25
|
+
},
|
|
26
|
+
}, async ({ baseProfileId, currentProfileId, limit, minDeltaMs }) => {
|
|
27
|
+
const baseProfile = getRenderProfile(baseProfileId);
|
|
28
|
+
if (!baseProfile) {
|
|
29
|
+
throw new Error(`Base profile "${baseProfileId}" not found.`);
|
|
30
|
+
}
|
|
31
|
+
const currentProfile = getRenderProfile(currentProfileId);
|
|
32
|
+
if (!currentProfile) {
|
|
33
|
+
throw new Error(`Current profile "${currentProfileId}" not found.`);
|
|
34
|
+
}
|
|
35
|
+
const comparison = compareRenders(baseProfile, currentProfile, limit ?? 10, minDeltaMs ?? 0);
|
|
36
|
+
return {
|
|
37
|
+
content: [{
|
|
38
|
+
type: 'text',
|
|
39
|
+
text: JSON.stringify({
|
|
40
|
+
...comparison,
|
|
41
|
+
regressions: comparison.regressions.map(formatDiffEntry),
|
|
42
|
+
improvements: comparison.improvements.map(formatDiffEntry),
|
|
43
|
+
added: comparison.added.map(formatDiffEntry),
|
|
44
|
+
removed: comparison.removed.map(formatDiffEntry),
|
|
45
|
+
}, null, 2),
|
|
46
|
+
}],
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=compare-renders.js.map
|
|
@@ -0,0 +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,CAOrB,KAAQ;IACT,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,CAAC,iBAAiB,EAAE;QACrC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,0GAA0G;QACvH,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,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;YACzH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kFAAkF,CAAC;SAC7I;KACF,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;QAClE,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,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,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,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +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,CA+ElE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getCaptureSession } from '../ingest/server.js';
|
|
3
|
+
export function registerGetCapturedRenders(server) {
|
|
4
|
+
server.registerTool('get_captured_renders', {
|
|
5
|
+
title: 'Get Captured Renders',
|
|
6
|
+
description: 'Optional diagnostic: peek at the live progress of a render-capture session without stopping it. ' +
|
|
7
|
+
'Returns commit count, components seen, whether actualDuration is populating, and an unknownEvents ' +
|
|
8
|
+
'count (non-zero = instrumentation may not be wired correctly). ' +
|
|
9
|
+
'Only call this if something seems wrong — it is not a required step before stop_render_capture.',
|
|
10
|
+
inputSchema: {
|
|
11
|
+
sessionId: z.string().describe('The sessionId returned by start_render_capture'),
|
|
12
|
+
},
|
|
13
|
+
}, async ({ sessionId }) => {
|
|
14
|
+
const session = getCaptureSession(sessionId);
|
|
15
|
+
if (!session) {
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: 'text', text: JSON.stringify({ error: `Session "${sessionId}" not found` }, null, 2) }],
|
|
18
|
+
isError: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const commitCount = session.commits.length;
|
|
22
|
+
const unknownEvents = session.unknownEvents;
|
|
23
|
+
const componentsSeen = new Set();
|
|
24
|
+
let hasActualDuration = false;
|
|
25
|
+
for (const commit of session.commits) {
|
|
26
|
+
for (const fiber of commit.fibers ?? []) {
|
|
27
|
+
if (fiber.name)
|
|
28
|
+
componentsSeen.add(fiber.name);
|
|
29
|
+
if ((fiber.actualDuration ?? 0) > 0)
|
|
30
|
+
hasActualDuration = true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Summarize the top components by total actualDuration so the agent can
|
|
34
|
+
// see which components are hot without stopping the session.
|
|
35
|
+
const durationByComponent = new Map();
|
|
36
|
+
for (const commit of session.commits) {
|
|
37
|
+
for (const fiber of commit.fibers ?? []) {
|
|
38
|
+
const name = fiber.name ?? `(fiber:${fiber.fiberId})`;
|
|
39
|
+
durationByComponent.set(name, (durationByComponent.get(name) ?? 0) + (fiber.actualDuration ?? 0));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const topComponents = Array.from(durationByComponent.entries())
|
|
43
|
+
.sort((a, b) => b[1] - a[1])
|
|
44
|
+
.slice(0, 10)
|
|
45
|
+
.map(([componentName, totalActualDuration]) => ({ componentName, totalActualDuration }));
|
|
46
|
+
let profilingStatus;
|
|
47
|
+
if (session.profilingAvailable === null) {
|
|
48
|
+
profilingStatus = 'unknown (no profiling-hooks-status event received yet)';
|
|
49
|
+
}
|
|
50
|
+
else if (session.profilingAvailable) {
|
|
51
|
+
profilingStatus = 'available';
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
profilingStatus = 'unavailable — app may be running a production build; switch to `next dev`';
|
|
55
|
+
}
|
|
56
|
+
const diagnosis = unknownEvents > 0 && commitCount === 0
|
|
57
|
+
? `${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.`
|
|
58
|
+
: null;
|
|
59
|
+
const result = {
|
|
60
|
+
sessionId,
|
|
61
|
+
status: session.status,
|
|
62
|
+
commitCount,
|
|
63
|
+
componentCount: componentsSeen.size,
|
|
64
|
+
hasActualDuration,
|
|
65
|
+
profilingStatus,
|
|
66
|
+
...(diagnosis ? { diagnosis } : {}),
|
|
67
|
+
topComponents,
|
|
68
|
+
nextStep: session.status === 'active'
|
|
69
|
+
? `call stop_render_capture({ sessionId: "${sessionId}" }) when you are done`
|
|
70
|
+
: `session is stopped — call stop_render_capture({ sessionId: "${sessionId}" }) to finalize`,
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=get-captured-renders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-captured-renders.js","sourceRoot":"","sources":["../../src/tools/get-captured-renders.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,CAuC7D"}
|
|
@@ -10,13 +10,14 @@ export function registerGetHotCommits(server) {
|
|
|
10
10
|
profileId: z.string().describe('Profile ID from load_render_profile'),
|
|
11
11
|
limit: z.number().int().positive().max(25).optional().describe('How many commits to include. Defaults to 10.'),
|
|
12
12
|
componentLimit: z.number().int().positive().max(10).optional().describe('How many top components to include per commit. Defaults to 3.'),
|
|
13
|
+
priorityLevel: z.string().optional().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.'),
|
|
13
14
|
},
|
|
14
|
-
}, async ({ profileId, limit, componentLimit }) => {
|
|
15
|
+
}, async ({ profileId, limit, componentLimit, priorityLevel }) => {
|
|
15
16
|
const profile = getRenderProfile(profileId);
|
|
16
17
|
if (!profile) {
|
|
17
18
|
throw new Error(`Profile "${profileId}" not found. Call get_render_summary without a profileId to list all loaded profiles.`);
|
|
18
19
|
}
|
|
19
|
-
const hotCommits = getHotCommits(profile, limit ?? 10, componentLimit ?? 3).map(commit => ({
|
|
20
|
+
const hotCommits = getHotCommits(profile, limit ?? 10, componentLimit ?? 3, priorityLevel).map(commit => ({
|
|
20
21
|
...commit,
|
|
21
22
|
duration: formatMs(commit.duration),
|
|
22
23
|
totalActualDuration: formatMs(commit.totalActualDuration),
|
|
@@ -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,CAAC,iBAAiB,EAAE;QACrC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC9G,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;
|
|
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,CAAC,iBAAiB,EAAE;QACrC,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,2GAA2G;QACxH,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;YAC9G,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+DAA+D,CAAC;YACxI,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kLAAkL,CAAC;SAClO;KACF,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,EAAE;QAC/D,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,YAAY,SAAS,uFAAuF,CAAC,CAAC;QAChI,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,cAAc,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxG,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,SAAS,CAAC,EAAE,CAAC,CAAC;gBACpD,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,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS;wBACT,aAAa,EAAE,uFAAuF;wBACtG,UAAU;qBACX,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { getRenderProfile, listRenderProfiles } from '../store.js';
|
|
|
5
5
|
export function registerGetRenderSummary(server) {
|
|
6
6
|
server.registerTool('get_render_summary', {
|
|
7
7
|
title: 'Get Render Summary',
|
|
8
|
-
description: 'Summarize the loaded Next.js render profile, including top components by render cost.',
|
|
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
10
|
profileId: z.string().optional().describe('Profile ID from load_render_profile. Omit to list loaded profiles.'),
|
|
11
11
|
limit: z.number().int().positive().max(25).optional().describe('How many top components to include. Defaults to 10.'),
|
|
@@ -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,CAAC,oBAAoB,EAAE;QACxC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,
|
|
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":"load-render-profile.d.ts","sourceRoot":"","sources":["../../src/tools/load-render-profile.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"load-render-profile.d.ts","sourceRoot":"","sources":["../../src/tools/load-render-profile.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6BjE"}
|
|
@@ -7,7 +7,9 @@ import { storeRenderProfile } from '../store.js';
|
|
|
7
7
|
export function registerLoadRenderProfile(server) {
|
|
8
8
|
server.registerTool('load_render_profile', {
|
|
9
9
|
title: 'Load Render Profile',
|
|
10
|
-
description: '
|
|
10
|
+
description: 'Load a React DevTools Profiler JSON export. ' +
|
|
11
|
+
'This is the entry point for the manual profiling path: open React DevTools in the browser → Profiler tab → Record → interact → Stop → Export JSON → share the file path here. ' +
|
|
12
|
+
'Returns a profileId for use with get_render_summary, get_slow_components, get_rerender_causes, and the other analysis tools.',
|
|
11
13
|
inputSchema: {
|
|
12
14
|
filePath: z.string().describe('Absolute or relative path to the exported React Profiler JSON file'),
|
|
13
15
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-render-profile.js","sourceRoot":"","sources":["../../src/tools/load-render-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CAAC,qBAAqB,EAAE;QACzC,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"load-render-profile.js","sourceRoot":"","sources":["../../src/tools/load-render-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CAAC,qBAAqB,EAAE;QACzC,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,8CAA8C;YACzD,gLAAgL;YAChL,8HAA8H;QAChI,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;SACpG;KACF,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAE5B,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM;wBACnC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM;wBACzC,mBAAmB,EAAE,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC;qBAC3D,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-render-capture.d.ts","sourceRoot":"","sources":["../../src/tools/run-render-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4DhE"}
|