@memlab/mcp-server 2.1.0 → 2.3.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.
- package/README.md +88 -3
- package/dist/analysis-budget.d.ts +71 -0
- package/dist/analysis-budget.d.ts.map +1 -0
- package/dist/analysis-budget.js +118 -0
- package/dist/analysis-budget.js.map +1 -0
- package/dist/guardrail.d.ts +24 -0
- package/dist/guardrail.d.ts.map +1 -0
- package/dist/guardrail.js +65 -0
- package/dist/guardrail.js.map +1 -0
- package/dist/heap-state.d.ts +46 -1
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +142 -10
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/array-group-by.d.ts +12 -0
- package/dist/tools/array-group-by.d.ts.map +1 -0
- package/dist/tools/array-group-by.js +191 -0
- package/dist/tools/array-group-by.js.map +1 -0
- package/dist/tools/auto-investigate.d.ts.map +1 -1
- package/dist/tools/auto-investigate.js +999 -37
- package/dist/tools/auto-investigate.js.map +1 -1
- package/dist/tools/cache-analysis.d.ts.map +1 -1
- package/dist/tools/cache-analysis.js +438 -21
- package/dist/tools/cache-analysis.js.map +1 -1
- package/dist/tools/check-health.d.ts.map +1 -1
- package/dist/tools/check-health.js +261 -1
- package/dist/tools/check-health.js.map +1 -1
- package/dist/tools/class-histogram.d.ts.map +1 -1
- package/dist/tools/class-histogram.js +142 -33
- 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 +238 -25
- 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 +25 -3
- package/dist/tools/detached-dom.js.map +1 -1
- package/dist/tools/dev-artifacts.d.ts +33 -0
- package/dist/tools/dev-artifacts.d.ts.map +1 -0
- package/dist/tools/dev-artifacts.js +165 -0
- package/dist/tools/dev-artifacts.js.map +1 -0
- package/dist/tools/diff-snapshots.d.ts.map +1 -1
- package/dist/tools/diff-snapshots.js +113 -18
- package/dist/tools/diff-snapshots.js.map +1 -1
- package/dist/tools/duplicated-strings.d.ts.map +1 -1
- package/dist/tools/duplicated-strings.js +74 -12
- package/dist/tools/duplicated-strings.js.map +1 -1
- package/dist/tools/eval.d.ts.map +1 -1
- package/dist/tools/eval.js +189 -10
- package/dist/tools/eval.js.map +1 -1
- package/dist/tools/event-listener-leaks.d.ts.map +1 -1
- package/dist/tools/event-listener-leaks.js +235 -13
- package/dist/tools/event-listener-leaks.js.map +1 -1
- package/dist/tools/event-registry.d.ts +12 -0
- package/dist/tools/event-registry.d.ts.map +1 -0
- package/dist/tools/event-registry.js +183 -0
- package/dist/tools/event-registry.js.map +1 -0
- package/dist/tools/find-by-property.d.ts.map +1 -1
- package/dist/tools/find-by-property.js +113 -31
- package/dist/tools/find-by-property.js.map +1 -1
- package/dist/tools/find-by-shape.d.ts +12 -0
- package/dist/tools/find-by-shape.d.ts.map +1 -0
- package/dist/tools/find-by-shape.js +178 -0
- package/dist/tools/find-by-shape.js.map +1 -0
- package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
- package/dist/tools/find-nodes-by-class.js +50 -6
- 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 +1 -1
- 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 +6 -0
- package/dist/tools/get-node.js.map +1 -1
- package/dist/tools/get-string.d.ts +12 -0
- package/dist/tools/get-string.d.ts.map +1 -0
- package/dist/tools/get-string.js +223 -0
- package/dist/tools/get-string.js.map +1 -0
- package/dist/tools/get-value.d.ts +12 -0
- package/dist/tools/get-value.d.ts.map +1 -0
- package/dist/tools/get-value.js +152 -0
- package/dist/tools/get-value.js.map +1 -0
- package/dist/tools/global-variables.d.ts.map +1 -1
- package/dist/tools/global-variables.js +54 -34
- package/dist/tools/global-variables.js.map +1 -1
- package/dist/tools/growth-signals.d.ts +12 -0
- package/dist/tools/growth-signals.d.ts.map +1 -0
- package/dist/tools/growth-signals.js +211 -0
- package/dist/tools/growth-signals.js.map +1 -0
- package/dist/tools/intern-opportunities.d.ts +12 -0
- package/dist/tools/intern-opportunities.d.ts.map +1 -0
- package/dist/tools/intern-opportunities.js +289 -0
- package/dist/tools/intern-opportunities.js.map +1 -0
- package/dist/tools/load-snapshot.d.ts +10 -0
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +152 -15
- package/dist/tools/load-snapshot.js.map +1 -1
- package/dist/tools/object-cost-breakdown.d.ts +12 -0
- package/dist/tools/object-cost-breakdown.d.ts.map +1 -0
- package/dist/tools/object-cost-breakdown.js +439 -0
- package/dist/tools/object-cost-breakdown.js.map +1 -0
- package/dist/tools/object-shape.d.ts.map +1 -1
- package/dist/tools/object-shape.js +95 -2
- package/dist/tools/object-shape.js.map +1 -1
- package/dist/tools/pinch-points.d.ts.map +1 -1
- package/dist/tools/pinch-points.js +9 -9
- package/dist/tools/pinch-points.js.map +1 -1
- package/dist/tools/property-distribution.d.ts +12 -0
- package/dist/tools/property-distribution.d.ts.map +1 -0
- package/dist/tools/property-distribution.js +168 -0
- package/dist/tools/property-distribution.js.map +1 -0
- package/dist/tools/quick-diagnosis.d.ts.map +1 -1
- package/dist/tools/quick-diagnosis.js +56 -19
- package/dist/tools/quick-diagnosis.js.map +1 -1
- package/dist/tools/retainer-summary.d.ts.map +1 -1
- package/dist/tools/retainer-summary.js +90 -5
- package/dist/tools/retainer-summary.js.map +1 -1
- package/dist/tools/retainer-trace.d.ts.map +1 -1
- package/dist/tools/retainer-trace.js +74 -22
- 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 +10 -3
- package/dist/tools/search-nodes.js.map +1 -1
- package/dist/tools/search-strings.d.ts +12 -0
- package/dist/tools/search-strings.d.ts.map +1 -0
- package/dist/tools/search-strings.js +182 -0
- package/dist/tools/search-strings.js.map +1 -0
- package/dist/tools/sequence-analysis.d.ts +12 -0
- package/dist/tools/sequence-analysis.d.ts.map +1 -0
- package/dist/tools/sequence-analysis.js +234 -0
- package/dist/tools/sequence-analysis.js.map +1 -0
- package/dist/tools/server-status.d.ts +12 -0
- package/dist/tools/server-status.d.ts.map +1 -0
- package/dist/tools/server-status.js +41 -0
- package/dist/tools/server-status.js.map +1 -0
- package/dist/tools/shape-histogram.d.ts.map +1 -1
- package/dist/tools/shape-histogram.js +61 -16
- package/dist/tools/shape-histogram.js.map +1 -1
- package/dist/tools/sliced-strings.d.ts.map +1 -1
- package/dist/tools/sliced-strings.js +16 -11
- package/dist/tools/sliced-strings.js.map +1 -1
- package/dist/tools/snapshot-summary.d.ts.map +1 -1
- package/dist/tools/snapshot-summary.js +55 -13
- package/dist/tools/snapshot-summary.js.map +1 -1
- package/dist/tools/snapshots.d.ts +12 -0
- package/dist/tools/snapshots.d.ts.map +1 -0
- package/dist/tools/snapshots.js +93 -0
- package/dist/tools/snapshots.js.map +1 -0
- package/dist/tools/stale-collections.d.ts.map +1 -1
- package/dist/tools/stale-collections.js +248 -7
- package/dist/tools/stale-collections.js.map +1 -1
- package/dist/tools/trace-dominators.d.ts.map +1 -1
- package/dist/tools/trace-dominators.js +28 -1
- package/dist/tools/trace-dominators.js.map +1 -1
- package/dist/tools/weakmap-entries.d.ts +12 -0
- package/dist/tools/weakmap-entries.d.ts.map +1 -0
- package/dist/tools/weakmap-entries.js +156 -0
- package/dist/tools/weakmap-entries.js.map +1 -0
- package/dist/utils.d.ts +81 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +303 -35
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
* @oncall memory_lab
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { getSnapshot, getSnapshotMetadata } from '../heap-state.js';
|
|
12
|
+
import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
|
+
export function registerInternOpportunities(server) {
|
|
14
|
+
server.tool('memlab_intern_opportunities', 'Identify string interning opportunities by grouping duplicated strings by the property name and parent object shape that holds them. Shows total savings per (property × shape) combination — the key metric for deciding where to add a string interning pool. Replaces the manual workflow of: duplicated_strings → retainer_summary → codebase grep. ' +
|
|
15
|
+
'⚠ Full-heap scan (builds string-duplication groups) — slow and memory-heavy on very large heaps (millions of nodes); raise min_copies / min_savings to bound it.', {
|
|
16
|
+
limit: z
|
|
17
|
+
.number()
|
|
18
|
+
.optional()
|
|
19
|
+
.default(15)
|
|
20
|
+
.describe('Maximum number of intern groups to return (default 15)'),
|
|
21
|
+
min_copies: z
|
|
22
|
+
.number()
|
|
23
|
+
.optional()
|
|
24
|
+
.default(100)
|
|
25
|
+
.describe('Minimum total copies across all strings in a group (default 100)'),
|
|
26
|
+
min_savings: z
|
|
27
|
+
.number()
|
|
28
|
+
.optional()
|
|
29
|
+
.default(102400)
|
|
30
|
+
.describe('Minimum savings in bytes to include a group (default 100 KB)'),
|
|
31
|
+
}, async ({ limit, min_copies, min_savings }) => {
|
|
32
|
+
try {
|
|
33
|
+
const snapshot = getSnapshot();
|
|
34
|
+
const meta = getSnapshotMetadata();
|
|
35
|
+
const totalSize = meta?.totalSize ?? 0;
|
|
36
|
+
// Step 1: Build frequency map of duplicated strings
|
|
37
|
+
const stringMap = new Map();
|
|
38
|
+
snapshot.nodes.forEach(node => {
|
|
39
|
+
if (node.type !== 'string')
|
|
40
|
+
return;
|
|
41
|
+
if (node.name === 'system / SlicedString')
|
|
42
|
+
return;
|
|
43
|
+
const strNode = node.toStringNode();
|
|
44
|
+
if (!strNode)
|
|
45
|
+
return;
|
|
46
|
+
const value = strNode.stringValue;
|
|
47
|
+
const entry = stringMap.get(value);
|
|
48
|
+
if (entry) {
|
|
49
|
+
entry.count++;
|
|
50
|
+
entry.totalSize += node.retainedSize;
|
|
51
|
+
if (entry.exampleIds.length < 20) {
|
|
52
|
+
entry.exampleIds.push(node.id);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
stringMap.set(value, {
|
|
57
|
+
count: 1,
|
|
58
|
+
totalSize: node.retainedSize,
|
|
59
|
+
exampleIds: [node.id],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// Step 2: For duplicated strings, sample referrers to get property × shape
|
|
64
|
+
const groupMap = new Map();
|
|
65
|
+
for (const [value, stats] of stringMap) {
|
|
66
|
+
if (stats.count < 2)
|
|
67
|
+
continue;
|
|
68
|
+
// Sample referrers to determine which (property, shape) groups hold this string
|
|
69
|
+
const groupDist = new Map();
|
|
70
|
+
let samplesProcessed = 0;
|
|
71
|
+
for (const nodeId of stats.exampleIds) {
|
|
72
|
+
const node = snapshot.getNodeById(nodeId);
|
|
73
|
+
if (!node)
|
|
74
|
+
continue;
|
|
75
|
+
for (const ref of node.referrers) {
|
|
76
|
+
if (ref.type !== 'property' && ref.type !== 'context')
|
|
77
|
+
continue;
|
|
78
|
+
const propName = String(ref.name_or_index);
|
|
79
|
+
const parent = ref.fromNode;
|
|
80
|
+
const parentProps = [];
|
|
81
|
+
for (const edge of parent.references) {
|
|
82
|
+
if (edge.type === 'property') {
|
|
83
|
+
parentProps.push(String(edge.name_or_index));
|
|
84
|
+
if (parentProps.length >= 12)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
parentProps.sort();
|
|
89
|
+
const shapeKey = parent.name !== 'Object'
|
|
90
|
+
? parent.name
|
|
91
|
+
: parentProps.length > 0
|
|
92
|
+
? `{${parentProps.join(',')}}`
|
|
93
|
+
: 'Object';
|
|
94
|
+
const groupKey = `${propName}::${shapeKey}`;
|
|
95
|
+
const dist = groupDist.get(groupKey);
|
|
96
|
+
if (dist) {
|
|
97
|
+
dist.sampledCount++;
|
|
98
|
+
dist.sampleRetained += node.retainedSize;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
groupDist.set(groupKey, {
|
|
102
|
+
sampledCount: 1,
|
|
103
|
+
propName,
|
|
104
|
+
parentProps,
|
|
105
|
+
shapeKey,
|
|
106
|
+
parentId: parent.id,
|
|
107
|
+
sampleRetained: node.retainedSize,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
samplesProcessed++;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (samplesProcessed === 0)
|
|
115
|
+
continue;
|
|
116
|
+
// Extrapolate true counts from sample using stats.count
|
|
117
|
+
for (const [groupKey, dist] of groupDist) {
|
|
118
|
+
const scaleFactor = stats.count / samplesProcessed;
|
|
119
|
+
const trueCount = Math.round(dist.sampledCount * scaleFactor);
|
|
120
|
+
const trueSize = stats.totalSize * (dist.sampledCount / samplesProcessed);
|
|
121
|
+
const existing = groupMap.get(groupKey);
|
|
122
|
+
if (existing) {
|
|
123
|
+
const strEntry = existing.strings.get(value);
|
|
124
|
+
if (strEntry) {
|
|
125
|
+
strEntry.count += trueCount;
|
|
126
|
+
strEntry.size += trueSize;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
existing.strings.set(value, {
|
|
130
|
+
count: trueCount,
|
|
131
|
+
size: trueSize,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
existing.totalCopies += trueCount;
|
|
135
|
+
existing.totalSize += trueSize;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
groupMap.set(groupKey, {
|
|
139
|
+
propertyName: dist.propName,
|
|
140
|
+
parentShapeProps: dist.parentProps,
|
|
141
|
+
parentShapeKey: dist.shapeKey,
|
|
142
|
+
strings: new Map([[value, { count: trueCount, size: trueSize }]]),
|
|
143
|
+
totalCopies: trueCount,
|
|
144
|
+
totalSize: trueSize,
|
|
145
|
+
exampleParentId: dist.parentId,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Step 3: Compute savings and filter
|
|
151
|
+
const groups = [];
|
|
152
|
+
for (const g of groupMap.values()) {
|
|
153
|
+
if (g.totalCopies < min_copies)
|
|
154
|
+
continue;
|
|
155
|
+
let savingsIfInterned = 0;
|
|
156
|
+
const topStrings = [];
|
|
157
|
+
for (const [value, strStats] of g.strings) {
|
|
158
|
+
if (strStats.count > 1) {
|
|
159
|
+
const perCopy = strStats.size / strStats.count;
|
|
160
|
+
savingsIfInterned += (strStats.count - 1) * perCopy;
|
|
161
|
+
}
|
|
162
|
+
topStrings.push({
|
|
163
|
+
value,
|
|
164
|
+
count: strStats.count,
|
|
165
|
+
size: strStats.size,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (savingsIfInterned < min_savings)
|
|
169
|
+
continue;
|
|
170
|
+
topStrings.sort((a, b) => b.size - a.size);
|
|
171
|
+
groups.push({
|
|
172
|
+
propertyName: g.propertyName,
|
|
173
|
+
parentShape: g.parentShapeKey,
|
|
174
|
+
parentShapeProps: g.parentShapeProps,
|
|
175
|
+
uniqueStrings: g.strings.size,
|
|
176
|
+
totalCopies: g.totalCopies,
|
|
177
|
+
totalSize: g.totalSize,
|
|
178
|
+
savingsIfInterned,
|
|
179
|
+
topStrings: topStrings.slice(0, 3),
|
|
180
|
+
exampleParentId: g.exampleParentId,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
groups.sort((a, b) => b.savingsIfInterned - a.savingsIfInterned);
|
|
184
|
+
const shown = groups.slice(0, limit);
|
|
185
|
+
if (shown.length === 0) {
|
|
186
|
+
return toolResult(`No significant interning opportunities found (min ${formatNumber(min_copies)} copies, min ${formatBytes(min_savings)} savings). Try lowering thresholds.`);
|
|
187
|
+
}
|
|
188
|
+
// Detect partial interning patterns (Feedback #3) and, while we're here,
|
|
189
|
+
// mark which groups' savings are CROSS-load (not capturable by a per-load
|
|
190
|
+
// intern pool) so the headline can split the two (Feedback round 3 §1c).
|
|
191
|
+
const partialInternAlerts = [];
|
|
192
|
+
for (const g of shown) {
|
|
193
|
+
if (g.uniqueStrings < 10)
|
|
194
|
+
continue;
|
|
195
|
+
const counts = g.topStrings.map(s => s.count);
|
|
196
|
+
if (counts.length < 2)
|
|
197
|
+
continue;
|
|
198
|
+
const median = counts.sort((a, b) => a - b)[Math.floor(counts.length / 2)];
|
|
199
|
+
if (median < 2 || median > 20)
|
|
200
|
+
continue;
|
|
201
|
+
const consistent = counts.every(c => c >= median * 0.5 && c <= median * 2);
|
|
202
|
+
if (!consistent)
|
|
203
|
+
continue;
|
|
204
|
+
g.crossLoad = true;
|
|
205
|
+
const perPoolSavings = g.savingsIfInterned;
|
|
206
|
+
partialInternAlerts.push(`⚠️ **\`.${g.propertyName}\` on \`${g.parentShape.length > 50 ? g.parentShape.slice(0, 47) + '…}' : g.parentShape}\`:** ` +
|
|
207
|
+
`${formatNumber(g.uniqueStrings)} unique strings each duplicated ~${median}× — ` +
|
|
208
|
+
`suggests **${median} independent intern pools** instead of one shared pool. ` +
|
|
209
|
+
`Consolidating into a single shared pool would save ~${formatBytes(perPoolSavings)}.`);
|
|
210
|
+
}
|
|
211
|
+
// Split savings: within-load is what a per-load/per-request intern pool
|
|
212
|
+
// can actually capture; cross-load duplication needs a shared/module
|
|
213
|
+
// pool or a retention/concurrency fix (Feedback round 3 §1c).
|
|
214
|
+
const withinLoadSavings = shown
|
|
215
|
+
.filter(g => !g.crossLoad)
|
|
216
|
+
.reduce((sum, g) => sum + g.savingsIfInterned, 0);
|
|
217
|
+
const crossLoadSavings = shown
|
|
218
|
+
.filter(g => g.crossLoad)
|
|
219
|
+
.reduce((sum, g) => sum + g.savingsIfInterned, 0);
|
|
220
|
+
const totalSavings = withinLoadSavings + crossLoadSavings;
|
|
221
|
+
const pctOf = (n) => totalSize > 0
|
|
222
|
+
? ` (${((n / totalSize) * 100).toFixed(1)}% of heap)`
|
|
223
|
+
: '';
|
|
224
|
+
const pctOfHeap = pctOf(totalSavings);
|
|
225
|
+
const headers = [
|
|
226
|
+
'Property',
|
|
227
|
+
'Parent Shape',
|
|
228
|
+
'Unique Strings',
|
|
229
|
+
'Total Copies',
|
|
230
|
+
'Total Size',
|
|
231
|
+
'Savings',
|
|
232
|
+
'% Heap',
|
|
233
|
+
'Example Parent',
|
|
234
|
+
];
|
|
235
|
+
const rightCols = new Set([2, 3, 4, 5, 6]);
|
|
236
|
+
const rows = shown.map(g => {
|
|
237
|
+
const shape = g.parentShape.length > 40
|
|
238
|
+
? g.parentShape.slice(0, 37) + '…}'
|
|
239
|
+
: g.parentShape;
|
|
240
|
+
const pct = totalSize > 0
|
|
241
|
+
? ((g.savingsIfInterned / totalSize) * 100).toFixed(1) + '%'
|
|
242
|
+
: '-';
|
|
243
|
+
return [
|
|
244
|
+
`.${g.propertyName}`,
|
|
245
|
+
shape,
|
|
246
|
+
formatNumber(g.uniqueStrings),
|
|
247
|
+
formatNumber(g.totalCopies),
|
|
248
|
+
formatBytes(g.totalSize),
|
|
249
|
+
formatBytes(g.savingsIfInterned),
|
|
250
|
+
pct,
|
|
251
|
+
`@${g.exampleParentId}`,
|
|
252
|
+
];
|
|
253
|
+
});
|
|
254
|
+
const headerLines = [
|
|
255
|
+
`# String Interning Opportunities`,
|
|
256
|
+
'',
|
|
257
|
+
`**Total duplication across top ${shown.length} groups: ${formatBytes(totalSavings)}${pctOfHeap}**`,
|
|
258
|
+
`- **Within-load (capturable by a per-load/per-request intern pool): ${formatBytes(withinLoadSavings)}${pctOf(withinLoadSavings)}**`,
|
|
259
|
+
];
|
|
260
|
+
if (crossLoadSavings > 0) {
|
|
261
|
+
headerLines.push(`- **Cross-load (NOT capturable by a per-request pool — needs a shared/module-scope pool or a retention/concurrency fix): ${formatBytes(crossLoadSavings)}${pctOf(crossLoadSavings)}**`);
|
|
262
|
+
}
|
|
263
|
+
const lines = [
|
|
264
|
+
...headerLines,
|
|
265
|
+
'',
|
|
266
|
+
markdownTable(headers, rows, rightCols),
|
|
267
|
+
'',
|
|
268
|
+
];
|
|
269
|
+
// Show top strings for the top 5 groups
|
|
270
|
+
for (const g of shown.slice(0, 5)) {
|
|
271
|
+
lines.push(`### \`.${g.propertyName}\` on \`${g.parentShape.length > 60 ? g.parentShape.slice(0, 57) + '…}' : g.parentShape}\` — ${formatBytes(g.savingsIfInterned)} savings`);
|
|
272
|
+
for (const s of g.topStrings) {
|
|
273
|
+
const val = s.value.length > 60 ? s.value.slice(0, 60) + '…' : s.value;
|
|
274
|
+
lines.push(`- "${val}" × ${formatNumber(s.count)} copies (${formatBytes(s.size)})`);
|
|
275
|
+
}
|
|
276
|
+
lines.push('');
|
|
277
|
+
}
|
|
278
|
+
if (partialInternAlerts.length > 0) {
|
|
279
|
+
lines.push('## Partial Interning Detected', '', 'Strings that are partially deduplicated — interned within each dataset/call but duplicated across them:', '', ...partialInternAlerts, '', '_This typically happens when `internStrings()` or a dedup function creates a new Map per call instead of sharing one across datasets. Fix: lift the intern pool to module scope or pass it as a parameter._', '');
|
|
280
|
+
}
|
|
281
|
+
lines.push('---', '', '**How to fix:** Add a string interning pool at the JSON.parse / API response boundary:', '```js', 'const internPool = new Map();', 'function intern(s) { let v = internPool.get(s); if (!v) { internPool.set(s, s); v = s; } return v; }', '// Apply to the property during ingestion:', '// obj.propertyName = intern(obj.propertyName);', '```', '', '**Next steps:**', `- Inspect example parent: \`memlab_object_shape(${shown[0].exampleParentId})\``, `- Find all instances: \`memlab_find_by_shape\` with properties ${JSON.stringify(shown[0].parentShapeProps.slice(0, 5))}`, '- Search codebase for the constructor/factory that creates these objects');
|
|
282
|
+
return toolResult(lines.join('\n'));
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
return errorResult(err);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=intern-opportunities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intern-opportunities.js","sourceRoot":"","sources":["../../src/tools/intern-opportunities.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,15 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
export declare const DEFAULT_MANIFOLD_BUCKET = "nest_server_nodejs_heap_snapshots";
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a `file_path` that may be a local path, a `manifold://bucket/key`
|
|
14
|
+
* URL, or a bare snapshot filename to a local path, fetching from Manifold
|
|
15
|
+
* into a temp dir when needed. Returns {localPath, fetchedFrom}.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveSnapshotPath(filePath: string): {
|
|
18
|
+
localPath: string;
|
|
19
|
+
fetchedFrom: string | null;
|
|
20
|
+
};
|
|
11
21
|
export declare function registerLoadSnapshot(server: McpServer): void;
|
|
12
22
|
//# sourceMappingURL=load-snapshot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-snapshot.d.ts","sourceRoot":"","sources":["../../src/tools/load-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"load-snapshot.d.ts","sourceRoot":"","sources":["../../src/tools/load-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA0BvE,eAAO,MAAM,uBAAuB,sCAAsC,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAoCA;AAmID,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+M5D"}
|
|
@@ -8,12 +8,53 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import fs from 'fs';
|
|
11
|
+
import os from 'os';
|
|
11
12
|
import path from 'path';
|
|
13
|
+
import { execFileSync } from 'child_process';
|
|
12
14
|
import { z } from 'zod';
|
|
13
15
|
import memlabHeapAnalysis from '@memlab/heap-analysis';
|
|
14
16
|
const { getFullHeapFromFile } = memlabHeapAnalysis;
|
|
15
|
-
import { setSnapshot } from '../heap-state.js';
|
|
17
|
+
import { setSnapshot, getSnapshotMetadata, setSessionConfig, listSnapshots, } from '../heap-state.js';
|
|
16
18
|
import { formatBytes, formatNumber, truncateNodeName, errorResult, textResult, } from '../utils.js';
|
|
19
|
+
// The bucket the Nest auto-capture + the Manifold links in diffs use, so a
|
|
20
|
+
// bare snapshot filename resolves predictably (Feedback §7).
|
|
21
|
+
export const DEFAULT_MANIFOLD_BUCKET = 'nest_server_nodejs_heap_snapshots';
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a `file_path` that may be a local path, a `manifold://bucket/key`
|
|
24
|
+
* URL, or a bare snapshot filename to a local path, fetching from Manifold
|
|
25
|
+
* into a temp dir when needed. Returns {localPath, fetchedFrom}.
|
|
26
|
+
*/
|
|
27
|
+
export function resolveSnapshotPath(filePath) {
|
|
28
|
+
// Already a local file? Use it directly.
|
|
29
|
+
const asLocal = path.resolve(filePath);
|
|
30
|
+
if (!filePath.startsWith('manifold://') && fs.existsSync(asLocal)) {
|
|
31
|
+
return { localPath: asLocal, fetchedFrom: null };
|
|
32
|
+
}
|
|
33
|
+
let manifoldKey = null;
|
|
34
|
+
if (filePath.startsWith('manifold://')) {
|
|
35
|
+
manifoldKey = filePath.slice('manifold://'.length);
|
|
36
|
+
}
|
|
37
|
+
else if (!filePath.includes('/') && /\.heapsnapshot$/i.test(filePath)) {
|
|
38
|
+
// Bare snapshot filename → resolve against the default bucket's flat/ tree.
|
|
39
|
+
manifoldKey = `${DEFAULT_MANIFOLD_BUCKET}/flat/${filePath}`;
|
|
40
|
+
}
|
|
41
|
+
if (!manifoldKey) {
|
|
42
|
+
// Nothing we can fetch; let the caller report "file not found".
|
|
43
|
+
return { localPath: asLocal, fetchedFrom: null };
|
|
44
|
+
}
|
|
45
|
+
// A Manifold key must be bucket/key; if only a key was given, prefix bucket.
|
|
46
|
+
if (!manifoldKey.includes('/')) {
|
|
47
|
+
manifoldKey = `${DEFAULT_MANIFOLD_BUCKET}/${manifoldKey}`;
|
|
48
|
+
}
|
|
49
|
+
const dest = path.join(os.tmpdir(), `memlab-${path.basename(manifoldKey).replace(/[^A-Za-z0-9._-]/g, '_')}`);
|
|
50
|
+
process.stderr.write(`Fetching ${manifoldKey} from Manifold → ${dest}…\n`);
|
|
51
|
+
execFileSync('manifold', ['get', manifoldKey, dest], {
|
|
52
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
53
|
+
timeout: 5 * 60 * 1000,
|
|
54
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
55
|
+
});
|
|
56
|
+
return { localPath: dest, fetchedFrom: manifoldKey };
|
|
57
|
+
}
|
|
17
58
|
function findLargestObject(snapshot) {
|
|
18
59
|
let best = null;
|
|
19
60
|
snapshot.nodes.forEach(node => {
|
|
@@ -67,7 +108,9 @@ function quickDiagnosis(snapshot, totalSelfSize) {
|
|
|
67
108
|
if (node.type === 'string' && node.self_size >= 1024 * 1024) {
|
|
68
109
|
largeStrings.push({ id: node.id, name: node.name, size: node.self_size });
|
|
69
110
|
}
|
|
70
|
-
|
|
111
|
+
// Count flat-string duplication only. Sliced strings (type 'sliced
|
|
112
|
+
// string') share a parent's storage, so they aren't independent dupes.
|
|
113
|
+
if (node.type === 'string') {
|
|
71
114
|
const key = node.name.length > 100 ? node.name.slice(0, 100) : node.name;
|
|
72
115
|
stringCounts.set(key, (stringCounts.get(key) ?? 0) + 1);
|
|
73
116
|
}
|
|
@@ -79,8 +122,12 @@ function quickDiagnosis(snapshot, totalSelfSize) {
|
|
|
79
122
|
const totalSize = largeStrings.reduce((s, n) => s + n.size, 0);
|
|
80
123
|
warnings.push(`⚠ ${largeStrings.length} string(s) > 1 MB (${formatBytes(totalSize)} total) — possible unbounded data retention`);
|
|
81
124
|
}
|
|
125
|
+
// Suppress noise: tiny or purely-numeric/SMI-like strings duplicate heavily
|
|
126
|
+
// but carry no signal (e.g. "5" ×3,372, "0" ×2,733). Require some length and
|
|
127
|
+
// non-numeric content to be worth flagging.
|
|
128
|
+
const isNoisyDupKey = (s) => s.length < 8 || /^[\s\d.,:+-]*$/.test(s);
|
|
82
129
|
const highDups = [...stringCounts.entries()]
|
|
83
|
-
.filter(([, count]) => count >= 1000)
|
|
130
|
+
.filter(([val, count]) => count >= 1000 && !isNoisyDupKey(val))
|
|
84
131
|
.sort((a, b) => b[1] - a[1])
|
|
85
132
|
.slice(0, 3);
|
|
86
133
|
for (const [val, count] of highDups) {
|
|
@@ -101,23 +148,100 @@ function quickDiagnosis(snapshot, totalSelfSize) {
|
|
|
101
148
|
for (const [name, count] of anomalous) {
|
|
102
149
|
warnings.push(`⚠ ${formatNumber(count)}× \`${name}\` instances`);
|
|
103
150
|
}
|
|
151
|
+
if (warnings.length > 0) {
|
|
152
|
+
warnings.push('', 'Run `memlab_quick_diagnosis` for actionable triage or `memlab_auto_investigate` for deep analysis.');
|
|
153
|
+
}
|
|
104
154
|
return warnings;
|
|
105
155
|
}
|
|
106
156
|
export function registerLoadSnapshot(server) {
|
|
107
|
-
server.tool('memlab_load_snapshot', 'Load and parse a .heapsnapshot file. This builds indexes, computes the dominator tree, and calculates retained sizes. Returns a quick diagnosis highlighting potential issues.
|
|
108
|
-
file_path: z
|
|
109
|
-
|
|
157
|
+
server.tool('memlab_load_snapshot', 'Load and parse a .heapsnapshot file. This builds indexes, computes the dominator tree, and calculates retained sizes. Returns a quick diagnosis highlighting potential issues. 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). Multiple snapshots can be kept resident — pass keep_previous:true to load several for diffing/comparison; switch between them with memlab_snapshots.', {
|
|
158
|
+
file_path: z
|
|
159
|
+
.string()
|
|
160
|
+
.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.'),
|
|
161
|
+
alias: z
|
|
162
|
+
.string()
|
|
163
|
+
.optional()
|
|
164
|
+
.describe('Optional short handle to identify this snapshot in a multi-snapshot session (defaults to the file name). Node ids are only valid within the snapshot they came from.'),
|
|
165
|
+
keep_previous: z
|
|
166
|
+
.boolean()
|
|
167
|
+
.optional()
|
|
168
|
+
.default(false)
|
|
169
|
+
.describe('Keep previously-loaded snapshots resident instead of replacing them (default false). Enables before/after diffing and app-to-app comparison without reloading. Each resident snapshot holds its full graph in memory — watch server RSS for very large heaps.'),
|
|
170
|
+
quiet: z
|
|
171
|
+
.boolean()
|
|
172
|
+
.optional()
|
|
173
|
+
.describe('Session output control: when true, the per-call "> Snapshot: …" header is printed once instead of on every subsequent tool result (saves tokens over a long investigation).'),
|
|
174
|
+
suppress_suggestions: z
|
|
175
|
+
.boolean()
|
|
176
|
+
.optional()
|
|
177
|
+
.describe('Session output control: when true, tools omit their "Suggested next steps" trailers to save tokens.'),
|
|
178
|
+
max_file_size_mb: z
|
|
179
|
+
.number()
|
|
180
|
+
.optional()
|
|
181
|
+
.default(900)
|
|
182
|
+
.describe('Maximum file size in MB to attempt loading (default 900). Snapshots larger than this will return an error instead of risking an OOM crash. Increase if your Node.js process has extra memory (--max-old-space-size).'),
|
|
183
|
+
}, async ({ file_path, alias, keep_previous, quiet, suppress_suggestions, max_file_size_mb, }) => {
|
|
110
184
|
try {
|
|
111
|
-
|
|
185
|
+
if (quiet != null || suppress_suggestions != null) {
|
|
186
|
+
setSessionConfig({
|
|
187
|
+
...(quiet != null ? { quietHeader: quiet } : {}),
|
|
188
|
+
...(suppress_suggestions != null
|
|
189
|
+
? { suppressSuggestions: suppress_suggestions }
|
|
190
|
+
: {}),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const previousMeta = getSnapshotMetadata();
|
|
194
|
+
let resolved;
|
|
195
|
+
let fetchedFrom = null;
|
|
196
|
+
try {
|
|
197
|
+
const r = resolveSnapshotPath(file_path);
|
|
198
|
+
resolved = r.localPath;
|
|
199
|
+
fetchedFrom = r.fetchedFrom;
|
|
200
|
+
}
|
|
201
|
+
catch (fetchErr) {
|
|
202
|
+
const msg = fetchErr instanceof Error ? fetchErr.message : String(fetchErr);
|
|
203
|
+
return errorResult(new Error(`Failed to fetch "${file_path}" from Manifold: ${msg}\n` +
|
|
204
|
+
`Ensure the 'manifold' CLI is installed and you have access to the bucket, ` +
|
|
205
|
+
`or pass a local absolute path instead.`));
|
|
206
|
+
}
|
|
112
207
|
if (!fs.existsSync(resolved)) {
|
|
113
|
-
return errorResult(new Error(`File not found: ${resolved}`
|
|
208
|
+
return errorResult(new Error(`File not found: ${resolved}` +
|
|
209
|
+
(file_path.includes('/')
|
|
210
|
+
? ''
|
|
211
|
+
: ` (also tried fetching "${file_path}" from the ${DEFAULT_MANIFOLD_BUCKET} bucket)`)));
|
|
114
212
|
}
|
|
115
213
|
const fileStat = fs.statSync(resolved);
|
|
116
214
|
const fileSizeMB = fileStat.size / (1024 * 1024);
|
|
215
|
+
if (fileSizeMB > max_file_size_mb) {
|
|
216
|
+
return errorResult(new Error(`Snapshot file is ${formatBytes(fileStat.size)} — exceeds the ${max_file_size_mb} MB safety limit. ` +
|
|
217
|
+
`Loading snapshots this large often causes the MCP server to crash with an out-of-memory error, ` +
|
|
218
|
+
`losing all analysis state.\n\n` +
|
|
219
|
+
`Options:\n` +
|
|
220
|
+
`1. Use a smaller snapshot from the same app if available\n` +
|
|
221
|
+
`2. Increase the limit: memlab_load_snapshot({max_file_size_mb: ${Math.ceil(fileSizeMB + 100)}})\n` +
|
|
222
|
+
`3. Restart the MCP server with more memory: NODE_OPTIONS="--max-old-space-size=8192"`));
|
|
223
|
+
}
|
|
117
224
|
if (fileSizeMB > 200) {
|
|
118
225
|
process.stderr.write(`Loading ${formatBytes(fileStat.size)} snapshot — this may take a while (parsing, computing dominators, building indexes)...\n`);
|
|
119
226
|
}
|
|
120
|
-
|
|
227
|
+
let snapshot;
|
|
228
|
+
try {
|
|
229
|
+
snapshot = await getFullHeapFromFile(resolved);
|
|
230
|
+
}
|
|
231
|
+
catch (loadErr) {
|
|
232
|
+
const msg = loadErr instanceof Error ? loadErr.message : String(loadErr);
|
|
233
|
+
if (msg.includes('heap out of memory') ||
|
|
234
|
+
msg.includes('allocation failed') ||
|
|
235
|
+
msg.includes('JavaScript heap') ||
|
|
236
|
+
msg.includes('ENOMEM')) {
|
|
237
|
+
return errorResult(new Error(`Out of memory while loading ${formatBytes(fileStat.size)} snapshot. ` +
|
|
238
|
+
`The snapshot requires more memory than is available to the MCP server process.\n\n` +
|
|
239
|
+
`Try:\n` +
|
|
240
|
+
`1. A smaller snapshot from the same app\n` +
|
|
241
|
+
`2. Restart with more memory: NODE_OPTIONS="--max-old-space-size=8192"`));
|
|
242
|
+
}
|
|
243
|
+
throw loadErr;
|
|
244
|
+
}
|
|
121
245
|
let nodeCount = 0;
|
|
122
246
|
let edgeCount = 0;
|
|
123
247
|
let totalSize = 0;
|
|
@@ -129,22 +253,35 @@ export function registerLoadSnapshot(server) {
|
|
|
129
253
|
edgeCount++;
|
|
130
254
|
});
|
|
131
255
|
const env = detectEnv(snapshot);
|
|
132
|
-
const fileName = path.basename(file_path);
|
|
133
|
-
setSnapshot(snapshot,
|
|
256
|
+
const fileName = path.basename(fetchedFrom ?? file_path.replace(/^manifold:\/\//, ''));
|
|
257
|
+
const meta = setSnapshot(snapshot, resolved, {
|
|
134
258
|
fileName,
|
|
135
259
|
nodeCount,
|
|
136
260
|
edgeCount,
|
|
137
261
|
totalSize,
|
|
138
262
|
env,
|
|
139
|
-
});
|
|
263
|
+
}, { alias, replace: !keep_previous });
|
|
140
264
|
const envLabel = env === 'browser'
|
|
141
265
|
? 'Browser'
|
|
142
266
|
: env === 'node'
|
|
143
267
|
? 'Node.js'
|
|
144
268
|
: 'Unknown';
|
|
145
|
-
const lines = [
|
|
146
|
-
|
|
147
|
-
|
|
269
|
+
const lines = [];
|
|
270
|
+
if (previousMeta && !keep_previous) {
|
|
271
|
+
lines.push(`⚠ Replacing previously loaded snapshot "${previousMeta.fileName}"`);
|
|
272
|
+
}
|
|
273
|
+
if (fetchedFrom) {
|
|
274
|
+
lines.push(`Fetched from Manifold: ${fetchedFrom}`);
|
|
275
|
+
}
|
|
276
|
+
lines.push(`Loaded ${fileName} (${formatBytes(fileStat.size)} on disk): ${formatNumber(nodeCount)} nodes, ${formatNumber(edgeCount)} edges, ${formatBytes(totalSize)} heap size (${envLabel} snapshot) [handle: ${meta.handle}]`);
|
|
277
|
+
if (keep_previous) {
|
|
278
|
+
const all = listSnapshots();
|
|
279
|
+
if (all.length > 1) {
|
|
280
|
+
lines.push(`Resident snapshots (${all.length}): ${all
|
|
281
|
+
.map(m => `${m.handle === meta.handle ? '→ ' : ''}${m.handle} (${formatBytes(m.totalSize)})`)
|
|
282
|
+
.join(', ')}. Switch with memlab_snapshots.`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
148
285
|
const warnings = quickDiagnosis(snapshot, totalSize);
|
|
149
286
|
if (warnings.length > 0) {
|
|
150
287
|
lines.push('', ...warnings);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-snapshot.js","sourceRoot":"","sources":["../../src/tools/load-snapshot.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"load-snapshot.js","sourceRoot":"","sources":["../../src/tools/load-snapshot.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 registerObjectCostBreakdown(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=object-cost-breakdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-cost-breakdown.d.ts","sourceRoot":"","sources":["../../src/tools/object-cost-breakdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAuHvE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+bnE"}
|