@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
@@ -7,11 +7,17 @@
7
7
  * @format
8
8
  * @oncall memory_lab
9
9
  */
10
+ import memlabCore from '@memlab/core';
11
+ const { utils, NumericSet } = memlabCore;
10
12
  import { z } from 'zod';
11
13
  import { getSnapshot } from '../heap-state.js';
12
- import { serializeNodeSummary, isNodeWorthInspecting, formatNodeSummaryTable, errorResult, toolResult, } from '../utils.js';
14
+ import { serializeNodeSummary, isNodeWorthInspecting, formatNodeSummaryTable, formatNumber, formatBytes, errorResult, toolResult, makeScanBudget, ScanTimeoutError, } from '../utils.js';
13
15
  export function registerFindByProperty(server) {
14
- server.tool('memlab_find_by_property', 'Find all objects that have a specific property name (outgoing edge). Useful for identifying objects with React internals (__reactFiber$, __reactProps$), custom data structures, or framework-specific markers. Results sorted by retained size.', {
16
+ server.tool('memlab_find_by_property', 'Find all objects that have a specific property name (outgoing edge). Useful for identifying ' +
17
+ 'objects with React internals (__reactFiber$, __reactProps$), custom data structures, or ' +
18
+ 'framework-specific markers. Use property_value_node_id for reverse referrer lookup — ' +
19
+ 'finding all objects whose named property points to a specific node (e.g., "which objects ' +
20
+ 'have their callback property pointing to closure @700467?"). Results sorted by retained size.', {
15
21
  property_name: z
16
22
  .string()
17
23
  .describe('The property/edge name to search for (e.g., "__reactFiber$", "cache", "data")'),
@@ -19,18 +25,35 @@ export function registerFindByProperty(server) {
19
25
  .string()
20
26
  .optional()
21
27
  .describe('Filter by the string value of the property target. Exact match by default; prefix with "/" for regex (e.g., "/^Left$/"). Only matches string-type target nodes.'),
28
+ property_value_node_id: z
29
+ .number()
30
+ .optional()
31
+ .describe('Filter by the target node ID of the property. Finds all objects whose named property points to this specific node. ' +
32
+ 'Essential for reverse referrer lookup — e.g., find all objects whose "callback" property points to closure @700467.'),
22
33
  edge_type: z
23
34
  .string()
24
35
  .optional()
25
36
  .describe('Optional edge type filter (property, element, context, internal)'),
37
+ output_mode: z
38
+ .enum(['full', 'count', 'ids'])
39
+ .optional()
40
+ .default('full')
41
+ .describe('Output verbosity: "full" returns node summaries (default), "count" returns only the total count and aggregate retained size, "ids" returns only node IDs'),
26
42
  limit: z
27
43
  .number()
28
44
  .optional()
29
45
  .default(20)
30
46
  .describe('Maximum number of results (default 20)'),
31
- }, async ({ property_name, property_value, edge_type, limit }) => {
47
+ timeout_ms: z
48
+ .number()
49
+ .optional()
50
+ .default(45000)
51
+ .describe('Wall-clock budget for the full-heap scan (default 45000). On very large browser heaps the scan returns partial results with a note instead of running for many minutes.'),
52
+ }, async ({ property_name, property_value, property_value_node_id, edge_type, output_mode, limit, timeout_ms, }) => {
32
53
  try {
33
54
  const snapshot = getSnapshot();
55
+ const budget = makeScanBudget(timeout_ms);
56
+ let timedOut = false;
34
57
  // Use prefix matching for names ending with $ (React dynamic suffixes)
35
58
  const isPrefix = property_name.endsWith('$');
36
59
  let valueRegex = null;
@@ -47,11 +70,14 @@ export function registerFindByProperty(server) {
47
70
  valueExact = property_value;
48
71
  }
49
72
  }
50
- const results = [];
51
- snapshot.nodes.forEach(node => {
52
- if (!isNodeWorthInspecting(node))
53
- return;
54
- const hasProperty = node.references.some(edge => {
73
+ const filterDesc = `"${property_name}"` +
74
+ (property_value ? ` = "${property_value}"` : '') +
75
+ (property_value_node_id != null
76
+ ? ` -> @${property_value_node_id}`
77
+ : '') +
78
+ (edge_type ? ` (edge type: ${edge_type})` : '');
79
+ const matchesProperty = (node) => {
80
+ return node.references.some(edge => {
55
81
  const edgeName = String(edge.name_or_index);
56
82
  const nameMatch = isPrefix
57
83
  ? edgeName.startsWith(property_name)
@@ -60,6 +86,10 @@ export function registerFindByProperty(server) {
60
86
  return false;
61
87
  if (edge_type && edge.type !== edge_type)
62
88
  return false;
89
+ if (property_value_node_id != null) {
90
+ if (edge.toNode.id !== property_value_node_id)
91
+ return false;
92
+ }
63
93
  if (valueExact != null || valueRegex != null) {
64
94
  const target = edge.toNode;
65
95
  if (!target.isString)
@@ -75,33 +105,85 @@ export function registerFindByProperty(server) {
75
105
  }
76
106
  return true;
77
107
  });
78
- if (!hasProperty)
79
- return;
80
- // Insertion sort to keep top N by retained size
81
- const size = node.retainedSize;
82
- let inserted = false;
83
- for (let i = 0; i < results.length; i++) {
84
- if (size > results[i].retainedSize) {
85
- results.splice(i, 0, node);
86
- inserted = true;
87
- break;
88
- }
89
- }
90
- if (!inserted) {
91
- results.push(node);
108
+ };
109
+ const timeoutNote = `\n\n⚠ Scan hit the ${timeout_ms}ms budget and returned PARTIAL results. Narrow the query (add edge_type, a more specific property_name), raise timeout_ms, or prefer an indexed tool. Browser heaps with millions of native/InternalNode nodes are slow to full-scan.`;
110
+ if (output_mode === 'count') {
111
+ let totalCount = 0;
112
+ const nodeIds = new NumericSet();
113
+ try {
114
+ snapshot.nodes.forEach(node => {
115
+ budget.tick();
116
+ if (!isNodeWorthInspecting(node))
117
+ return;
118
+ if (!matchesProperty(node))
119
+ return;
120
+ totalCount++;
121
+ nodeIds.add(node.id);
122
+ });
92
123
  }
93
- if (results.length > limit) {
94
- results.length = limit;
124
+ catch (e) {
125
+ if (e instanceof ScanTimeoutError)
126
+ timedOut = true;
127
+ else
128
+ throw e;
95
129
  }
96
- });
97
- const summaries = results.map(serializeNodeSummary);
98
- const filterDesc = `"${property_name}"` +
99
- (property_value ? ` = "${property_value}"` : '') +
100
- (edge_type ? ` (edge type: ${edge_type})` : '');
101
- if (summaries.length === 0) {
130
+ // Dominator-aware aggregate: property-matching objects can nest on the
131
+ // dominator tree, so a raw sum of retainedSize would double-count and
132
+ // can exceed 100% of heap. On a timeout this reflects the partial set.
133
+ const totalRetained = utils.aggregateDominatorMetrics(nodeIds, snapshot, () => true, (node) => node.retainedSize);
134
+ return toolResult(`Objects with property ${filterDesc}: ${formatNumber(totalCount)}${timedOut ? '+' : ''} total, ${formatBytes(totalRetained)} aggregate retained size (dominator-deduplicated)` +
135
+ (timedOut ? timeoutNote : ''));
136
+ }
137
+ const results = [];
138
+ let totalCount = 0;
139
+ try {
140
+ snapshot.nodes.forEach(node => {
141
+ budget.tick();
142
+ if (!isNodeWorthInspecting(node))
143
+ return;
144
+ if (!matchesProperty(node))
145
+ return;
146
+ totalCount++;
147
+ if (output_mode === 'ids') {
148
+ results.push(node);
149
+ return;
150
+ }
151
+ const size = node.retainedSize;
152
+ let inserted = false;
153
+ for (let i = 0; i < results.length; i++) {
154
+ if (size > results[i].retainedSize) {
155
+ results.splice(i, 0, node);
156
+ inserted = true;
157
+ break;
158
+ }
159
+ }
160
+ if (!inserted) {
161
+ results.push(node);
162
+ }
163
+ if (results.length > limit) {
164
+ results.length = limit;
165
+ }
166
+ });
167
+ }
168
+ catch (e) {
169
+ if (e instanceof ScanTimeoutError)
170
+ timedOut = true;
171
+ else
172
+ throw e;
173
+ }
174
+ if (totalCount === 0) {
102
175
  return toolResult(`No objects found with property ${filterDesc}`);
103
176
  }
104
- return toolResult(`Found ${summaries.length} objects with property ${filterDesc}\n\n${formatNodeSummaryTable(summaries)}`);
177
+ if (output_mode === 'ids') {
178
+ const sorted = results
179
+ .sort((a, b) => b.retainedSize - a.retainedSize)
180
+ .slice(0, limit);
181
+ return toolResult(`Found ${formatNumber(totalCount)}${timedOut ? '+' : ''} objects with property ${filterDesc} (showing ${sorted.length} IDs)\n\nIDs: ${sorted.map(n => n.id).join(', ')}` +
182
+ (timedOut ? timeoutNote : ''));
183
+ }
184
+ const summaries = results.map(serializeNodeSummary);
185
+ return toolResult(`Found ${formatNumber(totalCount)}${timedOut ? '+' : ''} objects with property ${filterDesc} (showing top ${summaries.length})\n\n${formatNodeSummaryTable(summaries)}` +
186
+ (timedOut ? timeoutNote : ''));
105
187
  }
106
188
  catch (err) {
107
189
  return errorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"find-by-property.js","sourceRoot":"","sources":["../../src/tools/find-by-property.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"find-by-property.js","sourceRoot":"","sources":["../../src/tools/find-by-property.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 registerFindByShape(server: McpServer): void;
12
+ //# sourceMappingURL=find-by-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-by-shape.d.ts","sourceRoot":"","sources":["../../src/tools/find-by-shape.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAgBvE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuN3D"}
@@ -0,0 +1,178 @@
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
+ const { utils, NumericSet } = memlabCore;
12
+ import { z } from 'zod';
13
+ import { getSnapshot } from '../heap-state.js';
14
+ import { isNodeWorthInspecting, serializeNodeSummary, formatNodeSummaryTable, formatNumber, formatBytes, errorResult, toolResult, } from '../utils.js';
15
+ export function registerFindByShape(server) {
16
+ server.tool('memlab_find_by_shape', 'Find all objects that have a specific set of property names (multi-property intersection search). Unlike find_by_property which searches for a single property, this finds objects matching a "shape" — objects that have ALL of the specified properties. Useful for finding instances of a specific record type, data structure, or component when you know its property names but not its constructor.', {
17
+ properties: z
18
+ .array(z.string())
19
+ .min(1)
20
+ .describe('Property names that must ALL be present on matching objects (e.g., ["callback", "context", "priority"])'),
21
+ exclude_properties: z
22
+ .array(z.string())
23
+ .optional()
24
+ .describe('Property names that must NOT be present. Use to distinguish between similar shapes.'),
25
+ class_name: z
26
+ .string()
27
+ .optional()
28
+ .describe('Optional constructor name filter to narrow results (e.g., "Object", "EventHandlerRefInternal")'),
29
+ output_mode: z
30
+ .enum(['full', 'count', 'ids'])
31
+ .optional()
32
+ .default('full')
33
+ .describe('Output verbosity: "full" returns node summaries (default), "count" returns only count and aggregate size, "ids" returns node IDs'),
34
+ follow_property: z
35
+ .string()
36
+ .optional()
37
+ .describe("For each matched object, resolve this property edge and include the target's " +
38
+ 'name, type, and ID in the output. Enables "find objects with shape X and tell ' +
39
+ 'me the distribution of property Y" in a single call.'),
40
+ limit: z
41
+ .number()
42
+ .optional()
43
+ .default(20)
44
+ .describe('Maximum number of results (default 20)'),
45
+ }, async ({ properties, exclude_properties, class_name, output_mode, follow_property, limit, }) => {
46
+ try {
47
+ const snapshot = getSnapshot();
48
+ const requiredSet = new Set(properties);
49
+ const excludeSet = new Set(exclude_properties ?? []);
50
+ const matchesShape = (node) => {
51
+ if (!isNodeWorthInspecting(node))
52
+ return false;
53
+ if (class_name && node.name !== class_name)
54
+ return false;
55
+ const foundProps = new Set();
56
+ for (const edge of node.references) {
57
+ if (edge.type !== 'property' && edge.type !== 'element')
58
+ continue;
59
+ const name = String(edge.name_or_index);
60
+ if (excludeSet.has(name))
61
+ return false;
62
+ if (requiredSet.has(name))
63
+ foundProps.add(name);
64
+ }
65
+ return foundProps.size === requiredSet.size;
66
+ };
67
+ const shapeDesc = `{${properties.join(', ')}}` +
68
+ (exclude_properties?.length
69
+ ? ` without {${exclude_properties.join(', ')}}`
70
+ : '') +
71
+ (class_name ? ` (class: ${class_name})` : '');
72
+ if (output_mode === 'count') {
73
+ let totalCount = 0;
74
+ let totalSelf = 0;
75
+ const nodeIds = new NumericSet();
76
+ snapshot.nodes.forEach(node => {
77
+ if (!matchesShape(node))
78
+ return;
79
+ totalCount++;
80
+ totalSelf += node.self_size;
81
+ nodeIds.add(node.id);
82
+ });
83
+ if (totalCount === 0) {
84
+ return toolResult(`No objects found matching shape ${shapeDesc}`);
85
+ }
86
+ // Dominator-aware aggregate: shape-matching objects can nest on the
87
+ // dominator tree, so a raw sum of retainedSize would double-count and
88
+ // can exceed 100% of heap.
89
+ const totalRetained = utils.aggregateDominatorMetrics(nodeIds, snapshot, () => true, (node) => node.retainedSize);
90
+ return toolResult(`Objects matching shape ${shapeDesc}: ${formatNumber(totalCount)} total, ${formatBytes(totalSelf)} self size, ${formatBytes(totalRetained)} aggregate retained size (dominator-deduplicated)`);
91
+ }
92
+ const results = [];
93
+ let totalCount = 0;
94
+ snapshot.nodes.forEach(node => {
95
+ if (!matchesShape(node))
96
+ return;
97
+ totalCount++;
98
+ const size = node.retainedSize;
99
+ let inserted = false;
100
+ for (let i = 0; i < results.length; i++) {
101
+ if (size > results[i].retainedSize) {
102
+ results.splice(i, 0, node);
103
+ inserted = true;
104
+ break;
105
+ }
106
+ }
107
+ if (!inserted) {
108
+ results.push(node);
109
+ }
110
+ if (results.length > limit) {
111
+ results.length = limit;
112
+ }
113
+ });
114
+ if (totalCount === 0) {
115
+ return toolResult(`No objects found matching shape ${shapeDesc}\n\n` +
116
+ `**Tips:**\n` +
117
+ `- Check property names with \`memlab_object_shape\` on a known instance\n` +
118
+ `- Try fewer required properties to broaden the search\n` +
119
+ `- Use \`memlab_find_by_property\` with a single distinctive property first`);
120
+ }
121
+ if (output_mode === 'ids') {
122
+ return toolResult(`Found ${formatNumber(totalCount)} objects matching shape ${shapeDesc} (showing ${results.length} IDs)\n\nIDs: ${results.map(n => n.id).join(', ')}`);
123
+ }
124
+ const summaries = results.map(serializeNodeSummary);
125
+ const countNote = totalCount > results.length
126
+ ? ` (${formatNumber(totalCount)} total, showing top ${results.length})`
127
+ : '';
128
+ const outputLines = [
129
+ `Found ${formatNumber(totalCount)} objects matching shape ${shapeDesc}${countNote}`,
130
+ '',
131
+ formatNodeSummaryTable(summaries),
132
+ ];
133
+ if (follow_property && results.length > 0) {
134
+ const followDistribution = new Map();
135
+ let missingCount = 0;
136
+ for (const node of results) {
137
+ let found = false;
138
+ for (const edge of node.references) {
139
+ if (String(edge.name_or_index) === follow_property) {
140
+ const target = edge.toNode;
141
+ const key = `${target.name} (${target.type})`;
142
+ const existing = followDistribution.get(key);
143
+ if (existing) {
144
+ existing.count++;
145
+ }
146
+ else {
147
+ followDistribution.set(key, {
148
+ count: 1,
149
+ exampleId: target.id,
150
+ });
151
+ }
152
+ found = true;
153
+ break;
154
+ }
155
+ }
156
+ if (!found)
157
+ missingCount++;
158
+ }
159
+ const sorted = [...followDistribution.entries()].sort((a, b) => b[1].count - a[1].count);
160
+ outputLines.push('', `**Property \`${follow_property}\` distribution across ${results.length} matches:**`);
161
+ for (const [key, info] of sorted.slice(0, 15)) {
162
+ outputLines.push(` - ${formatNumber(info.count)}× ${key} (example: @${info.exampleId})`);
163
+ }
164
+ if (sorted.length > 15) {
165
+ outputLines.push(` - … and ${sorted.length - 15} more types`);
166
+ }
167
+ if (missingCount > 0) {
168
+ outputLines.push(` - ${formatNumber(missingCount)} object(s) missing property \`${follow_property}\``);
169
+ }
170
+ }
171
+ return toolResult(outputLines.join('\n'));
172
+ }
173
+ catch (err) {
174
+ return errorResult(err);
175
+ }
176
+ });
177
+ }
178
+ //# sourceMappingURL=find-by-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-by-shape.js","sourceRoot":"","sources":["../../src/tools/find-by-shape.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"find-nodes-by-class.d.ts","sourceRoot":"","sources":["../../src/tools/find-nodes-by-class.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkChE"}
1
+ {"version":3,"file":"find-nodes-by-class.d.ts","sourceRoot":"","sources":["../../src/tools/find-nodes-by-class.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAgBvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwFhE"}
@@ -7,28 +7,72 @@
7
7
  * @format
8
8
  * @oncall memory_lab
9
9
  */
10
+ import memlabCore from '@memlab/core';
11
+ const { utils, NumericSet } = memlabCore;
10
12
  import { z } from 'zod';
11
13
  import { getSnapshot } from '../heap-state.js';
12
- import { filterLargestObjects, serializeNodeSummary, formatNodeSummaryTable, errorResult, toolResult, } from '../utils.js';
14
+ import { filterLargestObjects, serializeNodeSummary, formatNodeSummaryTable, formatNumber, formatBytes, errorResult, toolResult, } from '../utils.js';
13
15
  export function registerFindNodesByClass(server) {
14
16
  server.tool('memlab_find_nodes_by_class', 'Find heap objects by constructor/class name. Returns matching objects sorted by retained size. Follow up with memlab_retainer_trace on a result node to see why it is retained, memlab_get_references to inspect its properties, or memlab_retainer_summary to find common retainer patterns across all instances.', {
15
17
  class_name: z
16
18
  .string()
17
19
  .describe('The constructor or class name to search for'),
20
+ output_mode: z
21
+ .enum(['full', 'count', 'ids'])
22
+ .optional()
23
+ .default('full')
24
+ .describe('Output verbosity: "full" returns node summaries sorted by retained size (default), "count" returns only total count and aggregate retained size, "ids" returns only node IDs sorted by retained size'),
18
25
  limit: z
19
26
  .number()
20
27
  .optional()
21
28
  .default(20)
22
29
  .describe('Maximum number of results (default 20)'),
23
- }, async ({ class_name, limit }) => {
30
+ }, async ({ class_name, output_mode, limit }) => {
24
31
  try {
25
32
  const snapshot = getSnapshot();
26
- const nodes = filterLargestObjects(snapshot, node => node.name === class_name && node.type === 'object', limit);
27
- const summaries = nodes.map(serializeNodeSummary);
28
- if (summaries.length === 0) {
33
+ const classFilter = (node) => node.name === class_name && node.type === 'object';
34
+ if (output_mode === 'count') {
35
+ let totalCount = 0;
36
+ let totalSelf = 0;
37
+ const nodeIds = new NumericSet();
38
+ snapshot.nodes.forEach(node => {
39
+ if (!classFilter(node))
40
+ return;
41
+ totalCount++;
42
+ totalSelf += node.self_size;
43
+ nodeIds.add(node.id);
44
+ });
45
+ if (totalCount === 0) {
46
+ return toolResult(`No objects found with class "${class_name}"`);
47
+ }
48
+ // Dominator-aware aggregate: instances of a class often nest on the
49
+ // dominator tree (e.g. a Foo retaining another Foo), so a raw sum of
50
+ // retainedSize would double-count and can exceed 100% of heap.
51
+ const totalRetained = utils.aggregateDominatorMetrics(nodeIds, snapshot, () => true, (node) => node.retainedSize);
52
+ return toolResult(`"${class_name}": ${formatNumber(totalCount)} instances, ${formatBytes(totalSelf)} total self size, ${formatBytes(totalRetained)} aggregate retained size (dominator-deduplicated)`);
53
+ }
54
+ const nodes = filterLargestObjects(snapshot, classFilter, limit);
55
+ let totalCount = 0;
56
+ if (nodes.length === limit) {
57
+ snapshot.nodes.forEach(node => {
58
+ if (classFilter(node))
59
+ totalCount++;
60
+ });
61
+ }
62
+ else {
63
+ totalCount = nodes.length;
64
+ }
65
+ if (nodes.length === 0) {
29
66
  return toolResult(`No objects found with class "${class_name}"`);
30
67
  }
31
- return toolResult(`Found ${summaries.length} "${class_name}" objects\n\n${formatNodeSummaryTable(summaries)}`);
68
+ if (output_mode === 'ids') {
69
+ return toolResult(`"${class_name}": ${formatNumber(totalCount)} total instances (showing ${nodes.length} IDs by retained size)\n\nIDs: ${nodes.map(n => n.id).join(', ')}`);
70
+ }
71
+ const summaries = nodes.map(serializeNodeSummary);
72
+ const countNote = totalCount > nodes.length
73
+ ? ` (${formatNumber(totalCount)} total, showing top ${nodes.length})`
74
+ : '';
75
+ return toolResult(`Found ${formatNumber(totalCount)} "${class_name}" objects${countNote}\n\n${formatNodeSummaryTable(summaries)}`);
32
76
  }
33
77
  catch (err) {
34
78
  return errorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"find-nodes-by-class.js","sourceRoot":"","sources":["../../src/tools/find-nodes-by-class.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EAEX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,4BAA4B,EAC5B,oTAAoT,EACpT;QACE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,wCAAwC,CAAC;KACtD,EACD,KAAK,EAAE,EAAC,UAAU,EAAE,KAAK,EAAC,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,oBAAoB,CAChC,QAAQ,EACR,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAC1D,KAAK,CACN,CAAC;YACF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,UAAU,CAAC,gCAAgC,UAAU,GAAG,CAAC,CAAC;YACnE,CAAC;YACD,OAAO,UAAU,CACf,SAAS,SAAS,CAAC,MAAM,KAAK,UAAU,gBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAC5F,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"find-nodes-by-class.js","sourceRoot":"","sources":["../../src/tools/find-nodes-by-class.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"for-each.d.ts","sourceRoot":"","sources":["../../src/tools/for-each.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA2BvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6MvD"}
1
+ {"version":3,"file":"for-each.d.ts","sourceRoot":"","sources":["../../src/tools/for-each.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA2BvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+MvD"}
@@ -176,7 +176,7 @@ export function registerForEach(server) {
176
176
  catch (err) {
177
177
  if (err instanceof Error &&
178
178
  err.message.includes('Script execution timed out')) {
179
- return errorResult(new Error(`Execution timed out after ${timeout_ms}ms`));
179
+ return errorResult(new Error(`Execution timed out after ${timeout_ms}ms. Increase timeout_ms, or use a dedicated indexed tool (memlab_find_by_property, memlab_property_distribution, memlab_class_histogram) instead of a full-snapshot walk on a large heap.`));
180
180
  }
181
181
  return errorResult(err);
182
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"for-each.js","sourceRoot":"","sources":["../../src/tools/for-each.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"for-each.js","sourceRoot":"","sources":["../../src/tools/for-each.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-node.d.ts","sourceRoot":"","sources":["../../src/tools/get-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4CvD"}
1
+ {"version":3,"file":"get-node.d.ts","sourceRoot":"","sources":["../../src/tools/get-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmDvD"}
@@ -41,6 +41,12 @@ export function registerGetNode(server) {
41
41
  : d.string_value;
42
42
  lines.push(`**String Value:** "${val}"`);
43
43
  }
44
+ if (node.name === 'smi number' && node.self_size === 0) {
45
+ lines.push(`**Decoded SMI Value:** ${node.id >> 1}`);
46
+ }
47
+ else if (node.name === 'heap number') {
48
+ lines.push(`**Type:** Heap Number (boxed double — value not stored in snapshot format)`);
49
+ }
44
50
  return toolResult(lines.join('\n'));
45
51
  }
46
52
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"get-node.js","sourceRoot":"","sources":["../../src/tools/get-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,WAAW,EAEX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2JAA2J,EAC3J;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KAChE,EACD,KAAK,EAAE,EAAC,OAAO,EAAC,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,WAAW,CAAC,gBAAgB,OAAO,YAAY,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG;gBACZ,YAAY,CAAC,CAAC,EAAE,EAAE;gBAClB,aAAa,CAAC,CAAC,IAAI,EAAE;gBACrB,aAAa,CAAC,CAAC,IAAI,EAAE;gBACrB,kBAAkB,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE;gBAC5C,sBAAsB,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE;gBACpD,kBAAkB,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;gBAC9C,kBAAkB,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE;gBAClD,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC/C,kBAAkB,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;aAC3E,CAAC;YACF,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CACR,wBAAwB,CAAC,CAAC,QAAQ,CAAC,SAAS,UAAU,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAClG,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,GAAG,GACP,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,GAAG;oBACzB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;oBACtC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"get-node.js","sourceRoot":"","sources":["../../src/tools/get-node.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-references.d.ts","sourceRoot":"","sources":["../../src/tools/get-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoE7D"}
1
+ {"version":3,"file":"get-references.d.ts","sourceRoot":"","sources":["../../src/tools/get-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+G7D"}