@memlab/mcp-server 2.3.0 → 2.52.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.
Files changed (205) hide show
  1. package/README.md +18 -14
  2. package/bin/.eslintrc.js +26 -0
  3. package/bin/memlab-cli.js +313 -0
  4. package/dist/artifact-classes.d.ts +86 -0
  5. package/dist/artifact-classes.d.ts.map +1 -0
  6. package/dist/artifact-classes.js +261 -0
  7. package/dist/artifact-classes.js.map +1 -0
  8. package/dist/capture-mode.d.ts +60 -0
  9. package/dist/capture-mode.d.ts.map +1 -0
  10. package/dist/capture-mode.js +39 -0
  11. package/dist/capture-mode.js.map +1 -0
  12. package/dist/guardrail.d.ts.map +1 -1
  13. package/dist/guardrail.js +13 -0
  14. package/dist/guardrail.js.map +1 -1
  15. package/dist/heap-state.d.ts +96 -2
  16. package/dist/heap-state.d.ts.map +1 -1
  17. package/dist/heap-state.js +197 -2
  18. package/dist/heap-state.js.map +1 -1
  19. package/dist/index.js +41 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/progress.d.ts +25 -0
  22. package/dist/progress.d.ts.map +1 -0
  23. package/dist/progress.js +46 -0
  24. package/dist/progress.js.map +1 -0
  25. package/dist/result-handles.d.ts +11 -0
  26. package/dist/result-handles.d.ts.map +1 -0
  27. package/dist/result-handles.js +77 -0
  28. package/dist/result-handles.js.map +1 -0
  29. package/dist/string-index.d.ts +55 -0
  30. package/dist/string-index.d.ts.map +1 -0
  31. package/dist/string-index.js +91 -0
  32. package/dist/string-index.js.map +1 -0
  33. package/dist/tool-registry.d.ts +42 -0
  34. package/dist/tool-registry.d.ts.map +1 -0
  35. package/dist/tool-registry.js +20 -0
  36. package/dist/tool-registry.js.map +1 -0
  37. package/dist/tools/analyze-run.d.ts +12 -0
  38. package/dist/tools/analyze-run.d.ts.map +1 -0
  39. package/dist/tools/analyze-run.js +343 -0
  40. package/dist/tools/analyze-run.js.map +1 -0
  41. package/dist/tools/app-heap.d.ts +12 -0
  42. package/dist/tools/app-heap.d.ts.map +1 -0
  43. package/dist/tools/app-heap.js +140 -0
  44. package/dist/tools/app-heap.js.map +1 -0
  45. package/dist/tools/auto-investigate.d.ts.map +1 -1
  46. package/dist/tools/auto-investigate.js +91 -49
  47. package/dist/tools/auto-investigate.js.map +1 -1
  48. package/dist/tools/batch.d.ts +12 -0
  49. package/dist/tools/batch.d.ts.map +1 -0
  50. package/dist/tools/batch.js +168 -0
  51. package/dist/tools/batch.js.map +1 -0
  52. package/dist/tools/cache-analysis.d.ts.map +1 -1
  53. package/dist/tools/cache-analysis.js +156 -5
  54. package/dist/tools/cache-analysis.js.map +1 -1
  55. package/dist/tools/class-histogram.d.ts.map +1 -1
  56. package/dist/tools/class-histogram.js +14 -3
  57. package/dist/tools/class-histogram.js.map +1 -1
  58. package/dist/tools/collection-trend.d.ts +55 -0
  59. package/dist/tools/collection-trend.d.ts.map +1 -0
  60. package/dist/tools/collection-trend.js +315 -0
  61. package/dist/tools/collection-trend.js.map +1 -0
  62. package/dist/tools/detached-dom.d.ts +2 -0
  63. package/dist/tools/detached-dom.d.ts.map +1 -1
  64. package/dist/tools/detached-dom.js +291 -20
  65. package/dist/tools/detached-dom.js.map +1 -1
  66. package/dist/tools/dev-artifacts.d.ts +62 -6
  67. package/dist/tools/dev-artifacts.d.ts.map +1 -1
  68. package/dist/tools/dev-artifacts.js +466 -23
  69. package/dist/tools/dev-artifacts.js.map +1 -1
  70. package/dist/tools/diff-snapshots.d.ts.map +1 -1
  71. package/dist/tools/diff-snapshots.js +101 -44
  72. package/dist/tools/diff-snapshots.js.map +1 -1
  73. package/dist/tools/dominator-attribution.d.ts +12 -0
  74. package/dist/tools/dominator-attribution.d.ts.map +1 -0
  75. package/dist/tools/dominator-attribution.js +189 -0
  76. package/dist/tools/dominator-attribution.js.map +1 -0
  77. package/dist/tools/dominator-chain.d.ts +12 -0
  78. package/dist/tools/dominator-chain.d.ts.map +1 -0
  79. package/dist/tools/dominator-chain.js +92 -0
  80. package/dist/tools/dominator-chain.js.map +1 -0
  81. package/dist/tools/duplicate-objects.d.ts +12 -0
  82. package/dist/tools/duplicate-objects.d.ts.map +1 -0
  83. package/dist/tools/duplicate-objects.js +172 -0
  84. package/dist/tools/duplicate-objects.js.map +1 -0
  85. package/dist/tools/duplicated-strings.d.ts.map +1 -1
  86. package/dist/tools/duplicated-strings.js +46 -38
  87. package/dist/tools/duplicated-strings.js.map +1 -1
  88. package/dist/tools/eval.d.ts +1 -0
  89. package/dist/tools/eval.d.ts.map +1 -1
  90. package/dist/tools/eval.js +787 -30
  91. package/dist/tools/eval.js.map +1 -1
  92. package/dist/tools/explain-delta.d.ts +12 -0
  93. package/dist/tools/explain-delta.d.ts.map +1 -0
  94. package/dist/tools/explain-delta.js +170 -0
  95. package/dist/tools/explain-delta.js.map +1 -0
  96. package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
  97. package/dist/tools/find-nodes-by-class.js +112 -13
  98. package/dist/tools/find-nodes-by-class.js.map +1 -1
  99. package/dist/tools/finding-index.d.ts +22 -0
  100. package/dist/tools/finding-index.d.ts.map +1 -0
  101. package/dist/tools/finding-index.js +247 -0
  102. package/dist/tools/finding-index.js.map +1 -0
  103. package/dist/tools/for-each.d.ts.map +1 -1
  104. package/dist/tools/for-each.js +15 -3
  105. package/dist/tools/for-each.js.map +1 -1
  106. package/dist/tools/get-references.d.ts.map +1 -1
  107. package/dist/tools/get-references.js +35 -6
  108. package/dist/tools/get-references.js.map +1 -1
  109. package/dist/tools/get-referrers.d.ts.map +1 -1
  110. package/dist/tools/get-referrers.js +52 -6
  111. package/dist/tools/get-referrers.js.map +1 -1
  112. package/dist/tools/hunt-report.d.ts +12 -0
  113. package/dist/tools/hunt-report.d.ts.map +1 -0
  114. package/dist/tools/hunt-report.js +186 -0
  115. package/dist/tools/hunt-report.js.map +1 -0
  116. package/dist/tools/hypothesis.d.ts +12 -0
  117. package/dist/tools/hypothesis.d.ts.map +1 -0
  118. package/dist/tools/hypothesis.js +221 -0
  119. package/dist/tools/hypothesis.js.map +1 -0
  120. package/dist/tools/intern-opportunities.d.ts.map +1 -1
  121. package/dist/tools/intern-opportunities.js +721 -75
  122. package/dist/tools/intern-opportunities.js.map +1 -1
  123. package/dist/tools/ladder.d.ts +33 -0
  124. package/dist/tools/ladder.d.ts.map +1 -0
  125. package/dist/tools/ladder.js +266 -0
  126. package/dist/tools/ladder.js.map +1 -0
  127. package/dist/tools/largest-objects.d.ts.map +1 -1
  128. package/dist/tools/largest-objects.js +43 -16
  129. package/dist/tools/largest-objects.js.map +1 -1
  130. package/dist/tools/leak-report.d.ts +12 -0
  131. package/dist/tools/leak-report.d.ts.map +1 -0
  132. package/dist/tools/leak-report.js +256 -0
  133. package/dist/tools/leak-report.js.map +1 -0
  134. package/dist/tools/load-snapshot.d.ts +78 -0
  135. package/dist/tools/load-snapshot.d.ts.map +1 -1
  136. package/dist/tools/load-snapshot.js +519 -29
  137. package/dist/tools/load-snapshot.js.map +1 -1
  138. package/dist/tools/map-entries.d.ts +12 -0
  139. package/dist/tools/map-entries.d.ts.map +1 -0
  140. package/dist/tools/map-entries.js +139 -0
  141. package/dist/tools/map-entries.js.map +1 -0
  142. package/dist/tools/match-object.d.ts +12 -0
  143. package/dist/tools/match-object.d.ts.map +1 -0
  144. package/dist/tools/match-object.js +165 -0
  145. package/dist/tools/match-object.js.map +1 -0
  146. package/dist/tools/object-shape.d.ts.map +1 -1
  147. package/dist/tools/object-shape.js +92 -30
  148. package/dist/tools/object-shape.js.map +1 -1
  149. package/dist/tools/population-diff.d.ts +57 -0
  150. package/dist/tools/population-diff.d.ts.map +1 -0
  151. package/dist/tools/population-diff.js +338 -0
  152. package/dist/tools/population-diff.js.map +1 -0
  153. package/dist/tools/quick-diagnosis.d.ts.map +1 -1
  154. package/dist/tools/quick-diagnosis.js +12 -4
  155. package/dist/tools/quick-diagnosis.js.map +1 -1
  156. package/dist/tools/retainer-layers.d.ts +23 -0
  157. package/dist/tools/retainer-layers.d.ts.map +1 -0
  158. package/dist/tools/retainer-layers.js +179 -0
  159. package/dist/tools/retainer-layers.js.map +1 -0
  160. package/dist/tools/retainer-summary.d.ts +1 -0
  161. package/dist/tools/retainer-summary.d.ts.map +1 -1
  162. package/dist/tools/retainer-summary.js +128 -32
  163. package/dist/tools/retainer-summary.js.map +1 -1
  164. package/dist/tools/retainer-trace.d.ts.map +1 -1
  165. package/dist/tools/retainer-trace.js +105 -25
  166. package/dist/tools/retainer-trace.js.map +1 -1
  167. package/dist/tools/search-nodes.d.ts.map +1 -1
  168. package/dist/tools/search-nodes.js +5 -1
  169. package/dist/tools/search-nodes.js.map +1 -1
  170. package/dist/tools/search-strings.d.ts.map +1 -1
  171. package/dist/tools/search-strings.js +53 -7
  172. package/dist/tools/search-strings.js.map +1 -1
  173. package/dist/tools/sequence-analysis.d.ts +49 -0
  174. package/dist/tools/sequence-analysis.d.ts.map +1 -1
  175. package/dist/tools/sequence-analysis.js +268 -78
  176. package/dist/tools/sequence-analysis.js.map +1 -1
  177. package/dist/tools/shape-histogram.d.ts.map +1 -1
  178. package/dist/tools/shape-histogram.js +9 -2
  179. package/dist/tools/shape-histogram.js.map +1 -1
  180. package/dist/tools/sliced-strings.d.ts.map +1 -1
  181. package/dist/tools/sliced-strings.js +22 -4
  182. package/dist/tools/sliced-strings.js.map +1 -1
  183. package/dist/tools/snapshot-header.d.ts +28 -0
  184. package/dist/tools/snapshot-header.d.ts.map +1 -0
  185. package/dist/tools/snapshot-header.js +111 -0
  186. package/dist/tools/snapshot-header.js.map +1 -0
  187. package/dist/tools/string-patterns.d.ts.map +1 -1
  188. package/dist/tools/string-patterns.js +5 -4
  189. package/dist/tools/string-patterns.js.map +1 -1
  190. package/dist/tools/tools-index.d.ts +12 -0
  191. package/dist/tools/tools-index.d.ts.map +1 -0
  192. package/dist/tools/tools-index.js +342 -0
  193. package/dist/tools/tools-index.js.map +1 -0
  194. package/dist/tools/verify-fix.d.ts +23 -0
  195. package/dist/tools/verify-fix.d.ts.map +1 -0
  196. package/dist/tools/verify-fix.js +211 -0
  197. package/dist/tools/verify-fix.js.map +1 -0
  198. package/dist/tools/weakmap-entries.d.ts.map +1 -1
  199. package/dist/tools/weakmap-entries.js +6 -1
  200. package/dist/tools/weakmap-entries.js.map +1 -1
  201. package/dist/utils.d.ts +204 -1
  202. package/dist/utils.d.ts.map +1 -1
  203. package/dist/utils.js +478 -8
  204. package/dist/utils.js.map +1 -1
  205. package/package.json +5 -4
@@ -12,7 +12,7 @@ import path from 'path';
12
12
  import { z } from 'zod';
13
13
  import memlabHeapAnalysis from '@memlab/heap-analysis';
14
14
  const { getFullHeapFromFile } = memlabHeapAnalysis;
15
- import { setSnapshot, getCurrentHandle } from '../heap-state.js';
15
+ import { setSnapshot, getCurrentHandle, getSnapshotByHandle, listSnapshots, setCurrentSnapshot, } from '../heap-state.js';
16
16
  import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
17
17
  function buildHistogram(snapshot) {
18
18
  const map = new Map();
@@ -42,16 +42,62 @@ function isValueNamedStringClass(type, name) {
42
42
  return true;
43
43
  return false;
44
44
  }
45
+ // Resolve a before/after argument to a snapshot, preferring already-resident
46
+ // snapshots so diffing a captured ladder never re-parses a file that is already
47
+ // in memory (each reparse is a full dominator-tree build + a second resident
48
+ // graph). Order: (1) a resident handle, (2) a path matching a resident
49
+ // snapshot's file, (3) load from disk.
50
+ async function resolveDiffSnapshot(arg) {
51
+ const byHandle = getSnapshotByHandle(arg);
52
+ if (byHandle) {
53
+ return {
54
+ snapshot: byHandle,
55
+ label: arg,
56
+ residentHandle: arg,
57
+ resolvedPath: null,
58
+ };
59
+ }
60
+ const resolved = path.resolve(arg);
61
+ for (const m of listSnapshots()) {
62
+ // Match against BOTH the canonicalized path and the raw arg: load_snapshot
63
+ // stores a path.resolve()d filePath, but a snapshot first loaded through a
64
+ // different entry point may have been registered under its raw arg, so
65
+ // comparing only one form would miss the resident hit and re-parse.
66
+ if (m.filePath === resolved || m.filePath === arg) {
67
+ const s = getSnapshotByHandle(m.handle);
68
+ if (s) {
69
+ return {
70
+ snapshot: s,
71
+ label: m.handle,
72
+ residentHandle: m.handle,
73
+ resolvedPath: null,
74
+ };
75
+ }
76
+ }
77
+ }
78
+ if (!fs.existsSync(resolved)) {
79
+ throw new Error(`"${arg}" is neither a resident snapshot handle nor an existing file. ` +
80
+ `Use memlab_snapshots (action:"list") to see resident handles, or pass a ` +
81
+ `valid .heapsnapshot path.`);
82
+ }
83
+ const snapshot = await getFullHeapFromFile(resolved);
84
+ return {
85
+ snapshot,
86
+ label: path.basename(arg),
87
+ residentHandle: null,
88
+ resolvedPath: resolved,
89
+ };
90
+ }
45
91
  export function registerDiffSnapshots(server) {
46
- server.tool('memlab_diff_snapshots', 'Compare two heap snapshots by class histogram. Shows classes that grew, shrunk, appeared, or disappeared between "before" and "after" snapshots. By default the "after" snapshot becomes the active snapshot (set set_active:false to leave your active snapshot unchanged). For an ordered sequence of 3+ snapshots, use memlab_sequence_analysis instead.', {
92
+ server.tool('memlab_diff_snapshots', 'Compare two heap snapshots by class histogram. Shows classes that grew, shrunk, appeared, or disappeared between "before" and "after" snapshots. Each side accepts either a resident snapshot handle (from memlab_snapshots) or a file path — resident handles are reused in place, so diffing a ladder you already loaded never re-parses a file. By default the "after" snapshot becomes the active snapshot (set set_active:false to leave your active snapshot unchanged). For an ordered sequence of 3+ snapshots, use memlab_sequence_analysis instead.', {
47
93
  before_path: z
48
94
  .string()
49
95
  .optional()
50
- .describe('Path to the "before" snapshot (local, manifold://, or bare filename). Aliases: before, baseline.'),
96
+ .describe('The "before" snapshot: a resident handle (see memlab_snapshots) or a path (local, manifold://, or bare filename). Aliases: before, baseline.'),
51
97
  after_path: z
52
98
  .string()
53
99
  .optional()
54
- .describe('Path to the "after" snapshot (local, manifold://, or bare filename). Aliases: after, target.'),
100
+ .describe('The "after" snapshot: a resident handle (see memlab_snapshots) or a path (local, manifold://, or bare filename). Aliases: after, target.'),
55
101
  before: z.string().optional().describe('Alias for before_path.'),
56
102
  after: z.string().optional().describe('Alias for after_path.'),
57
103
  baseline: z.string().optional().describe('Alias for before_path.'),
@@ -93,51 +139,59 @@ export function registerDiffSnapshots(server) {
93
139
  if (!beforeArg || !afterArg) {
94
140
  return errorResult(new Error('Provide both a before and an after snapshot. Accepted names: before_path/before/baseline and after_path/after/target.'));
95
141
  }
96
- const resolvedBefore = path.resolve(beforeArg);
97
- const resolvedAfter = path.resolve(afterArg);
98
- if (!fs.existsSync(resolvedBefore)) {
99
- return errorResult(new Error(`Before file not found: ${resolvedBefore}`));
100
- }
101
- if (!fs.existsSync(resolvedAfter)) {
102
- return errorResult(new Error(`After file not found: ${resolvedAfter}`));
103
- }
104
- const [beforeSnapshot, afterSnapshot] = await Promise.all([
105
- getFullHeapFromFile(resolvedBefore),
106
- getFullHeapFromFile(resolvedAfter),
142
+ const [beforeResolved, afterResolved] = await Promise.all([
143
+ resolveDiffSnapshot(beforeArg),
144
+ resolveDiffSnapshot(afterArg),
107
145
  ]);
146
+ const beforeSnapshot = beforeResolved.snapshot;
147
+ const afterSnapshot = afterResolved.snapshot;
108
148
  const beforeHist = buildHistogram(beforeSnapshot);
109
149
  const afterHist = buildHistogram(afterSnapshot);
110
- // Make "after" the active snapshot
111
- let afterNodeCount = 0;
112
- let afterEdgeCount = 0;
113
- let afterTotalSize = 0;
114
- afterSnapshot.nodes.forEach(node => {
115
- afterNodeCount++;
116
- afterTotalSize += node.self_size;
117
- });
118
- afterSnapshot.edges.forEach(() => {
119
- afterEdgeCount++;
120
- });
121
- let hasWindow = false;
122
- let hasModule = false;
123
- afterSnapshot.nodes.forEach(node => {
124
- if (hasWindow)
125
- return;
126
- if (node.name.startsWith('Window ') && node.type === 'object')
127
- hasWindow = true;
128
- if (node.name === 'Module' && node.type === 'object' && !hasModule)
129
- hasModule = true;
130
- });
131
- const afterEnv = hasWindow ? 'browser' : hasModule ? 'node' : 'unknown';
150
+ // Make "after" the active snapshot. If it is already resident, switch to
151
+ // its handle in place; only a freshly-loaded snapshot needs registering
152
+ // (and the metadata scan that entails).
132
153
  let activeHandle = getCurrentHandle();
133
154
  if (set_active) {
134
- activeHandle = setSnapshot(afterSnapshot, afterArg, {
135
- fileName: path.basename(afterArg),
136
- nodeCount: afterNodeCount,
137
- edgeCount: afterEdgeCount,
138
- totalSize: afterTotalSize,
139
- env: afterEnv,
140
- }).handle;
155
+ if (afterResolved.residentHandle) {
156
+ setCurrentSnapshot(afterResolved.residentHandle);
157
+ activeHandle = afterResolved.residentHandle;
158
+ }
159
+ else {
160
+ let afterNodeCount = 0;
161
+ let afterEdgeCount = 0;
162
+ let afterTotalSize = 0;
163
+ afterSnapshot.nodes.forEach(node => {
164
+ afterNodeCount++;
165
+ afterTotalSize += node.self_size;
166
+ });
167
+ afterSnapshot.edges.forEach(() => {
168
+ afterEdgeCount++;
169
+ });
170
+ let hasWindow = false;
171
+ let hasModule = false;
172
+ afterSnapshot.nodes.forEach(node => {
173
+ if (hasWindow)
174
+ return;
175
+ if (node.name.startsWith('Window ') && node.type === 'object')
176
+ hasWindow = true;
177
+ if (node.name === 'Module' &&
178
+ node.type === 'object' &&
179
+ !hasModule)
180
+ hasModule = true;
181
+ });
182
+ const afterEnv = hasWindow
183
+ ? 'browser'
184
+ : hasModule
185
+ ? 'node'
186
+ : 'unknown';
187
+ activeHandle = setSnapshot(afterSnapshot, afterResolved.resolvedPath ?? afterArg, {
188
+ fileName: path.basename(afterArg),
189
+ nodeCount: afterNodeCount,
190
+ edgeCount: afterEdgeCount,
191
+ totalSize: afterTotalSize,
192
+ env: afterEnv,
193
+ }).handle;
194
+ }
141
195
  }
142
196
  // Compute deltas
143
197
  const allKeys = new Set([...beforeHist.keys(), ...afterHist.keys()]);
@@ -246,6 +300,9 @@ export function registerDiffSnapshots(server) {
246
300
  const sign = (n) => (n >= 0 ? '+' : '-');
247
301
  lines.push('## Snapshot Comparison');
248
302
  lines.push('');
303
+ const residentTag = (r) => r.residentHandle ? ' (resident)' : '';
304
+ lines.push(`before: \`${beforeResolved.label}\`${residentTag(beforeResolved)} → after: \`${afterResolved.label}\`${residentTag(afterResolved)}`);
305
+ lines.push('');
249
306
  lines.push(`| | Before | After | Delta |`);
250
307
  lines.push(`|---|---:|---:|---:|`);
251
308
  lines.push(`| Nodes | ${formatNumber(totalBeforeNodes)} | ${formatNumber(totalAfterNodes)} | ${sign(nodeDelta)}${formatNumber(Math.abs(nodeDelta))} |`);
@@ -1 +1 @@
1
- {"version":3,"file":"diff-snapshots.js","sourceRoot":"","sources":["../../src/tools/diff-snapshots.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff-snapshots.js","sourceRoot":"","sources":["../../src/tools/diff-snapshots.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 registerDominatorAttribution(server: McpServer): void;
12
+ //# sourceMappingURL=dominator-attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominator-attribution.d.ts","sourceRoot":"","sources":["../../src/tools/dominator-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAuCvE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwNpE"}
@@ -0,0 +1,189 @@
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 memlabCore from '@memlab/core';
11
+ import { z } from 'zod';
12
+ import { getSnapshot } from '../heap-state.js';
13
+ import { boundedDominatorRetainedSize, errorResult, formatBytes, formatNumber, markdownTable, toolResult, truncateNodeName, } from '../utils.js';
14
+ import { makeMembershipTest, parsePopulation } from './population-diff.js';
15
+ const { NumericSet } = memlabCore;
16
+ // Bound on the upward walk from a population member to a candidate, mirroring
17
+ // `boundedDominatorRetainedSize`. A member whose walk truncates is reported
18
+ // unattributed rather than guessed at.
19
+ const MAX_HOPS = 500;
20
+ export function registerDominatorAttribution(server) {
21
+ server.tool('memlab_dominator_attribution', 'Given several candidate retainers, measure how much of a population each one actually DOMINATES — i.e. what would really be freed by releasing it. Answers "which of these is the amplifier?" with a number instead of a plausible story. ' +
22
+ 'Each population member is walked up the dominator tree to the first candidate above it, so every member is attributed to exactly one candidate and the shares cannot double-count. Members that reach the root without passing any candidate are reported as an explicit unattributed remainder — those are held through paths none of the candidates control. ' +
23
+ 'When one candidate sits above another, a second column reports what the outer one dominates at any depth, so an ancestor is never printed as holding nothing merely because a nested candidate took its members. ' +
24
+ 'A candidate that comes back with ZERO is the useful result: it refutes a hypothesis that named it. Measured example: for 4,541 detached nodes the split was activeElement 3,675 / activeElementInst 0 / lastSelection 18 / 848 unattributed, which killed the "the React fiber is the amplifier" theory outright. ' +
25
+ 'Sizes are dominator-deduped (a nested member is not counted again under its ancestor), so the per-candidate figures are additive.', {
26
+ node_ids: z
27
+ .array(z.number())
28
+ .describe('Candidate retainer node ids, from the CURRENT snapshot (ids are per-capture). Typically the objects a hypothesis names — e.g. the ids behind the top rows of memlab_detached_dom group_by:"dominator", or the properties of one suspect object.'),
29
+ population: z
30
+ .string()
31
+ .optional()
32
+ .default('detached')
33
+ .describe('What to attribute: "detached" (default), "class:<ClassName>", "shape:prop1,prop2", or "all" (every node in the heap — expensive, and the totals become the whole heap).'),
34
+ limit: z
35
+ .number()
36
+ .optional()
37
+ .default(30)
38
+ .describe('Maximum candidate rows to print (default 30).'),
39
+ }, async ({ node_ids, population, limit }) => {
40
+ try {
41
+ if (node_ids.length === 0) {
42
+ return errorResult('node_ids is empty — pass the candidate retainers to compare.');
43
+ }
44
+ const snapshot = getSnapshot();
45
+ const candidates = new Map();
46
+ const missing = [];
47
+ for (const id of node_ids) {
48
+ const node = snapshot.getNodeById(id);
49
+ if (!node) {
50
+ missing.push(id);
51
+ continue;
52
+ }
53
+ candidates.set(id, {
54
+ id,
55
+ label: truncateNodeName(node.name, node.type, node.self_size, 48),
56
+ ownRetained: node.retainedSize,
57
+ memberCount: 0,
58
+ memberSelf: 0,
59
+ memberIds: [],
60
+ totalCount: 0,
61
+ cededCount: 0,
62
+ });
63
+ }
64
+ if (candidates.size === 0) {
65
+ return errorResult(`None of the ${node_ids.length} node id(s) exist in the current snapshot (ids are only valid within the snapshot they were read from): ${missing.join(', ')}.`);
66
+ }
67
+ const isMember = population.trim() === 'all'
68
+ ? (node) => node.id > 3
69
+ : makeMembershipTest(parsePopulation(population));
70
+ let total = 0;
71
+ let totalSelf = 0;
72
+ let unattributed = 0;
73
+ let unattributedSelf = 0;
74
+ let truncatedWalks = 0;
75
+ snapshot.nodes.forEach(node => {
76
+ if (!isMember(node))
77
+ return;
78
+ total++;
79
+ totalSelf += node.self_size;
80
+ // A candidate that is itself in the population is attributed to
81
+ // itself: it dominates itself, and excluding it would understate a
82
+ // container that IS part of what leaked.
83
+ let cur = candidates.has(node.id)
84
+ ? node
85
+ : (node.dominatorNode ?? null);
86
+ let hops = 0;
87
+ let hit;
88
+ // The walk does NOT stop at the first candidate. Stopping there
89
+ // reports an ancestor candidate as dominating nothing whenever a
90
+ // second candidate happens to sit between it and the members — which
91
+ // reads as "this object holds none of the leak" when the truth is the
92
+ // opposite. Nearest-wins still decides the exclusive attribution; the
93
+ // rest of the chain is recorded as containment.
94
+ while (cur) {
95
+ const c = candidates.get(cur.id);
96
+ if (c) {
97
+ c.totalCount++;
98
+ if (hit === undefined)
99
+ hit = c;
100
+ else
101
+ c.cededCount++;
102
+ }
103
+ if (hops++ >= MAX_HOPS) {
104
+ if (hit === undefined)
105
+ truncatedWalks++;
106
+ break;
107
+ }
108
+ const next = cur.dominatorNode ?? null;
109
+ if (!next || next.id === cur.id)
110
+ break;
111
+ cur = next;
112
+ }
113
+ if (hit) {
114
+ hit.memberCount++;
115
+ hit.memberSelf += node.self_size;
116
+ hit.memberIds.push(node.id);
117
+ }
118
+ else {
119
+ unattributed++;
120
+ unattributedSelf += node.self_size;
121
+ }
122
+ });
123
+ if (total === 0) {
124
+ return toolResult(`No nodes match population \`${population}\` in this snapshot — nothing to attribute.`);
125
+ }
126
+ const rows = [...candidates.values()].sort((a, b) => b.memberCount - a.memberCount || b.totalCount - a.totalCount);
127
+ const shown = rows.slice(0, limit);
128
+ const reclaimable = new Map();
129
+ for (const c of shown) {
130
+ reclaimable.set(c.id, c.memberIds.length > 0
131
+ ? boundedDominatorRetainedSize(new NumericSet(c.memberIds), snapshot)
132
+ : { retained: 0, exact: true });
133
+ }
134
+ const pct = (n) => total > 0 ? `${((n / total) * 100).toFixed(1)}%` : '-';
135
+ const lines = [
136
+ `## Dominator attribution of \`${population}\` across ${formatNumber(candidates.size)} candidate(s)`,
137
+ '',
138
+ `Population: ${formatNumber(total)} node(s), ${formatBytes(totalSelf)} self size.`,
139
+ '',
140
+ markdownTable([
141
+ 'Candidate',
142
+ 'Class',
143
+ 'Attributed',
144
+ '% of pop.',
145
+ 'Dominates (any depth)',
146
+ 'Reclaimable (deduped)',
147
+ 'Candidate retains',
148
+ ], shown.map(c => {
149
+ const r = reclaimable.get(c.id);
150
+ return [
151
+ `@${c.id}`,
152
+ c.label,
153
+ formatNumber(c.memberCount),
154
+ pct(c.memberCount),
155
+ c.cededCount > 0
156
+ ? `${formatNumber(c.totalCount)} (${formatNumber(c.cededCount)} to a nested candidate)`
157
+ : formatNumber(c.totalCount),
158
+ c.memberCount === 0
159
+ ? '—'
160
+ : `${formatBytes(r?.retained ?? 0)}${r?.exact === false ? ' (upper bound)' : ''}`,
161
+ formatBytes(c.ownRetained),
162
+ ];
163
+ }), new Set([2, 3, 4, 5, 6])),
164
+ '',
165
+ `- **Unattributed:** ${formatNumber(unattributed)} (${pct(unattributed)}), ${formatBytes(unattributedSelf)} self — reached the root without passing any candidate, so no candidate here frees them.`,
166
+ ];
167
+ if (rows.length > shown.length) {
168
+ lines.push(`- ${formatNumber(rows.length - shown.length)} further candidate(s) not shown (raise \`limit\`).`);
169
+ }
170
+ if (truncatedWalks > 0) {
171
+ lines.push(`- ⚠ ${formatNumber(truncatedWalks)} member(s) hit the ${MAX_HOPS}-hop walk cap and were counted as unattributed. Their true owner may be a candidate deeper up the chain; treat the unattributed figure as an upper bound.`);
172
+ }
173
+ const zero = shown.filter(c => c.totalCount === 0);
174
+ if (zero.length > 0) {
175
+ lines.push('', `⛔ **${formatNumber(zero.length)} candidate(s) dominate NOTHING in this population, at any depth** (${zero.map(c => `@${c.id} ${c.label}`).join(', ')}). Releasing them frees none of it — any hypothesis that names one of them as the amplifier is refuted by this measurement, not merely unsupported.`);
176
+ }
177
+ const nested = shown.filter(c => c.cededCount > 0);
178
+ if (nested.length > 0) {
179
+ lines.push('', `ℹ ${formatNumber(nested.length)} candidate(s) are ANCESTORS of another candidate (${nested.map(c => `@${c.id}`).join(', ')}), so members below the inner one are attributed there. Read their **Attributed** column as "what this object holds that the nested candidate does not" — a low value there with a high **Dominates** does not mean the object is innocent, it means the nested candidate is the tighter fix.`);
180
+ }
181
+ lines.push('', "_**Attributed** is by NEAREST candidate in the dominator tree, so each member counts once and the column sums to the population minus the unattributed remainder. **Dominates (any depth)** counts every member below the candidate and therefore double-counts across nested candidates — never sum it. **Reclaimable** is dominator-deduped over the attributed members — the bytes actually released — while **Candidate retains** is the candidate's entire retained size, which also covers everything it holds outside this population._");
182
+ return toolResult(lines.join('\n'));
183
+ }
184
+ catch (err) {
185
+ return errorResult(err);
186
+ }
187
+ });
188
+ }
189
+ //# sourceMappingURL=dominator-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominator-attribution.js","sourceRoot":"","sources":["../../src/tools/dominator-attribution.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 registerDominatorChain(server: McpServer): void;
12
+ //# sourceMappingURL=dominator-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominator-chain.d.ts","sourceRoot":"","sources":["../../src/tools/dominator-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAavE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgG9D"}
@@ -0,0 +1,92 @@
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 { isNodeWorthInspecting, truncateNodeName, errorResult, toolResult, formatBytes, formatNumber, } from '../utils.js';
13
+ export function registerDominatorChain(server) {
14
+ server.tool('memlab_dominator_chain', 'Walk UPWARD through the immediate-dominator chain from a node to the GC root — the accountability chain of objects that each, if freed, would free the target. Every node on the chain exclusively dominates the target, so the nearest application-owned entry is the single owner to fix. This complements the DOWNWARD memlab_dominator_subtree / memlab_trace_dominators (what a node dominates) and the edge-based memlab_retainer_trace (a shortest reference path, which need not be a dominator). Mirrors the Chrome DevTools "Retained by / dominators" chain. Each step shows retained size and the fan-in (how much extra memory the next dominator is accountable for).', {
15
+ node_id: z
16
+ .number()
17
+ .describe('The numeric ID of the heap node to trace upward from'),
18
+ max_depth: z
19
+ .number()
20
+ .optional()
21
+ .default(30)
22
+ .describe('Maximum number of dominator hops to climb (default 30)'),
23
+ }, async ({ node_id, max_depth }) => {
24
+ try {
25
+ const snapshot = getSnapshot();
26
+ const targetNode = snapshot.getNodeById(node_id);
27
+ if (!targetNode) {
28
+ return errorResult(`Node with id ${node_id} not found`);
29
+ }
30
+ // Climb immediate dominators until the GC root (which dominates itself)
31
+ // or a depth/cycle limit is hit.
32
+ const chain = [targetNode];
33
+ const visited = new Set([targetNode.id]);
34
+ let current = targetNode;
35
+ let reachedRoot = false;
36
+ while (chain.length <= max_depth) {
37
+ const dom = current.dominatorNode;
38
+ if (!dom || dom.id === current.id) {
39
+ reachedRoot = true;
40
+ break;
41
+ }
42
+ if (visited.has(dom.id))
43
+ break;
44
+ visited.add(dom.id);
45
+ chain.push(dom);
46
+ current = dom;
47
+ }
48
+ // The nearest dominator ABOVE the target that is a real, inspectable
49
+ // app object — the accountable owner to fix.
50
+ const owner = chain
51
+ .slice(1)
52
+ .find(n => isNodeWorthInspecting(n) && n.name !== '(GC roots)');
53
+ const lines = [
54
+ `## Dominator chain for @${targetNode.id} (${truncateNodeName(targetNode.name, targetNode.type, targetNode.self_size, 60)})`,
55
+ '',
56
+ `Retained ${formatBytes(targetNode.retainedSize)}. Climbing ${chain.length - 1} immediate dominator(s) toward the GC root${reachedRoot ? '' : ` (stopped at max_depth ${max_depth})`}.`,
57
+ '',
58
+ ];
59
+ for (let i = 0; i < chain.length; i++) {
60
+ const n = chain[i];
61
+ const indent = ' '.repeat(i);
62
+ const name = truncateNodeName(n.name, n.type, n.self_size, 80);
63
+ // Fan-in: how much more the next dominator up is accountable for than
64
+ // this node — i.e. what else it holds besides this subtree.
65
+ let fanIn = '';
66
+ if (i + 1 < chain.length) {
67
+ const delta = chain[i + 1].retainedSize - n.retainedSize;
68
+ if (delta > 0)
69
+ fanIn = ` — dominator holds +${formatBytes(delta)} beyond this`;
70
+ }
71
+ const marker = i === 0 ? 'target' : `↑ dom ${i}`;
72
+ const ownerTag = owner && n.id === owner.id ? ' ← nearest app owner' : '';
73
+ lines.push(`${indent}[${marker}] @${n.id} ${name} (retained ${formatBytes(n.retainedSize)})${fanIn}${ownerTag}`);
74
+ }
75
+ lines.push('');
76
+ if (reachedRoot) {
77
+ lines.push('_(reached GC root — this is the full accountability chain)_');
78
+ }
79
+ else {
80
+ lines.push(`_(stopped at max_depth ${max_depth}; pass a larger max_depth to reach the root)_`);
81
+ }
82
+ if (owner) {
83
+ lines.push('', `**Nearest app owner:** @${owner.id} ${truncateNodeName(owner.name, owner.type, owner.self_size, 60)} — retains ${formatBytes(owner.retainedSize)} (${formatNumber(owner.retainedSize)} bytes). Fixing this object frees the target.`);
84
+ }
85
+ return toolResult(lines.join('\n'));
86
+ }
87
+ catch (err) {
88
+ return errorResult(err);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=dominator-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominator-chain.js","sourceRoot":"","sources":["../../src/tools/dominator-chain.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 registerDuplicateObjects(server: McpServer): void;
12
+ //# sourceMappingURL=duplicate-objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-objects.d.ts","sourceRoot":"","sources":["../../src/tools/duplicate-objects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAkCvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6LhE"}