@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
@@ -1 +1 @@
1
- {"version":3,"file":"sliced-strings.js","sourceRoot":"","sources":["../../src/tools/sliced-strings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sliced-strings.js","sourceRoot":"","sources":["../../src/tools/sliced-strings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
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
+ /**
12
+ * memlab_snapshot_header — peek a snapshot's header WITHOUT the dominator pass.
13
+ *
14
+ * The expensive/risky part of memlab_load_snapshot is the dominator-tree
15
+ * computation (uninterruptible, super-linear, can wedge/OOM the server). This
16
+ * tool skips it entirely: it resolves + fetches the file (reusing any cached
17
+ * download, so a follow-up real load doesn't re-download), reads the node/edge
18
+ * counts and capture time from the file header, and reports whether the capture
19
+ * fits under the current auto-scaled load ceiling.
20
+ *
21
+ * The point is to end the "attempt load → refused on counts → hand-compute
22
+ * density → re-query Scuba for a smaller file → retry" loop that dominated a
23
+ * server-snapshot sweep (feedback round 7 §1/§2): peek a candidate, read its
24
+ * exact counts + this-app density + the estimated max-loadable file size, then
25
+ * pick the right capture in one step.
26
+ */
27
+ export declare function registerSnapshotHeader(server: McpServer): void;
28
+ //# sourceMappingURL=snapshot-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-header.d.ts","sourceRoot":"","sources":["../../src/tools/snapshot-header.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAcvE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwH9D"}
@@ -0,0 +1,111 @@
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 fs from 'fs';
11
+ import path from 'path';
12
+ import { z } from 'zod';
13
+ import { resolveSnapshotPath, peekSnapshotCounts, computeDefaultCeilings, estimateMaxLoadableMB, extractCaptureTime, DEFAULT_MANIFOLD_BUCKET, } from './load-snapshot.js';
14
+ import { formatBytes, formatNumber, errorResult, textResult } from '../utils.js';
15
+ /**
16
+ * memlab_snapshot_header — peek a snapshot's header WITHOUT the dominator pass.
17
+ *
18
+ * The expensive/risky part of memlab_load_snapshot is the dominator-tree
19
+ * computation (uninterruptible, super-linear, can wedge/OOM the server). This
20
+ * tool skips it entirely: it resolves + fetches the file (reusing any cached
21
+ * download, so a follow-up real load doesn't re-download), reads the node/edge
22
+ * counts and capture time from the file header, and reports whether the capture
23
+ * fits under the current auto-scaled load ceiling.
24
+ *
25
+ * The point is to end the "attempt load → refused on counts → hand-compute
26
+ * density → re-query Scuba for a smaller file → retry" loop that dominated a
27
+ * server-snapshot sweep (feedback round 7 §1/§2): peek a candidate, read its
28
+ * exact counts + this-app density + the estimated max-loadable file size, then
29
+ * pick the right capture in one step.
30
+ */
31
+ export function registerSnapshotHeader(server) {
32
+ server.tool('memlab_snapshot_header', "Peek a .heapsnapshot's header (node/edge counts, capture time, file size) WITHOUT loading it — no dominator pass, so it can never wedge or OOM the server the way a full memlab_load_snapshot can. Reports whether the capture fits under the current auto-scaled load ceiling, this app's node/edge density, and — when it doesn't fit — the estimated largest same-app capture that WOULD fit, so you can select a loadable snapshot in one step instead of attempting an oversized load. Accepts a local absolute path, a manifold:// URL, or a bare snapshot filename (resolved against the nest_server_nodejs_heap_snapshots bucket and fetched automatically; the download is reused by a subsequent memlab_load_snapshot). Use this to triage which capture in a size band to load before committing to the expensive load.", {
33
+ file_path: z
34
+ .string()
35
+ .describe('A local absolute path to a .heapsnapshot file, a manifold:// URL (manifold://bucket/key), or a bare snapshot filename to fetch from the nest_server_nodejs_heap_snapshots bucket.'),
36
+ }, async ({ file_path }) => {
37
+ try {
38
+ let resolved;
39
+ let fetchedFrom = null;
40
+ try {
41
+ const r = resolveSnapshotPath(file_path);
42
+ resolved = r.localPath;
43
+ fetchedFrom = r.fetchedFrom;
44
+ }
45
+ catch (fetchErr) {
46
+ const msg = fetchErr instanceof Error ? fetchErr.message : String(fetchErr);
47
+ return errorResult(new Error(`Failed to fetch "${file_path}" from Manifold: ${msg}\n` +
48
+ `Ensure the 'manifold' CLI is installed and you have access to the bucket, ` +
49
+ `or pass a local absolute path instead.`));
50
+ }
51
+ if (!fs.existsSync(resolved)) {
52
+ return errorResult(new Error(`File not found: ${resolved}` +
53
+ (file_path.includes('/')
54
+ ? ''
55
+ : ` (also tried fetching "${file_path}" from the ${DEFAULT_MANIFOLD_BUCKET} bucket)`)));
56
+ }
57
+ const fileStat = fs.statSync(resolved);
58
+ const fileSizeMB = fileStat.size / (1024 * 1024);
59
+ const fileName = path.basename(fetchedFrom ?? file_path.replace(/^manifold:\/\//, ''));
60
+ const counts = peekSnapshotCounts(resolved);
61
+ const ceilings = computeDefaultCeilings();
62
+ const lines = [];
63
+ lines.push(`Snapshot header: ${fileName}`);
64
+ if (fetchedFrom)
65
+ lines.push(`Fetched from Manifold: ${fetchedFrom}`);
66
+ lines.push(`File size: ${formatBytes(fileStat.size)}`);
67
+ if (!counts) {
68
+ lines.push(`Node/edge counts: not found in the header prefix — cannot assess loadability without a full load.`);
69
+ return textResult(lines.join('\n'));
70
+ }
71
+ lines.push(`Nodes: ${formatNumber(counts.nodeCount)} Edges: ${formatNumber(counts.edgeCount)}`);
72
+ const captured = extractCaptureTime(fileName);
73
+ if (captured) {
74
+ const iso = captured.toISOString().slice(0, 10);
75
+ const ageDays = Math.max(0, Math.floor((Date.now() - captured.getTime()) / 86_400_000));
76
+ lines.push(`Captured ${iso} (${ageDays} day(s) ago) — if you find a candidate, verify the fix wasn't already deployed since then before writing one.`);
77
+ }
78
+ const heapNote = ceilings.heapLimitMB > 0
79
+ ? ` (server heap ~${formatNumber(ceilings.heapLimitMB)} MB via --max-old-space-size)`
80
+ : '';
81
+ lines.push(`Current load ceiling: ${formatNumber(ceilings.maxNodes)} nodes / ${formatNumber(ceilings.maxEdges)} edges${heapNote}.`);
82
+ const nodesPerMB = Math.round(counts.nodeCount / fileSizeMB);
83
+ const edgesPerMB = Math.round(counts.edgeCount / fileSizeMB);
84
+ const fitsNodes = counts.nodeCount <= ceilings.maxNodes;
85
+ const fitsEdges = counts.edgeCount <= ceilings.maxEdges;
86
+ if (fitsNodes && fitsEdges) {
87
+ lines.push(`✓ Loadable — under the ceiling on both nodes and edges. Load it with memlab_load_snapshot({file_path: "${file_path}"}); the fetched file is cached so it won't re-download.`);
88
+ }
89
+ else {
90
+ const over = !fitsNodes && !fitsEdges
91
+ ? 'nodes and edges'
92
+ : !fitsEdges
93
+ ? 'edges'
94
+ : 'nodes';
95
+ const estMB = estimateMaxLoadableMB(counts, fileSizeMB, {
96
+ maxNodes: ceilings.maxNodes,
97
+ maxEdges: ceilings.maxEdges,
98
+ });
99
+ lines.push(`✗ Over the ceiling on ${over}. Density: ${formatNumber(nodesPerMB)} nodes/MB, ${formatNumber(edgesPerMB)} edges/MB.` +
100
+ (estMB != null
101
+ ? ` For this app the ceiling corresponds to roughly a ≤${formatNumber(estMB)} MB capture — select a smaller snapshot below that size (then memlab_snapshot_header it to confirm), or force the load with memlab_load_snapshot({force: true}) accepting a long, uninterruptible dominator pass.`
102
+ : ` Select a smaller snapshot, or force the load with memlab_load_snapshot({force: true}).`));
103
+ }
104
+ return textResult(lines.join('\n'));
105
+ }
106
+ catch (err) {
107
+ return errorResult(err);
108
+ }
109
+ });
110
+ }
111
+ //# sourceMappingURL=snapshot-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-header.js","sourceRoot":"","sources":["../../src/tools/snapshot-header.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"string-patterns.d.ts","sourceRoot":"","sources":["../../src/tools/string-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAiBvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+H9D"}
1
+ {"version":3,"file":"string-patterns.d.ts","sourceRoot":"","sources":["../../src/tools/string-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAiBvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgI9D"}
@@ -8,7 +8,7 @@
8
8
  * @oncall memory_lab
9
9
  */
10
10
  import { z } from 'zod';
11
- import { getSnapshot } from '../heap-state.js';
11
+ import { getSnapshot, isLightSnapshot } from '../heap-state.js';
12
12
  import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
13
13
  function extractPrefix(value, prefixLen) {
14
14
  if (value.length <= prefixLen)
@@ -38,7 +38,8 @@ export function registerStringPatterns(server) {
38
38
  .describe('Maximum number of groups to return (default 20)'),
39
39
  }, async ({ prefix_length, min_count, min_total_size, limit }) => {
40
40
  try {
41
- const snapshot = getSnapshot();
41
+ const snapshot = getSnapshot({ allowLight: true });
42
+ const light = isLightSnapshot();
42
43
  const groups = new Map();
43
44
  snapshot.nodes.forEach(node => {
44
45
  if (node.type !== 'string')
@@ -86,7 +87,7 @@ export function registerStringPatterns(server) {
86
87
  'Prefix',
87
88
  'Count',
88
89
  'Total Size',
89
- 'Retained',
90
+ light ? 'Retained (n/a)' : 'Retained',
90
91
  'Len Range',
91
92
  'Examples',
92
93
  ];
@@ -100,7 +101,7 @@ export function registerStringPatterns(server) {
100
101
  displayPrefix,
101
102
  formatNumber(g.count),
102
103
  formatBytes(g.total_self_size),
103
- formatBytes(g.total_retained_size),
104
+ light ? 'n/a (light)' : formatBytes(g.total_retained_size),
104
105
  lenRange,
105
106
  g.example_ids.map(id => `@${id}`).join(', '),
106
107
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"string-patterns.js","sourceRoot":"","sources":["../../src/tools/string-patterns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"string-patterns.js","sourceRoot":"","sources":["../../src/tools/string-patterns.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 registerToolsIndex(server: McpServer): void;
12
+ //# sourceMappingURL=tools-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-index.d.ts","sourceRoot":"","sources":["../../src/tools/tools-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAkSvE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4F1D"}
@@ -0,0 +1,342 @@
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 { listToolNames } from '../tool-registry.js';
12
+ import { errorResult, makeNamePatternTest, textResult } from '../utils.js';
13
+ const GROUPS = [
14
+ {
15
+ question: 'What is this heap actually made of?',
16
+ tools: [
17
+ [
18
+ 'memlab_app_heap',
19
+ 'START HERE on an unfamiliar app: splits the heap into application data vs bundle source vs V8 machinery. On one app this showed ~55% of the heap was JS bundle source, which reframed every number that followed.',
20
+ ],
21
+ [
22
+ 'memlab_quick_diagnosis',
23
+ 'One call for summary + biggest objects + class histogram + duplicated strings.',
24
+ ],
25
+ [
26
+ 'memlab_snapshot_summary',
27
+ 'Node/edge counts and totals, when you only need the shape of the capture.',
28
+ ],
29
+ [
30
+ 'memlab_class_histogram',
31
+ 'Counts and sizes per class; `name_pattern` answers "is class X present?" in one row.',
32
+ ],
33
+ ['memlab_largest_objects', 'The single biggest retainers, ranked.'],
34
+ [
35
+ 'memlab_shape_histogram',
36
+ 'Groups plain objects by their property set — finds record types the class name hides behind `Object`.',
37
+ ],
38
+ [
39
+ 'memlab_object_cost_breakdown',
40
+ 'Where one class’s bytes actually go (self vs properties vs elements).',
41
+ ],
42
+ ],
43
+ },
44
+ {
45
+ question: 'Is anything growing — and is it a leak?',
46
+ tools: [
47
+ [
48
+ 'memlab_leak_report',
49
+ 'The ladder verdict: per-class growth across an ordered set of snapshots.',
50
+ ],
51
+ [
52
+ 'memlab_sequence_analysis',
53
+ 'Per-class trend across a ladder, with artifact families flagged.',
54
+ ],
55
+ [
56
+ 'memlab_collection_trend',
57
+ 'Entry counts of NAMED collections across a ladder, with growth per interaction cycle.',
58
+ ],
59
+ [
60
+ 'memlab_population_diff',
61
+ 'Whether two snapshots hold the same POPULATION or just the same count — equal totals are not identity.',
62
+ ],
63
+ [
64
+ 'memlab_growth_signals',
65
+ 'Single-snapshot signals that something is accumulating.',
66
+ ],
67
+ [
68
+ 'memlab_diff_snapshots',
69
+ 'Raw per-class deltas between two resident snapshots.',
70
+ ],
71
+ [
72
+ 'memlab_hypothesis',
73
+ 'State a leak hypothesis and have it checked against the ladder instead of arguing it.',
74
+ ],
75
+ [
76
+ 'memlab_verify_fix',
77
+ 'Did the fix work? Compares per-cycle growth RATES between a before ladder and an after ladder.',
78
+ ],
79
+ [
80
+ 'memlab_ladder',
81
+ 'Name a ladder once and reference it as `ladder:<name>` from every trend tool.',
82
+ ],
83
+ ],
84
+ },
85
+ {
86
+ question: 'Who owns the growth / why is X retained?',
87
+ tools: [
88
+ [
89
+ 'memlab_explain_delta',
90
+ 'WHERE a heap grew, attributed to the object that owns the new bytes rather than to what they are.',
91
+ ],
92
+ [
93
+ 'memlab_dominator_chain',
94
+ 'From one node up to the accountable application object.',
95
+ ],
96
+ [
97
+ 'memlab_dominator_attribution',
98
+ 'Given several candidate retainers, how much each one actually dominates — a zero refutes a hypothesis.',
99
+ ],
100
+ ['memlab_retainer_trace', 'The shortest retainer path for one node.'],
101
+ [
102
+ 'memlab_retainer_summary',
103
+ 'Retainer paths across many instances, clustered by shape.',
104
+ ],
105
+ ['memlab_referrer_summary', 'Who points at this, grouped by edge.'],
106
+ [
107
+ 'memlab_pinch_points',
108
+ 'Single objects whose release would free the most.',
109
+ ],
110
+ ['memlab_dominator_subtree', 'What one object holds, expanded downward.'],
111
+ [
112
+ 'memlab_retainer_layers',
113
+ 'The retention structure around a node, layer by layer.',
114
+ ],
115
+ ['memlab_trace_dominators', 'Dominator path for a set of nodes at once.'],
116
+ ],
117
+ },
118
+ {
119
+ question: 'Is it real, or a measurement artifact?',
120
+ tools: [
121
+ [
122
+ 'memlab_dev_artifacts',
123
+ 'Memory retained ONLY by dev/automation roots — DevTools, extensions, React Fast Refresh, the a11y cache. Run before calling anything a production leak.',
124
+ ],
125
+ [
126
+ 'memlab_explain_delta',
127
+ 'Counts the OTHER artifact family — V8 JIT warmup — which dev_artifacts does not. Read both.',
128
+ ],
129
+ [
130
+ 'memlab_check_health',
131
+ 'Prioritized triage that separates likely-real from likely-noise.',
132
+ ],
133
+ ],
134
+ },
135
+ {
136
+ question: 'Detached DOM and event listeners',
137
+ tools: [
138
+ [
139
+ 'memlab_detached_dom',
140
+ 'Detached nodes, with a pinned-vs-GC-eligible split; `group_by:"dominator"` groups by what a fix would actually free.',
141
+ ],
142
+ ['memlab_event_listener_leaks', 'Listeners that outlived their target.'],
143
+ ['memlab_event_registry', 'What is registered on what.'],
144
+ ],
145
+ },
146
+ {
147
+ question: 'Collections and caches',
148
+ tools: [
149
+ [
150
+ 'memlab_cache_analysis',
151
+ 'Unbounded or oversized caches in one snapshot.',
152
+ ],
153
+ [
154
+ 'memlab_stale_collections',
155
+ 'Collections holding entries nothing else references.',
156
+ ],
157
+ [
158
+ 'memlab_collection_trend',
159
+ 'The same collections tracked ACROSS a ladder.',
160
+ ],
161
+ [
162
+ 'memlab_map_entries',
163
+ 'Enumerate a Map/Set correctly (SMI gaps and browser slot typing handled).',
164
+ ],
165
+ ['memlab_weakmap_entries', 'Enumerate a WeakMap.'],
166
+ [
167
+ 'memlab_array_group_by',
168
+ 'Group an array’s elements by a property to see what is piling up.',
169
+ ],
170
+ [
171
+ 'memlab_property_distribution',
172
+ 'Cardinality and top values of one property across instances.',
173
+ ],
174
+ ],
175
+ },
176
+ {
177
+ question: 'Strings and duplication',
178
+ tools: [
179
+ [
180
+ 'memlab_intern_opportunities',
181
+ 'What an intern pool would actually reclaim, grouped by property x parent shape. Start here for an interning decision.',
182
+ ],
183
+ ['memlab_duplicated_strings', 'The raw per-value duplication table.'],
184
+ [
185
+ 'memlab_string_patterns',
186
+ 'Group strings by prefix to find families (URLs, ids, payloads).',
187
+ ],
188
+ ['memlab_sliced_strings', 'Substrings pinning huge parents.'],
189
+ [
190
+ 'memlab_duplicate_objects',
191
+ 'The same question for objects rather than strings.',
192
+ ],
193
+ ['memlab_search_strings', 'Find a string value in the heap.'],
194
+ ['memlab_get_string', 'Read one string node’s value.'],
195
+ ],
196
+ },
197
+ {
198
+ question: 'Inspect or find specific objects',
199
+ tools: [
200
+ [
201
+ 'memlab_find_nodes_by_class',
202
+ 'By exact class name, or by `name_pattern` regex/substring.',
203
+ ],
204
+ ['memlab_search_nodes', 'By name/type/size predicates.'],
205
+ ['memlab_find_by_property', 'By a property name/value.'],
206
+ ['memlab_find_by_shape', 'By property set.'],
207
+ ['memlab_match_object', 'By a structural pattern.'],
208
+ ['memlab_get_node', 'One node’s details.'],
209
+ ['memlab_object_shape', 'One object’s properties and their sizes.'],
210
+ ['memlab_get_references', 'Outgoing edges.'],
211
+ ['memlab_get_referrers', 'Incoming edges.'],
212
+ ['memlab_get_property', 'One property of one object.'],
213
+ ['memlab_get_value', 'A scalar value, where the format allows it.'],
214
+ [
215
+ 'memlab_closure_inspection',
216
+ 'What a closure captured, and what that costs.',
217
+ ],
218
+ ['memlab_global_variables', 'What is hanging off the global object.'],
219
+ ['memlab_aggregate', 'Sum/count over a node set.'],
220
+ ['memlab_for_each', 'Run one tool over many nodes.'],
221
+ ],
222
+ },
223
+ {
224
+ question: 'None of the above — ask the heap directly',
225
+ tools: [
226
+ [
227
+ 'memlab_eval',
228
+ 'Arbitrary JS over the snapshot, with indexed helpers (`byClass`, `iterByType`, `classCounts`, `entries`, `dominates`, `pathBetween`). Use `mode:"describe_env"` for the calling convention. This is the escape hatch when no fixed-shape tool matches the question.',
229
+ ],
230
+ [
231
+ 'memlab_auto_investigate',
232
+ 'When you do not yet have a question: runs the standard deep-dive and reports what it found.',
233
+ ],
234
+ [
235
+ 'memlab_tools',
236
+ 'This index. Filter it with `question` or look a tool up with `tool`.',
237
+ ],
238
+ ],
239
+ },
240
+ {
241
+ question: 'Session, batching and write-ups',
242
+ tools: [
243
+ [
244
+ 'memlab_load_snapshot',
245
+ 'Load a local path, a manifold:// URL, or a bare Nest filename.',
246
+ ],
247
+ [
248
+ 'memlab_snapshots',
249
+ 'List / switch / unload resident snapshots; set session output controls.',
250
+ ],
251
+ [
252
+ 'memlab_batch',
253
+ 'Several tools against ONE load — the load is the expensive part.',
254
+ ],
255
+ [
256
+ 'memlab_snapshot_header',
257
+ 'Node/edge counts WITHOUT loading the snapshot.',
258
+ ],
259
+ [
260
+ 'memlab_server_status',
261
+ 'Confirm the server is alive; returns instantly.',
262
+ ],
263
+ [
264
+ 'memlab_finding_index',
265
+ 'Record findings as you go so the write-up is not reconstructed from memory.',
266
+ ],
267
+ ['memlab_reports', 'Render the findings.'],
268
+ ['memlab_hunt_report', 'Render a leak-hunt run.'],
269
+ [
270
+ 'memlab_analyze_run',
271
+ 'Point at a run.json and get the WHOLE analysis protocol — trend, owner attribution, population diff, artifact classification, caveats — in one call.',
272
+ ],
273
+ ],
274
+ },
275
+ ];
276
+ export function registerToolsIndex(server) {
277
+ server.tool('memlab_tools', 'Index of every memlab tool, grouped by the QUESTION it answers ("what is this heap made of", "is anything growing", "why is X retained", "is it real or an artifact", …). Call this first when you are not sure which tool fits, or when you suspect the server has something better than the one you were about to use — it costs one call and lists tools whose schemas have not been fetched yet, which is otherwise impossible to discover under deferred tool loading. Pass `question` to filter to matching groups, or `tool` to find which group a tool belongs to.', {
278
+ question: z
279
+ .string()
280
+ .optional()
281
+ .describe('Filter to groups matching this text (case-insensitive regex, substring fallback) — e.g. "growing", "retained", "artifact", "string".'),
282
+ tool: z
283
+ .string()
284
+ .optional()
285
+ .describe('Show the group(s) containing this tool name (with or without the memlab_ prefix).'),
286
+ }, async ({ question, tool }) => {
287
+ try {
288
+ const registered = new Set(listToolNames());
289
+ const wanted = tool
290
+ ? tool.startsWith('memlab_')
291
+ ? tool
292
+ : `memlab_${tool}`
293
+ : null;
294
+ const matchesQuestion = makeNamePatternTest(question);
295
+ let groups = GROUPS;
296
+ if (wanted != null) {
297
+ groups = groups.filter(g => g.tools.some(([n]) => n === wanted));
298
+ if (groups.length === 0) {
299
+ return textResult(`\`${wanted}\` is not in the index${registered.has(wanted) ? ' (but it IS registered — the index is missing an entry; see the uncategorized list below)' : ' and is not a registered tool'}.\n\nRegistered tools: ${[...registered].join(', ')}`);
300
+ }
301
+ }
302
+ if (question != null) {
303
+ groups = groups.filter(g => matchesQuestion(g.question) ||
304
+ g.tools.some(([n, w]) => matchesQuestion(n) || matchesQuestion(w)));
305
+ }
306
+ const lines = [
307
+ `# memlab tools by question (${registered.size} registered)`,
308
+ '',
309
+ ];
310
+ if (groups.length === 0) {
311
+ lines.push(`No group matches ${question != null ? `"${question}"` : 'that filter'}. Call \`memlab_tools\` with no arguments for the full index.`);
312
+ return textResult(lines.join('\n'));
313
+ }
314
+ for (const g of groups) {
315
+ lines.push(`## ${g.question}`, '');
316
+ for (const [name, when] of g.tools) {
317
+ // A name in the index that is no longer registered is worse than a
318
+ // missing one: it sends the caller after a tool that will fail.
319
+ const missing = registered.has(name) ? '' : ' _(not registered)_';
320
+ lines.push(`- \`${name}\`${missing} — ${when}`);
321
+ }
322
+ lines.push('');
323
+ }
324
+ // Drift guard. The index is hand-written for usefulness, so a newly
325
+ // added tool would otherwise be invisible here — which is the exact
326
+ // failure this tool exists to fix, reproduced one level up.
327
+ if (question == null && wanted == null) {
328
+ const indexed = new Set(GROUPS.flatMap(g => g.tools.map(([n]) => n)));
329
+ const uncategorized = [...registered].filter(n => !indexed.has(n));
330
+ if (uncategorized.length > 0) {
331
+ lines.push('## Not yet categorized', '', `These are registered but missing from the index above: ${uncategorized.map(n => `\`${n}\``).join(', ')}. Their own descriptions are the only documentation.`, '');
332
+ }
333
+ }
334
+ lines.push('_A tool listed under several questions is genuinely useful for each. Where a group is ordered, the first entry is the one to try first._');
335
+ return textResult(lines.join('\n'));
336
+ }
337
+ catch (err) {
338
+ return errorResult(err);
339
+ }
340
+ });
341
+ }
342
+ //# sourceMappingURL=tools-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-index.js","sourceRoot":"","sources":["../../src/tools/tools-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
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 { IHeapSnapshot } from '@memlab/core';
11
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ type MetricKind = 'collection_length' | 'class_count' | 'pending_chain';
13
+ /**
14
+ * Measure the metric on one parsed snapshot. One scalar per snapshot is the
15
+ * whole point: the arms are compared on a rate, and a rate needs a number per
16
+ * rung, not a report.
17
+ */
18
+ export declare function measureMetric(snapshot: IHeapSnapshot, kind: MetricKind, locator: string, chainEdge: string): number;
19
+ /** Growth per interaction cycle across an arm's ladder. */
20
+ export declare function perCycleRate(values: number[], cycles: number): number;
21
+ export declare function registerVerifyFix(server: McpServer): void;
22
+ export {};
23
+ //# sourceMappingURL=verify-fix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-fix.d.ts","sourceRoot":"","sources":["../../src/tools/verify-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAY,aAAa,EAAC,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAgBvE,KAAK,UAAU,GAAG,mBAAmB,GAAG,aAAa,GAAG,eAAe,CAAC;AAOxE;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAuCR;AA4CD,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIrE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4JzD"}