@memlab/mcp-server 2.1.1 → 2.18.1
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 +83 -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 +53 -1
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +153 -10
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +38 -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 +1056 -52
- 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 +200 -48
- 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-references.d.ts.map +1 -1
- package/dist/tools/get-references.js +35 -6
- package/dist/tools/get-references.js.map +1 -1
- package/dist/tools/get-referrers.d.ts.map +1 -1
- package/dist/tools/get-referrers.js +35 -6
- package/dist/tools/get-referrers.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 +870 -0
- package/dist/tools/intern-opportunities.js.map +1 -0
- package/dist/tools/largest-objects.d.ts.map +1 -1
- package/dist/tools/largest-objects.js +37 -14
- package/dist/tools/largest-objects.js.map +1 -1
- package/dist/tools/load-snapshot.d.ts +70 -0
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +446 -17
- 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 +109 -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 +65 -20
- 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 +173 -43
- 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 +244 -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 +38 -15
- package/dist/tools/sliced-strings.js.map +1 -1
- package/dist/tools/snapshot-header.d.ts +28 -0
- package/dist/tools/snapshot-header.d.ts.map +1 -0
- package/dist/tools/snapshot-header.js +111 -0
- package/dist/tools/snapshot-header.js.map +1 -0
- 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 +139 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +448 -35
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
|
@@ -102,14 +102,63 @@ function countZombies(listeners, snapshot) {
|
|
|
102
102
|
}
|
|
103
103
|
return zombies;
|
|
104
104
|
}
|
|
105
|
+
function analyzeContextDistribution(listeners, snapshot) {
|
|
106
|
+
const callbackIds = new Set();
|
|
107
|
+
const contextIds = new Set();
|
|
108
|
+
const contextShapeMap = new Map();
|
|
109
|
+
let orphanedCount = 0;
|
|
110
|
+
for (const l of listeners) {
|
|
111
|
+
callbackIds.add(l.callbackId);
|
|
112
|
+
if (l.contextId != null) {
|
|
113
|
+
contextIds.add(l.contextId);
|
|
114
|
+
const ctxNode = snapshot.getNodeById(l.contextId);
|
|
115
|
+
if (ctxNode) {
|
|
116
|
+
const shapeName = ctxNode.name;
|
|
117
|
+
const existing = contextShapeMap.get(shapeName);
|
|
118
|
+
if (existing) {
|
|
119
|
+
existing.count++;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
contextShapeMap.set(shapeName, { count: 1, exampleId: ctxNode.id });
|
|
123
|
+
}
|
|
124
|
+
if (ctxNode.numOfReferrers <= 2) {
|
|
125
|
+
orphanedCount++;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const contextShapes = [...contextShapeMap.entries()]
|
|
131
|
+
.map(([shapeName, info]) => ({
|
|
132
|
+
shapeName,
|
|
133
|
+
count: info.count,
|
|
134
|
+
exampleId: info.exampleId,
|
|
135
|
+
}))
|
|
136
|
+
.sort((a, b) => b.count - a.count)
|
|
137
|
+
.slice(0, 10);
|
|
138
|
+
return {
|
|
139
|
+
uniqueCallbacks: callbackIds.size,
|
|
140
|
+
uniqueContexts: contextIds.size,
|
|
141
|
+
totalListeners: listeners.length,
|
|
142
|
+
contextShapes,
|
|
143
|
+
orphanedContextCount: orphanedCount,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// A duplicate is the SAME callback function instance bound to the SAME context
|
|
147
|
+
// instance, registered more than once. We key by node ids (callbackId +
|
|
148
|
+
// contextId), NOT by name/shape — keying by name counted distinct closures that
|
|
149
|
+
// merely share a name across different hosts as "duplicates", which produced
|
|
150
|
+
// wildly inflated counts (e.g. 99.95%) on per-model registries that are really
|
|
151
|
+
// structural, one-listener-per-model (Feedback §8).
|
|
105
152
|
function countDuplicateCallbacks(listeners) {
|
|
106
|
-
const
|
|
153
|
+
const pairs = new Map();
|
|
107
154
|
for (const l of listeners) {
|
|
108
|
-
|
|
109
|
-
|
|
155
|
+
if (l.callbackId <= 0)
|
|
156
|
+
continue;
|
|
157
|
+
const key = `${l.callbackId}\0${l.contextId ?? 0}`;
|
|
158
|
+
pairs.set(key, (pairs.get(key) ?? 0) + 1);
|
|
110
159
|
}
|
|
111
160
|
let duplicates = 0;
|
|
112
|
-
for (const count of
|
|
161
|
+
for (const count of pairs.values()) {
|
|
113
162
|
if (count > 1)
|
|
114
163
|
duplicates += count - 1;
|
|
115
164
|
}
|
|
@@ -117,11 +166,14 @@ function countDuplicateCallbacks(listeners) {
|
|
|
117
166
|
}
|
|
118
167
|
export function registerEventListenerLeaks(server) {
|
|
119
168
|
server.tool('memlab_event_listener_leaks', 'Detect EventEmitter-style listener accumulation — the #1 cause of memory leaks in ' +
|
|
120
|
-
'
|
|
121
|
-
'
|
|
122
|
-
'
|
|
123
|
-
'
|
|
124
|
-
'
|
|
169
|
+
'event-driven apps. Scans for: (1) objects with _events/_listeners properties (Backbone/Node.js), ' +
|
|
170
|
+
'and (2) accumulations of {callback, context}-shaped objects (custom event systems like ' +
|
|
171
|
+
'WAWebEventEmitter, Signal, etc.). Detects arrays with >N entries (accumulation), entries ' +
|
|
172
|
+
'where the context/ctx object has no other referrers (zombie listeners), and multiple entries ' +
|
|
173
|
+
'with the same callback (mount/unmount leaks). ' +
|
|
174
|
+
'Use extra_event_properties to detect app-specific event container property names ' +
|
|
175
|
+
'(e.g., "#eventMap" for private class fields). ' +
|
|
176
|
+
'⚠ Full-heap scan — slow on very large heaps (millions of nodes).', {
|
|
125
177
|
min_listeners: z
|
|
126
178
|
.number()
|
|
127
179
|
.optional()
|
|
@@ -137,10 +189,35 @@ export function registerEventListenerLeaks(server) {
|
|
|
137
189
|
.optional()
|
|
138
190
|
.default(true)
|
|
139
191
|
.describe('Check for zombie listeners whose context objects have no other referrers (default true). Can be slow on very large snapshots.'),
|
|
140
|
-
|
|
192
|
+
extra_event_properties: z
|
|
193
|
+
.array(z.string())
|
|
194
|
+
.optional()
|
|
195
|
+
.describe('Additional property names to scan as event containers (e.g., ["#eventMap", "#listeningTo"] for private class fields). ' +
|
|
196
|
+
'These are checked in addition to the built-in patterns (_events, _listeners, eventMap, etc.).'),
|
|
197
|
+
detect_shapes: z
|
|
198
|
+
.boolean()
|
|
199
|
+
.optional()
|
|
200
|
+
.default(true)
|
|
201
|
+
.describe('Also detect accumulations of {callback, context}-shaped objects regardless of parent property naming (default true). ' +
|
|
202
|
+
"Catches custom event systems that don't use standard _events/_listeners patterns."),
|
|
203
|
+
analyze_contexts: z
|
|
204
|
+
.boolean()
|
|
205
|
+
.optional()
|
|
206
|
+
.default(true)
|
|
207
|
+
.describe('For each accumulation, analyze the distribution of unique callbacks vs contexts, ' +
|
|
208
|
+
'group context objects by shape/class, and detect orphaned contexts (default true). ' +
|
|
209
|
+
'This is the key signal for identifying listener-based memory leaks where many ' +
|
|
210
|
+
'orphaned objects register on the same event.'),
|
|
211
|
+
}, async ({ min_listeners, limit, check_zombies, extra_event_properties, detect_shapes, analyze_contexts, }) => {
|
|
141
212
|
try {
|
|
142
213
|
const snapshot = getSnapshot();
|
|
143
214
|
const accumulations = [];
|
|
215
|
+
const effectiveEventProps = new Set(EVENT_PROPERTY_NAMES);
|
|
216
|
+
if (extra_event_properties) {
|
|
217
|
+
for (const p of extra_event_properties) {
|
|
218
|
+
effectiveEventProps.add(p);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
144
221
|
snapshot.nodes.forEach(node => {
|
|
145
222
|
if (node.id <= 3)
|
|
146
223
|
return;
|
|
@@ -148,7 +225,7 @@ export function registerEventListenerLeaks(server) {
|
|
|
148
225
|
return;
|
|
149
226
|
for (const edge of node.references) {
|
|
150
227
|
const eName = String(edge.name_or_index);
|
|
151
|
-
if (!
|
|
228
|
+
if (!effectiveEventProps.has(eName))
|
|
152
229
|
continue;
|
|
153
230
|
if (edge.toNode.id <= 3)
|
|
154
231
|
continue;
|
|
@@ -161,6 +238,9 @@ export function registerEventListenerLeaks(server) {
|
|
|
161
238
|
? countZombies(allListeners, snapshot)
|
|
162
239
|
: 0;
|
|
163
240
|
const duplicateCallbackCount = countDuplicateCallbacks(allListeners);
|
|
241
|
+
const contextDist = analyze_contexts
|
|
242
|
+
? analyzeContextDistribution(allListeners, snapshot)
|
|
243
|
+
: undefined;
|
|
164
244
|
const entry = {
|
|
165
245
|
hostNodeId: node.id,
|
|
166
246
|
hostName: node.name,
|
|
@@ -179,6 +259,7 @@ export function registerEventListenerLeaks(server) {
|
|
|
179
259
|
zombieCount,
|
|
180
260
|
duplicateCallbackCount,
|
|
181
261
|
totalRetainedSize: node.retainedSize,
|
|
262
|
+
contextDistribution: contextDist,
|
|
182
263
|
};
|
|
183
264
|
let inserted = false;
|
|
184
265
|
for (let i = 0; i < accumulations.length; i++) {
|
|
@@ -195,14 +276,129 @@ export function registerEventListenerLeaks(server) {
|
|
|
195
276
|
break;
|
|
196
277
|
}
|
|
197
278
|
});
|
|
279
|
+
// Shape-based detection: find accumulations of {callback, context}-shaped objects
|
|
280
|
+
if (detect_shapes) {
|
|
281
|
+
const CALLBACK_PROPS = new Set([
|
|
282
|
+
'callback',
|
|
283
|
+
'fn',
|
|
284
|
+
'handler',
|
|
285
|
+
'listener',
|
|
286
|
+
]);
|
|
287
|
+
const CONTEXT_PROPS = new Set([
|
|
288
|
+
'context',
|
|
289
|
+
'ctx',
|
|
290
|
+
'this',
|
|
291
|
+
'target',
|
|
292
|
+
'scope',
|
|
293
|
+
]);
|
|
294
|
+
const shapeMap = new Map();
|
|
295
|
+
snapshot.nodes.forEach(node => {
|
|
296
|
+
if (node.id <= 3)
|
|
297
|
+
return;
|
|
298
|
+
if (node.type !== 'object' || node.name !== 'Object')
|
|
299
|
+
return;
|
|
300
|
+
const propNames = [];
|
|
301
|
+
let hasCallback = false;
|
|
302
|
+
let hasContext = false;
|
|
303
|
+
let callbackId = 0;
|
|
304
|
+
let callbackName = '';
|
|
305
|
+
let contextId = null;
|
|
306
|
+
let contextName = null;
|
|
307
|
+
for (const edge of node.references) {
|
|
308
|
+
if (edge.type !== 'property')
|
|
309
|
+
continue;
|
|
310
|
+
const pName = String(edge.name_or_index);
|
|
311
|
+
propNames.push(pName);
|
|
312
|
+
if (CALLBACK_PROPS.has(pName)) {
|
|
313
|
+
hasCallback = true;
|
|
314
|
+
callbackId = edge.toNode.id;
|
|
315
|
+
callbackName = edge.toNode.name;
|
|
316
|
+
}
|
|
317
|
+
if (CONTEXT_PROPS.has(pName)) {
|
|
318
|
+
hasContext = true;
|
|
319
|
+
contextId = edge.toNode.id;
|
|
320
|
+
contextName = edge.toNode.name;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (!hasCallback || !hasContext)
|
|
324
|
+
return;
|
|
325
|
+
if (propNames.length === 0 || propNames.length > 10)
|
|
326
|
+
return;
|
|
327
|
+
propNames.sort();
|
|
328
|
+
const key = propNames.join(',');
|
|
329
|
+
const existing = shapeMap.get(key);
|
|
330
|
+
if (existing) {
|
|
331
|
+
existing.count++;
|
|
332
|
+
existing.totalRetained += node.retainedSize;
|
|
333
|
+
existing.allListeners.push({
|
|
334
|
+
callbackId,
|
|
335
|
+
callbackName,
|
|
336
|
+
contextId,
|
|
337
|
+
contextName,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
shapeMap.set(key, {
|
|
342
|
+
count: 1,
|
|
343
|
+
totalRetained: node.retainedSize,
|
|
344
|
+
properties: propNames,
|
|
345
|
+
exampleId: node.id,
|
|
346
|
+
allListeners: [
|
|
347
|
+
{ callbackId, callbackName, contextId, contextName },
|
|
348
|
+
],
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
for (const [, shape] of shapeMap) {
|
|
353
|
+
if (shape.count < min_listeners)
|
|
354
|
+
continue;
|
|
355
|
+
const contextDist = analyze_contexts
|
|
356
|
+
? analyzeContextDistribution(shape.allListeners, snapshot)
|
|
357
|
+
: undefined;
|
|
358
|
+
const entry = {
|
|
359
|
+
hostNodeId: shape.exampleId,
|
|
360
|
+
hostName: `{${shape.properties.join(', ')}}`,
|
|
361
|
+
hostType: 'shape',
|
|
362
|
+
eventPropertyName: `(${shape.properties.join(', ')})`,
|
|
363
|
+
eventContainerId: shape.exampleId,
|
|
364
|
+
totalListeners: shape.count,
|
|
365
|
+
eventBreakdown: [
|
|
366
|
+
{
|
|
367
|
+
eventName: '(shape-based)',
|
|
368
|
+
listenerCount: shape.count,
|
|
369
|
+
sampleListeners: shape.allListeners.slice(0, 3),
|
|
370
|
+
},
|
|
371
|
+
],
|
|
372
|
+
zombieCount: 0,
|
|
373
|
+
duplicateCallbackCount: countDuplicateCallbacks(shape.allListeners),
|
|
374
|
+
totalRetainedSize: shape.totalRetained,
|
|
375
|
+
contextDistribution: contextDist,
|
|
376
|
+
};
|
|
377
|
+
let inserted = false;
|
|
378
|
+
for (let i = 0; i < accumulations.length; i++) {
|
|
379
|
+
if (entry.totalListeners > accumulations[i].totalListeners) {
|
|
380
|
+
accumulations.splice(i, 0, entry);
|
|
381
|
+
inserted = true;
|
|
382
|
+
break;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (!inserted)
|
|
386
|
+
accumulations.push(entry);
|
|
387
|
+
if (accumulations.length > limit)
|
|
388
|
+
accumulations.length = limit;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
198
391
|
if (accumulations.length === 0) {
|
|
199
392
|
return toolResult(`No event listener accumulation found with >= ${min_listeners} listeners. ` +
|
|
200
|
-
`Try lowering min_listeners or check \`memlab_find_by_property\` with property_name="
|
|
393
|
+
`Try lowering min_listeners, or check \`memlab_find_by_property\` with property_name="callback", ` +
|
|
394
|
+
`or use \`memlab_shape_histogram\` with sort_by="count" to find high-count shapes.`);
|
|
201
395
|
}
|
|
202
396
|
const lines = [
|
|
203
397
|
`## Event Listener Leak Detection`,
|
|
204
398
|
`Found ${accumulations.length} object(s) with potential listener accumulation`,
|
|
205
399
|
'',
|
|
400
|
+
'_"Duplicates" = the same callback instance bound to the same context, registered more than once (by node id, not by name/shape). One listener per distinct model/host is structural, not a leak._',
|
|
401
|
+
'',
|
|
206
402
|
];
|
|
207
403
|
const headers = [
|
|
208
404
|
'Host',
|
|
@@ -233,7 +429,33 @@ export function registerEventListenerLeaks(server) {
|
|
|
233
429
|
lines.push('');
|
|
234
430
|
}
|
|
235
431
|
if (a.duplicateCallbackCount > 0) {
|
|
236
|
-
lines.push(`**${formatNumber(a.duplicateCallbackCount)} duplicate callback(s)** — same callback registered
|
|
432
|
+
lines.push(`**${formatNumber(a.duplicateCallbackCount)} duplicate callback(s)** — the same callback *instance* bound to the same context registered more than once (classic mount/unmount leak). One listener per distinct model is structural, not a duplicate.`);
|
|
433
|
+
lines.push('');
|
|
434
|
+
}
|
|
435
|
+
if (a.contextDistribution) {
|
|
436
|
+
const cd = a.contextDistribution;
|
|
437
|
+
lines.push('**Context distribution:**');
|
|
438
|
+
lines.push(`- ${formatNumber(cd.uniqueCallbacks)} unique callback(s) across ${formatNumber(cd.totalListeners)} listeners`);
|
|
439
|
+
lines.push(`- ${formatNumber(cd.uniqueContexts)} unique context object(s) across ${formatNumber(cd.totalListeners)} listeners`);
|
|
440
|
+
if (cd.orphanedContextCount > 0) {
|
|
441
|
+
const orphanPct = cd.uniqueContexts > 0
|
|
442
|
+
? ` (${((cd.orphanedContextCount / cd.uniqueContexts) * 100).toFixed(0)}%)`
|
|
443
|
+
: '';
|
|
444
|
+
lines.push(`- **${formatNumber(cd.orphanedContextCount)} orphaned context(s)**${orphanPct} — only retained by listener registrations`);
|
|
445
|
+
}
|
|
446
|
+
if (cd.contextShapes.length > 0) {
|
|
447
|
+
lines.push('- Context shapes:');
|
|
448
|
+
for (const cs of cd.contextShapes) {
|
|
449
|
+
lines.push(` - ${formatNumber(cs.count)}× \`${cs.shapeName}\` (example: @${cs.exampleId})`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
if (cd.uniqueCallbacks <= 3 &&
|
|
453
|
+
cd.uniqueContexts > 10 &&
|
|
454
|
+
cd.orphanedContextCount > cd.uniqueContexts * 0.5) {
|
|
455
|
+
lines.push('');
|
|
456
|
+
lines.push(`**⚠ LEAK PATTERN:** Few callbacks (${cd.uniqueCallbacks}) but many orphaned contexts (${formatNumber(cd.orphanedContextCount)}) — ` +
|
|
457
|
+
`classic listener-based memory leak where orphaned objects register on shared models but are never unregistered.`);
|
|
458
|
+
}
|
|
237
459
|
lines.push('');
|
|
238
460
|
}
|
|
239
461
|
lines.push('Event breakdown:');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-listener-leaks.js","sourceRoot":"","sources":["../../src/tools/event-listener-leaks.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"event-listener-leaks.js","sourceRoot":"","sources":["../../src/tools/event-listener-leaks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
export declare function registerEventRegistry(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=event-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.d.ts","sourceRoot":"","sources":["../../src/tools/event-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA4CvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoK7D"}
|
|
@@ -0,0 +1,183 @@
|
|
|
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 { z } from 'zod';
|
|
11
|
+
import { getSnapshot } from '../heap-state.js';
|
|
12
|
+
import { formatNumber, markdownTable, errorResult, toolResult, makeScanBudget, ScanTimeoutError, } from '../utils.js';
|
|
13
|
+
const CALLBACK_PROPS = new Set(['callback', 'fn', 'handler', 'listener']);
|
|
14
|
+
const CONTEXT_PROPS = new Set(['context', 'ctx', 'this', 'target', 'scope']);
|
|
15
|
+
// Extract {callback, context} listeners (or bare closures) from an Array node.
|
|
16
|
+
function listenersFromArray(arr) {
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const e of arr.references) {
|
|
19
|
+
if (e.type !== 'element')
|
|
20
|
+
continue;
|
|
21
|
+
const entry = e.toNode;
|
|
22
|
+
if (entry.id <= 3)
|
|
23
|
+
continue;
|
|
24
|
+
if (entry.type === 'closure') {
|
|
25
|
+
out.push({ callbackId: entry.id, contextId: 0 });
|
|
26
|
+
}
|
|
27
|
+
else if (entry.type === 'object') {
|
|
28
|
+
let cb = 0;
|
|
29
|
+
let ctx = 0;
|
|
30
|
+
for (const pe of entry.references) {
|
|
31
|
+
const pn = String(pe.name_or_index);
|
|
32
|
+
if (CALLBACK_PROPS.has(pn))
|
|
33
|
+
cb = pe.toNode.id;
|
|
34
|
+
else if (CONTEXT_PROPS.has(pn))
|
|
35
|
+
ctx = pe.toNode.id;
|
|
36
|
+
}
|
|
37
|
+
if (cb > 0)
|
|
38
|
+
out.push({ callbackId: cb, contextId: ctx });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
export function registerEventRegistry(server) {
|
|
44
|
+
server.tool('memlab_event_registry', 'Detector for per-model event registries (Backbone/Marionette/observer style): objects mapping event names to arrays of {callback, context} listeners, e.g. `{"change:name": [{callback, context}], "add": [...]}`. Reports top event names by total listener count, the listeners-per-host distribution, and a structural-vs-leak verdict (one listener per host = O(hosts) structural baseline; the same callback instance bound to the same host/event more than once = a re-subscription leak). Complements memlab_event_listener_leaks by understanding the registry structure across many hosts.', {
|
|
45
|
+
min_events: z
|
|
46
|
+
.number()
|
|
47
|
+
.optional()
|
|
48
|
+
.default(2)
|
|
49
|
+
.describe('Minimum number of event-name->listener-array properties for an object to count as a registry container (default 2).'),
|
|
50
|
+
limit: z
|
|
51
|
+
.number()
|
|
52
|
+
.optional()
|
|
53
|
+
.default(20)
|
|
54
|
+
.describe('Maximum number of event names to report (default 20).'),
|
|
55
|
+
timeout_ms: z
|
|
56
|
+
.number()
|
|
57
|
+
.optional()
|
|
58
|
+
.default(45000)
|
|
59
|
+
.describe('Wall-clock scan budget (default 45000); returns partial results on very large browser heaps instead of hanging.'),
|
|
60
|
+
}, async ({ min_events, limit, timeout_ms }) => {
|
|
61
|
+
try {
|
|
62
|
+
const snapshot = getSnapshot();
|
|
63
|
+
const budget = makeScanBudget(timeout_ms);
|
|
64
|
+
let timedOut = false;
|
|
65
|
+
// Per event-name aggregates across ALL registry containers.
|
|
66
|
+
const perEvent = new Map();
|
|
67
|
+
let containerCount = 0;
|
|
68
|
+
const perHostTotals = [];
|
|
69
|
+
let totalListenersAll = 0;
|
|
70
|
+
let totalDuplicateExtra = 0;
|
|
71
|
+
try {
|
|
72
|
+
snapshot.nodes.forEach(node => {
|
|
73
|
+
budget.tick();
|
|
74
|
+
if (node.id <= 3 || node.type !== 'object')
|
|
75
|
+
return;
|
|
76
|
+
// A registry container has >= min_events properties whose target is
|
|
77
|
+
// an Array of listeners.
|
|
78
|
+
let eventProps = 0;
|
|
79
|
+
let hostListeners = 0;
|
|
80
|
+
const localEvents = [];
|
|
81
|
+
for (const edge of node.references) {
|
|
82
|
+
if (edge.type !== 'property')
|
|
83
|
+
continue;
|
|
84
|
+
const target = edge.toNode;
|
|
85
|
+
if (target.type !== 'object' || target.name !== 'Array')
|
|
86
|
+
continue;
|
|
87
|
+
const listeners = listenersFromArray(target);
|
|
88
|
+
if (listeners.length === 0)
|
|
89
|
+
continue;
|
|
90
|
+
eventProps++;
|
|
91
|
+
hostListeners += listeners.length;
|
|
92
|
+
localEvents.push({
|
|
93
|
+
name: String(edge.name_or_index),
|
|
94
|
+
listeners,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (eventProps < min_events)
|
|
98
|
+
return;
|
|
99
|
+
containerCount++;
|
|
100
|
+
perHostTotals.push(hostListeners);
|
|
101
|
+
totalListenersAll += hostListeners;
|
|
102
|
+
for (const ev of localEvents) {
|
|
103
|
+
const e = perEvent.get(ev.name) ?? {
|
|
104
|
+
totalListeners: 0,
|
|
105
|
+
hosts: 0,
|
|
106
|
+
duplicatePairs: 0,
|
|
107
|
+
};
|
|
108
|
+
e.totalListeners += ev.listeners.length;
|
|
109
|
+
e.hosts++;
|
|
110
|
+
// Duplicates WITHIN this host/event = same callback+context twice.
|
|
111
|
+
const seen = new Map();
|
|
112
|
+
for (const l of ev.listeners) {
|
|
113
|
+
const key = `${l.callbackId}\0${l.contextId}`;
|
|
114
|
+
seen.set(key, (seen.get(key) ?? 0) + 1);
|
|
115
|
+
}
|
|
116
|
+
for (const c of seen.values()) {
|
|
117
|
+
if (c > 1) {
|
|
118
|
+
e.duplicatePairs += c - 1;
|
|
119
|
+
totalDuplicateExtra += c - 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
perEvent.set(ev.name, e);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
if (e instanceof ScanTimeoutError)
|
|
128
|
+
timedOut = true;
|
|
129
|
+
else
|
|
130
|
+
throw e;
|
|
131
|
+
}
|
|
132
|
+
if (containerCount === 0) {
|
|
133
|
+
return toolResult(`No per-model event registries found (objects with >= ${min_events} event-name -> listener-array properties).` +
|
|
134
|
+
(timedOut ? ' (scan timed out before completing)' : '') +
|
|
135
|
+
' Try memlab_event_listener_leaks for _events/_listeners-style containers.');
|
|
136
|
+
}
|
|
137
|
+
perHostTotals.sort((a, b) => a - b);
|
|
138
|
+
const median = perHostTotals[Math.floor(perHostTotals.length / 2)];
|
|
139
|
+
const maxPerHost = perHostTotals[perHostTotals.length - 1];
|
|
140
|
+
const avgPerHost = totalListenersAll / containerCount;
|
|
141
|
+
const topEvents = [...perEvent.entries()]
|
|
142
|
+
.sort((a, b) => b[1].totalListeners - a[1].totalListeners)
|
|
143
|
+
.slice(0, limit);
|
|
144
|
+
// Structural vs leak: if duplicates are rare relative to total, the
|
|
145
|
+
// accumulation is O(hosts) structural (one listener per host/event);
|
|
146
|
+
// many duplicates => real re-subscription leak.
|
|
147
|
+
const dupRatio = totalListenersAll > 0 ? totalDuplicateExtra / totalListenersAll : 0;
|
|
148
|
+
const verdict = totalDuplicateExtra === 0
|
|
149
|
+
? '**Structural (not a leak):** every listener is a distinct callback/context on its host — this is the expected O(hosts) baseline (one listener per model per event).'
|
|
150
|
+
: dupRatio < 0.01
|
|
151
|
+
? `**Mostly structural:** ${formatNumber(totalDuplicateExtra)} duplicate registration(s) (${(dupRatio * 100).toFixed(2)}%) — small re-subscription effect, likely benign.`
|
|
152
|
+
: `**⚠ Re-subscription leak:** ${formatNumber(totalDuplicateExtra)} duplicate registration(s) (${(dupRatio * 100).toFixed(1)}%) — the same callback instance is bound to the same host/event repeatedly (missing \`.off()\`/unsubscribe).`;
|
|
153
|
+
const lines = [
|
|
154
|
+
'## Event Registry Analysis',
|
|
155
|
+
'',
|
|
156
|
+
`${formatNumber(containerCount)} registry host(s), ${formatNumber(totalListenersAll)} total listeners.`,
|
|
157
|
+
`Listeners per host: avg ${avgPerHost.toFixed(1)}, median ${formatNumber(median)}, max ${formatNumber(maxPerHost)}.`,
|
|
158
|
+
'',
|
|
159
|
+
verdict,
|
|
160
|
+
'',
|
|
161
|
+
'### Top event names by total listeners',
|
|
162
|
+
'',
|
|
163
|
+
];
|
|
164
|
+
const headers = ['Event', 'Total listeners', 'Hosts', 'Duplicates'];
|
|
165
|
+
const rightCols = new Set([1, 2, 3]);
|
|
166
|
+
const rows = topEvents.map(([name, e]) => [
|
|
167
|
+
name.length > 40 ? name.slice(0, 37) + '…' : name,
|
|
168
|
+
formatNumber(e.totalListeners),
|
|
169
|
+
formatNumber(e.hosts),
|
|
170
|
+
formatNumber(e.duplicatePairs),
|
|
171
|
+
]);
|
|
172
|
+
lines.push(markdownTable(headers, rows, rightCols));
|
|
173
|
+
if (timedOut) {
|
|
174
|
+
lines.push('', `⚠ Scan hit the ${timeout_ms}ms budget — results are partial. Raise timeout_ms for full coverage.`);
|
|
175
|
+
}
|
|
176
|
+
return toolResult(lines.join('\n'));
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
return errorResult(err);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=event-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.js","sourceRoot":"","sources":["../../src/tools/event-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-by-property.d.ts","sourceRoot":"","sources":["../../src/tools/find-by-property.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"find-by-property.d.ts","sourceRoot":"","sources":["../../src/tools/find-by-property.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAkBvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkN9D"}
|