@memlab/mcp-server 2.1.0 → 2.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 +88 -3
- package/dist/analysis-budget.d.ts +71 -0
- package/dist/analysis-budget.d.ts.map +1 -0
- package/dist/analysis-budget.js +118 -0
- package/dist/analysis-budget.js.map +1 -0
- package/dist/guardrail.d.ts +24 -0
- package/dist/guardrail.d.ts.map +1 -0
- package/dist/guardrail.js +65 -0
- package/dist/guardrail.js.map +1 -0
- package/dist/heap-state.d.ts +46 -1
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +142 -10
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/array-group-by.d.ts +12 -0
- package/dist/tools/array-group-by.d.ts.map +1 -0
- package/dist/tools/array-group-by.js +191 -0
- package/dist/tools/array-group-by.js.map +1 -0
- package/dist/tools/auto-investigate.d.ts.map +1 -1
- package/dist/tools/auto-investigate.js +999 -37
- package/dist/tools/auto-investigate.js.map +1 -1
- package/dist/tools/cache-analysis.d.ts.map +1 -1
- package/dist/tools/cache-analysis.js +438 -21
- package/dist/tools/cache-analysis.js.map +1 -1
- package/dist/tools/check-health.d.ts.map +1 -1
- package/dist/tools/check-health.js +261 -1
- package/dist/tools/check-health.js.map +1 -1
- package/dist/tools/class-histogram.d.ts.map +1 -1
- package/dist/tools/class-histogram.js +142 -33
- package/dist/tools/class-histogram.js.map +1 -1
- package/dist/tools/closure-inspection.d.ts.map +1 -1
- package/dist/tools/closure-inspection.js +238 -25
- package/dist/tools/closure-inspection.js.map +1 -1
- package/dist/tools/detached-dom.d.ts.map +1 -1
- package/dist/tools/detached-dom.js +25 -3
- package/dist/tools/detached-dom.js.map +1 -1
- package/dist/tools/dev-artifacts.d.ts +33 -0
- package/dist/tools/dev-artifacts.d.ts.map +1 -0
- package/dist/tools/dev-artifacts.js +165 -0
- package/dist/tools/dev-artifacts.js.map +1 -0
- package/dist/tools/diff-snapshots.d.ts.map +1 -1
- package/dist/tools/diff-snapshots.js +113 -18
- package/dist/tools/diff-snapshots.js.map +1 -1
- package/dist/tools/duplicated-strings.d.ts.map +1 -1
- package/dist/tools/duplicated-strings.js +74 -12
- package/dist/tools/duplicated-strings.js.map +1 -1
- package/dist/tools/eval.d.ts.map +1 -1
- package/dist/tools/eval.js +189 -10
- package/dist/tools/eval.js.map +1 -1
- package/dist/tools/event-listener-leaks.d.ts.map +1 -1
- package/dist/tools/event-listener-leaks.js +235 -13
- package/dist/tools/event-listener-leaks.js.map +1 -1
- package/dist/tools/event-registry.d.ts +12 -0
- package/dist/tools/event-registry.d.ts.map +1 -0
- package/dist/tools/event-registry.js +183 -0
- package/dist/tools/event-registry.js.map +1 -0
- package/dist/tools/find-by-property.d.ts.map +1 -1
- package/dist/tools/find-by-property.js +113 -31
- package/dist/tools/find-by-property.js.map +1 -1
- package/dist/tools/find-by-shape.d.ts +12 -0
- package/dist/tools/find-by-shape.d.ts.map +1 -0
- package/dist/tools/find-by-shape.js +178 -0
- package/dist/tools/find-by-shape.js.map +1 -0
- package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
- package/dist/tools/find-nodes-by-class.js +50 -6
- package/dist/tools/find-nodes-by-class.js.map +1 -1
- package/dist/tools/for-each.d.ts.map +1 -1
- package/dist/tools/for-each.js +1 -1
- package/dist/tools/for-each.js.map +1 -1
- package/dist/tools/get-node.d.ts.map +1 -1
- package/dist/tools/get-node.js +6 -0
- package/dist/tools/get-node.js.map +1 -1
- package/dist/tools/get-string.d.ts +12 -0
- package/dist/tools/get-string.d.ts.map +1 -0
- package/dist/tools/get-string.js +223 -0
- package/dist/tools/get-string.js.map +1 -0
- package/dist/tools/get-value.d.ts +12 -0
- package/dist/tools/get-value.d.ts.map +1 -0
- package/dist/tools/get-value.js +152 -0
- package/dist/tools/get-value.js.map +1 -0
- package/dist/tools/global-variables.d.ts.map +1 -1
- package/dist/tools/global-variables.js +54 -34
- package/dist/tools/global-variables.js.map +1 -1
- package/dist/tools/growth-signals.d.ts +12 -0
- package/dist/tools/growth-signals.d.ts.map +1 -0
- package/dist/tools/growth-signals.js +211 -0
- package/dist/tools/growth-signals.js.map +1 -0
- package/dist/tools/intern-opportunities.d.ts +12 -0
- package/dist/tools/intern-opportunities.d.ts.map +1 -0
- package/dist/tools/intern-opportunities.js +289 -0
- package/dist/tools/intern-opportunities.js.map +1 -0
- package/dist/tools/load-snapshot.d.ts +10 -0
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +152 -15
- package/dist/tools/load-snapshot.js.map +1 -1
- package/dist/tools/object-cost-breakdown.d.ts +12 -0
- package/dist/tools/object-cost-breakdown.d.ts.map +1 -0
- package/dist/tools/object-cost-breakdown.js +439 -0
- package/dist/tools/object-cost-breakdown.js.map +1 -0
- package/dist/tools/object-shape.d.ts.map +1 -1
- package/dist/tools/object-shape.js +95 -2
- package/dist/tools/object-shape.js.map +1 -1
- package/dist/tools/pinch-points.d.ts.map +1 -1
- package/dist/tools/pinch-points.js +9 -9
- package/dist/tools/pinch-points.js.map +1 -1
- package/dist/tools/property-distribution.d.ts +12 -0
- package/dist/tools/property-distribution.d.ts.map +1 -0
- package/dist/tools/property-distribution.js +168 -0
- package/dist/tools/property-distribution.js.map +1 -0
- package/dist/tools/quick-diagnosis.d.ts.map +1 -1
- package/dist/tools/quick-diagnosis.js +56 -19
- package/dist/tools/quick-diagnosis.js.map +1 -1
- package/dist/tools/retainer-summary.d.ts.map +1 -1
- package/dist/tools/retainer-summary.js +90 -5
- package/dist/tools/retainer-summary.js.map +1 -1
- package/dist/tools/retainer-trace.d.ts.map +1 -1
- package/dist/tools/retainer-trace.js +74 -22
- package/dist/tools/retainer-trace.js.map +1 -1
- package/dist/tools/search-nodes.d.ts.map +1 -1
- package/dist/tools/search-nodes.js +10 -3
- package/dist/tools/search-nodes.js.map +1 -1
- package/dist/tools/search-strings.d.ts +12 -0
- package/dist/tools/search-strings.d.ts.map +1 -0
- package/dist/tools/search-strings.js +182 -0
- package/dist/tools/search-strings.js.map +1 -0
- package/dist/tools/sequence-analysis.d.ts +12 -0
- package/dist/tools/sequence-analysis.d.ts.map +1 -0
- package/dist/tools/sequence-analysis.js +234 -0
- package/dist/tools/sequence-analysis.js.map +1 -0
- package/dist/tools/server-status.d.ts +12 -0
- package/dist/tools/server-status.d.ts.map +1 -0
- package/dist/tools/server-status.js +41 -0
- package/dist/tools/server-status.js.map +1 -0
- package/dist/tools/shape-histogram.d.ts.map +1 -1
- package/dist/tools/shape-histogram.js +61 -16
- package/dist/tools/shape-histogram.js.map +1 -1
- package/dist/tools/sliced-strings.d.ts.map +1 -1
- package/dist/tools/sliced-strings.js +16 -11
- package/dist/tools/sliced-strings.js.map +1 -1
- package/dist/tools/snapshot-summary.d.ts.map +1 -1
- package/dist/tools/snapshot-summary.js +55 -13
- package/dist/tools/snapshot-summary.js.map +1 -1
- package/dist/tools/snapshots.d.ts +12 -0
- package/dist/tools/snapshots.d.ts.map +1 -0
- package/dist/tools/snapshots.js +93 -0
- package/dist/tools/snapshots.js.map +1 -0
- package/dist/tools/stale-collections.d.ts.map +1 -1
- package/dist/tools/stale-collections.js +248 -7
- package/dist/tools/stale-collections.js.map +1 -1
- package/dist/tools/trace-dominators.d.ts.map +1 -1
- package/dist/tools/trace-dominators.js +28 -1
- package/dist/tools/trace-dominators.js.map +1 -1
- package/dist/tools/weakmap-entries.d.ts +12 -0
- package/dist/tools/weakmap-entries.d.ts.map +1 -0
- package/dist/tools/weakmap-entries.js +156 -0
- package/dist/tools/weakmap-entries.js.map +1 -0
- package/dist/utils.d.ts +81 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +303 -35
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-histogram.js","sourceRoot":"","sources":["../../src/tools/class-histogram.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,EAAC,
|
|
1
|
+
{"version":3,"file":"class-histogram.js","sourceRoot":"","sources":["../../src/tools/class-histogram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closure-inspection.d.ts","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"closure-inspection.d.ts","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA6HvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8RjE"}
|
|
@@ -10,25 +10,146 @@
|
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
12
|
import { errorResult, toolResult, formatBytes, formatNumber, formatNodeInline, markdownTable, } from '../utils.js';
|
|
13
|
+
function walkScopeChain(contextNode, maxDepth) {
|
|
14
|
+
const allVars = [];
|
|
15
|
+
const visited = new Set();
|
|
16
|
+
let currentContext = contextNode;
|
|
17
|
+
let depth = 0;
|
|
18
|
+
while (currentContext &&
|
|
19
|
+
depth <= maxDepth &&
|
|
20
|
+
!visited.has(currentContext.id)) {
|
|
21
|
+
visited.add(currentContext.id);
|
|
22
|
+
for (const edge of currentContext.references) {
|
|
23
|
+
if (edge.type === 'context' || edge.type === 'property') {
|
|
24
|
+
const name = String(edge.name_or_index);
|
|
25
|
+
if (name === 'previous' || name === 'native_context')
|
|
26
|
+
continue;
|
|
27
|
+
const target = edge.toNode;
|
|
28
|
+
if (target.id <= 3)
|
|
29
|
+
continue;
|
|
30
|
+
const v = {
|
|
31
|
+
variable_name: name,
|
|
32
|
+
target_type: target.type,
|
|
33
|
+
target_name: target.name,
|
|
34
|
+
target_id: target.id,
|
|
35
|
+
self_size: target.self_size,
|
|
36
|
+
retained_size: target.retainedSize,
|
|
37
|
+
depth,
|
|
38
|
+
};
|
|
39
|
+
if (target.isString) {
|
|
40
|
+
const strNode = target.toStringNode();
|
|
41
|
+
if (strNode) {
|
|
42
|
+
const val = strNode.stringValue;
|
|
43
|
+
v.string_value = val.length > 200 ? val.slice(0, 200) + '...' : val;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
allVars.push(v);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Walk to the parent scope via "previous" edge
|
|
50
|
+
let nextContext = null;
|
|
51
|
+
for (const edge of currentContext.references) {
|
|
52
|
+
if (String(edge.name_or_index) === 'previous' && edge.toNode.id > 3) {
|
|
53
|
+
nextContext = edge.toNode;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
currentContext = nextContext;
|
|
58
|
+
depth++;
|
|
59
|
+
}
|
|
60
|
+
return { variables: allVars, depth };
|
|
61
|
+
}
|
|
62
|
+
function findEdge(node, name) {
|
|
63
|
+
return node.references.find(e => String(e.name_or_index) === name) ?? null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* For a suspended generator/async frame, enumerate its
|
|
67
|
+
* `parameters_and_registers` FixedArray. Register slots are opaque numeric
|
|
68
|
+
* indices in the snapshot, but values that are *also* context-allocated show
|
|
69
|
+
* up as named variables in the scope chain — so we cross-reference by target
|
|
70
|
+
* node id to recover source variable names where possible (Feedback §3a).
|
|
71
|
+
*/
|
|
72
|
+
function inspectFrameRegisters(generator, nameById, minRetained) {
|
|
73
|
+
const parEdge = findEdge(generator, 'parameters_and_registers');
|
|
74
|
+
if (!parEdge)
|
|
75
|
+
return [];
|
|
76
|
+
const arr = parEdge.toNode;
|
|
77
|
+
const entries = [];
|
|
78
|
+
for (const edge of arr.references) {
|
|
79
|
+
if (edge.type !== 'element')
|
|
80
|
+
continue;
|
|
81
|
+
const target = edge.toNode;
|
|
82
|
+
if (target.id <= 3)
|
|
83
|
+
continue;
|
|
84
|
+
if (target.name === 'undefined' || target.name === 'the_hole')
|
|
85
|
+
continue;
|
|
86
|
+
if (target.retainedSize < minRetained)
|
|
87
|
+
continue;
|
|
88
|
+
const idx = Number(edge.name_or_index);
|
|
89
|
+
entries.push({
|
|
90
|
+
index: Number.isFinite(idx) ? idx : -1,
|
|
91
|
+
target,
|
|
92
|
+
resolvedName: nameById.get(target.id) ?? null,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
entries.sort((a, b) => b.target.retainedSize - a.target.retainedSize);
|
|
96
|
+
return entries;
|
|
97
|
+
}
|
|
13
98
|
export function registerClosureInspection(server) {
|
|
14
|
-
server.tool('memlab_closure_inspection', 'Inspect a closure (function)
|
|
99
|
+
server.tool('memlab_closure_inspection', 'Inspect a closure (function) OR a suspended generator/async frame to show its captured/live variables. ' +
|
|
100
|
+
'For closures, walks the FULL scope chain via "previous" edges on V8 Context objects, reporting variables ' +
|
|
101
|
+
'at each scope depth. For generators (suspended async functions), additionally decodes the ' +
|
|
102
|
+
'`parameters_and_registers` array and resolves register slots to source variable names where the value is ' +
|
|
103
|
+
'also context-allocated. Shows the function name, source location, and all bound variables with types and sizes. ' +
|
|
104
|
+
'Critical for diagnosing closure- and suspended-async-based memory leaks where a frame unintentionally retains large objects.', {
|
|
15
105
|
node_id: z
|
|
16
106
|
.number()
|
|
17
107
|
.describe('The numeric ID of the closure/function node'),
|
|
18
|
-
|
|
108
|
+
max_scope_depth: z
|
|
109
|
+
.number()
|
|
110
|
+
.optional()
|
|
111
|
+
.default(10)
|
|
112
|
+
.describe('Maximum scope chain depth to walk (default 10). Increase for deeply nested closures.'),
|
|
113
|
+
min_retained_size: z
|
|
114
|
+
.number()
|
|
115
|
+
.optional()
|
|
116
|
+
.default(0)
|
|
117
|
+
.describe('Only show captured variables retaining at least this many bytes (default 0 = show all). ' +
|
|
118
|
+
'Use e.g. 10240 for 10 KB to filter noise in deeply nested closures.'),
|
|
119
|
+
max_variables: z
|
|
120
|
+
.number()
|
|
121
|
+
.optional()
|
|
122
|
+
.default(20)
|
|
123
|
+
.describe('Limit output to the top N variables by retained size (default 20; pass 0 for no limit). ' +
|
|
124
|
+
'The default caps deeply nested closures (which can have 100+ captured variables) to the top 20 by retained size, with the remainder summarized as "… and N more". Raise it or pass 0 to see everything.'),
|
|
125
|
+
}, async ({ node_id, max_scope_depth, min_retained_size, max_variables }) => {
|
|
19
126
|
try {
|
|
20
127
|
const snapshot = getSnapshot();
|
|
21
128
|
const node = snapshot.getNodeById(node_id);
|
|
22
129
|
if (!node) {
|
|
23
130
|
return errorResult(`Node with id ${node_id} not found`);
|
|
24
131
|
}
|
|
25
|
-
|
|
26
|
-
|
|
132
|
+
// A suspended generator/async frame has a parameters_and_registers
|
|
133
|
+
// array. Treat such nodes as inspectable frames too.
|
|
134
|
+
const registersEdge = findEdge(node, 'parameters_and_registers');
|
|
135
|
+
const isGenerator = registersEdge != null;
|
|
136
|
+
if (node.type !== 'closure' && !isGenerator) {
|
|
137
|
+
return toolResult(`Node @${node_id} is not a closure or generator frame (type is "${node.type}"). This tool is designed for closure nodes and suspended generator/async frames (which expose parameters_and_registers).`);
|
|
27
138
|
}
|
|
28
|
-
//
|
|
29
|
-
|
|
139
|
+
// For a generator, the function/closure lives behind the "function"
|
|
140
|
+
// edge; resolve scope context and shared info from there.
|
|
141
|
+
const fnNode = isGenerator
|
|
142
|
+
? (findEdge(node, 'function')?.toNode ?? node)
|
|
143
|
+
: node;
|
|
144
|
+
// Also look for the "shared" edge which points to SharedFunctionInfo
|
|
145
|
+
const sharedEdge = fnNode.references.find(e => String(e.name_or_index) === 'shared' && e.type === 'internal') ?? findEdge(fnNode, 'shared');
|
|
146
|
+
// Get the context chain — the scope object this frame closes over
|
|
147
|
+
const contextEdge = fnNode.references.find(e => String(e.name_or_index) === 'context' && e.type === 'internal') ??
|
|
148
|
+
findEdge(node, 'context') ??
|
|
149
|
+
findEdge(fnNode, 'context');
|
|
150
|
+
// Also collect direct context-type edges from the closure itself
|
|
151
|
+
const directVars = node.references
|
|
30
152
|
.filter(edge => edge.type === 'context')
|
|
31
|
-
.sort((a, b) => b.toNode.retainedSize - a.toNode.retainedSize)
|
|
32
153
|
.map(edge => {
|
|
33
154
|
const target = edge.toNode;
|
|
34
155
|
const v = {
|
|
@@ -38,7 +159,7 @@ export function registerClosureInspection(server) {
|
|
|
38
159
|
target_id: target.id,
|
|
39
160
|
self_size: target.self_size,
|
|
40
161
|
retained_size: target.retainedSize,
|
|
41
|
-
|
|
162
|
+
depth: 0,
|
|
42
163
|
};
|
|
43
164
|
if (target.isString) {
|
|
44
165
|
const strNode = target.toStringNode();
|
|
@@ -50,23 +171,49 @@ export function registerClosureInspection(server) {
|
|
|
50
171
|
}
|
|
51
172
|
return v;
|
|
52
173
|
});
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
174
|
+
// Walk the full scope chain if a context object exists
|
|
175
|
+
let chainVars = [];
|
|
176
|
+
let chainDepth = 0;
|
|
177
|
+
if (contextEdge) {
|
|
178
|
+
const chain = walkScopeChain(contextEdge.toNode, max_scope_depth);
|
|
179
|
+
chainVars = chain.variables;
|
|
180
|
+
chainDepth = chain.depth;
|
|
181
|
+
}
|
|
182
|
+
// Merge: direct vars at depth 0, then chain vars (shift depth by 1 if there are direct vars)
|
|
183
|
+
const allVars = [...directVars];
|
|
184
|
+
const directVarNames = new Set(directVars.map(v => `${v.variable_name}@${v.target_id}`));
|
|
185
|
+
for (const cv of chainVars) {
|
|
186
|
+
const key = `${cv.variable_name}@${cv.target_id}`;
|
|
187
|
+
if (!directVarNames.has(key)) {
|
|
188
|
+
allVars.push(cv);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
allVars.sort((a, b) => b.retained_size - a.retained_size);
|
|
192
|
+
const totalVarCount = allVars.length;
|
|
193
|
+
const totalVarRetained = allVars.reduce((sum, v) => sum + v.retained_size, 0);
|
|
194
|
+
let filteredVars = allVars;
|
|
195
|
+
if (min_retained_size > 0) {
|
|
196
|
+
filteredVars = filteredVars.filter(v => v.retained_size >= min_retained_size);
|
|
197
|
+
}
|
|
198
|
+
const effectiveMax = max_variables > 0 ? max_variables : filteredVars.length;
|
|
199
|
+
const omittedVars = filteredVars.slice(effectiveMax);
|
|
200
|
+
const omittedRetained = omittedVars.reduce((sum, v) => sum + v.retained_size, 0);
|
|
201
|
+
filteredVars = filteredVars.slice(0, effectiveMax);
|
|
202
|
+
const locNode = fnNode.location ? fnNode : node;
|
|
203
|
+
const location = locNode.location
|
|
59
204
|
? {
|
|
60
|
-
script_id:
|
|
61
|
-
line:
|
|
62
|
-
column:
|
|
205
|
+
script_id: locNode.location.script_id,
|
|
206
|
+
line: locNode.location.line,
|
|
207
|
+
column: locNode.location.column,
|
|
63
208
|
}
|
|
64
209
|
: null;
|
|
65
|
-
const totalCapturedRetained = capturedVars.reduce((sum, v) => sum + v.retained_size, 0);
|
|
66
210
|
const lines = [
|
|
67
|
-
|
|
211
|
+
`**${isGenerator ? 'Suspended frame' : 'Closure'}:** ${formatNodeInline(node.id, node.name, node.type, node.self_size)}`,
|
|
68
212
|
`**Self Size:** ${formatBytes(node.self_size)} | **Retained Size:** ${formatBytes(node.retainedSize)}`,
|
|
69
213
|
];
|
|
214
|
+
if (isGenerator && fnNode !== node) {
|
|
215
|
+
lines.push(`**Function:** ${formatNodeInline(fnNode.id, fnNode.name, fnNode.type, fnNode.self_size)}`);
|
|
216
|
+
}
|
|
70
217
|
if (location) {
|
|
71
218
|
lines.push(`**Location:** script ${location.script_id}, line ${location.line}, col ${location.column}`);
|
|
72
219
|
}
|
|
@@ -77,25 +224,91 @@ export function registerClosureInspection(server) {
|
|
|
77
224
|
if (sharedEdge) {
|
|
78
225
|
lines.push(`**Shared Function Info:** @${sharedEdge.toNode.id} ${sharedEdge.toNode.name}`);
|
|
79
226
|
}
|
|
80
|
-
|
|
227
|
+
const showingNote = filteredVars.length < totalVarCount
|
|
228
|
+
? ` (showing ${formatNumber(filteredVars.length)} of ${formatNumber(totalVarCount)})`
|
|
229
|
+
: '';
|
|
230
|
+
lines.push(`**Captured Variables:** ${formatNumber(totalVarCount)}, total retained ${formatBytes(totalVarRetained)}` +
|
|
231
|
+
(chainDepth > 1 ? ` (across ${chainDepth} scope levels)` : '') +
|
|
232
|
+
showingNote);
|
|
81
233
|
lines.push('');
|
|
82
|
-
if (
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
234
|
+
if (filteredVars.length > 0) {
|
|
235
|
+
const hasMultipleDepths = new Set(filteredVars.map(v => v.depth)).size > 1;
|
|
236
|
+
const headers = hasMultipleDepths
|
|
237
|
+
? ['Depth', 'Variable', 'Target', 'Target Type', 'Retained']
|
|
238
|
+
: ['Variable', 'Target', 'Target Type', 'Retained'];
|
|
239
|
+
const rightCols = hasMultipleDepths ? new Set([4]) : new Set([3]);
|
|
240
|
+
const rows = filteredVars.map(v => {
|
|
86
241
|
let targetLabel = `@${v.target_id} ${v.target_name}`;
|
|
87
242
|
if (v.string_value != null) {
|
|
88
243
|
const sv = v.string_value;
|
|
89
244
|
targetLabel = `@${v.target_id} "${sv.length > 60 ? sv.slice(0, 60) + '...' : sv}"`;
|
|
90
245
|
}
|
|
91
|
-
|
|
246
|
+
const row = [
|
|
92
247
|
v.variable_name,
|
|
93
248
|
targetLabel,
|
|
94
249
|
v.target_type,
|
|
95
250
|
formatBytes(v.retained_size),
|
|
96
251
|
];
|
|
252
|
+
if (hasMultipleDepths) {
|
|
253
|
+
row.unshift(String(v.depth));
|
|
254
|
+
}
|
|
255
|
+
return row;
|
|
97
256
|
});
|
|
98
257
|
lines.push(markdownTable(headers, rows, rightCols));
|
|
258
|
+
if (omittedVars.length > 0) {
|
|
259
|
+
lines.push('');
|
|
260
|
+
lines.push(`… and ${formatNumber(omittedVars.length)} more variable(s) retaining ${formatBytes(omittedRetained)} total` +
|
|
261
|
+
(min_retained_size > 0
|
|
262
|
+
? ` (filtered below ${formatBytes(min_retained_size)})`
|
|
263
|
+
: ''));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else if (totalVarCount > 0) {
|
|
267
|
+
lines.push(`All ${formatNumber(totalVarCount)} variables are below the ${formatBytes(min_retained_size)} threshold (${formatBytes(totalVarRetained)} total). Lower min_retained_size to see them.`);
|
|
268
|
+
}
|
|
269
|
+
// For suspended generator/async frames, decode parameters_and_registers.
|
|
270
|
+
if (isGenerator) {
|
|
271
|
+
const nameById = new Map();
|
|
272
|
+
for (const v of allVars) {
|
|
273
|
+
if (!nameById.has(v.target_id)) {
|
|
274
|
+
nameById.set(v.target_id, v.variable_name);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const regs = inspectFrameRegisters(node, nameById, min_retained_size);
|
|
278
|
+
lines.push('');
|
|
279
|
+
lines.push(`**Live registers (\`parameters_and_registers\`):** ${formatNumber(regs.length)} slot(s) retaining ≥ ${formatBytes(min_retained_size)}`);
|
|
280
|
+
if (regs.length > 0) {
|
|
281
|
+
const effMax = max_variables > 0 ? max_variables : regs.length;
|
|
282
|
+
const headers = [
|
|
283
|
+
'Slot',
|
|
284
|
+
'Source name',
|
|
285
|
+
'Target',
|
|
286
|
+
'Type',
|
|
287
|
+
'Retained',
|
|
288
|
+
];
|
|
289
|
+
const rightCols = new Set([4]);
|
|
290
|
+
const rows = regs.slice(0, effMax).map(r => {
|
|
291
|
+
let targetLabel = `@${r.target.id} ${r.target.name}`;
|
|
292
|
+
if (r.target.isString) {
|
|
293
|
+
const s = r.target.toStringNode();
|
|
294
|
+
if (s) {
|
|
295
|
+
const v = s.stringValue;
|
|
296
|
+
targetLabel = `@${r.target.id} "${v.length > 50 ? v.slice(0, 50) + '...' : v}"`;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return [
|
|
300
|
+
r.index >= 0 ? `[${r.index}]` : '?',
|
|
301
|
+
r.resolvedName ?? '(unnamed register)',
|
|
302
|
+
targetLabel,
|
|
303
|
+
r.target.type,
|
|
304
|
+
formatBytes(r.target.retainedSize),
|
|
305
|
+
];
|
|
306
|
+
});
|
|
307
|
+
lines.push('');
|
|
308
|
+
lines.push(markdownTable(headers, rows, rightCols));
|
|
309
|
+
lines.push('');
|
|
310
|
+
lines.push('_Register slots are bytecode-local indices. Names are recovered when the value is also context-allocated (appears in the scope chain above); slots shown as "(unnamed register)" are stack-only temporaries whose source name is not in the snapshot._');
|
|
311
|
+
}
|
|
99
312
|
}
|
|
100
313
|
return toolResult(lines.join('\n'));
|
|
101
314
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closure-inspection.js","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"closure-inspection.js","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detached-dom.d.ts","sourceRoot":"","sources":["../../src/tools/detached-dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA4EvE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"detached-dom.d.ts","sourceRoot":"","sources":["../../src/tools/detached-dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA4EvE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoM3D"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot, getSnapshotEnv } from '../heap-state.js';
|
|
12
12
|
import { queryNodes, formatQueryNodesResult, formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
|
+
import { collectDevRoots, classifyDevOnly } from './dev-artifacts.js';
|
|
13
14
|
function isDetachedDOMNode(node) {
|
|
14
15
|
if (node.id <= 3)
|
|
15
16
|
return false;
|
|
@@ -61,7 +62,8 @@ function getFirstNonFrameworkRetainer(node) {
|
|
|
61
62
|
return '(unknown)';
|
|
62
63
|
}
|
|
63
64
|
export function registerDetachedDom(server) {
|
|
64
|
-
server.tool('memlab_detached_dom', 'Find detached DOM elements still retained in memory. These are common sources of memory leaks — DOM nodes removed from the document but kept alive by JavaScript references. Supports count-only and ids-only modes for large result sets. Use group_by to aggregate by element tag, retainer pattern, or data-testid.'
|
|
65
|
+
server.tool('memlab_detached_dom', 'Find detached DOM elements still retained in memory. These are common sources of memory leaks — DOM nodes removed from the document but kept alive by JavaScript references. Supports count-only and ids-only modes for large result sets. Use group_by to aggregate by element tag, retainer pattern, or data-testid. ' +
|
|
66
|
+
'⚠ Full-heap scan — slow on very large heaps (millions of nodes); use count-only / ids-only modes and group_by to bound output.', {
|
|
65
67
|
output_mode: z
|
|
66
68
|
.enum(['full', 'count', 'ids'])
|
|
67
69
|
.optional()
|
|
@@ -81,7 +83,12 @@ export function registerDetachedDom(server) {
|
|
|
81
83
|
.optional()
|
|
82
84
|
.default(20)
|
|
83
85
|
.describe('Maximum number of results (default 20, up to 10000 for ids mode)'),
|
|
84
|
-
|
|
86
|
+
classify_dev_only: z
|
|
87
|
+
.boolean()
|
|
88
|
+
.optional()
|
|
89
|
+
.default(true)
|
|
90
|
+
.describe("Report how much detached DOM is retained ONLY via dev/extension globals (__REACT_DEVTOOLS_GLOBAL_HOOK__, window.Debug, …) and would be GC'd in production (default true). Use memlab_dev_artifacts for the full breakdown."),
|
|
91
|
+
}, async ({ output_mode, group_by, offset, limit, classify_dev_only }) => {
|
|
85
92
|
try {
|
|
86
93
|
const env = getSnapshotEnv();
|
|
87
94
|
if (env === 'node') {
|
|
@@ -93,15 +100,20 @@ export function registerDetachedDom(server) {
|
|
|
93
100
|
'- `memlab_class_histogram` — per-class instance counts and sizes');
|
|
94
101
|
}
|
|
95
102
|
const snapshot = getSnapshot();
|
|
103
|
+
const devRoots = classify_dev_only ? collectDevRoots(snapshot) : null;
|
|
96
104
|
if (group_by) {
|
|
97
105
|
const groups = new Map();
|
|
98
106
|
let totalDetached = 0;
|
|
99
107
|
let totalRetainedAll = 0;
|
|
108
|
+
let devOnlyRetained = 0;
|
|
100
109
|
snapshot.nodes.forEach(node => {
|
|
101
110
|
if (!isDetachedDOMNode(node))
|
|
102
111
|
return;
|
|
103
112
|
totalDetached++;
|
|
104
113
|
totalRetainedAll += node.retainedSize;
|
|
114
|
+
if (devRoots && classifyDevOnly(node, devRoots).devOnly) {
|
|
115
|
+
devOnlyRetained += node.retainedSize;
|
|
116
|
+
}
|
|
105
117
|
let key;
|
|
106
118
|
switch (group_by) {
|
|
107
119
|
case 'element':
|
|
@@ -169,6 +181,12 @@ export function registerDetachedDom(server) {
|
|
|
169
181
|
'',
|
|
170
182
|
markdownTable(headers, rows, rightCols),
|
|
171
183
|
];
|
|
184
|
+
if (devRoots && devRoots.byId.size > 0 && devOnlyRetained > 0) {
|
|
185
|
+
const pct = totalRetainedAll > 0
|
|
186
|
+
? ((devOnlyRetained / totalRetainedAll) * 100).toFixed(0)
|
|
187
|
+
: '0';
|
|
188
|
+
lines.push('', `⚠ **${formatBytes(devOnlyRetained)} (${pct}%) of this detached DOM is retained ONLY via dev/extension globals** (${[...new Set(devRoots.byId.values())].join(', ')}) — it would be garbage-collected in production. Exclude it from leak totals; run \`memlab_dev_artifacts\` for the breakdown.`);
|
|
189
|
+
}
|
|
172
190
|
if (sorted.length > 0) {
|
|
173
191
|
lines.push('', `**Suggested action:** Use \`memlab_retainer_summary\` with node_ids from the top group's example to trace the common retention pattern.`);
|
|
174
192
|
}
|
|
@@ -182,12 +200,16 @@ export function registerDetachedDom(server) {
|
|
|
182
200
|
});
|
|
183
201
|
const output = formatQueryNodesResult(result, offset);
|
|
184
202
|
if (result.total_count > 0 && output_mode === 'full') {
|
|
203
|
+
const devNote = devRoots && devRoots.byId.size > 0
|
|
204
|
+
? ` Dev/extension globals (${[...new Set(devRoots.byId.values())].join(', ')}) are present — run \`memlab_dev_artifacts\` to exclude DevTools-only retention from leak totals.`
|
|
205
|
+
: '';
|
|
185
206
|
return toolResult(output +
|
|
186
207
|
'\n\n---\n\n' +
|
|
187
208
|
'**Suggested action:** Check for missing `removeEventListener` calls, ' +
|
|
188
209
|
'React component cleanup in `useEffect` return, or refs not cleared on unmount. ' +
|
|
189
210
|
'Use `memlab_retainer_trace` on top entries to find the retention path. ' +
|
|
190
|
-
'Use `group_by: "retainer"` to see which components are retaining the most detached DOM.'
|
|
211
|
+
'Use `group_by: "retainer"` to see which components are retaining the most detached DOM.' +
|
|
212
|
+
devNote);
|
|
191
213
|
}
|
|
192
214
|
return toolResult(output);
|
|
193
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detached-dom.js","sourceRoot":"","sources":["../../src/tools/detached-dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"detached-dom.js","sourceRoot":"","sources":["../../src/tools/detached-dom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
* @oncall memory_lab
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
import type { IHeapNode, IHeapSnapshot } from '@memlab/core';
|
|
12
|
+
export interface DevRoots {
|
|
13
|
+
byId: Map<number, string>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find the dev/extension "root" objects: the targets of dev-global edges on
|
|
17
|
+
* the Window/global object, plus any node whose own name marks it as a
|
|
18
|
+
* devtools hook.
|
|
19
|
+
*/
|
|
20
|
+
export declare function collectDevRoots(snapshot: IHeapSnapshot): DevRoots;
|
|
21
|
+
/**
|
|
22
|
+
* Classify whether a node is retained ONLY via a dev/extension global. We walk
|
|
23
|
+
* the dominator chain upward: if a dev root *dominates* the node, then every
|
|
24
|
+
* path from a GC root to the node passes through that dev object, so it would
|
|
25
|
+
* be collected in production. Using the dominator (not the shortest retainer)
|
|
26
|
+
* makes the "only via" claim rigorous.
|
|
27
|
+
*/
|
|
28
|
+
export declare function classifyDevOnly(node: IHeapNode, devRoots: DevRoots, maxWalk?: number): {
|
|
29
|
+
devOnly: boolean;
|
|
30
|
+
via: string | null;
|
|
31
|
+
};
|
|
32
|
+
export declare function registerDevArtifacts(server: McpServer): void;
|
|
33
|
+
//# sourceMappingURL=dev-artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-artifacts.d.ts","sourceRoot":"","sources":["../../src/tools/dev-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAC,SAAS,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AA4B3D,MAAM,WAAW,QAAQ;IAEvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,QAAQ,CAqBjE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,SAAO,GACb;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAC,CAYxC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwG5D"}
|