@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.
Files changed (175) hide show
  1. package/README.md +83 -3
  2. package/dist/analysis-budget.d.ts +71 -0
  3. package/dist/analysis-budget.d.ts.map +1 -0
  4. package/dist/analysis-budget.js +118 -0
  5. package/dist/analysis-budget.js.map +1 -0
  6. package/dist/guardrail.d.ts +24 -0
  7. package/dist/guardrail.d.ts.map +1 -0
  8. package/dist/guardrail.js +65 -0
  9. package/dist/guardrail.js.map +1 -0
  10. package/dist/heap-state.d.ts +53 -1
  11. package/dist/heap-state.d.ts.map +1 -1
  12. package/dist/heap-state.js +153 -10
  13. package/dist/heap-state.js.map +1 -1
  14. package/dist/index.js +38 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/tools/array-group-by.d.ts +12 -0
  17. package/dist/tools/array-group-by.d.ts.map +1 -0
  18. package/dist/tools/array-group-by.js +191 -0
  19. package/dist/tools/array-group-by.js.map +1 -0
  20. package/dist/tools/auto-investigate.d.ts.map +1 -1
  21. package/dist/tools/auto-investigate.js +1056 -52
  22. package/dist/tools/auto-investigate.js.map +1 -1
  23. package/dist/tools/cache-analysis.d.ts.map +1 -1
  24. package/dist/tools/cache-analysis.js +438 -21
  25. package/dist/tools/cache-analysis.js.map +1 -1
  26. package/dist/tools/check-health.d.ts.map +1 -1
  27. package/dist/tools/check-health.js +261 -1
  28. package/dist/tools/check-health.js.map +1 -1
  29. package/dist/tools/class-histogram.d.ts.map +1 -1
  30. package/dist/tools/class-histogram.js +142 -33
  31. package/dist/tools/class-histogram.js.map +1 -1
  32. package/dist/tools/closure-inspection.d.ts.map +1 -1
  33. package/dist/tools/closure-inspection.js +238 -25
  34. package/dist/tools/closure-inspection.js.map +1 -1
  35. package/dist/tools/detached-dom.d.ts.map +1 -1
  36. package/dist/tools/detached-dom.js +25 -3
  37. package/dist/tools/detached-dom.js.map +1 -1
  38. package/dist/tools/dev-artifacts.d.ts +33 -0
  39. package/dist/tools/dev-artifacts.d.ts.map +1 -0
  40. package/dist/tools/dev-artifacts.js +165 -0
  41. package/dist/tools/dev-artifacts.js.map +1 -0
  42. package/dist/tools/diff-snapshots.d.ts.map +1 -1
  43. package/dist/tools/diff-snapshots.js +200 -48
  44. package/dist/tools/diff-snapshots.js.map +1 -1
  45. package/dist/tools/duplicated-strings.d.ts.map +1 -1
  46. package/dist/tools/duplicated-strings.js +74 -12
  47. package/dist/tools/duplicated-strings.js.map +1 -1
  48. package/dist/tools/eval.d.ts.map +1 -1
  49. package/dist/tools/eval.js +189 -10
  50. package/dist/tools/eval.js.map +1 -1
  51. package/dist/tools/event-listener-leaks.d.ts.map +1 -1
  52. package/dist/tools/event-listener-leaks.js +235 -13
  53. package/dist/tools/event-listener-leaks.js.map +1 -1
  54. package/dist/tools/event-registry.d.ts +12 -0
  55. package/dist/tools/event-registry.d.ts.map +1 -0
  56. package/dist/tools/event-registry.js +183 -0
  57. package/dist/tools/event-registry.js.map +1 -0
  58. package/dist/tools/find-by-property.d.ts.map +1 -1
  59. package/dist/tools/find-by-property.js +113 -31
  60. package/dist/tools/find-by-property.js.map +1 -1
  61. package/dist/tools/find-by-shape.d.ts +12 -0
  62. package/dist/tools/find-by-shape.d.ts.map +1 -0
  63. package/dist/tools/find-by-shape.js +178 -0
  64. package/dist/tools/find-by-shape.js.map +1 -0
  65. package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
  66. package/dist/tools/find-nodes-by-class.js +50 -6
  67. package/dist/tools/find-nodes-by-class.js.map +1 -1
  68. package/dist/tools/for-each.d.ts.map +1 -1
  69. package/dist/tools/for-each.js +1 -1
  70. package/dist/tools/for-each.js.map +1 -1
  71. package/dist/tools/get-node.d.ts.map +1 -1
  72. package/dist/tools/get-node.js +6 -0
  73. package/dist/tools/get-node.js.map +1 -1
  74. package/dist/tools/get-references.d.ts.map +1 -1
  75. package/dist/tools/get-references.js +35 -6
  76. package/dist/tools/get-references.js.map +1 -1
  77. package/dist/tools/get-referrers.d.ts.map +1 -1
  78. package/dist/tools/get-referrers.js +35 -6
  79. package/dist/tools/get-referrers.js.map +1 -1
  80. package/dist/tools/get-string.d.ts +12 -0
  81. package/dist/tools/get-string.d.ts.map +1 -0
  82. package/dist/tools/get-string.js +223 -0
  83. package/dist/tools/get-string.js.map +1 -0
  84. package/dist/tools/get-value.d.ts +12 -0
  85. package/dist/tools/get-value.d.ts.map +1 -0
  86. package/dist/tools/get-value.js +152 -0
  87. package/dist/tools/get-value.js.map +1 -0
  88. package/dist/tools/global-variables.d.ts.map +1 -1
  89. package/dist/tools/global-variables.js +54 -34
  90. package/dist/tools/global-variables.js.map +1 -1
  91. package/dist/tools/growth-signals.d.ts +12 -0
  92. package/dist/tools/growth-signals.d.ts.map +1 -0
  93. package/dist/tools/growth-signals.js +211 -0
  94. package/dist/tools/growth-signals.js.map +1 -0
  95. package/dist/tools/intern-opportunities.d.ts +12 -0
  96. package/dist/tools/intern-opportunities.d.ts.map +1 -0
  97. package/dist/tools/intern-opportunities.js +870 -0
  98. package/dist/tools/intern-opportunities.js.map +1 -0
  99. package/dist/tools/largest-objects.d.ts.map +1 -1
  100. package/dist/tools/largest-objects.js +37 -14
  101. package/dist/tools/largest-objects.js.map +1 -1
  102. package/dist/tools/load-snapshot.d.ts +70 -0
  103. package/dist/tools/load-snapshot.d.ts.map +1 -1
  104. package/dist/tools/load-snapshot.js +446 -17
  105. package/dist/tools/load-snapshot.js.map +1 -1
  106. package/dist/tools/object-cost-breakdown.d.ts +12 -0
  107. package/dist/tools/object-cost-breakdown.d.ts.map +1 -0
  108. package/dist/tools/object-cost-breakdown.js +439 -0
  109. package/dist/tools/object-cost-breakdown.js.map +1 -0
  110. package/dist/tools/object-shape.d.ts.map +1 -1
  111. package/dist/tools/object-shape.js +109 -2
  112. package/dist/tools/object-shape.js.map +1 -1
  113. package/dist/tools/pinch-points.d.ts.map +1 -1
  114. package/dist/tools/pinch-points.js +9 -9
  115. package/dist/tools/pinch-points.js.map +1 -1
  116. package/dist/tools/property-distribution.d.ts +12 -0
  117. package/dist/tools/property-distribution.d.ts.map +1 -0
  118. package/dist/tools/property-distribution.js +168 -0
  119. package/dist/tools/property-distribution.js.map +1 -0
  120. package/dist/tools/quick-diagnosis.d.ts.map +1 -1
  121. package/dist/tools/quick-diagnosis.js +65 -20
  122. package/dist/tools/quick-diagnosis.js.map +1 -1
  123. package/dist/tools/retainer-summary.d.ts.map +1 -1
  124. package/dist/tools/retainer-summary.js +90 -5
  125. package/dist/tools/retainer-summary.js.map +1 -1
  126. package/dist/tools/retainer-trace.d.ts.map +1 -1
  127. package/dist/tools/retainer-trace.js +173 -43
  128. package/dist/tools/retainer-trace.js.map +1 -1
  129. package/dist/tools/search-nodes.d.ts.map +1 -1
  130. package/dist/tools/search-nodes.js +10 -3
  131. package/dist/tools/search-nodes.js.map +1 -1
  132. package/dist/tools/search-strings.d.ts +12 -0
  133. package/dist/tools/search-strings.d.ts.map +1 -0
  134. package/dist/tools/search-strings.js +182 -0
  135. package/dist/tools/search-strings.js.map +1 -0
  136. package/dist/tools/sequence-analysis.d.ts +12 -0
  137. package/dist/tools/sequence-analysis.d.ts.map +1 -0
  138. package/dist/tools/sequence-analysis.js +244 -0
  139. package/dist/tools/sequence-analysis.js.map +1 -0
  140. package/dist/tools/server-status.d.ts +12 -0
  141. package/dist/tools/server-status.d.ts.map +1 -0
  142. package/dist/tools/server-status.js +41 -0
  143. package/dist/tools/server-status.js.map +1 -0
  144. package/dist/tools/shape-histogram.d.ts.map +1 -1
  145. package/dist/tools/shape-histogram.js +61 -16
  146. package/dist/tools/shape-histogram.js.map +1 -1
  147. package/dist/tools/sliced-strings.d.ts.map +1 -1
  148. package/dist/tools/sliced-strings.js +38 -15
  149. package/dist/tools/sliced-strings.js.map +1 -1
  150. package/dist/tools/snapshot-header.d.ts +28 -0
  151. package/dist/tools/snapshot-header.d.ts.map +1 -0
  152. package/dist/tools/snapshot-header.js +111 -0
  153. package/dist/tools/snapshot-header.js.map +1 -0
  154. package/dist/tools/snapshot-summary.d.ts.map +1 -1
  155. package/dist/tools/snapshot-summary.js +55 -13
  156. package/dist/tools/snapshot-summary.js.map +1 -1
  157. package/dist/tools/snapshots.d.ts +12 -0
  158. package/dist/tools/snapshots.d.ts.map +1 -0
  159. package/dist/tools/snapshots.js +93 -0
  160. package/dist/tools/snapshots.js.map +1 -0
  161. package/dist/tools/stale-collections.d.ts.map +1 -1
  162. package/dist/tools/stale-collections.js +248 -7
  163. package/dist/tools/stale-collections.js.map +1 -1
  164. package/dist/tools/trace-dominators.d.ts.map +1 -1
  165. package/dist/tools/trace-dominators.js +28 -1
  166. package/dist/tools/trace-dominators.js.map +1 -1
  167. package/dist/tools/weakmap-entries.d.ts +12 -0
  168. package/dist/tools/weakmap-entries.d.ts.map +1 -0
  169. package/dist/tools/weakmap-entries.js +156 -0
  170. package/dist/tools/weakmap-entries.js.map +1 -0
  171. package/dist/utils.d.ts +139 -2
  172. package/dist/utils.d.ts.map +1 -1
  173. package/dist/utils.js +448 -35
  174. package/dist/utils.js.map +1 -1
  175. 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 callbackContextPairs = new Map();
153
+ const pairs = new Map();
107
154
  for (const l of listeners) {
108
- const key = `${l.callbackName}\0${l.contextName ?? ''}`;
109
- callbackContextPairs.set(key, (callbackContextPairs.get(key) ?? 0) + 1);
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 callbackContextPairs.values()) {
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
- 'Backbone/Node.js/EventEmitter-based apps. Scans for objects with _events/_listeners ' +
121
- 'properties and flags: arrays with >N entries (accumulation), entries where the ' +
122
- 'context/ctx object has no other referrers (zombie listeners from missed .off() calls), ' +
123
- 'and multiple entries with the same callback but different contexts (mount/unmount leaks). ' +
124
- 'Use after memlab_auto_investigate flags subscription accumulation.', {
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
- }, async ({ min_listeners, limit, check_zombies }) => {
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 (!EVENT_PROPERTY_NAMES.has(eName))
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="_events".`);
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 multiple times (classic mount/unmount leak)`);
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;AAavE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+G9D"}
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"}