@perfonext/render-mcp 0.3.1 → 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 +69 -86
- package/dist/index.js +1 -1
- package/dist/ingest/server.d.ts.map +1 -1
- package/dist/ingest/server.js +15 -13
- package/dist/ingest/server.js.map +1 -1
- package/dist/parser/analysis.d.ts.map +1 -1
- package/dist/parser/analysis.js +63 -62
- package/dist/parser/analysis.js.map +1 -1
- package/dist/parser/react-profile.d.ts.map +1 -1
- package/dist/parser/react-profile.js +1 -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 +15 -4
- package/dist/parser/react-scan-lite.js.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 +17 -5
- 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 +7 -3
- 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 +20 -4
- package/dist/tools/stop-render-capture.js.map +1 -1
- package/package.json +17 -5
package/README.md
CHANGED
|
@@ -1,12 +1,55 @@
|
|
|
1
1
|
# perfonext-render-mcp
|
|
2
2
|
|
|
3
|
+
> Analyze React render behavior in Next.js apps and apply fixes in the editor.
|
|
4
|
+
|
|
3
5
|
[](https://www.npmjs.com/package/@perfonext/render-mcp)
|
|
6
|
+
[](https://www.npmjs.com/package/@perfonext/render-mcp)
|
|
7
|
+
[](https://www.npmjs.com/package/@perfonext/render-mcp)
|
|
8
|
+
|
|
9
|
+
`perfonext-render-mcp` is a Model Context Protocol (MCP) server that gives GitHub Copilot, Claude Desktop,
|
|
10
|
+
Claude Code, and other MCP clients structured, machine-readable React render analysis for Next.js performance
|
|
11
|
+
work. It turns live capture sessions and React DevTools Profiler exports into component costs, exact rerender
|
|
12
|
+
causes, and regression diffs — evidence Copilot can act on directly.
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
Run directly with `npx`:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx -y @perfonext/render-mcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Or install globally:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g @perfonext/render-mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The executable command remains `perfonext-render-mcp` after installation.
|
|
29
|
+
|
|
30
|
+
Add the server to VS Code in `.vscode/mcp.json` (the workspace MCP configuration file):
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"servers": {
|
|
35
|
+
"perfonext-render": {
|
|
36
|
+
"type": "stdio",
|
|
37
|
+
"command": "npx",
|
|
38
|
+
"args": ["-y", "@perfonext/render-mcp"]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Then reload the VS Code window and run **MCP: List Servers** to start it, or accept the trust prompt when it appears. For a locally-built checkout, point `command`/`args` at `node` and the repo's `dist/index.js` instead.
|
|
4
45
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
46
|
+
Then ask Copilot: _"Run a render analysis on my app."_
|
|
47
|
+
|
|
48
|
+
## What It Does
|
|
8
49
|
|
|
9
|
-
|
|
50
|
+
`perfonext-render-mcp` is the **agent companion** to React DevTools Profiler and `react-scan` — best at
|
|
51
|
+
machine-readable summaries, exact rerender-cause attribution, source-aware follow-up, and diffing. The loop is
|
|
52
|
+
**collect → analyze → fix**, all locally:
|
|
10
53
|
|
|
11
54
|
- **collect** — choose live capture (react-scan/lite streams events in real time) or manual DevTools export
|
|
12
55
|
- **analyze** — the MCP returns structured, machine-readable evidence: component costs, rerender causes, commit breakdowns, and regressions
|
|
@@ -15,7 +58,7 @@ The loop is **collect → analyze → fix**, all locally:
|
|
|
15
58
|
> **Note:** while a live capture session is active, React DevTools Timeline Profiler will not receive events
|
|
16
59
|
> (react-scan/lite takes over the profiling channel). Calling `stop_render_capture` restores it.
|
|
17
60
|
|
|
18
|
-
|
|
61
|
+
Capabilities:
|
|
19
62
|
|
|
20
63
|
- **live capture** — streams per-commit fiber events from a running React app directly into the MCP over a local HTTP endpoint; no manual export required
|
|
21
64
|
- **manual export** — loads exported React DevTools Profiler JSON files as an alternative input path
|
|
@@ -33,38 +76,39 @@ The loop is **collect → analyze → fix**, all locally:
|
|
|
33
76
|
|
|
34
77
|
### Entry point
|
|
35
78
|
|
|
36
|
-
| Tool
|
|
37
|
-
|
|
79
|
+
| Tool | Description |
|
|
80
|
+
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
38
81
|
| `begin_render_analysis` | Entry point. Accepts `approach: "live" \| "manual"`. For `live`: starts a capture session and returns the instrumentation snippet. For `manual`: returns React DevTools Profiler export steps. |
|
|
39
82
|
|
|
40
83
|
### Live capture
|
|
41
84
|
|
|
42
|
-
| Tool
|
|
43
|
-
|
|
44
|
-
| `run_render_capture`
|
|
45
|
-
| `stop_render_capture`
|
|
46
|
-
| `get_captured_renders` | Optional diagnostic: peek at session progress without stopping (commit count, unknown events). Only call if something seems wrong.
|
|
85
|
+
| Tool | Description |
|
|
86
|
+
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
87
|
+
| `run_render_capture` | Called after instrumentation is wired up. Accepts `method: "manual-interaction" \| "test-suite"`. Returns focused instructions for whichever method the user picks. Test suites must run **headed** (e.g. `playwright test --headed`) so React profiling hooks activate. |
|
|
88
|
+
| `stop_render_capture` | Stop the session, finalize buffered events into a profile, and return a `profileId` plus `dataQuality` (`exact` \| `heuristic`) for analysis |
|
|
89
|
+
| `get_captured_renders` | Optional diagnostic: peek at session progress without stopping (commit count, unknown events). Only call if something seems wrong. |
|
|
47
90
|
|
|
48
91
|
### Analysis
|
|
49
92
|
|
|
50
|
-
| Tool
|
|
51
|
-
|
|
52
|
-
| `load_render_profile` | Parse and load an exported React DevTools Profiler JSON file from disk (manual path entry point)
|
|
53
|
-
| `get_render_summary`
|
|
54
|
-
| `get_hot_commits`
|
|
55
|
-
| `get_slow_components` | Rank the slowest components by total actual render time
|
|
93
|
+
| Tool | Description |
|
|
94
|
+
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
95
|
+
| `load_render_profile` | Parse and load an exported React DevTools Profiler JSON file from disk (manual path entry point) |
|
|
96
|
+
| `get_render_summary` | Summarize a loaded profile: top components by render cost, hottest commits, and detected render issues |
|
|
97
|
+
| `get_hot_commits` | Rank the most expensive commits and show the top components inside each spike |
|
|
98
|
+
| `get_slow_components` | Rank the slowest components by total actual render time |
|
|
56
99
|
| `get_rerender_causes` | Explain rerender causes with evidence, confidence, and a risk score. Reports exact changed props/state/hooks when `changeDescription` data is present (`dataQuality: "exact"`), heuristics otherwise |
|
|
57
|
-
| `compare_renders`
|
|
100
|
+
| `compare_renders` | Diff two loaded render profiles and rank regressions, improvements, additions, and removals |
|
|
58
101
|
|
|
59
|
-
##
|
|
102
|
+
## Usage Walkthrough
|
|
60
103
|
|
|
61
|
-
Ask Copilot:
|
|
104
|
+
Ask Copilot: _"Run a render analysis on my app."_
|
|
62
105
|
|
|
63
106
|
Copilot calls `begin_render_analysis` and asks you to choose:
|
|
64
107
|
|
|
65
108
|
**Option A — Live capture (recommended)**
|
|
66
109
|
|
|
67
110
|
Copilot will:
|
|
111
|
+
|
|
68
112
|
1. Start a capture session (ingest server on `127.0.0.1:7721`)
|
|
69
113
|
2. Install `react-scan` as a devDependency if not present
|
|
70
114
|
3. Write `instrumentation-client.js` at your project root with the session snippet
|
|
@@ -85,30 +129,6 @@ The ingest server runs on a **fixed port (7721)**. Only the `sessionId` line in
|
|
|
85
129
|
3. Export the JSON and share the file path
|
|
86
130
|
4. Copilot calls `load_render_profile({ filePath: "..." })`
|
|
87
131
|
|
|
88
|
-
## Rerender Score Contract
|
|
89
|
-
|
|
90
|
-
`get_rerender_causes` returns a `dataQuality`, and per component a `score`, `scoreBand`, `confidence`,
|
|
91
|
-
`evidence[]`, and (when known) a `source` file/line.
|
|
92
|
-
|
|
93
|
-
- `dataQuality`:
|
|
94
|
-
- `exact`: at least one fiber carried real `changeDescription` data (live capture in a headed browser), so
|
|
95
|
-
causes name the specific props/state/hooks that changed
|
|
96
|
-
- `heuristic`: no diff data available (DevTools JSON export, or a headless run), so causes are inferred from
|
|
97
|
-
render patterns
|
|
98
|
-
- `score`: a `0-10` rerender-risk score
|
|
99
|
-
- `scoreBand`:
|
|
100
|
-
- `low`: `0.0-2.9`
|
|
101
|
-
- `medium`: `3.0-5.9`
|
|
102
|
-
- `high`: `6.0-10.0`
|
|
103
|
-
- `confidence`: how many independent evidence signals supported the finding
|
|
104
|
-
- `low`: one weak signal or only fallback export evidence
|
|
105
|
-
- `medium`: two independent signals
|
|
106
|
-
- `high`: three or more independent signals
|
|
107
|
-
- `evidence[]`: machine-readable signals such as exact change descriptions, repeated updates, nested-update
|
|
108
|
-
propagation, wide commit spread, or high actual-vs-self duration ratio
|
|
109
|
-
|
|
110
|
-
The score ranks investigation order, not exact root cause.
|
|
111
|
-
|
|
112
132
|
## Example Copilot Prompts
|
|
113
133
|
|
|
114
134
|
- "Run a render analysis on my app."
|
|
@@ -116,49 +136,12 @@ The score ranks investigation order, not exact root cause.
|
|
|
116
136
|
- "Which components are re-rendering the most and why?"
|
|
117
137
|
- "Compare this run to the profile I captured before the refactor."
|
|
118
138
|
- "I already have a React DevTools export — load it and tell me what's slow."
|
|
139
|
+
- "Show me the hottest commits and which components dominated each spike."
|
|
119
140
|
|
|
120
|
-
##
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
Run directly with `npx`:
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
npx -y @perfonext/render-mcp
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
Or install globally:
|
|
130
|
-
|
|
131
|
-
```bash
|
|
132
|
-
npm install -g @perfonext/render-mcp
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
The executable command remains `perfonext-render-mcp` after installation.
|
|
136
|
-
|
|
137
|
-
## MCP Configuration
|
|
138
|
-
|
|
139
|
-
Add to your VS Code `settings.json`:
|
|
140
|
-
|
|
141
|
-
```json
|
|
142
|
-
{
|
|
143
|
-
"mcp": {
|
|
144
|
-
"servers": {
|
|
145
|
-
"perfonext-render": {
|
|
146
|
-
"command": "npx",
|
|
147
|
-
"args": ["-y", "@perfonext/render-mcp"]
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Example Copilot Prompts
|
|
141
|
+
## Related Perfonext Tools
|
|
155
142
|
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
- "Which components are re-rendering the most and why?"
|
|
159
|
-
- "Compare this run to the profile I captured before the refactor."
|
|
160
|
-
- "I already have a React DevTools export — load it and tell me what's slow."
|
|
161
|
-
- "Show me the hottest commits and which components dominated each spike."
|
|
143
|
+
- [perfonext-profiler-mcp](https://github.com/souvikdu/perfonext-profiler-mcp) — CPU profiling (V8/Chrome) for Next.js servers
|
|
144
|
+
- [perfonext-build-mcp](https://github.com/souvikdu/perfonext-build-mcp) — Next.js bundle/build analysis
|
|
162
145
|
|
|
163
146
|
## Development
|
|
164
147
|
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { registerStopRenderCapture } from './tools/stop-render-capture.js';
|
|
|
13
13
|
import { registerGetCapturedRenders } from './tools/get-captured-renders.js';
|
|
14
14
|
const server = new McpServer({
|
|
15
15
|
name: 'perfonext-render-mcp',
|
|
16
|
-
version: '0.3.
|
|
16
|
+
version: '0.3.2',
|
|
17
17
|
});
|
|
18
18
|
registerLoadRenderProfile(server);
|
|
19
19
|
registerCompareRenders(server);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ingest/server.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACtD,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ingest/server.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACtD,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAyGD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB;;+FAE2F;IAC3F,aAAa,EAAE,MAAM,CAAC;CACvB;AAyID,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,cAAc,CAAC,CAoBpE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE/E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAKhF;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAE7C"}
|
package/dist/ingest/server.js
CHANGED
|
@@ -4,19 +4,21 @@ function normalizeFiber(raw) {
|
|
|
4
4
|
const cd = raw.changeDescription ?? null;
|
|
5
5
|
return {
|
|
6
6
|
fiberId: typeof raw.fiberId === 'number' ? raw.fiberId : 0,
|
|
7
|
-
name:
|
|
7
|
+
name: typeof raw.name === 'string' && raw.name.trim() ? raw.name.trim() : '(anonymous)',
|
|
8
8
|
depth: typeof raw.depth === 'number' ? raw.depth : 0,
|
|
9
9
|
actualDuration: typeof raw.actualDuration === 'number' ? raw.actualDuration : 0,
|
|
10
10
|
selfDuration: typeof raw.selfBaseDuration === 'number' ? raw.selfBaseDuration : 0,
|
|
11
|
-
changeDescription: cd != null
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
changeDescription: cd != null
|
|
12
|
+
? {
|
|
13
|
+
isFirstMount: cd.isFirstMount ?? false,
|
|
14
|
+
props: cd.props ?? null,
|
|
15
|
+
state: cd.state ? ['state'] : null,
|
|
16
|
+
context: cd.context ? ['context'] : null,
|
|
17
|
+
hooks: cd.hooks?.map((i) => `hook[${i}]`) ?? null,
|
|
18
|
+
parent: cd.parent ?? false,
|
|
19
|
+
}
|
|
20
|
+
: null,
|
|
21
|
+
source: raw.source && typeof raw.source === 'object' ? raw.source : null,
|
|
20
22
|
parentId: null,
|
|
21
23
|
};
|
|
22
24
|
}
|
|
@@ -27,13 +29,13 @@ function parseOneEvent(raw, commitIndex, urlSessionId) {
|
|
|
27
29
|
// ── Native react-scan/lite endpoint format ────────────────────────────────
|
|
28
30
|
// Body: { message: LiteEventKind, data: {...}, sessionId, timestamp }
|
|
29
31
|
if (typeof r.message === 'string') {
|
|
30
|
-
const data =
|
|
32
|
+
const data = r.data && typeof r.data === 'object' ? r.data : {};
|
|
31
33
|
const ts = typeof r.timestamp === 'number' ? r.timestamp : Date.now();
|
|
32
34
|
if (r.message === 'commit') {
|
|
33
35
|
const tree = Array.isArray(data.tree) ? data.tree : [];
|
|
34
36
|
const fibers = tree.map(normalizeFiber);
|
|
35
37
|
// Use root-depth fiber's actualDuration as commit duration; fall back to sum.
|
|
36
|
-
const rootFiber = fibers.find(f => f.depth === 0);
|
|
38
|
+
const rootFiber = fibers.find((f) => f.depth === 0);
|
|
37
39
|
const duration = rootFiber?.actualDuration ?? fibers.reduce((s, f) => s + f.actualDuration, 0);
|
|
38
40
|
return {
|
|
39
41
|
kind: 'commit',
|
|
@@ -104,7 +106,7 @@ function handleRequest(req, res) {
|
|
|
104
106
|
return;
|
|
105
107
|
}
|
|
106
108
|
readBody(req)
|
|
107
|
-
.then(body => {
|
|
109
|
+
.then((body) => {
|
|
108
110
|
let rawEvents;
|
|
109
111
|
try {
|
|
110
112
|
const parsed = JSON.parse(body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ingest/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuEzC,SAAS,cAAc,CAAC,GAAa;IACnC,MAAM,EAAE,GAAG,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC;IACzC,OAAO;QACL,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ingest/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/parser/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAIf,gBAAgB,EAChB,mBAAmB,EAEnB,gBAAgB,EAEhB,WAAW,EAGX,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EAId,MAAM,YAAY,CAAC;AAyBpB,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAmFD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,mBAAmB,EAC5B,KAAK,SAAK,EACV,cAAc,SAAI,EAClB,aAAa,CAAC,EAAE,MAAM,GACrB,gBAAgB,EAAE,CAsBpB;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,mBAAmB,EAC5B,KAAK,SAAK,GACT;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC;CACpC,CA6BA;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,mBAAmB,EAC5B,KAAK,SAAK,EACV,MAAM,GAAE,OAAO,GAAG,SAAS,GAAG,KAAe,EAC7C,WAAW,SAAI,GACd,kBAAkB,EAAE,CA+BtB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,mBAAmB,EAC5B,KAAK,SAAK,EACV,WAAW,SAAI,GACd,aAAa,EAAE,CAiMjB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,cAAc,SAAI,GACjB,eAAe,GAAG,IAAI,CA8ExB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,KAAK,SAAK,GACT,qBAAqB,EAAE,CA8JzB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CA4E1F;AAmDD,wBAAgB,cAAc,CAC5B,WAAW,EAAE,mBAAmB,EAChC,cAAc,EAAE,mBAAmB,EACnC,KAAK,SAAK,EACV,QAAQ,SAAI,GACX,gBAAgB,CA6ClB"}
|