@memlab/mcp-server 2.0.3 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -13
- package/dist/heap-state.d.ts +12 -1
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +10 -4
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +27 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/aggregate-nodes.d.ts.map +1 -1
- package/dist/tools/aggregate-nodes.js +2 -2
- package/dist/tools/aggregate-nodes.js.map +1 -1
- package/dist/tools/auto-investigate.d.ts +12 -0
- package/dist/tools/auto-investigate.d.ts.map +1 -0
- package/dist/tools/auto-investigate.js +683 -0
- package/dist/tools/auto-investigate.js.map +1 -0
- package/dist/tools/cache-analysis.d.ts +12 -0
- package/dist/tools/cache-analysis.d.ts.map +1 -0
- package/dist/tools/cache-analysis.js +341 -0
- package/dist/tools/cache-analysis.js.map +1 -0
- package/dist/tools/check-health.d.ts +12 -0
- package/dist/tools/check-health.d.ts.map +1 -0
- package/dist/tools/check-health.js +289 -0
- package/dist/tools/check-health.js.map +1 -0
- package/dist/tools/class-histogram.d.ts.map +1 -1
- package/dist/tools/class-histogram.js +70 -14
- package/dist/tools/class-histogram.js.map +1 -1
- package/dist/tools/closure-inspection.d.ts.map +1 -1
- package/dist/tools/closure-inspection.js +5 -5
- package/dist/tools/closure-inspection.js.map +1 -1
- package/dist/tools/detached-dom.d.ts.map +1 -1
- package/dist/tools/detached-dom.js +151 -5
- package/dist/tools/detached-dom.js.map +1 -1
- package/dist/tools/diff-snapshots.d.ts +12 -0
- package/dist/tools/diff-snapshots.d.ts.map +1 -0
- package/dist/tools/diff-snapshots.js +224 -0
- package/dist/tools/diff-snapshots.js.map +1 -0
- package/dist/tools/dominator-subtree.d.ts.map +1 -1
- package/dist/tools/dominator-subtree.js +29 -4
- package/dist/tools/dominator-subtree.js.map +1 -1
- package/dist/tools/duplicated-strings.d.ts.map +1 -1
- package/dist/tools/duplicated-strings.js +62 -9
- package/dist/tools/duplicated-strings.js.map +1 -1
- package/dist/tools/eval.d.ts.map +1 -1
- package/dist/tools/eval.js +111 -7
- package/dist/tools/eval.js.map +1 -1
- package/dist/tools/event-listener-leaks.d.ts +12 -0
- package/dist/tools/event-listener-leaks.d.ts.map +1 -0
- package/dist/tools/event-listener-leaks.js +266 -0
- package/dist/tools/event-listener-leaks.js.map +1 -0
- package/dist/tools/find-by-property.d.ts.map +1 -1
- package/dist/tools/find-by-property.js +38 -4
- package/dist/tools/find-by-property.js.map +1 -1
- package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
- package/dist/tools/find-nodes-by-class.js +4 -4
- package/dist/tools/find-nodes-by-class.js.map +1 -1
- package/dist/tools/for-each.d.ts.map +1 -1
- package/dist/tools/for-each.js +2 -2
- package/dist/tools/for-each.js.map +1 -1
- package/dist/tools/get-node.d.ts.map +1 -1
- package/dist/tools/get-node.js +2 -2
- package/dist/tools/get-node.js.map +1 -1
- package/dist/tools/get-property.d.ts.map +1 -1
- package/dist/tools/get-property.js +4 -4
- package/dist/tools/get-property.js.map +1 -1
- package/dist/tools/get-references.d.ts.map +1 -1
- package/dist/tools/get-references.js +11 -5
- package/dist/tools/get-references.js.map +1 -1
- package/dist/tools/get-referrers.d.ts.map +1 -1
- package/dist/tools/get-referrers.js +11 -5
- package/dist/tools/get-referrers.js.map +1 -1
- package/dist/tools/global-variables.d.ts.map +1 -1
- package/dist/tools/global-variables.js +10 -6
- package/dist/tools/global-variables.js.map +1 -1
- package/dist/tools/largest-objects.d.ts.map +1 -1
- package/dist/tools/largest-objects.js +78 -8
- package/dist/tools/largest-objects.js.map +1 -1
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +118 -4
- package/dist/tools/load-snapshot.js.map +1 -1
- package/dist/tools/object-shape.d.ts.map +1 -1
- package/dist/tools/object-shape.js +66 -47
- package/dist/tools/object-shape.js.map +1 -1
- package/dist/tools/pinch-points.d.ts +12 -0
- package/dist/tools/pinch-points.d.ts.map +1 -0
- package/dist/tools/pinch-points.js +124 -0
- package/dist/tools/pinch-points.js.map +1 -0
- package/dist/tools/quick-diagnosis.d.ts +12 -0
- package/dist/tools/quick-diagnosis.d.ts.map +1 -0
- package/dist/tools/quick-diagnosis.js +213 -0
- package/dist/tools/quick-diagnosis.js.map +1 -0
- package/dist/tools/referrer-summary.d.ts +12 -0
- package/dist/tools/referrer-summary.d.ts.map +1 -0
- package/dist/tools/referrer-summary.js +119 -0
- package/dist/tools/referrer-summary.js.map +1 -0
- package/dist/tools/reports.d.ts.map +1 -1
- package/dist/tools/reports.js +5 -5
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/retainer-summary.d.ts +12 -0
- package/dist/tools/retainer-summary.d.ts.map +1 -0
- package/dist/tools/retainer-summary.js +307 -0
- package/dist/tools/retainer-summary.js.map +1 -0
- package/dist/tools/retainer-trace.d.ts.map +1 -1
- package/dist/tools/retainer-trace.js +88 -14
- package/dist/tools/retainer-trace.js.map +1 -1
- package/dist/tools/search-nodes.d.ts.map +1 -1
- package/dist/tools/search-nodes.js +2 -2
- package/dist/tools/search-nodes.js.map +1 -1
- package/dist/tools/shape-histogram.d.ts +12 -0
- package/dist/tools/shape-histogram.d.ts.map +1 -0
- package/dist/tools/shape-histogram.js +119 -0
- package/dist/tools/shape-histogram.js.map +1 -0
- package/dist/tools/sliced-strings.d.ts +12 -0
- package/dist/tools/sliced-strings.d.ts.map +1 -0
- package/dist/tools/sliced-strings.js +126 -0
- package/dist/tools/sliced-strings.js.map +1 -0
- package/dist/tools/snapshot-summary.d.ts.map +1 -1
- package/dist/tools/snapshot-summary.js +42 -3
- package/dist/tools/snapshot-summary.js.map +1 -1
- package/dist/tools/stale-collections.d.ts.map +1 -1
- package/dist/tools/stale-collections.js +30 -6
- package/dist/tools/stale-collections.js.map +1 -1
- package/dist/tools/string-patterns.d.ts +12 -0
- package/dist/tools/string-patterns.d.ts.map +1 -0
- package/dist/tools/string-patterns.js +115 -0
- package/dist/tools/string-patterns.js.map +1 -0
- package/dist/tools/trace-dominators.d.ts +12 -0
- package/dist/tools/trace-dominators.d.ts.map +1 -0
- package/dist/tools/trace-dominators.js +237 -0
- package/dist/tools/trace-dominators.js.map +1 -0
- package/dist/utils.d.ts +9 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +67 -5
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,12 +9,16 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { serializeNodeSummary, isNodeWorthInspecting, formatNodeSummaryTable, errorResult,
|
|
12
|
+
import { serializeNodeSummary, isNodeWorthInspecting, formatNodeSummaryTable, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerFindByProperty(server) {
|
|
14
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.', {
|
|
15
15
|
property_name: z
|
|
16
16
|
.string()
|
|
17
17
|
.describe('The property/edge name to search for (e.g., "__reactFiber$", "cache", "data")'),
|
|
18
|
+
property_value: z
|
|
19
|
+
.string()
|
|
20
|
+
.optional()
|
|
21
|
+
.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.'),
|
|
18
22
|
edge_type: z
|
|
19
23
|
.string()
|
|
20
24
|
.optional()
|
|
@@ -24,11 +28,25 @@ export function registerFindByProperty(server) {
|
|
|
24
28
|
.optional()
|
|
25
29
|
.default(20)
|
|
26
30
|
.describe('Maximum number of results (default 20)'),
|
|
27
|
-
}, async ({ property_name, edge_type, limit }) => {
|
|
31
|
+
}, async ({ property_name, property_value, edge_type, limit }) => {
|
|
28
32
|
try {
|
|
29
33
|
const snapshot = getSnapshot();
|
|
30
34
|
// Use prefix matching for names ending with $ (React dynamic suffixes)
|
|
31
35
|
const isPrefix = property_name.endsWith('$');
|
|
36
|
+
let valueRegex = null;
|
|
37
|
+
let valueExact = null;
|
|
38
|
+
if (property_value) {
|
|
39
|
+
if (property_value.startsWith('/') &&
|
|
40
|
+
property_value.lastIndexOf('/') > 0) {
|
|
41
|
+
const lastSlash = property_value.lastIndexOf('/');
|
|
42
|
+
const pattern = property_value.slice(1, lastSlash);
|
|
43
|
+
const flags = property_value.slice(lastSlash + 1);
|
|
44
|
+
valueRegex = new RegExp(pattern, flags);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
valueExact = property_value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
32
50
|
const results = [];
|
|
33
51
|
snapshot.nodes.forEach(node => {
|
|
34
52
|
if (!isNodeWorthInspecting(node))
|
|
@@ -42,6 +60,19 @@ export function registerFindByProperty(server) {
|
|
|
42
60
|
return false;
|
|
43
61
|
if (edge_type && edge.type !== edge_type)
|
|
44
62
|
return false;
|
|
63
|
+
if (valueExact != null || valueRegex != null) {
|
|
64
|
+
const target = edge.toNode;
|
|
65
|
+
if (!target.isString)
|
|
66
|
+
return false;
|
|
67
|
+
const strNode = target.toStringNode();
|
|
68
|
+
if (!strNode)
|
|
69
|
+
return false;
|
|
70
|
+
const strVal = strNode.stringValue;
|
|
71
|
+
if (valueExact != null && strVal !== valueExact)
|
|
72
|
+
return false;
|
|
73
|
+
if (valueRegex != null && !valueRegex.test(strVal))
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
45
76
|
return true;
|
|
46
77
|
});
|
|
47
78
|
if (!hasProperty)
|
|
@@ -64,10 +95,13 @@ export function registerFindByProperty(server) {
|
|
|
64
95
|
}
|
|
65
96
|
});
|
|
66
97
|
const summaries = results.map(serializeNodeSummary);
|
|
98
|
+
const filterDesc = `"${property_name}"` +
|
|
99
|
+
(property_value ? ` = "${property_value}"` : '') +
|
|
100
|
+
(edge_type ? ` (edge type: ${edge_type})` : '');
|
|
67
101
|
if (summaries.length === 0) {
|
|
68
|
-
return
|
|
102
|
+
return toolResult(`No objects found with property ${filterDesc}`);
|
|
69
103
|
}
|
|
70
|
-
return
|
|
104
|
+
return toolResult(`Found ${summaries.length} objects with property ${filterDesc}\n\n${formatNodeSummaryTable(summaries)}`);
|
|
71
105
|
}
|
|
72
106
|
catch (err) {
|
|
73
107
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-by-property.js","sourceRoot":"","sources":["../../src/tools/find-by-property.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,
|
|
1
|
+
{"version":3,"file":"find-by-property.js","sourceRoot":"","sources":["../../src/tools/find-by-property.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;
|
|
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"}
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { filterLargestObjects, serializeNodeSummary, formatNodeSummaryTable, errorResult,
|
|
12
|
+
import { filterLargestObjects, serializeNodeSummary, formatNodeSummaryTable, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerFindNodesByClass(server) {
|
|
14
|
-
server.tool('memlab_find_nodes_by_class', 'Find heap objects by constructor/class name. Returns matching objects sorted by retained size.', {
|
|
14
|
+
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
15
|
class_name: z
|
|
16
16
|
.string()
|
|
17
17
|
.describe('The constructor or class name to search for'),
|
|
@@ -26,9 +26,9 @@ export function registerFindNodesByClass(server) {
|
|
|
26
26
|
const nodes = filterLargestObjects(snapshot, node => node.name === class_name && node.type === 'object', limit);
|
|
27
27
|
const summaries = nodes.map(serializeNodeSummary);
|
|
28
28
|
if (summaries.length === 0) {
|
|
29
|
-
return
|
|
29
|
+
return toolResult(`No objects found with class "${class_name}"`);
|
|
30
30
|
}
|
|
31
|
-
return
|
|
31
|
+
return toolResult(`Found ${summaries.length} "${class_name}" objects\n\n${formatNodeSummaryTable(summaries)}`);
|
|
32
32
|
}
|
|
33
33
|
catch (err) {
|
|
34
34
|
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,
|
|
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 +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;
|
|
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"}
|
package/dist/tools/for-each.js
CHANGED
|
@@ -12,7 +12,7 @@ import vm from 'node:vm';
|
|
|
12
12
|
import memlabCore from '@memlab/core';
|
|
13
13
|
const { utils } = memlabCore;
|
|
14
14
|
import { getSnapshot } from '../heap-state.js';
|
|
15
|
-
import { errorResult,
|
|
15
|
+
import { errorResult, toolResult, serializeNodeSummary, serializeNodeDetail, formatBytes, formatNumber, markdownTable, isNodeWorthInspecting, filterLargestObjects, queryNodes, } from '../utils.js';
|
|
16
16
|
const MAX_OUTPUT_SIZE = 50 * 1024; // 50KB
|
|
17
17
|
function truncate(str, max) {
|
|
18
18
|
if (str.length <= max)
|
|
@@ -171,7 +171,7 @@ export function registerForEach(server) {
|
|
|
171
171
|
output = String(sandbox.__result);
|
|
172
172
|
}
|
|
173
173
|
output = truncate(output, MAX_OUTPUT_SIZE);
|
|
174
|
-
return
|
|
174
|
+
return toolResult(output);
|
|
175
175
|
}
|
|
176
176
|
catch (err) {
|
|
177
177
|
if (err instanceof Error &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"for-each.js","sourceRoot":"","sources":["../../src/tools/for-each.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,MAAM,EAAC,KAAK,EAAC,GAAG,UAAU,CAAC;AAC3B,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,WAAW,
|
|
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;
|
|
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"}
|
package/dist/tools/get-node.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { serializeNodeDetail, formatBytes, formatNumber, errorResult,
|
|
12
|
+
import { serializeNodeDetail, formatBytes, formatNumber, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerGetNode(server) {
|
|
14
14
|
server.tool('memlab_get_node', 'Look up a heap node by its numeric ID. Returns full details including size, type, detachment status, dominator, location, and string value if applicable.', {
|
|
15
15
|
node_id: z.number().describe('The numeric ID of the heap node'),
|
|
@@ -41,7 +41,7 @@ export function registerGetNode(server) {
|
|
|
41
41
|
: d.string_value;
|
|
42
42
|
lines.push(`**String Value:** "${val}"`);
|
|
43
43
|
}
|
|
44
|
-
return
|
|
44
|
+
return toolResult(lines.join('\n'));
|
|
45
45
|
}
|
|
46
46
|
catch (err) {
|
|
47
47
|
return errorResult(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,
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-property.d.ts","sourceRoot":"","sources":["../../src/tools/get-property.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-property.d.ts","sourceRoot":"","sources":["../../src/tools/get-property.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAavE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmG3D"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { serializeNodeDetail, formatBytes, formatNumber, errorResult,
|
|
12
|
+
import { serializeNodeDetail, formatBytes, formatNumber, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerGetProperty(server) {
|
|
14
14
|
server.tool('memlab_get_property', 'Look up a specific property (outgoing edge) of a heap node by name and return the target node with full details. Useful for traversing the object graph step by step (e.g., get the __proto__, stateNode, or memoizedState of a node).', {
|
|
15
15
|
node_id: z.number().describe('The numeric ID of the heap node'),
|
|
@@ -41,7 +41,7 @@ export function registerGetProperty(server) {
|
|
|
41
41
|
e.type === 'context')
|
|
42
42
|
.slice(0, 20)
|
|
43
43
|
.map(e => `${e.type}:${String(e.name_or_index)}`);
|
|
44
|
-
return
|
|
44
|
+
return toolResult(`Property "${property_name}" not found on @${node_id} ${node.name}${edge_type ? ` (type filter: ${edge_type})` : ''}\n\nAvailable properties: ${available.join(', ')}`);
|
|
45
45
|
}
|
|
46
46
|
const formatTarget = (d, edgeName, edgeType) => {
|
|
47
47
|
const lines = [
|
|
@@ -71,14 +71,14 @@ export function registerGetProperty(server) {
|
|
|
71
71
|
if (matching.length === 1) {
|
|
72
72
|
const edge = matching[0];
|
|
73
73
|
const detail = serializeNodeDetail(edge.toNode);
|
|
74
|
-
return
|
|
74
|
+
return toolResult(formatTarget(detail, String(edge.name_or_index), edge.type));
|
|
75
75
|
}
|
|
76
76
|
// Multiple matches
|
|
77
77
|
const sections = matching.map((edge, i) => {
|
|
78
78
|
const detail = serializeNodeDetail(edge.toNode);
|
|
79
79
|
return `### Match ${i + 1}\n${formatTarget(detail, String(edge.name_or_index), edge.type)}`;
|
|
80
80
|
});
|
|
81
|
-
return
|
|
81
|
+
return toolResult(sections.join('\n\n'));
|
|
82
82
|
}
|
|
83
83
|
catch (err) {
|
|
84
84
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-property.js","sourceRoot":"","sources":["../../src/tools/get-property.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,
|
|
1
|
+
{"version":3,"file":"get-property.js","sourceRoot":"","sources":["../../src/tools/get-property.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;
|
|
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"}
|
|
@@ -9,16 +9,21 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { formatBytes, formatNumber, markdownTable, errorResult,
|
|
12
|
+
import { formatBytes, formatNumber, markdownTable, truncateNodeName, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerGetReferences(server) {
|
|
14
|
-
server.tool('memlab_get_references', 'Get outgoing edges (references) from a heap node, sorted by target retained size. Shows what objects this node points to.', {
|
|
14
|
+
server.tool('memlab_get_references', 'Get outgoing edges (references) from a heap node, sorted by target retained size. Shows what objects this node points to — its properties, elements, and closure captures. Complements memlab_get_referrers (incoming edges). Use memlab_object_shape for a quick property overview, or memlab_closure_inspection for closure-specific analysis.', {
|
|
15
15
|
node_id: z.number().describe('The numeric ID of the heap node'),
|
|
16
16
|
limit: z
|
|
17
17
|
.number()
|
|
18
18
|
.optional()
|
|
19
19
|
.default(30)
|
|
20
20
|
.describe('Maximum number of references to return (default 30)'),
|
|
21
|
-
|
|
21
|
+
compact: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.default(true)
|
|
25
|
+
.describe('Truncate target names to 60 chars to save tokens (default true). Set to false to see full names.'),
|
|
26
|
+
}, async ({ node_id, limit, compact }) => {
|
|
22
27
|
try {
|
|
23
28
|
const snapshot = getSnapshot();
|
|
24
29
|
const node = snapshot.getNodeById(node_id);
|
|
@@ -42,16 +47,17 @@ export function registerGetReferences(server) {
|
|
|
42
47
|
'Retained',
|
|
43
48
|
];
|
|
44
49
|
const rightCols = new Set([5]);
|
|
50
|
+
const nameMaxLen = compact ? 60 : 300;
|
|
45
51
|
const rows = edges.map(e => [
|
|
46
52
|
String(e.name_or_index),
|
|
47
53
|
e.type,
|
|
48
54
|
`@${e.toNode.id}`,
|
|
49
|
-
e.toNode.name,
|
|
55
|
+
truncateNodeName(e.toNode.name, e.toNode.type, e.toNode.self_size, nameMaxLen),
|
|
50
56
|
e.toNode.type,
|
|
51
57
|
formatBytes(e.toNode.retainedSize),
|
|
52
58
|
]);
|
|
53
59
|
lines.push(markdownTable(headers, rows, rightCols));
|
|
54
|
-
return
|
|
60
|
+
return toolResult(lines.join('\n'));
|
|
55
61
|
}
|
|
56
62
|
catch (err) {
|
|
57
63
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-references.js","sourceRoot":"","sources":["../../src/tools/get-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,
|
|
1
|
+
{"version":3,"file":"get-references.js","sourceRoot":"","sources":["../../src/tools/get-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-referrers.d.ts","sourceRoot":"","sources":["../../src/tools/get-referrers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"get-referrers.d.ts","sourceRoot":"","sources":["../../src/tools/get-referrers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoE5D"}
|
|
@@ -9,16 +9,21 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { formatBytes, formatNumber, markdownTable, errorResult,
|
|
12
|
+
import { formatBytes, formatNumber, markdownTable, truncateNodeName, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerGetReferrers(server) {
|
|
14
|
-
server.tool('memlab_get_referrers', 'Get incoming edges (referrers) to a heap node, sorted by source retained size. Shows what objects hold references to this node.', {
|
|
14
|
+
server.tool('memlab_get_referrers', 'Get incoming edges (referrers) to a heap node, sorted by source retained size. Shows what objects hold references to this node. Complements memlab_get_references (outgoing edges). Use memlab_retainer_trace to see the full GC root path.', {
|
|
15
15
|
node_id: z.number().describe('The numeric ID of the heap node'),
|
|
16
16
|
limit: z
|
|
17
17
|
.number()
|
|
18
18
|
.optional()
|
|
19
19
|
.default(30)
|
|
20
20
|
.describe('Maximum number of referrers to return (default 30)'),
|
|
21
|
-
|
|
21
|
+
compact: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.default(true)
|
|
25
|
+
.describe('Truncate source names to 60 chars to save tokens (default true). Set to false to see full names.'),
|
|
26
|
+
}, async ({ node_id, limit, compact }) => {
|
|
22
27
|
try {
|
|
23
28
|
const snapshot = getSnapshot();
|
|
24
29
|
const node = snapshot.getNodeById(node_id);
|
|
@@ -42,16 +47,17 @@ export function registerGetReferrers(server) {
|
|
|
42
47
|
'Retained',
|
|
43
48
|
];
|
|
44
49
|
const rightCols = new Set([5]);
|
|
50
|
+
const nameMaxLen = compact ? 60 : 300;
|
|
45
51
|
const rows = edges.map(e => [
|
|
46
52
|
`@${e.fromNode.id}`,
|
|
47
|
-
e.fromNode.name,
|
|
53
|
+
truncateNodeName(e.fromNode.name, e.fromNode.type, e.fromNode.self_size, nameMaxLen),
|
|
48
54
|
e.fromNode.type,
|
|
49
55
|
String(e.name_or_index),
|
|
50
56
|
e.type,
|
|
51
57
|
formatBytes(e.fromNode.retainedSize),
|
|
52
58
|
]);
|
|
53
59
|
lines.push(markdownTable(headers, rows, rightCols));
|
|
54
|
-
return
|
|
60
|
+
return toolResult(lines.join('\n'));
|
|
55
61
|
}
|
|
56
62
|
catch (err) {
|
|
57
63
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-referrers.js","sourceRoot":"","sources":["../../src/tools/get-referrers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,
|
|
1
|
+
{"version":3,"file":"get-referrers.js","sourceRoot":"","sources":["../../src/tools/get-referrers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-variables.d.ts","sourceRoot":"","sources":["../../src/tools/global-variables.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"global-variables.d.ts","sourceRoot":"","sources":["../../src/tools/global-variables.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAsQvE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyF/D"}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
-
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { formatBytes, markdownTable, errorResult,
|
|
11
|
+
import { getSnapshot, getSnapshotEnv } from '../heap-state.js';
|
|
12
|
+
import { formatBytes, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
// Common built-in Window properties that should be excluded.
|
|
14
14
|
// This is a subset of the ~780 known browser globals from MemLab's BuiltInGlobalVariables.
|
|
15
15
|
const BUILTIN_GLOBALS = new Set([
|
|
@@ -261,7 +261,7 @@ const BUILTIN_GLOBALS = new Set([
|
|
|
261
261
|
'postMessage',
|
|
262
262
|
]);
|
|
263
263
|
export function registerGlobalVariables(server) {
|
|
264
|
-
server.tool('memlab_global_variables', 'Find non-built-in global variables on the Window object, sorted by retained size. These are application-specific globals that may indicate memory issues.', {
|
|
264
|
+
server.tool('memlab_global_variables', 'Find non-built-in global variables on the Window object (browser) or global object (Node.js), sorted by retained size. These are application-specific globals that may indicate memory issues.', {
|
|
265
265
|
limit: z
|
|
266
266
|
.number()
|
|
267
267
|
.optional()
|
|
@@ -271,8 +271,12 @@ export function registerGlobalVariables(server) {
|
|
|
271
271
|
try {
|
|
272
272
|
const snapshot = getSnapshot();
|
|
273
273
|
const globals = [];
|
|
274
|
+
const env = getSnapshotEnv();
|
|
275
|
+
const globalMatcher = env === 'node'
|
|
276
|
+
? (name) => name === 'global' || name === 'Global'
|
|
277
|
+
: (name) => name.startsWith('Window ');
|
|
274
278
|
snapshot.nodes.forEach(node => {
|
|
275
|
-
if (!node.name
|
|
279
|
+
if (!globalMatcher(node.name))
|
|
276
280
|
return;
|
|
277
281
|
for (const edge of node.references) {
|
|
278
282
|
const edgeName = String(edge.name_or_index);
|
|
@@ -304,7 +308,7 @@ export function registerGlobalVariables(server) {
|
|
|
304
308
|
globals.sort((a, b) => b.retained_size - a.retained_size);
|
|
305
309
|
const topGlobals = globals.slice(0, limit);
|
|
306
310
|
if (topGlobals.length === 0) {
|
|
307
|
-
return
|
|
311
|
+
return toolResult('No non-built-in global variables found.');
|
|
308
312
|
}
|
|
309
313
|
const headers = [
|
|
310
314
|
'Variable',
|
|
@@ -321,7 +325,7 @@ export function registerGlobalVariables(server) {
|
|
|
321
325
|
g.target_type,
|
|
322
326
|
formatBytes(g.retained_size),
|
|
323
327
|
]);
|
|
324
|
-
return
|
|
328
|
+
return toolResult(`Global variables (${topGlobals.length} found)\n\n${markdownTable(headers, rows, rightCols)}`);
|
|
325
329
|
}
|
|
326
330
|
catch (err) {
|
|
327
331
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-variables.js","sourceRoot":"","sources":["../../src/tools/global-variables.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"global-variables.js","sourceRoot":"","sources":["../../src/tools/global-variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"largest-objects.d.ts","sourceRoot":"","sources":["../../src/tools/largest-objects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"largest-objects.d.ts","sourceRoot":"","sources":["../../src/tools/largest-objects.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA+CvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyE9D"}
|
|
@@ -9,20 +9,90 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { isNodeWorthInspecting, filterLargestObjects,
|
|
12
|
+
import { isNodeWorthInspecting, filterLargestObjects, truncateNodeName, formatBytes, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
|
+
function sanitizeForTable(s) {
|
|
14
|
+
return s.replace(/[\n\r\t]/g, ' ').replace(/\|/g, '¦');
|
|
15
|
+
}
|
|
16
|
+
function getContentPreview(node) {
|
|
17
|
+
if (node.isString) {
|
|
18
|
+
const strNode = node.toStringNode();
|
|
19
|
+
if (strNode) {
|
|
20
|
+
const val = strNode.stringValue;
|
|
21
|
+
const preview = val.length > 60 ? val.slice(0, 60) + '…' : val;
|
|
22
|
+
return sanitizeForTable(preview);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// For objects/arrays, show first few property names
|
|
26
|
+
const props = [];
|
|
27
|
+
for (const edge of node.references) {
|
|
28
|
+
if (edge.type === 'property' ||
|
|
29
|
+
edge.type === 'element' ||
|
|
30
|
+
edge.type === 'shortcut') {
|
|
31
|
+
props.push(String(edge.name_or_index));
|
|
32
|
+
if (props.length >= 4)
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (props.length > 0) {
|
|
37
|
+
const more = node.edge_count > props.length ? ', …' : '';
|
|
38
|
+
return `{${props.join(', ')}${more}}`;
|
|
39
|
+
}
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
13
42
|
export function registerLargestObjects(server) {
|
|
14
|
-
server.tool('memlab_largest_objects', 'Find the top N objects by retained size in the loaded heap snapshot. Filters out internal/meta objects.', {
|
|
43
|
+
server.tool('memlab_largest_objects', 'Find the top N objects by retained size in the loaded heap snapshot. Filters out internal/meta objects. Use node_type to filter to a specific type (e.g., "object", "closure") or exclude_types to remove noisy types (e.g., "string"). Shows a content preview for each node.', {
|
|
15
44
|
limit: z
|
|
16
45
|
.number()
|
|
17
46
|
.optional()
|
|
18
|
-
.default(
|
|
19
|
-
.describe('Maximum number of objects to return (default
|
|
20
|
-
|
|
47
|
+
.default(25)
|
|
48
|
+
.describe('Maximum number of objects to return (default 25)'),
|
|
49
|
+
node_type: z
|
|
50
|
+
.string()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Only include this node type (e.g., "object", "closure", "string", "regexp").'),
|
|
53
|
+
exclude_types: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('Comma-separated node types to exclude (e.g., "string,concatenated string"). Useful to filter out large strings dominating the list.'),
|
|
57
|
+
}, async ({ limit, node_type, exclude_types }) => {
|
|
21
58
|
try {
|
|
22
59
|
const snapshot = getSnapshot();
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
60
|
+
const excludeSet = exclude_types
|
|
61
|
+
? new Set(exclude_types.split(',').map(s => s.trim()))
|
|
62
|
+
: null;
|
|
63
|
+
const nodes = filterLargestObjects(snapshot, (node) => {
|
|
64
|
+
if (!isNodeWorthInspecting(node))
|
|
65
|
+
return false;
|
|
66
|
+
if (node_type && node.type !== node_type)
|
|
67
|
+
return false;
|
|
68
|
+
if (excludeSet && excludeSet.has(node.type))
|
|
69
|
+
return false;
|
|
70
|
+
return true;
|
|
71
|
+
}, limit);
|
|
72
|
+
const headers = [
|
|
73
|
+
'ID',
|
|
74
|
+
'Name',
|
|
75
|
+
'Type',
|
|
76
|
+
'Self Size',
|
|
77
|
+
'Retained Size',
|
|
78
|
+
'Preview',
|
|
79
|
+
];
|
|
80
|
+
const rightCols = new Set([3, 4]);
|
|
81
|
+
const rows = nodes.map(n => [
|
|
82
|
+
`@${n.id}`,
|
|
83
|
+
truncateNodeName(n.name, n.type, n.self_size, 60),
|
|
84
|
+
n.type,
|
|
85
|
+
formatBytes(n.self_size),
|
|
86
|
+
formatBytes(n.retainedSize),
|
|
87
|
+
getContentPreview(n),
|
|
88
|
+
]);
|
|
89
|
+
const filterParts = [];
|
|
90
|
+
if (node_type)
|
|
91
|
+
filterParts.push(`type=${node_type}`);
|
|
92
|
+
if (exclude_types)
|
|
93
|
+
filterParts.push(`excluding ${exclude_types}`);
|
|
94
|
+
const filterNote = filterParts.length > 0 ? ` (${filterParts.join(', ')})` : '';
|
|
95
|
+
return toolResult(`Top ${rows.length} objects by retained size${filterNote}\n\n${markdownTable(headers, rows, rightCols)}`);
|
|
26
96
|
}
|
|
27
97
|
catch (err) {
|
|
28
98
|
return errorResult(err);
|