@memlab/mcp-server 2.0.2 → 2.1.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 +23 -13
- package/bin/memlab-mcp.js +9 -0
- 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 +29 -2
- 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
|
@@ -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 { getSnapshot, getSnapshotEnv } from '../heap-state.js';
|
|
11
|
+
import { formatBytes, formatNumber, errorResult, toolResult } from '../utils.js';
|
|
12
|
+
export function registerCheckHealth(server) {
|
|
13
|
+
server.tool('memlab_check_health', 'Run all heuristic health checks in one call and return a prioritized list of findings. This is the recommended first step after loading a snapshot — it replaces calling 4-5 individual tools to triage.', {}, async () => {
|
|
14
|
+
try {
|
|
15
|
+
const snapshot = getSnapshot();
|
|
16
|
+
const env = getSnapshotEnv();
|
|
17
|
+
const findings = [];
|
|
18
|
+
let totalSize = 0;
|
|
19
|
+
let totalStringSize = 0;
|
|
20
|
+
let detachedCount = 0;
|
|
21
|
+
const classCounts = new Map();
|
|
22
|
+
const stringCounts = new Map();
|
|
23
|
+
let largestObjId = 0;
|
|
24
|
+
let largestObjName = '';
|
|
25
|
+
let largestObjSize = 0;
|
|
26
|
+
let largestObjType = '';
|
|
27
|
+
snapshot.nodes.forEach(node => {
|
|
28
|
+
if (node.id <= 3)
|
|
29
|
+
return;
|
|
30
|
+
totalSize += node.self_size;
|
|
31
|
+
if (node.type === 'string') {
|
|
32
|
+
totalStringSize += node.self_size;
|
|
33
|
+
if (node.name !== 'system / SlicedString') {
|
|
34
|
+
const key = node.name.length > 100 ? node.name.slice(0, 100) : node.name;
|
|
35
|
+
const entry = stringCounts.get(key);
|
|
36
|
+
if (entry) {
|
|
37
|
+
entry.count++;
|
|
38
|
+
entry.totalSize += node.retainedSize;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
stringCounts.set(key, { count: 1, totalSize: node.retainedSize });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if ((node.type === 'object' ||
|
|
46
|
+
node.type === 'closure' ||
|
|
47
|
+
node.type === 'regexp') &&
|
|
48
|
+
node.retainedSize > largestObjSize) {
|
|
49
|
+
largestObjId = node.id;
|
|
50
|
+
largestObjName = node.name;
|
|
51
|
+
largestObjSize = node.retainedSize;
|
|
52
|
+
largestObjType = node.type;
|
|
53
|
+
}
|
|
54
|
+
if (env !== 'node') {
|
|
55
|
+
if (node.is_detached || node.name.startsWith('Detached ')) {
|
|
56
|
+
detachedCount++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (node.type !== 'hidden' && node.type !== 'array') {
|
|
60
|
+
classCounts.set(node.name, (classCounts.get(node.name) ?? 0) + 1);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
// Check 1: Single object retaining >5% of heap
|
|
64
|
+
if (totalSize > 0 && largestObjSize >= totalSize * 0.05) {
|
|
65
|
+
const pct = ((largestObjSize / totalSize) * 100).toFixed(0);
|
|
66
|
+
const sev = largestObjSize >= totalSize * 0.3 ? 'critical' : 'warning';
|
|
67
|
+
findings.push({
|
|
68
|
+
severity: sev,
|
|
69
|
+
title: `Single object retains ${pct}% of heap`,
|
|
70
|
+
detail: `@${largestObjId} \`${largestObjName}\` (${largestObjType}) retains ${formatBytes(largestObjSize)}`,
|
|
71
|
+
next_step: `memlab_retainer_trace with node_id ${largestObjId}`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Check 2: String bytes > 30% of heap
|
|
75
|
+
if (totalSize > 0 && totalStringSize >= totalSize * 0.3) {
|
|
76
|
+
const pct = ((totalStringSize / totalSize) * 100).toFixed(0);
|
|
77
|
+
findings.push({
|
|
78
|
+
severity: 'warning',
|
|
79
|
+
title: `Strings consume ${pct}% of heap (${formatBytes(totalStringSize)})`,
|
|
80
|
+
detail: 'High string memory usage may indicate duplicated strings, large JSON payloads, or template strings',
|
|
81
|
+
next_step: 'memlab_duplicated_strings followed by memlab_string_patterns',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// Check 3: Heavily duplicated strings (>5 MB total)
|
|
85
|
+
const heavyDups = [...stringCounts.entries()]
|
|
86
|
+
.filter(([, s]) => s.count >= 100 && s.totalSize >= 5 * 1024 * 1024)
|
|
87
|
+
.sort((a, b) => b[1].totalSize - a[1].totalSize)
|
|
88
|
+
.slice(0, 3);
|
|
89
|
+
for (const [val, stats] of heavyDups) {
|
|
90
|
+
const display = val.length > 50 ? val.slice(0, 50) + '...' : val;
|
|
91
|
+
findings.push({
|
|
92
|
+
severity: 'warning',
|
|
93
|
+
title: `"${display}" duplicated ${formatNumber(stats.count)} times`,
|
|
94
|
+
detail: `Total retained: ${formatBytes(stats.totalSize)}`,
|
|
95
|
+
next_step: 'memlab_duplicated_strings then memlab_retainer_summary with class_name "string"',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// Check 4: Detached DOM (browser only)
|
|
99
|
+
if (env !== 'node' && detachedCount > 0) {
|
|
100
|
+
const sev = detachedCount >= 100 ? 'warning' : 'info';
|
|
101
|
+
findings.push({
|
|
102
|
+
severity: sev,
|
|
103
|
+
title: `${formatNumber(detachedCount)} detached DOM node(s)`,
|
|
104
|
+
detail: 'Detached DOM elements still retained in memory',
|
|
105
|
+
next_step: 'memlab_detached_dom',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Check 5: Subscription/listener accumulation
|
|
109
|
+
const listenerKeywords = new Set([
|
|
110
|
+
'callback',
|
|
111
|
+
'handler',
|
|
112
|
+
'listener',
|
|
113
|
+
'fn',
|
|
114
|
+
]);
|
|
115
|
+
const contextKeywords = new Set([
|
|
116
|
+
'context',
|
|
117
|
+
'ctx',
|
|
118
|
+
'this',
|
|
119
|
+
'target',
|
|
120
|
+
'scope',
|
|
121
|
+
]);
|
|
122
|
+
const shapeAccum = new Map();
|
|
123
|
+
snapshot.nodes.forEach(node => {
|
|
124
|
+
if (node.type !== 'object' || node.id <= 3)
|
|
125
|
+
return;
|
|
126
|
+
if (node.name !== 'Object')
|
|
127
|
+
return;
|
|
128
|
+
const names = [];
|
|
129
|
+
for (const edge of node.references) {
|
|
130
|
+
if (edge.type === 'property') {
|
|
131
|
+
names.push(String(edge.name_or_index));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (names.length === 0 || names.length > 10)
|
|
135
|
+
return;
|
|
136
|
+
const hasListener = names.some(n => listenerKeywords.has(n) || n.startsWith('on'));
|
|
137
|
+
const hasContext = names.some(n => contextKeywords.has(n));
|
|
138
|
+
if (!hasListener || !hasContext)
|
|
139
|
+
return;
|
|
140
|
+
names.sort();
|
|
141
|
+
const key = names.join(',');
|
|
142
|
+
const existing = shapeAccum.get(key);
|
|
143
|
+
if (existing) {
|
|
144
|
+
existing.count++;
|
|
145
|
+
existing.totalSelfSize += node.self_size;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
shapeAccum.set(key, {
|
|
149
|
+
count: 1,
|
|
150
|
+
totalSelfSize: node.self_size,
|
|
151
|
+
exampleId: node.id,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
for (const [shape, stats] of shapeAccum) {
|
|
156
|
+
if (stats.count < 100000)
|
|
157
|
+
continue;
|
|
158
|
+
const sev = stats.totalSelfSize >= totalSize * 0.1
|
|
159
|
+
? 'critical'
|
|
160
|
+
: stats.totalSelfSize >= totalSize * 0.05
|
|
161
|
+
? 'warning'
|
|
162
|
+
: 'info';
|
|
163
|
+
findings.push({
|
|
164
|
+
severity: sev,
|
|
165
|
+
title: `${formatNumber(stats.count)} listener/subscription objects with shape {${shape}}`,
|
|
166
|
+
detail: `Total self size: ${formatBytes(stats.totalSelfSize)}. These objects have callback/handler + context properties, suggesting event listener or subscription registrations that are accumulating.`,
|
|
167
|
+
next_step: `memlab_retainer_summary with node_ids [${stats.exampleId}] to trace the retention pattern`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Check 6: Repeated Error accumulation
|
|
171
|
+
const errorNames = new Set([
|
|
172
|
+
'Error',
|
|
173
|
+
'SyntaxError',
|
|
174
|
+
'TypeError',
|
|
175
|
+
'ReferenceError',
|
|
176
|
+
'RangeError',
|
|
177
|
+
'URIError',
|
|
178
|
+
'EvalError',
|
|
179
|
+
'AggregateError',
|
|
180
|
+
]);
|
|
181
|
+
const errorMessages = new Map();
|
|
182
|
+
snapshot.nodes.forEach(node => {
|
|
183
|
+
if (node.type !== 'object' || node.id <= 3)
|
|
184
|
+
return;
|
|
185
|
+
if (!errorNames.has(node.name))
|
|
186
|
+
return;
|
|
187
|
+
for (const edge of node.references) {
|
|
188
|
+
if (String(edge.name_or_index) === 'message' &&
|
|
189
|
+
edge.toNode.isString) {
|
|
190
|
+
const strNode = edge.toNode.toStringNode();
|
|
191
|
+
if (!strNode)
|
|
192
|
+
break;
|
|
193
|
+
const msg = strNode.stringValue;
|
|
194
|
+
const key = `${node.name}::${msg}`;
|
|
195
|
+
const existing = errorMessages.get(key);
|
|
196
|
+
if (existing) {
|
|
197
|
+
existing.count++;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
errorMessages.set(key, {
|
|
201
|
+
count: 1,
|
|
202
|
+
errorType: node.name,
|
|
203
|
+
exampleId: node.id,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
for (const [, stats] of errorMessages) {
|
|
211
|
+
if (stats.count < 50)
|
|
212
|
+
continue;
|
|
213
|
+
findings.push({
|
|
214
|
+
severity: stats.count >= 500 ? 'warning' : 'info',
|
|
215
|
+
title: `${formatNumber(stats.count)} identical \`${stats.errorType}\` instances`,
|
|
216
|
+
detail: 'Repeated identical error objects suggest a module failing to load or a retry loop',
|
|
217
|
+
next_step: `memlab_get_node with node_id ${stats.exampleId} to inspect the error, then memlab_retainer_trace to find where it's created`,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// Check 7: Classes with >10,000 instances
|
|
221
|
+
const anomalousClasses = [...classCounts.entries()]
|
|
222
|
+
.filter(([, count]) => count >= 10000)
|
|
223
|
+
.sort((a, b) => b[1] - a[1])
|
|
224
|
+
.slice(0, 5);
|
|
225
|
+
for (const [name, count] of anomalousClasses) {
|
|
226
|
+
findings.push({
|
|
227
|
+
severity: 'warning',
|
|
228
|
+
title: `${formatNumber(count)} instances of \`${name}\``,
|
|
229
|
+
detail: 'Unusually high instance count may indicate accumulation or a leak',
|
|
230
|
+
next_step: `memlab_retainer_summary with class_name "${name}"`,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// Check 8: Retained module source code
|
|
234
|
+
let moduleSourceSize = 0;
|
|
235
|
+
let moduleSourceCount = 0;
|
|
236
|
+
snapshot.nodes.forEach(node => {
|
|
237
|
+
if (node.id <= 3)
|
|
238
|
+
return;
|
|
239
|
+
if (node.type !== 'string' && node.name !== 'system / ExternalString')
|
|
240
|
+
return;
|
|
241
|
+
if (node.self_size < 1024)
|
|
242
|
+
return;
|
|
243
|
+
const strNode = node.toStringNode();
|
|
244
|
+
if (!strNode)
|
|
245
|
+
return;
|
|
246
|
+
const val = strNode.stringValue;
|
|
247
|
+
if (val.includes('__d(') ||
|
|
248
|
+
val.includes('define(') ||
|
|
249
|
+
(val.includes('function(') && val.includes('module'))) {
|
|
250
|
+
moduleSourceSize += node.self_size;
|
|
251
|
+
moduleSourceCount++;
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
if (totalSize > 0 && moduleSourceSize >= 10 * 1024 * 1024) {
|
|
255
|
+
const pct = ((moduleSourceSize / totalSize) * 100).toFixed(1);
|
|
256
|
+
findings.push({
|
|
257
|
+
severity: moduleSourceSize >= totalSize * 0.1 ? 'warning' : 'info',
|
|
258
|
+
title: `${formatBytes(moduleSourceSize)} of retained module source code (${pct}% of heap)`,
|
|
259
|
+
detail: `${formatNumber(moduleSourceCount)} string(s) containing JS module source (__d(), define(), function(module)). These are bundled source text retained after evaluation.`,
|
|
260
|
+
next_step: 'memlab_string_patterns to identify which modules are retained, then check if source can be released after evaluation',
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
// Sort by severity
|
|
264
|
+
const severityOrder = {
|
|
265
|
+
critical: 0,
|
|
266
|
+
warning: 1,
|
|
267
|
+
info: 2,
|
|
268
|
+
};
|
|
269
|
+
findings.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
270
|
+
if (findings.length === 0) {
|
|
271
|
+
return toolResult('No health issues detected. The heap looks healthy.\n\n' +
|
|
272
|
+
'For deeper analysis, try `memlab_class_histogram` or `memlab_largest_objects`.');
|
|
273
|
+
}
|
|
274
|
+
const icons = {
|
|
275
|
+
critical: '🔴',
|
|
276
|
+
warning: '🟡',
|
|
277
|
+
info: '🔵',
|
|
278
|
+
};
|
|
279
|
+
const lines = findings.map((f, i) => `${i + 1}. ${icons[f.severity]} **${f.title}**\n` +
|
|
280
|
+
` ${f.detail}\n` +
|
|
281
|
+
` → Next: \`${f.next_step}\``);
|
|
282
|
+
return toolResult(`# Health Check: ${findings.length} finding(s)\n\n${lines.join('\n\n')}`);
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
return errorResult(err);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=check-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-health.js","sourceRoot":"","sources":["../../src/tools/check-health.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AAW/E,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,0MAA0M,EAC1M,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAc,EAAE,CAAC;YAE/B,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,EAGzB,CAAC;YAEJ,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,cAAc,GAAG,EAAE,CAAC;YACxB,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,cAAc,GAAG,EAAE,CAAC;YAExB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;oBAAE,OAAO;gBACzB,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;gBAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3B,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC;oBAClC,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;wBAC1C,MAAM,GAAG,GACP,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACpC,IAAI,KAAK,EAAE,CAAC;4BACV,KAAK,CAAC,KAAK,EAAE,CAAC;4BACd,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;wBACvC,CAAC;6BAAM,CAAC;4BACN,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,EAAC,CAAC,CAAC;wBAClE,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ;oBACrB,IAAI,CAAC,IAAI,KAAK,SAAS;oBACvB,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;oBACzB,IAAI,CAAC,YAAY,GAAG,cAAc,EAClC,CAAC;oBACD,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;oBACvB,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC;oBAC3B,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC;oBACnC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC7B,CAAC;gBAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC1D,aAAa,EAAE,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACpD,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,+CAA+C;YAC/C,IAAI,SAAS,GAAG,CAAC,IAAI,cAAc,IAAI,SAAS,GAAG,IAAI,EAAE,CAAC;gBACxD,MAAM,GAAG,GAAG,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,GAAG,GACP,cAAc,IAAI,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,GAAG;oBACb,KAAK,EAAE,yBAAyB,GAAG,WAAW;oBAC9C,MAAM,EAAE,IAAI,YAAY,MAAM,cAAc,OAAO,cAAc,aAAa,WAAW,CAAC,cAAc,CAAC,EAAE;oBAC3G,SAAS,EAAE,sCAAsC,YAAY,EAAE;iBAChE,CAAC,CAAC;YACL,CAAC;YAED,sCAAsC;YACtC,IAAI,SAAS,GAAG,CAAC,IAAI,eAAe,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;gBACxD,MAAM,GAAG,GAAG,CAAC,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7D,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE,mBAAmB,GAAG,cAAc,WAAW,CAAC,eAAe,CAAC,GAAG;oBAC1E,MAAM,EACJ,oGAAoG;oBACtG,SAAS,EACP,8DAA8D;iBACjE,CAAC,CAAC;YACL,CAAC;YAED,oDAAoD;YACpD,MAAM,SAAS,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;iBAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;iBACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;iBAC/C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACjE,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE,IAAI,OAAO,gBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ;oBACnE,MAAM,EAAE,mBAAmB,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;oBACzD,SAAS,EACP,iFAAiF;iBACpF,CAAC,CAAC;YACL,CAAC;YAED,uCAAuC;YACvC,IAAI,GAAG,KAAK,MAAM,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAa,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChE,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,GAAG;oBACb,KAAK,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC,uBAAuB;oBAC5D,MAAM,EAAE,gDAAgD;oBACxD,SAAS,EAAE,qBAAqB;iBACjC,CAAC,CAAC;YACL,CAAC;YAED,8CAA8C;YAC9C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;gBAC/B,UAAU;gBACV,SAAS;gBACT,UAAU;gBACV,IAAI;aACL,CAAC,CAAC;YACH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;gBAC9B,SAAS;gBACT,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,OAAO;aACR,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAGvB,CAAC;YAEJ,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;oBAAE,OAAO;gBACnD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO;gBACnC,MAAM,KAAK,GAAa,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBAC7B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;gBACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;oBAAE,OAAO;gBACpD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CACnD,CAAC;gBACF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;oBAAE,OAAO;gBACxC,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACrC,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACjB,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE;wBAClB,KAAK,EAAE,CAAC;wBACR,aAAa,EAAE,IAAI,CAAC,SAAS;wBAC7B,SAAS,EAAE,IAAI,CAAC,EAAE;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM;oBAAE,SAAS;gBACnC,MAAM,GAAG,GACP,KAAK,CAAC,aAAa,IAAI,SAAS,GAAG,GAAG;oBACpC,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,SAAS,GAAG,IAAI;wBACvC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,MAAM,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,GAAG;oBACb,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,KAAK,GAAG;oBACzF,MAAM,EAAE,oBAAoB,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,4IAA4I;oBACxM,SAAS,EAAE,0CAA0C,KAAK,CAAC,SAAS,kCAAkC;iBACvG,CAAC,CAAC;YACL,CAAC;YAED,uCAAuC;YACvC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;gBACzB,OAAO;gBACP,aAAa;gBACb,WAAW;gBACX,gBAAgB;gBAChB,YAAY;gBACZ,UAAU;gBACV,WAAW;gBACX,gBAAgB;aACjB,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,GAAG,EAG1B,CAAC;YAEJ,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;oBAAE,OAAO;gBACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,OAAO;gBACvC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IACE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,SAAS;wBACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,CAAC;wBACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;wBAC3C,IAAI,CAAC,OAAO;4BAAE,MAAM;wBACpB,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;wBAChC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;wBACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACxC,IAAI,QAAQ,EAAE,CAAC;4BACb,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACnB,CAAC;6BAAM,CAAC;4BACN,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE;gCACrB,KAAK,EAAE,CAAC;gCACR,SAAS,EAAE,IAAI,CAAC,IAAI;gCACpB,SAAS,EAAE,IAAI,CAAC,EAAE;6BACnB,CAAC,CAAC;wBACL,CAAC;wBACD,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE,CAAC;gBACtC,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE;oBAAE,SAAS;gBAC/B,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;oBACjD,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,SAAS,cAAc;oBAChF,MAAM,EACJ,mFAAmF;oBACrF,SAAS,EAAE,gCAAgC,KAAK,CAAC,SAAS,8EAA8E;iBACzI,CAAC,CAAC;YACL,CAAC;YAED,0CAA0C;YAC1C,MAAM,gBAAgB,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;iBAChD,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC;iBACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,gBAAgB,EAAE,CAAC;gBAC7C,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,SAAS;oBACnB,KAAK,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,mBAAmB,IAAI,IAAI;oBACxD,MAAM,EACJ,mEAAmE;oBACrE,SAAS,EAAE,4CAA4C,IAAI,GAAG;iBAC/D,CAAC,CAAC;YACL,CAAC;YAED,uCAAuC;YACvC,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAE1B,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;oBAAE,OAAO;gBACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,yBAAyB;oBACnE,OAAO;gBACT,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI;oBAAE,OAAO;gBAClC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;gBAChC,IACE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACpB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACvB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EACrD,CAAC;oBACD,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC;oBACnC,iBAAiB,EAAE,CAAC;gBACtB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,SAAS,GAAG,CAAC,IAAI,gBAAgB,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBAC1D,MAAM,GAAG,GAAG,CAAC,CAAC,gBAAgB,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9D,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,gBAAgB,IAAI,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;oBAClE,KAAK,EAAE,GAAG,WAAW,CAAC,gBAAgB,CAAC,oCAAoC,GAAG,YAAY;oBAC1F,MAAM,EAAE,GAAG,YAAY,CAAC,iBAAiB,CAAC,sIAAsI;oBAChL,SAAS,EACP,sHAAsH;iBACzH,CAAC,CAAC;YACL,CAAC;YAED,mBAAmB;YACnB,MAAM,aAAa,GAA6B;gBAC9C,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,CAAC;aACR,CAAC;YACF,QAAQ,CAAC,IAAI,CACX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAChE,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,UAAU,CACf,wDAAwD;oBACtD,gFAAgF,CACnF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAA6B;gBACtC,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,IAAI;aACX,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CACxB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM;gBACjD,MAAM,CAAC,CAAC,MAAM,IAAI;gBAClB,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAClC,CAAC;YAEF,OAAO,UAAU,CACf,mBAAmB,QAAQ,CAAC,MAAM,kBAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACzE,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":"class-histogram.d.ts","sourceRoot":"","sources":["../../src/tools/class-histogram.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"class-histogram.d.ts","sourceRoot":"","sources":["../../src/tools/class-histogram.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAevE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgM9D"}
|
|
@@ -10,27 +10,41 @@
|
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import memlabCore from '@memlab/core';
|
|
12
12
|
const { utils, NumericSet } = memlabCore;
|
|
13
|
-
import { getSnapshot } from '../heap-state.js';
|
|
14
|
-
import { errorResult,
|
|
13
|
+
import { getSnapshot, getSnapshotMetadata } from '../heap-state.js';
|
|
14
|
+
import { errorResult, toolResult, formatBytes, formatNumber, markdownTable, truncateNodeName, } from '../utils.js';
|
|
15
15
|
export function registerClassHistogram(server) {
|
|
16
|
-
server.tool('memlab_class_histogram', 'Show instance count and total self size per constructor/class name, sorted by aggregate retained size (dominator-aware, no double-counting). Useful for identifying which types of objects dominate memory.', {
|
|
16
|
+
server.tool('memlab_class_histogram', 'Show instance count and total self size per constructor/class name, sorted by aggregate retained size (dominator-aware, no double-counting). Useful for identifying which types of objects dominate memory. Use min_count or min_retained_size to filter large histograms. Follow up with memlab_find_nodes_by_class to inspect specific classes, or memlab_retainer_trace on a sample node to see why objects are retained.', {
|
|
17
17
|
limit: z
|
|
18
18
|
.number()
|
|
19
19
|
.optional()
|
|
20
|
-
.default(
|
|
21
|
-
.describe('Maximum number of classes to return (default
|
|
20
|
+
.default(20)
|
|
21
|
+
.describe('Maximum number of classes to return (default 20)'),
|
|
22
22
|
min_count: z
|
|
23
23
|
.number()
|
|
24
24
|
.optional()
|
|
25
25
|
.default(1)
|
|
26
26
|
.describe('Minimum instance count to include (default 1)'),
|
|
27
|
+
min_retained_size: z
|
|
28
|
+
.number()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Minimum aggregate retained size in bytes to include. Use to filter to classes consuming significant memory (e.g., 1048576 for 1 MB).'),
|
|
31
|
+
min_self_size: z
|
|
32
|
+
.number()
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Minimum total self size in bytes to include.'),
|
|
27
35
|
node_type: z
|
|
28
36
|
.string()
|
|
29
37
|
.optional()
|
|
30
38
|
.describe('Filter by node type (e.g., "object", "closure", "string"). If omitted, all types are included.'),
|
|
31
|
-
|
|
39
|
+
suppress_suggestions: z
|
|
40
|
+
.boolean()
|
|
41
|
+
.optional()
|
|
42
|
+
.default(false)
|
|
43
|
+
.describe('Omit "Suggested next steps" boilerplate from the output to save tokens.'),
|
|
44
|
+
}, async ({ limit, min_count, min_retained_size, min_self_size, node_type, suppress_suggestions, }) => {
|
|
32
45
|
try {
|
|
33
46
|
const snapshot = getSnapshot();
|
|
47
|
+
const meta = getSnapshotMetadata();
|
|
34
48
|
const classMap = new Map();
|
|
35
49
|
snapshot.nodes.forEach(node => {
|
|
36
50
|
if (node_type && node.type !== node_type)
|
|
@@ -54,16 +68,28 @@ export function registerClassHistogram(server) {
|
|
|
54
68
|
});
|
|
55
69
|
}
|
|
56
70
|
});
|
|
57
|
-
// Filter by min_count first, then compute
|
|
58
|
-
// classes that pass
|
|
59
|
-
// on classes we'll discard anyway.
|
|
60
|
-
|
|
71
|
+
// Filter by min_count and min_self_size first, then compute
|
|
72
|
+
// retained sizes only for classes that pass to avoid expensive
|
|
73
|
+
// dominator walks on classes we'll discard anyway.
|
|
74
|
+
let filtered = [...classMap.entries()].filter(([, v]) => v.count >= min_count);
|
|
75
|
+
if (min_self_size != null) {
|
|
76
|
+
filtered = filtered.filter(([, v]) => v.total_self_size >= min_self_size);
|
|
77
|
+
}
|
|
61
78
|
// Compute dominator-aware aggregate retained size per class.
|
|
62
79
|
const withRetained = filtered.map(([key, v]) => {
|
|
63
80
|
const retainedSize = utils.aggregateDominatorMetrics(v.node_ids, snapshot, () => true, (node) => node.retainedSize);
|
|
64
81
|
return { key, ...v, retained_size: retainedSize };
|
|
65
82
|
});
|
|
66
|
-
|
|
83
|
+
// Apply min_retained_size filter after dominator walk
|
|
84
|
+
let afterRetainedFilter = withRetained;
|
|
85
|
+
if (min_retained_size != null) {
|
|
86
|
+
afterRetainedFilter = withRetained.filter(v => v.retained_size >= min_retained_size);
|
|
87
|
+
}
|
|
88
|
+
// Use total heap size as the denominator for cumulative % so it
|
|
89
|
+
// reflects each class's share of the entire heap, not just the
|
|
90
|
+
// filtered subset.
|
|
91
|
+
const totalRetainedAll = meta?.totalSize ?? 0;
|
|
92
|
+
const sorted = afterRetainedFilter
|
|
67
93
|
.sort((a, b) => b.retained_size - a.retained_size)
|
|
68
94
|
.slice(0, limit);
|
|
69
95
|
const headers = [
|
|
@@ -72,19 +98,49 @@ export function registerClassHistogram(server) {
|
|
|
72
98
|
'Count',
|
|
73
99
|
'Self Size',
|
|
74
100
|
'Retained Size',
|
|
101
|
+
'Cum %',
|
|
75
102
|
];
|
|
76
|
-
const rightCols = new Set([2, 3, 4]);
|
|
103
|
+
const rightCols = new Set([2, 3, 4, 5]);
|
|
104
|
+
let cumRetained = 0;
|
|
77
105
|
const rows = sorted.map(v => {
|
|
78
|
-
const
|
|
106
|
+
const rawName = v.key.split('::').slice(1).join('::');
|
|
107
|
+
const name = truncateNodeName(rawName, v.type, Math.round(v.total_self_size / v.count), 120);
|
|
108
|
+
cumRetained += v.retained_size;
|
|
109
|
+
const cumPct = totalRetainedAll > 0
|
|
110
|
+
? ((cumRetained / totalRetainedAll) * 100).toFixed(1) + '%'
|
|
111
|
+
: '-';
|
|
79
112
|
return [
|
|
80
113
|
name,
|
|
81
114
|
v.type,
|
|
82
115
|
formatNumber(v.count),
|
|
83
116
|
formatBytes(v.total_self_size),
|
|
84
117
|
formatBytes(v.retained_size),
|
|
118
|
+
cumPct,
|
|
85
119
|
];
|
|
86
120
|
});
|
|
87
|
-
|
|
121
|
+
const lines = [
|
|
122
|
+
`Class histogram (${formatNumber(classMap.size)} total classes, showing ${rows.length})`,
|
|
123
|
+
'',
|
|
124
|
+
markdownTable(headers, rows, rightCols),
|
|
125
|
+
];
|
|
126
|
+
if (!suppress_suggestions) {
|
|
127
|
+
const highCount = sorted.filter(v => v.count >= 1000);
|
|
128
|
+
if (highCount.length > 0) {
|
|
129
|
+
lines.push('', '**Suggested next steps:**');
|
|
130
|
+
for (const v of highCount.slice(0, 3)) {
|
|
131
|
+
const name = v.key.split('::').slice(1).join('::');
|
|
132
|
+
lines.push(`- ${formatNumber(v.count)} \`${name}\` instances — use \`memlab_find_nodes_by_class("${name}")\` to inspect, \`memlab_retainer_summary("${name}")\` to find common retainer patterns, or \`memlab_retainer_trace\` on a sample node`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const highStrings = sorted.filter(v => v.type === 'string' && v.count >= 100);
|
|
136
|
+
if (highStrings.length > 0) {
|
|
137
|
+
if (highCount.length === 0) {
|
|
138
|
+
lines.push('', '**Suggested next steps:**');
|
|
139
|
+
}
|
|
140
|
+
lines.push(`- High string duplication detected — use \`memlab_duplicated_strings\` to find the most-duplicated string values`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return toolResult(lines.join('\n'));
|
|
88
144
|
}
|
|
89
145
|
catch (err) {
|
|
90
146
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-histogram.js","sourceRoot":"","sources":["../../src/tools/class-histogram.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,EAAC,KAAK,EAAE,UAAU,EAAC,GAAG,UAAU,CAAC;AACvC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"class-histogram.js","sourceRoot":"","sources":["../../src/tools/class-histogram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closure-inspection.d.ts","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"closure-inspection.d.ts","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAcvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2HjE"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { errorResult,
|
|
12
|
+
import { errorResult, toolResult, formatBytes, formatNumber, formatNodeInline, markdownTable, } from '../utils.js';
|
|
13
13
|
export function registerClosureInspection(server) {
|
|
14
14
|
server.tool('memlab_closure_inspection', 'Inspect a closure (function) node to show its captured variables from the enclosing scope. Shows the function name, source location, and all context-bound variables with their types and sizes. Critical for diagnosing closure-based memory leaks where a function unintentionally retains large objects.', {
|
|
15
15
|
node_id: z
|
|
@@ -23,7 +23,7 @@ export function registerClosureInspection(server) {
|
|
|
23
23
|
return errorResult(`Node with id ${node_id} not found`);
|
|
24
24
|
}
|
|
25
25
|
if (node.type !== 'closure') {
|
|
26
|
-
return
|
|
26
|
+
return toolResult(`Node @${node_id} is not a closure (type is "${node.type}"). This tool is designed for closure nodes.`);
|
|
27
27
|
}
|
|
28
28
|
// Captured variables come via "context" type edges
|
|
29
29
|
const capturedVars = node.references
|
|
@@ -64,7 +64,7 @@ export function registerClosureInspection(server) {
|
|
|
64
64
|
: null;
|
|
65
65
|
const totalCapturedRetained = capturedVars.reduce((sum, v) => sum + v.retained_size, 0);
|
|
66
66
|
const lines = [
|
|
67
|
-
`**Closure:** ${formatNodeInline(node.id, node.name, node.type)}`,
|
|
67
|
+
`**Closure:** ${formatNodeInline(node.id, node.name, node.type, node.self_size)}`,
|
|
68
68
|
`**Self Size:** ${formatBytes(node.self_size)} | **Retained Size:** ${formatBytes(node.retainedSize)}`,
|
|
69
69
|
];
|
|
70
70
|
if (location) {
|
|
@@ -72,7 +72,7 @@ export function registerClosureInspection(server) {
|
|
|
72
72
|
}
|
|
73
73
|
if (contextEdge) {
|
|
74
74
|
const ctx = contextEdge.toNode;
|
|
75
|
-
lines.push(`**Scope Context:** ${formatNodeInline(ctx.id, ctx.name, ctx.type)}`);
|
|
75
|
+
lines.push(`**Scope Context:** ${formatNodeInline(ctx.id, ctx.name, ctx.type, ctx.self_size)}`);
|
|
76
76
|
}
|
|
77
77
|
if (sharedEdge) {
|
|
78
78
|
lines.push(`**Shared Function Info:** @${sharedEdge.toNode.id} ${sharedEdge.toNode.name}`);
|
|
@@ -97,7 +97,7 @@ export function registerClosureInspection(server) {
|
|
|
97
97
|
});
|
|
98
98
|
lines.push(markdownTable(headers, rows, rightCols));
|
|
99
99
|
}
|
|
100
|
-
return
|
|
100
|
+
return toolResult(lines.join('\n'));
|
|
101
101
|
}
|
|
102
102
|
catch (err) {
|
|
103
103
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closure-inspection.js","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAEL,WAAW,
|
|
1
|
+
{"version":3,"file":"closure-inspection.js","sourceRoot":"","sources":["../../src/tools/closure-inspection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detached-dom.d.ts","sourceRoot":"","sources":["../../src/tools/detached-dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"detached-dom.d.ts","sourceRoot":"","sources":["../../src/tools/detached-dom.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA4EvE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuK3D"}
|