@memlab/mcp-server 2.3.0 → 2.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -14
- package/bin/.eslintrc.js +26 -0
- package/bin/memlab-cli.js +313 -0
- package/dist/artifact-classes.d.ts +86 -0
- package/dist/artifact-classes.d.ts.map +1 -0
- package/dist/artifact-classes.js +261 -0
- package/dist/artifact-classes.js.map +1 -0
- package/dist/capture-mode.d.ts +60 -0
- package/dist/capture-mode.d.ts.map +1 -0
- package/dist/capture-mode.js +39 -0
- package/dist/capture-mode.js.map +1 -0
- package/dist/guardrail.d.ts.map +1 -1
- package/dist/guardrail.js +13 -0
- package/dist/guardrail.js.map +1 -1
- package/dist/heap-state.d.ts +96 -2
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +197 -2
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +41 -1
- package/dist/index.js.map +1 -1
- package/dist/progress.d.ts +25 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +46 -0
- package/dist/progress.js.map +1 -0
- package/dist/result-handles.d.ts +11 -0
- package/dist/result-handles.d.ts.map +1 -0
- package/dist/result-handles.js +77 -0
- package/dist/result-handles.js.map +1 -0
- package/dist/string-index.d.ts +55 -0
- package/dist/string-index.d.ts.map +1 -0
- package/dist/string-index.js +91 -0
- package/dist/string-index.js.map +1 -0
- package/dist/tool-registry.d.ts +42 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +20 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tools/analyze-run.d.ts +12 -0
- package/dist/tools/analyze-run.d.ts.map +1 -0
- package/dist/tools/analyze-run.js +343 -0
- package/dist/tools/analyze-run.js.map +1 -0
- package/dist/tools/app-heap.d.ts +12 -0
- package/dist/tools/app-heap.d.ts.map +1 -0
- package/dist/tools/app-heap.js +140 -0
- package/dist/tools/app-heap.js.map +1 -0
- package/dist/tools/auto-investigate.d.ts.map +1 -1
- package/dist/tools/auto-investigate.js +91 -49
- package/dist/tools/auto-investigate.js.map +1 -1
- package/dist/tools/batch.d.ts +12 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +168 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/cache-analysis.d.ts.map +1 -1
- package/dist/tools/cache-analysis.js +156 -5
- package/dist/tools/cache-analysis.js.map +1 -1
- package/dist/tools/class-histogram.d.ts.map +1 -1
- package/dist/tools/class-histogram.js +14 -3
- package/dist/tools/class-histogram.js.map +1 -1
- package/dist/tools/collection-trend.d.ts +55 -0
- package/dist/tools/collection-trend.d.ts.map +1 -0
- package/dist/tools/collection-trend.js +315 -0
- package/dist/tools/collection-trend.js.map +1 -0
- package/dist/tools/detached-dom.d.ts +2 -0
- package/dist/tools/detached-dom.d.ts.map +1 -1
- package/dist/tools/detached-dom.js +291 -20
- package/dist/tools/detached-dom.js.map +1 -1
- package/dist/tools/dev-artifacts.d.ts +62 -6
- package/dist/tools/dev-artifacts.d.ts.map +1 -1
- package/dist/tools/dev-artifacts.js +466 -23
- package/dist/tools/dev-artifacts.js.map +1 -1
- package/dist/tools/diff-snapshots.d.ts.map +1 -1
- package/dist/tools/diff-snapshots.js +101 -44
- package/dist/tools/diff-snapshots.js.map +1 -1
- package/dist/tools/dominator-attribution.d.ts +12 -0
- package/dist/tools/dominator-attribution.d.ts.map +1 -0
- package/dist/tools/dominator-attribution.js +189 -0
- package/dist/tools/dominator-attribution.js.map +1 -0
- package/dist/tools/dominator-chain.d.ts +12 -0
- package/dist/tools/dominator-chain.d.ts.map +1 -0
- package/dist/tools/dominator-chain.js +92 -0
- package/dist/tools/dominator-chain.js.map +1 -0
- package/dist/tools/duplicate-objects.d.ts +12 -0
- package/dist/tools/duplicate-objects.d.ts.map +1 -0
- package/dist/tools/duplicate-objects.js +172 -0
- package/dist/tools/duplicate-objects.js.map +1 -0
- package/dist/tools/duplicated-strings.d.ts.map +1 -1
- package/dist/tools/duplicated-strings.js +46 -38
- package/dist/tools/duplicated-strings.js.map +1 -1
- package/dist/tools/eval.d.ts +1 -0
- package/dist/tools/eval.d.ts.map +1 -1
- package/dist/tools/eval.js +787 -30
- package/dist/tools/eval.js.map +1 -1
- package/dist/tools/explain-delta.d.ts +12 -0
- package/dist/tools/explain-delta.d.ts.map +1 -0
- package/dist/tools/explain-delta.js +170 -0
- package/dist/tools/explain-delta.js.map +1 -0
- package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
- package/dist/tools/find-nodes-by-class.js +112 -13
- package/dist/tools/find-nodes-by-class.js.map +1 -1
- package/dist/tools/finding-index.d.ts +22 -0
- package/dist/tools/finding-index.d.ts.map +1 -0
- package/dist/tools/finding-index.js +247 -0
- package/dist/tools/finding-index.js.map +1 -0
- package/dist/tools/for-each.d.ts.map +1 -1
- package/dist/tools/for-each.js +15 -3
- package/dist/tools/for-each.js.map +1 -1
- package/dist/tools/get-references.d.ts.map +1 -1
- package/dist/tools/get-references.js +35 -6
- 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 +52 -6
- package/dist/tools/get-referrers.js.map +1 -1
- package/dist/tools/hunt-report.d.ts +12 -0
- package/dist/tools/hunt-report.d.ts.map +1 -0
- package/dist/tools/hunt-report.js +186 -0
- package/dist/tools/hunt-report.js.map +1 -0
- package/dist/tools/hypothesis.d.ts +12 -0
- package/dist/tools/hypothesis.d.ts.map +1 -0
- package/dist/tools/hypothesis.js +221 -0
- package/dist/tools/hypothesis.js.map +1 -0
- package/dist/tools/intern-opportunities.d.ts.map +1 -1
- package/dist/tools/intern-opportunities.js +721 -75
- package/dist/tools/intern-opportunities.js.map +1 -1
- package/dist/tools/ladder.d.ts +33 -0
- package/dist/tools/ladder.d.ts.map +1 -0
- package/dist/tools/ladder.js +266 -0
- package/dist/tools/ladder.js.map +1 -0
- package/dist/tools/largest-objects.d.ts.map +1 -1
- package/dist/tools/largest-objects.js +43 -16
- package/dist/tools/largest-objects.js.map +1 -1
- package/dist/tools/leak-report.d.ts +12 -0
- package/dist/tools/leak-report.d.ts.map +1 -0
- package/dist/tools/leak-report.js +256 -0
- package/dist/tools/leak-report.js.map +1 -0
- package/dist/tools/load-snapshot.d.ts +78 -0
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +519 -29
- package/dist/tools/load-snapshot.js.map +1 -1
- package/dist/tools/map-entries.d.ts +12 -0
- package/dist/tools/map-entries.d.ts.map +1 -0
- package/dist/tools/map-entries.js +139 -0
- package/dist/tools/map-entries.js.map +1 -0
- package/dist/tools/match-object.d.ts +12 -0
- package/dist/tools/match-object.d.ts.map +1 -0
- package/dist/tools/match-object.js +165 -0
- package/dist/tools/match-object.js.map +1 -0
- package/dist/tools/object-shape.d.ts.map +1 -1
- package/dist/tools/object-shape.js +92 -30
- package/dist/tools/object-shape.js.map +1 -1
- package/dist/tools/population-diff.d.ts +57 -0
- package/dist/tools/population-diff.d.ts.map +1 -0
- package/dist/tools/population-diff.js +338 -0
- package/dist/tools/population-diff.js.map +1 -0
- package/dist/tools/quick-diagnosis.d.ts.map +1 -1
- package/dist/tools/quick-diagnosis.js +12 -4
- package/dist/tools/quick-diagnosis.js.map +1 -1
- package/dist/tools/retainer-layers.d.ts +23 -0
- package/dist/tools/retainer-layers.d.ts.map +1 -0
- package/dist/tools/retainer-layers.js +179 -0
- package/dist/tools/retainer-layers.js.map +1 -0
- package/dist/tools/retainer-summary.d.ts +1 -0
- package/dist/tools/retainer-summary.d.ts.map +1 -1
- package/dist/tools/retainer-summary.js +128 -32
- 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 +105 -25
- 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 +5 -1
- package/dist/tools/search-nodes.js.map +1 -1
- package/dist/tools/search-strings.d.ts.map +1 -1
- package/dist/tools/search-strings.js +53 -7
- package/dist/tools/search-strings.js.map +1 -1
- package/dist/tools/sequence-analysis.d.ts +49 -0
- package/dist/tools/sequence-analysis.d.ts.map +1 -1
- package/dist/tools/sequence-analysis.js +268 -78
- package/dist/tools/sequence-analysis.js.map +1 -1
- package/dist/tools/shape-histogram.d.ts.map +1 -1
- package/dist/tools/shape-histogram.js +9 -2
- 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 +22 -4
- package/dist/tools/sliced-strings.js.map +1 -1
- package/dist/tools/snapshot-header.d.ts +28 -0
- package/dist/tools/snapshot-header.d.ts.map +1 -0
- package/dist/tools/snapshot-header.js +111 -0
- package/dist/tools/snapshot-header.js.map +1 -0
- package/dist/tools/string-patterns.d.ts.map +1 -1
- package/dist/tools/string-patterns.js +5 -4
- package/dist/tools/string-patterns.js.map +1 -1
- package/dist/tools/tools-index.d.ts +12 -0
- package/dist/tools/tools-index.d.ts.map +1 -0
- package/dist/tools/tools-index.js +342 -0
- package/dist/tools/tools-index.js.map +1 -0
- package/dist/tools/verify-fix.d.ts +23 -0
- package/dist/tools/verify-fix.d.ts.map +1 -0
- package/dist/tools/verify-fix.js +211 -0
- package/dist/tools/verify-fix.js.map +1 -0
- package/dist/tools/weakmap-entries.d.ts.map +1 -1
- package/dist/tools/weakmap-entries.js +6 -1
- package/dist/tools/weakmap-entries.js.map +1 -1
- package/dist/utils.d.ts +204 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +478 -8
- package/dist/utils.js.map +1 -1
- package/package.json +5 -4
|
@@ -9,7 +9,24 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { formatNodeInline,
|
|
12
|
+
import { formatBytes, formatNodeInline, collapseRepeatedRuns, formatRetainerTree, isNodeWorthInspecting, instrumentationRetainerNote, errorResult, toolResult, } from '../utils.js';
|
|
13
|
+
// async/await desugars to a repeating retainer ladder: each suspended `await`
|
|
14
|
+
// frame is a `Promise → system / Context → Generator` triplet, and a deep async
|
|
15
|
+
// stack repeats it dozens of times with identical retained sizes. Folding the
|
|
16
|
+
// run keeps the signal (how much it retains) without the noise (Feedback round 5
|
|
17
|
+
// §10). We only fold runs of 3+ so a lone closure `system / Context` — which is
|
|
18
|
+
// frequently the actual leak owner — stays visible.
|
|
19
|
+
const ASYNC_CONTINUATION_NAMES = new Set([
|
|
20
|
+
'Promise',
|
|
21
|
+
'system / Context',
|
|
22
|
+
'Generator',
|
|
23
|
+
'AsyncGenerator',
|
|
24
|
+
'AsyncGeneratorFunction',
|
|
25
|
+
'AsyncFunction',
|
|
26
|
+
]);
|
|
27
|
+
function isAsyncContinuationFrame(node) {
|
|
28
|
+
return ASYNC_CONTINUATION_NAMES.has(node.name);
|
|
29
|
+
}
|
|
13
30
|
export function registerRetainerTrace(server) {
|
|
14
31
|
server.tool('memlab_retainer_trace', 'Get the shortest path from a GC root to a specific heap node. This shows why the object is retained in memory by walking the pathEdge chain. Use memlab_retainer_summary to trace multiple instances of a class and group by common retainer patterns. Use memlab_get_referrers / memlab_get_references to explore incoming/outgoing edges from a node.', {
|
|
15
32
|
node_id: z.number().describe('The numeric ID of the heap node'),
|
|
@@ -26,7 +43,7 @@ export function registerRetainerTrace(server) {
|
|
|
26
43
|
.boolean()
|
|
27
44
|
.optional()
|
|
28
45
|
.default(false)
|
|
29
|
-
.describe('Expand the elided middle: show every node on the path instead of collapsing consecutive V8/internal runs. Use when the interesting library/application boundary is hidden inside a "… N internal node(s) …" gap.'),
|
|
46
|
+
.describe('Expand the elided middle: show every node on the path instead of collapsing consecutive V8/internal runs and repeating async-continuation ladders (Promise → Context → Generator). Use when the interesting library/application boundary is hidden inside a "… N internal node(s) …" or "… N async continuation frames …" gap.'),
|
|
30
47
|
}, async ({ node_id, max_depth, show_sizes, expand }) => {
|
|
31
48
|
try {
|
|
32
49
|
const snapshot = getSnapshot();
|
|
@@ -102,6 +119,54 @@ export function registerRetainerTrace(server) {
|
|
|
102
119
|
const last = collapsed[collapsed.length - 1];
|
|
103
120
|
last.collapsedCount = (last.collapsedCount ?? 0) + internalRun;
|
|
104
121
|
}
|
|
122
|
+
// Second pass: fold repeating async-continuation ladders that the
|
|
123
|
+
// internal-node collapse leaves expanded (they're "worth inspecting"
|
|
124
|
+
// object/closure nodes). Replace a run of 3+ consecutive async frames
|
|
125
|
+
// with a single elision note on the node that follows it, carrying a
|
|
126
|
+
// representative retained size (Feedback round 5 §10).
|
|
127
|
+
const folded = [];
|
|
128
|
+
let i = 0;
|
|
129
|
+
while (i < collapsed.length) {
|
|
130
|
+
let j = i;
|
|
131
|
+
while (j < collapsed.length &&
|
|
132
|
+
isAsyncContinuationFrame(collapsed[j].node)) {
|
|
133
|
+
j++;
|
|
134
|
+
}
|
|
135
|
+
const runLen = j - i;
|
|
136
|
+
if (runLen >= 3 && j < collapsed.length) {
|
|
137
|
+
// Sum the frames elided within the run (each may already carry its
|
|
138
|
+
// own internal-collapse count) and attach the note to the next
|
|
139
|
+
// kept node, whose incoming edge stays valid.
|
|
140
|
+
const elided = collapsed
|
|
141
|
+
.slice(i, j)
|
|
142
|
+
.reduce((n, it) => n + 1 + (it.collapsedCount ?? 0), 0);
|
|
143
|
+
const retained = collapsed[i].node.retainedSize;
|
|
144
|
+
const next = collapsed[j];
|
|
145
|
+
const priorCount = next.collapsedCount ?? 0;
|
|
146
|
+
const asyncNote = `${elided} async continuation frames, all retaining ~${formatBytes(retained)}`;
|
|
147
|
+
folded.push({
|
|
148
|
+
...next,
|
|
149
|
+
collapsedCount: priorCount + elided,
|
|
150
|
+
// Compose with any elision the first-pass internal-node collapse
|
|
151
|
+
// already attached to `next` so the rendered note describes the
|
|
152
|
+
// FULL collapsedCount — the renderer shows collapsedNote verbatim
|
|
153
|
+
// in place of the "N internal node(s)" default, so a bare async
|
|
154
|
+
// note would silently drop the prior internal-node count.
|
|
155
|
+
collapsedNote: next.collapsedNote
|
|
156
|
+
? `${asyncNote}; ${next.collapsedNote}`
|
|
157
|
+
: priorCount > 0
|
|
158
|
+
? `${asyncNote}; ${priorCount} internal node(s)`
|
|
159
|
+
: asyncNote,
|
|
160
|
+
});
|
|
161
|
+
i = j + 1;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
folded.push(collapsed[i]);
|
|
165
|
+
i++;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
collapsed.length = 0;
|
|
169
|
+
collapsed.push(...folded);
|
|
105
170
|
}
|
|
106
171
|
// Highlight the application/library boundary: the node closest to the
|
|
107
172
|
// target that has a source location (i.e. user/app code, not a V8
|
|
@@ -122,8 +187,11 @@ export function registerRetainerTrace(server) {
|
|
|
122
187
|
: '';
|
|
123
188
|
const lines = [
|
|
124
189
|
`Retainer trace for @${node_id} (${fullLength} nodes${depthNote}):`,
|
|
125
|
-
'',
|
|
126
190
|
];
|
|
191
|
+
if (show_sizes) {
|
|
192
|
+
lines.push('(top = GC root; each node is retained by the one above it)');
|
|
193
|
+
}
|
|
194
|
+
lines.push('');
|
|
127
195
|
if (appFrame) {
|
|
128
196
|
const loc = appFrame.location;
|
|
129
197
|
lines.push(`First source-located (app) frame: @${appFrame.id} ${formatNodeInline(appFrame.id, appFrame.name, appFrame.type, appFrame.self_size)}` +
|
|
@@ -142,30 +210,42 @@ export function registerRetainerTrace(server) {
|
|
|
142
210
|
lines.push(`⚠ ${instrNote}`, '');
|
|
143
211
|
}
|
|
144
212
|
if (show_sizes) {
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
}
|
|
213
|
+
// Top-down indented tree: GC root at the top, each node retained by
|
|
214
|
+
// the one above it. Single, unambiguous reading direction (no mixing
|
|
215
|
+
// of ← and → on one line).
|
|
216
|
+
// `item.edgeName` is the OUTGOING edge (item -> next), so the edge
|
|
217
|
+
// pointing INTO item is the previous item's edgeName. The helper wants
|
|
218
|
+
// each node's incoming edge.
|
|
219
|
+
const treeSteps = items.map((item, i) => ({
|
|
220
|
+
id: item.node.id,
|
|
221
|
+
name: item.node.name,
|
|
222
|
+
type: item.node.type,
|
|
223
|
+
retainedSize: item.node.retainedSize,
|
|
224
|
+
selfSize: item.node.self_size,
|
|
225
|
+
edgeName: i > 0 ? items[i - 1].edgeName : undefined,
|
|
226
|
+
collapsedBefore: item.collapsedCount,
|
|
227
|
+
collapsedNote: item.collapsedNote,
|
|
228
|
+
}));
|
|
163
229
|
if (truncated && max_depth != null) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
230
|
+
const target = reverseItems[reverseItems.length - 1].node;
|
|
231
|
+
treeSteps.push({
|
|
232
|
+
id: target.id,
|
|
233
|
+
name: target.name,
|
|
234
|
+
type: target.type,
|
|
235
|
+
retainedSize: target.retainedSize,
|
|
236
|
+
selfSize: target.self_size,
|
|
237
|
+
// The target's real incoming edge is one of the elided middle
|
|
238
|
+
// nodes' edges and isn't available here. `items[last].edgeName`
|
|
239
|
+
// is the edge into the FIRST elided node, not into the target, so
|
|
240
|
+
// using it would misattribute an unrelated property to the target.
|
|
241
|
+
// Leave it undefined so no bogus `└─ .prop →` label is rendered.
|
|
242
|
+
edgeName: undefined,
|
|
243
|
+
collapsedBefore: fullLength - max_depth,
|
|
244
|
+
});
|
|
168
245
|
}
|
|
246
|
+
// Fold runs of identical hops (linked lists / intrusive chains)
|
|
247
|
+
// unless the caller explicitly asked to see every node.
|
|
248
|
+
lines.push(formatRetainerTree(expand ? treeSteps : collapseRepeatedRuns(treeSteps), { showSizes: true }));
|
|
169
249
|
}
|
|
170
250
|
else {
|
|
171
251
|
// Compact inline chain format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retainer-trace.js","sourceRoot":"","sources":["../../src/tools/retainer-trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"retainer-trace.js","sourceRoot":"","sources":["../../src/tools/retainer-trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-nodes.d.ts","sourceRoot":"","sources":["../../src/tools/search-nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAavE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"search-nodes.d.ts","sourceRoot":"","sources":["../../src/tools/search-nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAavE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwG3D"}
|
|
@@ -55,7 +55,11 @@ export function registerSearchNodes(server) {
|
|
|
55
55
|
.describe('Wall-clock budget for the full-heap scan (default 45000). On very large browser heaps, returns partial results with a note instead of hanging.'),
|
|
56
56
|
}, async ({ name_pattern, type, min_retained_size, min_self_size, is_detached, output_mode, offset, limit, timeout_ms, }) => {
|
|
57
57
|
try {
|
|
58
|
-
|
|
58
|
+
// A retained-size FILTER needs the dominator pass; without it the scan
|
|
59
|
+
// is name/type/self-size only, which a light load fully supports.
|
|
60
|
+
const snapshot = getSnapshot({
|
|
61
|
+
allowLight: min_retained_size == null,
|
|
62
|
+
});
|
|
59
63
|
const nameRegex = name_pattern ? new RegExp(name_pattern, 'i') : null;
|
|
60
64
|
const effectiveLimit = output_mode === 'ids' ? Math.min(limit, 10000) : Math.min(limit, 500);
|
|
61
65
|
const filter = (node) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-nodes.js","sourceRoot":"","sources":["../../src/tools/search-nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACL,UAAU,EACV,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,iPAAiP;QAC/O,iJAAiJ,EACnJ;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2CAA2C,CAAC;QACxD,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,yGAAyG,CAC1G;QACH,iBAAiB,EAAE,CAAC;aACjB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,sCAAsC,CAAC;QACnD,WAAW,EAAE,CAAC;aACX,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,WAAW,EAAE,CAAC;aACX,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;aAC9B,QAAQ,EAAE;aACV,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CACP,8HAA8H,CAC/H;QACH,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,2CAA2C,CAAC;QACxD,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CACP,kEAAkE,CACnE;QACH,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,gJAAgJ,CACjJ;KACJ,EACD,KAAK,EAAE,EACL,YAAY,EACZ,IAAI,EACJ,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,MAAM,EACN,KAAK,EACL,UAAU,GACX,EAAE,EAAE;QACH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"search-nodes.js","sourceRoot":"","sources":["../../src/tools/search-nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-strings.d.ts","sourceRoot":"","sources":["../../src/tools/search-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAWvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"search-strings.d.ts","sourceRoot":"","sources":["../../src/tools/search-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAWvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0Q7D"}
|
|
@@ -8,13 +8,15 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
-
import { getSnapshot } from '../heap-state.js';
|
|
11
|
+
import { getSnapshot, isLightSnapshot } from '../heap-state.js';
|
|
12
12
|
import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
13
|
export function registerSearchStrings(server) {
|
|
14
14
|
server.tool('memlab_search_strings', 'Search the content (stringValue) of all string nodes in the heap snapshot. ' +
|
|
15
15
|
'Unlike memlab_search_nodes which searches by node name/class, this searches the ' +
|
|
16
16
|
'actual text content of strings. Essential for finding string constants (error messages, ' +
|
|
17
17
|
'event names, config keys, URLs) and tracing them back to their origin. ' +
|
|
18
|
+
'Scope, because the two are easy to confuse: this sees ONLY the values of heap string nodes. ' +
|
|
19
|
+
"Class and constructor names (what memlab_class_histogram and memlab_search_nodes report) live in the snapshot name table and are NOT string nodes, so a class name will not be found here no matter how many instances exist — the result says so and points at the right tool when the pattern matches node names. Sliced strings are also skipped, since they share a parent string's storage. " +
|
|
18
20
|
'Supports exact substring match and regex patterns. ' +
|
|
19
21
|
"⚠ Full-heap scan over every string's content — slow on very large heaps (millions of nodes); use a specific pattern and a small limit.", {
|
|
20
22
|
pattern: z
|
|
@@ -42,7 +44,8 @@ export function registerSearchStrings(server) {
|
|
|
42
44
|
.describe('Show which objects reference each matching string (default true). Disable for faster results when you only need the string values.'),
|
|
43
45
|
}, async ({ pattern, limit, min_length, max_length, show_referrers }) => {
|
|
44
46
|
try {
|
|
45
|
-
const snapshot = getSnapshot();
|
|
47
|
+
const snapshot = getSnapshot({ allowLight: true });
|
|
48
|
+
const light = isLightSnapshot();
|
|
46
49
|
let regex = null;
|
|
47
50
|
let substring = null;
|
|
48
51
|
if (pattern.startsWith('/') && pattern.lastIndexOf('/') > 0) {
|
|
@@ -57,11 +60,37 @@ export function registerSearchStrings(server) {
|
|
|
57
60
|
const matches = [];
|
|
58
61
|
let scannedCount = 0;
|
|
59
62
|
let totalStringNodes = 0;
|
|
63
|
+
// Nodes whose NAME matches the pattern. A class/constructor name (e.g.
|
|
64
|
+
// `ChatstateCollection`) lives in the snapshot's name table, not as a
|
|
65
|
+
// heap string node, so it is invisible to a string-VALUE search: a real
|
|
66
|
+
// investigation saw 226 nodes named `*chatstate*` next to 5 matching
|
|
67
|
+
// string values and read the gap as a parser bug. Counted in the same
|
|
68
|
+
// pass so the cross-check costs nothing, and reported so the caller is
|
|
69
|
+
// pointed at memlab_search_nodes instead of concluding the data is
|
|
70
|
+
// missing.
|
|
71
|
+
let nameMatchCount = 0;
|
|
72
|
+
const nameMatchExamples = [];
|
|
73
|
+
const matchesText = (v) => regex
|
|
74
|
+
? regex.test(v)
|
|
75
|
+
: substring != null
|
|
76
|
+
? v.includes(substring)
|
|
77
|
+
: false;
|
|
60
78
|
snapshot.nodes.forEach(node => {
|
|
61
79
|
if (node.id <= 3)
|
|
62
80
|
return;
|
|
63
|
-
if (!node.isString)
|
|
81
|
+
if (!node.isString) {
|
|
82
|
+
if (matchesText(node.name)) {
|
|
83
|
+
nameMatchCount++;
|
|
84
|
+
if (nameMatchExamples.length < 3) {
|
|
85
|
+
nameMatchExamples.push({
|
|
86
|
+
id: node.id,
|
|
87
|
+
name: node.name,
|
|
88
|
+
type: node.type,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
64
92
|
return;
|
|
93
|
+
}
|
|
65
94
|
totalStringNodes++;
|
|
66
95
|
const strNode = node.toStringNode();
|
|
67
96
|
if (!strNode)
|
|
@@ -81,7 +110,10 @@ export function registerSearchStrings(server) {
|
|
|
81
110
|
}
|
|
82
111
|
if (!isMatch)
|
|
83
112
|
return;
|
|
84
|
-
|
|
113
|
+
// A light load has no retained sizes, so ranking by them would sort
|
|
114
|
+
// every match to a tie and silently return scan order instead of the
|
|
115
|
+
// heaviest strings. Fall back to self size, which is always present.
|
|
116
|
+
const size = light ? node.self_size : node.retainedSize;
|
|
85
117
|
let inserted = false;
|
|
86
118
|
for (let i = 0; i < matches.length; i++) {
|
|
87
119
|
if (size > matches[i].retainedSize) {
|
|
@@ -110,6 +142,11 @@ export function registerSearchStrings(server) {
|
|
|
110
142
|
matches.length = limit;
|
|
111
143
|
});
|
|
112
144
|
const patternDesc = regex ? `regex ${pattern}` : `"${pattern}"`;
|
|
145
|
+
const nameMatchNote = nameMatchCount > 0
|
|
146
|
+
? `\n\n> \u2139\ufe0f **${formatNumber(nameMatchCount)} non-string node(s) also match ${patternDesc} in their NAME** (e.g. ${nameMatchExamples
|
|
147
|
+
.map(e => `@${e.id} \`${e.name.length > 40 ? e.name.slice(0, 37) + '\u2026' : e.name}\` (${e.type})`)
|
|
148
|
+
.join(', ')}). This tool searches string VALUES only; class and constructor names live in the snapshot's name table, not in heap string nodes, so they never appear above. Search those with \`memlab_search_nodes({name_pattern: ...})\` or \`memlab_class_histogram\`.`
|
|
149
|
+
: '';
|
|
113
150
|
if (matches.length === 0) {
|
|
114
151
|
return toolResult(`No strings matching ${patternDesc} found.\n\n` +
|
|
115
152
|
`Scanned ${formatNumber(scannedCount)} of ${formatNumber(totalStringNodes)} string nodes` +
|
|
@@ -119,14 +156,21 @@ export function registerSearchStrings(server) {
|
|
|
119
156
|
'- Use a shorter or less specific pattern\n' +
|
|
120
157
|
'- Use regex for flexible matching: `/partial.*match/i`\n' +
|
|
121
158
|
'- Remove min_length/max_length filters\n' +
|
|
122
|
-
'- Use `memlab_duplicated_strings` if looking for repeated strings'
|
|
159
|
+
'- Use `memlab_duplicated_strings` if looking for repeated strings' +
|
|
160
|
+
nameMatchNote);
|
|
123
161
|
}
|
|
124
162
|
const lines = [
|
|
125
163
|
`## String Content Search`,
|
|
126
164
|
`Found ${formatNumber(matches.length)} string(s) matching ${patternDesc} (scanned ${formatNumber(scannedCount)} of ${formatNumber(totalStringNodes)} string nodes)`,
|
|
127
165
|
'',
|
|
128
166
|
];
|
|
129
|
-
const headers = [
|
|
167
|
+
const headers = [
|
|
168
|
+
'ID',
|
|
169
|
+
'Preview',
|
|
170
|
+
'Length',
|
|
171
|
+
'Self Size',
|
|
172
|
+
light ? 'Retained (n/a)' : 'Retained',
|
|
173
|
+
];
|
|
130
174
|
const rightCols = new Set([2, 3, 4]);
|
|
131
175
|
const rows = matches.map(m => {
|
|
132
176
|
const preview = m.stringValue.length > 80
|
|
@@ -137,7 +181,7 @@ export function registerSearchStrings(server) {
|
|
|
137
181
|
`"${preview.replace(/\n/g, '\\n').replace(/\|/g, '\\|')}"`,
|
|
138
182
|
formatNumber(m.stringValue.length),
|
|
139
183
|
formatBytes(m.selfSize),
|
|
140
|
-
formatBytes(m.retainedSize),
|
|
184
|
+
light ? 'n/a (light)' : formatBytes(m.retainedSize),
|
|
141
185
|
];
|
|
142
186
|
});
|
|
143
187
|
lines.push(markdownTable(headers, rows, rightCols));
|
|
@@ -166,6 +210,8 @@ export function registerSearchStrings(server) {
|
|
|
166
210
|
}
|
|
167
211
|
}
|
|
168
212
|
}
|
|
213
|
+
if (nameMatchNote)
|
|
214
|
+
lines.push(nameMatchNote);
|
|
169
215
|
lines.push('');
|
|
170
216
|
lines.push('**Suggested next steps:**');
|
|
171
217
|
const top = matches[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-strings.js","sourceRoot":"","sources":["../../src/tools/search-strings.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":"search-strings.js","sourceRoot":"","sources":["../../src/tools/search-strings.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,54 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
import { type ArtifactKind } from '../artifact-classes.js';
|
|
12
|
+
interface ClassStats {
|
|
13
|
+
count: number;
|
|
14
|
+
selfSize: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function normalizeClassName(name: string): string;
|
|
17
|
+
type Trend = 'monotonic-up' | 'monotonic-down' | 'grew-net' | 'flat-or-mixed';
|
|
18
|
+
export interface SequenceStep {
|
|
19
|
+
label: string;
|
|
20
|
+
localPath: string;
|
|
21
|
+
hist: Map<string, ClassStats>;
|
|
22
|
+
nodeCount: number;
|
|
23
|
+
totalSize: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SequenceRow {
|
|
26
|
+
key: string;
|
|
27
|
+
type: string;
|
|
28
|
+
name: string;
|
|
29
|
+
counts: number[];
|
|
30
|
+
netCount: number;
|
|
31
|
+
netSize: number;
|
|
32
|
+
trend: Trend;
|
|
33
|
+
artifact: ArtifactKind | null;
|
|
34
|
+
}
|
|
35
|
+
export interface SequenceTrends {
|
|
36
|
+
steps: SequenceStep[];
|
|
37
|
+
rows: SequenceRow[];
|
|
38
|
+
keys: Set<string>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load an ordered ladder of snapshots and compute per-class growth trends.
|
|
42
|
+
*
|
|
43
|
+
* Extracted from the `memlab_sequence_analysis` handler so it can be composed
|
|
44
|
+
* (see `memlab_leak_report`) instead of re-implemented: the loop that loads each
|
|
45
|
+
* rung, histograms it, and drops the graph before the next is both the expensive
|
|
46
|
+
* part and the part that is easy to get subtly wrong (resolution, size guard,
|
|
47
|
+
* one-graph-resident-at-a-time).
|
|
48
|
+
*
|
|
49
|
+
* Failures THROW rather than returning an MCP error envelope — the callers are
|
|
50
|
+
* tool handlers that already wrap their body in try/catch, and a composed caller
|
|
51
|
+
* needs a failure it cannot accidentally treat as a result.
|
|
52
|
+
*/
|
|
53
|
+
export declare function computeSequenceTrends(paths: string[], opts: {
|
|
54
|
+
minGrowthCount: number;
|
|
55
|
+
monotonicOnly?: boolean;
|
|
56
|
+
maxFileSizeMB?: number;
|
|
57
|
+
toolName?: string;
|
|
58
|
+
}): Promise<SequenceTrends>;
|
|
11
59
|
export declare function registerSequenceAnalysis(server: McpServer): void;
|
|
60
|
+
export {};
|
|
12
61
|
//# sourceMappingURL=sequence-analysis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sequence-analysis.d.ts","sourceRoot":"","sources":["../../src/tools/sequence-analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"sequence-analysis.d.ts","sourceRoot":"","sources":["../../src/tools/sequence-analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAqBvE,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,wBAAwB,CAAC;AAGhC,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkBD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AA0BD,KAAK,KAAK,GAAG,cAAc,GAAG,gBAAgB,GAAG,UAAU,GAAG,eAAe,CAAC;AAgB9E,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IAGd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IAItB,IAAI,EAAE,WAAW,EAAE,CAAC;IAEpB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE;IACJ,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,OAAO,CAAC,cAAc,CAAC,CAyGzB;AAkBD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsShE"}
|