@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,165 @@
|
|
|
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, markdownTable, truncateNodeName, errorResult, toolResult, } from '../utils.js';
|
|
13
|
+
// Globals installed by browser dev tools / extensions. Anything retained ONLY
|
|
14
|
+
// through one of these would be garbage-collected in production — it's a
|
|
15
|
+
// profiling artifact, not a real leak (Feedback round 2 §6).
|
|
16
|
+
const DEV_GLOBAL_EDGE_NAMES = new Set([
|
|
17
|
+
'__REACT_DEVTOOLS_GLOBAL_HOOK__',
|
|
18
|
+
'__REACT_DEVTOOLS_ATTACH__',
|
|
19
|
+
'__REDUX_DEVTOOLS_EXTENSION__',
|
|
20
|
+
'__REDUX_DEVTOOLS_EXTENSION_COMPAT__',
|
|
21
|
+
'__VUE_DEVTOOLS_GLOBAL_HOOK__',
|
|
22
|
+
'__MOBX_DEVTOOLS_GLOBAL_HOOK__',
|
|
23
|
+
'__APOLLO_DEVTOOLS_GLOBAL_HOOK__',
|
|
24
|
+
'__RECOIL_DEVTOOLS_EXTENSION__',
|
|
25
|
+
'Debug', // window.Debug — common debugging handle (e.g. WhatsApp Web)
|
|
26
|
+
]);
|
|
27
|
+
const DEV_NODE_NAME_RE = /__REACT_DEVTOOLS|DEVTOOLS_GLOBAL_HOOK|ReactDevTools/;
|
|
28
|
+
/**
|
|
29
|
+
* Find the dev/extension "root" objects: the targets of dev-global edges on
|
|
30
|
+
* the Window/global object, plus any node whose own name marks it as a
|
|
31
|
+
* devtools hook.
|
|
32
|
+
*/
|
|
33
|
+
export function collectDevRoots(snapshot) {
|
|
34
|
+
const byId = new Map();
|
|
35
|
+
snapshot.nodes.forEach(node => {
|
|
36
|
+
if (node.id <= 3)
|
|
37
|
+
return;
|
|
38
|
+
const isGlobal = node.name.startsWith('Window ') ||
|
|
39
|
+
node.name === 'global' ||
|
|
40
|
+
node.name === 'globalThis';
|
|
41
|
+
if (isGlobal) {
|
|
42
|
+
for (const edge of node.references) {
|
|
43
|
+
const eName = String(edge.name_or_index);
|
|
44
|
+
if (DEV_GLOBAL_EDGE_NAMES.has(eName) && edge.toNode.id > 3) {
|
|
45
|
+
byId.set(edge.toNode.id, eName);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (DEV_NODE_NAME_RE.test(node.name)) {
|
|
50
|
+
byId.set(node.id, node.name);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return { byId };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Classify whether a node is retained ONLY via a dev/extension global. We walk
|
|
57
|
+
* the dominator chain upward: if a dev root *dominates* the node, then every
|
|
58
|
+
* path from a GC root to the node passes through that dev object, so it would
|
|
59
|
+
* be collected in production. Using the dominator (not the shortest retainer)
|
|
60
|
+
* makes the "only via" claim rigorous.
|
|
61
|
+
*/
|
|
62
|
+
export function classifyDevOnly(node, devRoots, maxWalk = 1000) {
|
|
63
|
+
if (devRoots.byId.size === 0)
|
|
64
|
+
return { devOnly: false, via: null };
|
|
65
|
+
let cur = node.dominatorNode ?? null;
|
|
66
|
+
let steps = 0;
|
|
67
|
+
while (cur && steps < maxWalk) {
|
|
68
|
+
const via = devRoots.byId.get(cur.id);
|
|
69
|
+
if (via != null)
|
|
70
|
+
return { devOnly: true, via };
|
|
71
|
+
if (cur.dominatorNode?.id === cur.id)
|
|
72
|
+
break;
|
|
73
|
+
cur = cur.dominatorNode ?? null;
|
|
74
|
+
steps++;
|
|
75
|
+
}
|
|
76
|
+
return { devOnly: false, via: null };
|
|
77
|
+
}
|
|
78
|
+
export function registerDevArtifacts(server) {
|
|
79
|
+
server.tool('memlab_dev_artifacts', 'Classify large retainers as production-relevant vs. dev-only (browser snapshots). Flags any object retained ONLY through a dev/extension global (__REACT_DEVTOOLS_GLOBAL_HOOK__, __REDUX_DEVTOOLS_EXTENSION__, window.Debug, …) — these are profiling artifacts that would be garbage-collected in production and should not be counted as leaks. Reports total bytes attributable to dev artifacts so "241 MB leak!" headlines that are really DevTools retention get caught.', {
|
|
80
|
+
limit: z
|
|
81
|
+
.number()
|
|
82
|
+
.optional()
|
|
83
|
+
.default(25)
|
|
84
|
+
.describe('Maximum number of objects to classify (default 25).'),
|
|
85
|
+
min_retained_size: z
|
|
86
|
+
.number()
|
|
87
|
+
.optional()
|
|
88
|
+
.default(524288)
|
|
89
|
+
.describe('Only consider objects retaining at least this (default 512 KB).'),
|
|
90
|
+
only_dev: z
|
|
91
|
+
.boolean()
|
|
92
|
+
.optional()
|
|
93
|
+
.default(false)
|
|
94
|
+
.describe('Show only the dev-only artifacts (default false: show both, dev-only flagged).'),
|
|
95
|
+
}, async ({ limit, min_retained_size, only_dev }) => {
|
|
96
|
+
try {
|
|
97
|
+
const snapshot = getSnapshot();
|
|
98
|
+
const meta = getSnapshotMetadata();
|
|
99
|
+
const totalSize = meta?.totalSize ?? 0;
|
|
100
|
+
const devRoots = collectDevRoots(snapshot);
|
|
101
|
+
if (devRoots.byId.size === 0) {
|
|
102
|
+
return toolResult('No dev/extension globals (__REACT_DEVTOOLS_GLOBAL_HOOK__, __REDUX_DEVTOOLS_EXTENSION__, window.Debug, …) found in this snapshot. ' +
|
|
103
|
+
'Either this is a production/clean capture, or none were installed — large retainers here are NOT dev artifacts.');
|
|
104
|
+
}
|
|
105
|
+
const cands = [];
|
|
106
|
+
let devOnlyBytes = 0;
|
|
107
|
+
snapshot.nodes.forEach(node => {
|
|
108
|
+
if (node.id <= 3)
|
|
109
|
+
return;
|
|
110
|
+
if (node.retainedSize < min_retained_size)
|
|
111
|
+
return;
|
|
112
|
+
if (node.type !== 'object' &&
|
|
113
|
+
node.type !== 'closure' &&
|
|
114
|
+
node.type !== 'array')
|
|
115
|
+
return;
|
|
116
|
+
const { devOnly, via } = classifyDevOnly(node, devRoots);
|
|
117
|
+
if (devOnly)
|
|
118
|
+
devOnlyBytes += node.retainedSize;
|
|
119
|
+
if (only_dev && !devOnly)
|
|
120
|
+
return;
|
|
121
|
+
// keep top-N by retained size
|
|
122
|
+
const size = node.retainedSize;
|
|
123
|
+
let i = 0;
|
|
124
|
+
for (; i < cands.length; i++) {
|
|
125
|
+
if (size > cands[i].node.retainedSize)
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
cands.splice(i, 0, { node, devOnly, via });
|
|
129
|
+
if (cands.length > limit)
|
|
130
|
+
cands.length = limit;
|
|
131
|
+
});
|
|
132
|
+
const lines = [
|
|
133
|
+
'## Dev-only artifact classification',
|
|
134
|
+
'',
|
|
135
|
+
`Dev/extension globals present: ${[...new Set(devRoots.byId.values())].join(', ')}`,
|
|
136
|
+
`Total retained held ONLY via dev artifacts: **${formatBytes(devOnlyBytes)}**` +
|
|
137
|
+
(totalSize > 0
|
|
138
|
+
? ` (${Math.min(100, (devOnlyBytes / totalSize) * 100).toFixed(1)}% of heap — exclude from production leak totals)`
|
|
139
|
+
: ''),
|
|
140
|
+
'',
|
|
141
|
+
];
|
|
142
|
+
if (cands.length > 0) {
|
|
143
|
+
const headers = ['ID', 'Name', 'Type', 'Retained', 'Classification'];
|
|
144
|
+
const rightCols = new Set([3]);
|
|
145
|
+
const rows = cands.map(c => [
|
|
146
|
+
`@${c.node.id}`,
|
|
147
|
+
truncateNodeName(c.node.name, c.node.type, c.node.self_size, 40),
|
|
148
|
+
c.node.type,
|
|
149
|
+
formatBytes(c.node.retainedSize),
|
|
150
|
+
c.devOnly ? `dev-only (via ${c.via})` : 'production',
|
|
151
|
+
]);
|
|
152
|
+
lines.push(markdownTable(headers, rows, rightCols));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
lines.push('No objects matched the size threshold.');
|
|
156
|
+
}
|
|
157
|
+
lines.push('', '_"dev-only" = the object\'s dominator chain passes through a dev/extension global, so every retainer path goes through it and it would be GC\'d in production. Verify with `memlab_retainer_trace`._');
|
|
158
|
+
return toolResult(lines.join('\n'));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return errorResult(err);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=dev-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-artifacts.js","sourceRoot":"","sources":["../../src/tools/dev-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAE,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AAClE,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,8EAA8E;AAC9E,yEAAyE;AACzE,6DAA6D;AAC7D,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,gCAAgC;IAChC,2BAA2B;IAC3B,8BAA8B;IAC9B,qCAAqC;IACrC,8BAA8B;IAC9B,+BAA+B;IAC/B,iCAAiC;IACjC,+BAA+B;IAC/B,OAAO,EAAE,6DAA6D;CACvE,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,qDAAqD,CAAC;AAO/E;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC5B,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;YAAE,OAAO;QACzB,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAC/B,IAAI,CAAC,IAAI,KAAK,QAAQ;YACtB,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;QAC7B,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACzC,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,EAAC,IAAI,EAAC,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAe,EACf,QAAkB,EAClB,OAAO,GAAG,IAAI;IAEd,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC;IACjE,IAAI,GAAG,GAAqB,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IACvD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,EAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE;YAAE,MAAM;QAC5C,GAAG,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,EAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,gdAAgd,EAChd;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,qDAAqD,CAAC;QAClE,iBAAiB,EAAE,CAAC;aACjB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CACP,iEAAiE,CAClE;QACH,QAAQ,EAAE,CAAC;aACR,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,gFAAgF,CACjF;KACJ,EACD,KAAK,EAAE,EAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAC,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YAE3C,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,UAAU,CACf,mIAAmI;oBACjI,iHAAiH,CACpH,CAAC;YACJ,CAAC;YAQD,MAAM,KAAK,GAAW,EAAE,CAAC;YACzB,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;oBAAE,OAAO;gBACzB,IAAI,IAAI,CAAC,YAAY,GAAG,iBAAiB;oBAAE,OAAO;gBAClD,IACE,IAAI,CAAC,IAAI,KAAK,QAAQ;oBACtB,IAAI,CAAC,IAAI,KAAK,SAAS;oBACvB,IAAI,CAAC,IAAI,KAAK,OAAO;oBAErB,OAAO;gBACT,MAAM,EAAC,OAAO,EAAE,GAAG,EAAC,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBACvD,IAAI,OAAO;oBAAE,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;gBAC/C,IAAI,QAAQ,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACjC,8BAA8B;gBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC7B,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY;wBAAE,MAAM;gBAC/C,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAC,CAAC,CAAC;gBACzC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;oBAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAa;gBACtB,qCAAqC;gBACrC,EAAE;gBACF,kCAAkC,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACnF,iDAAiD,WAAW,CAAC,YAAY,CAAC,IAAI;oBAC5E,CAAC,SAAS,GAAG,CAAC;wBACZ,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kDAAkD;wBACnH,CAAC,CAAC,EAAE,CAAC;gBACT,EAAE;aACH,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;gBACrE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE;oBACf,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;oBAChE,CAAC,CAAC,IAAI,CAAC,IAAI;oBACX,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;oBAChC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY;iBACrD,CAAC,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACvD,CAAC;YACD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,sMAAsM,CACvM,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-snapshots.d.ts","sourceRoot":"","sources":["../../src/tools/diff-snapshots.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"diff-snapshots.d.ts","sourceRoot":"","sources":["../../src/tools/diff-snapshots.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA+CvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmW7D"}
|
|
@@ -12,7 +12,7 @@ import path from 'path';
|
|
|
12
12
|
import { z } from 'zod';
|
|
13
13
|
import memlabHeapAnalysis from '@memlab/heap-analysis';
|
|
14
14
|
const { getFullHeapFromFile } = memlabHeapAnalysis;
|
|
15
|
-
import { setSnapshot } from '../heap-state.js';
|
|
15
|
+
import { setSnapshot, getCurrentHandle } from '../heap-state.js';
|
|
16
16
|
import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
17
17
|
function buildHistogram(snapshot) {
|
|
18
18
|
const map = new Map();
|
|
@@ -31,19 +31,36 @@ function buildHistogram(snapshot) {
|
|
|
31
31
|
});
|
|
32
32
|
return map;
|
|
33
33
|
}
|
|
34
|
+
// Value-named string "classes" (literal values used as the class name, e.g.
|
|
35
|
+
// "554", "1780525701808.81", "o:10,add") are noise in a diff (§10).
|
|
36
|
+
function isValueNamedStringClass(type, name) {
|
|
37
|
+
if (type !== 'string' && type !== 'concatenated string')
|
|
38
|
+
return false;
|
|
39
|
+
if (name.length < 8)
|
|
40
|
+
return true;
|
|
41
|
+
if (/^[\s\d.,:+-]*$/.test(name))
|
|
42
|
+
return true;
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
34
45
|
export function registerDiffSnapshots(server) {
|
|
35
|
-
server.tool('memlab_diff_snapshots', 'Compare two heap snapshots by class histogram. Shows classes that grew, shrunk, appeared, or disappeared between "before" and "after" snapshots.
|
|
46
|
+
server.tool('memlab_diff_snapshots', 'Compare two heap snapshots by class histogram. Shows classes that grew, shrunk, appeared, or disappeared between "before" and "after" snapshots. By default the "after" snapshot becomes the active snapshot (set set_active:false to leave your active snapshot unchanged). For an ordered sequence of 3+ snapshots, use memlab_sequence_analysis instead.', {
|
|
36
47
|
before_path: z
|
|
37
48
|
.string()
|
|
38
|
-
.
|
|
49
|
+
.optional()
|
|
50
|
+
.describe('Path to the "before" snapshot (local, manifold://, or bare filename). Aliases: before, baseline.'),
|
|
39
51
|
after_path: z
|
|
40
52
|
.string()
|
|
41
|
-
.
|
|
53
|
+
.optional()
|
|
54
|
+
.describe('Path to the "after" snapshot (local, manifold://, or bare filename). Aliases: after, target.'),
|
|
55
|
+
before: z.string().optional().describe('Alias for before_path.'),
|
|
56
|
+
after: z.string().optional().describe('Alias for after_path.'),
|
|
57
|
+
baseline: z.string().optional().describe('Alias for before_path.'),
|
|
58
|
+
target: z.string().optional().describe('Alias for after_path.'),
|
|
42
59
|
limit: z
|
|
43
60
|
.number()
|
|
44
61
|
.optional()
|
|
45
62
|
.default(30)
|
|
46
|
-
.describe('Maximum rows per section (default 30)'),
|
|
63
|
+
.describe('Maximum rows per section / top_n (default 30)'),
|
|
47
64
|
min_count_delta: z
|
|
48
65
|
.number()
|
|
49
66
|
.optional()
|
|
@@ -54,10 +71,30 @@ export function registerDiffSnapshots(server) {
|
|
|
54
71
|
.optional()
|
|
55
72
|
.default(0)
|
|
56
73
|
.describe('Minimum absolute change in self size (bytes) to show (default 0).'),
|
|
57
|
-
|
|
74
|
+
include_value_classes: z
|
|
75
|
+
.boolean()
|
|
76
|
+
.optional()
|
|
77
|
+
.default(false)
|
|
78
|
+
.describe('Include anonymous value-named string "classes" (e.g. "554", literal values used as names). Default false: they are filtered and rolled up into a single "(string literals)" row to cut noise (§10).'),
|
|
79
|
+
hide_zero_size_delta: z
|
|
80
|
+
.boolean()
|
|
81
|
+
.optional()
|
|
82
|
+
.default(true)
|
|
83
|
+
.describe('Hide rows whose self-size delta is 0 B (default true) — these are usually noise.'),
|
|
84
|
+
set_active: z
|
|
85
|
+
.boolean()
|
|
86
|
+
.optional()
|
|
87
|
+
.default(true)
|
|
88
|
+
.describe('Make the "after" snapshot the active one for subsequent tools (default true). Set false to leave your current active snapshot unchanged.'),
|
|
89
|
+
}, async ({ before_path, after_path, before, after, baseline, target, limit, min_count_delta, min_size_delta, include_value_classes, hide_zero_size_delta, set_active, }) => {
|
|
58
90
|
try {
|
|
59
|
-
const
|
|
60
|
-
const
|
|
91
|
+
const beforeArg = before_path ?? before ?? baseline;
|
|
92
|
+
const afterArg = after_path ?? after ?? target;
|
|
93
|
+
if (!beforeArg || !afterArg) {
|
|
94
|
+
return errorResult(new Error('Provide both a before and an after snapshot. Accepted names: before_path/before/baseline and after_path/after/target.'));
|
|
95
|
+
}
|
|
96
|
+
const resolvedBefore = path.resolve(beforeArg);
|
|
97
|
+
const resolvedAfter = path.resolve(afterArg);
|
|
61
98
|
if (!fs.existsSync(resolvedBefore)) {
|
|
62
99
|
return errorResult(new Error(`Before file not found: ${resolvedBefore}`));
|
|
63
100
|
}
|
|
@@ -92,16 +129,28 @@ export function registerDiffSnapshots(server) {
|
|
|
92
129
|
hasModule = true;
|
|
93
130
|
});
|
|
94
131
|
const afterEnv = hasWindow ? 'browser' : hasModule ? 'node' : 'unknown';
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
132
|
+
let activeHandle = getCurrentHandle();
|
|
133
|
+
if (set_active) {
|
|
134
|
+
activeHandle = setSnapshot(afterSnapshot, afterArg, {
|
|
135
|
+
fileName: path.basename(afterArg),
|
|
136
|
+
nodeCount: afterNodeCount,
|
|
137
|
+
edgeCount: afterEdgeCount,
|
|
138
|
+
totalSize: afterTotalSize,
|
|
139
|
+
env: afterEnv,
|
|
140
|
+
}).handle;
|
|
141
|
+
}
|
|
102
142
|
// Compute deltas
|
|
103
143
|
const allKeys = new Set([...beforeHist.keys(), ...afterHist.keys()]);
|
|
104
144
|
const diffs = [];
|
|
145
|
+
// Rollup accumulator for filtered value-named string classes (§10).
|
|
146
|
+
const rollup = {
|
|
147
|
+
grewCount: 0,
|
|
148
|
+
grewSize: 0,
|
|
149
|
+
grewClasses: 0,
|
|
150
|
+
shrunkCount: 0,
|
|
151
|
+
shrunkSize: 0,
|
|
152
|
+
shrunkClasses: 0,
|
|
153
|
+
};
|
|
105
154
|
for (const key of allKeys) {
|
|
106
155
|
const before = beforeHist.get(key);
|
|
107
156
|
const after = afterHist.get(key);
|
|
@@ -115,11 +164,28 @@ export function registerDiffSnapshots(server) {
|
|
|
115
164
|
Math.abs(sizeDelta) < min_size_delta) {
|
|
116
165
|
continue;
|
|
117
166
|
}
|
|
167
|
+
if (hide_zero_size_delta && sizeDelta === 0)
|
|
168
|
+
continue;
|
|
118
169
|
const parts = key.split('::');
|
|
170
|
+
const type = parts[0];
|
|
171
|
+
const name = parts.slice(1).join('::');
|
|
172
|
+
if (!include_value_classes && isValueNamedStringClass(type, name)) {
|
|
173
|
+
if (countDelta > 0) {
|
|
174
|
+
rollup.grewCount += countDelta;
|
|
175
|
+
rollup.grewSize += sizeDelta;
|
|
176
|
+
rollup.grewClasses++;
|
|
177
|
+
}
|
|
178
|
+
else if (countDelta < 0) {
|
|
179
|
+
rollup.shrunkCount += countDelta;
|
|
180
|
+
rollup.shrunkSize += sizeDelta;
|
|
181
|
+
rollup.shrunkClasses++;
|
|
182
|
+
}
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
119
185
|
diffs.push({
|
|
120
186
|
key,
|
|
121
|
-
name
|
|
122
|
-
type
|
|
187
|
+
name,
|
|
188
|
+
type,
|
|
123
189
|
before_count: bc,
|
|
124
190
|
after_count: ac,
|
|
125
191
|
count_delta: countDelta,
|
|
@@ -128,6 +194,33 @@ export function registerDiffSnapshots(server) {
|
|
|
128
194
|
size_delta: sizeDelta,
|
|
129
195
|
});
|
|
130
196
|
}
|
|
197
|
+
// Emit the rolled-up value-string classes as single synthetic rows.
|
|
198
|
+
if (rollup.grewClasses > 0) {
|
|
199
|
+
diffs.push({
|
|
200
|
+
key: 'string::(string literals)',
|
|
201
|
+
name: `(string literals ×${formatNumber(rollup.grewClasses)})`,
|
|
202
|
+
type: 'string',
|
|
203
|
+
before_count: 0,
|
|
204
|
+
after_count: rollup.grewCount,
|
|
205
|
+
count_delta: rollup.grewCount,
|
|
206
|
+
before_size: 0,
|
|
207
|
+
after_size: rollup.grewSize,
|
|
208
|
+
size_delta: rollup.grewSize,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (rollup.shrunkClasses > 0) {
|
|
212
|
+
diffs.push({
|
|
213
|
+
key: 'string::(string literals)-shrunk',
|
|
214
|
+
name: `(string literals ×${formatNumber(rollup.shrunkClasses)})`,
|
|
215
|
+
type: 'string',
|
|
216
|
+
before_count: -rollup.shrunkCount,
|
|
217
|
+
after_count: 0,
|
|
218
|
+
count_delta: rollup.shrunkCount,
|
|
219
|
+
before_size: -rollup.shrunkSize,
|
|
220
|
+
after_size: 0,
|
|
221
|
+
size_delta: rollup.shrunkSize,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
131
224
|
const grew = diffs
|
|
132
225
|
.filter(d => d.count_delta > 0)
|
|
133
226
|
.sort((a, b) => b.count_delta - a.count_delta);
|
|
@@ -213,7 +306,9 @@ export function registerDiffSnapshots(server) {
|
|
|
213
306
|
if (grew.length === 0 && shrunk.length === 0) {
|
|
214
307
|
lines.push('No significant differences found between the two snapshots.');
|
|
215
308
|
}
|
|
216
|
-
lines.push(
|
|
309
|
+
lines.push(set_active
|
|
310
|
+
? `\n*The "after" snapshot is now the active snapshot${activeHandle ? ` (handle: ${activeHandle})` : ''} for further analysis. Pass set_active:false to keep your current one.*`
|
|
311
|
+
: `\n*Active snapshot left unchanged${activeHandle ? ` (handle: ${activeHandle})` : ''} (set_active:false).*`);
|
|
217
312
|
return toolResult(lines.join('\n'));
|
|
218
313
|
}
|
|
219
314
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-snapshots.js","sourceRoot":"","sources":["../../src/tools/diff-snapshots.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"diff-snapshots.js","sourceRoot":"","sources":["../../src/tools/diff-snapshots.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicated-strings.d.ts","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"duplicated-strings.d.ts","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAUvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgOjE"}
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot } from '../heap-state.js';
|
|
12
|
-
import { formatBytes, errorResult, toolResult } from '../utils.js';
|
|
12
|
+
import { formatBytes, errorResult, toolResult, looksLikeFailurePayload, } from '../utils.js';
|
|
13
13
|
export function registerDuplicatedStrings(server) {
|
|
14
|
-
server.tool('memlab_duplicated_strings', 'Find duplicated string instances in the heap. Shows strings that appear multiple times, ranked by total retained size — a common source of memory waste. Use after memlab_class_histogram shows high string counts.'
|
|
14
|
+
server.tool('memlab_duplicated_strings', 'Find duplicated string instances in the heap. Shows strings that appear multiple times, ranked by total retained size — a common source of memory waste. Use after memlab_class_histogram shows high string counts. ' +
|
|
15
|
+
'⚠ Full-heap scan — slow and memory-heavy on very large heaps (millions of nodes); raise min_count to bound the work.', {
|
|
15
16
|
limit: z
|
|
16
17
|
.number()
|
|
17
18
|
.optional()
|
|
@@ -62,14 +63,20 @@ export function registerDuplicatedStrings(server) {
|
|
|
62
63
|
.filter(([, stats]) => stats.count >= min_count)
|
|
63
64
|
.sort((a, b) => b[1].total_size - a[1].total_size)
|
|
64
65
|
.slice(0, limit)
|
|
65
|
-
.map(([value, stats]) =>
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
.map(([value, stats]) => {
|
|
67
|
+
const per_copy_size = stats.count > 0 ? stats.total_size / stats.count : 0;
|
|
68
|
+
const potential_savings = (stats.count - 1) * per_copy_size;
|
|
69
|
+
return {
|
|
70
|
+
value: value.length > 200 ? value.substring(0, 200) + '...' : value,
|
|
71
|
+
count: stats.count,
|
|
72
|
+
total_size: stats.total_size,
|
|
73
|
+
total_size_formatted: formatBytes(stats.total_size),
|
|
74
|
+
potential_savings,
|
|
75
|
+
example_node_ids: stats.example_node_ids,
|
|
76
|
+
field_context: null,
|
|
77
|
+
actionability: null,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
73
80
|
if (duplicated.length === 0) {
|
|
74
81
|
return toolResult('No duplicated strings found.');
|
|
75
82
|
}
|
|
@@ -100,7 +107,41 @@ export function registerDuplicatedStrings(server) {
|
|
|
100
107
|
const topProp = [...propCounts.entries()].sort((a, b) => b[1].count - a[1].count)[0];
|
|
101
108
|
d.field_context = `.${topProp[0]} on \`${topProp[1].ownerName}\` instances`;
|
|
102
109
|
}
|
|
110
|
+
// Classify actionability: app vs framework vs mixed
|
|
111
|
+
let appCount = 0;
|
|
112
|
+
let frameworkCount = 0;
|
|
113
|
+
for (const nodeId of d.example_node_ids) {
|
|
114
|
+
const node = snapshot.getNodeById(nodeId);
|
|
115
|
+
if (!node)
|
|
116
|
+
continue;
|
|
117
|
+
for (const ref of node.referrers) {
|
|
118
|
+
const fromName = ref.fromNode.name;
|
|
119
|
+
const edgeName = String(ref.name_or_index);
|
|
120
|
+
const isFramework = fromName.startsWith('system /') ||
|
|
121
|
+
fromName === 'Module' ||
|
|
122
|
+
fromName === '(object properties)' ||
|
|
123
|
+
edgeName === 'map' ||
|
|
124
|
+
edgeName === 'table' ||
|
|
125
|
+
edgeName === 'elements';
|
|
126
|
+
if (isFramework) {
|
|
127
|
+
frameworkCount++;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
appCount++;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (appCount > 0 && frameworkCount > 0) {
|
|
135
|
+
d.actionability = 'mixed';
|
|
136
|
+
}
|
|
137
|
+
else if (frameworkCount > 0) {
|
|
138
|
+
d.actionability = 'framework';
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
d.actionability = 'app';
|
|
142
|
+
}
|
|
103
143
|
}
|
|
144
|
+
const appActionableCount = duplicated.filter(d => d.actionability === 'app' || d.actionability === 'mixed').length;
|
|
104
145
|
const lines = duplicated.map((d, i) => {
|
|
105
146
|
const val = d.value.length > 80 ? d.value.slice(0, 80) + '...' : d.value;
|
|
106
147
|
const nodeIdsPart = include_node_ids
|
|
@@ -109,16 +150,37 @@ export function registerDuplicatedStrings(server) {
|
|
|
109
150
|
const context = d.field_context
|
|
110
151
|
? `\n commonly held as: ${d.field_context}`
|
|
111
152
|
: '';
|
|
112
|
-
|
|
153
|
+
const actionLabel = d.actionability ? ` [${d.actionability}]` : '';
|
|
154
|
+
const savingsLabel = d.potential_savings > 0
|
|
155
|
+
? `, savings: ${formatBytes(d.potential_savings)}`
|
|
156
|
+
: '';
|
|
157
|
+
return `${i + 1}. "${val}" x ${d.count} copies, ${d.total_size_formatted} total${savingsLabel}${actionLabel}${nodeIdsPart}${context}`;
|
|
113
158
|
});
|
|
159
|
+
// Cached failure payloads: duplicated JSON-ish strings carrying an
|
|
160
|
+
// explicit failure/error marker. These are both wasted memory and a
|
|
161
|
+
// signal that an upstream dependency is failing (and that failures are
|
|
162
|
+
// being cached). Feedback round 4 §D.
|
|
163
|
+
const failurePayloads = duplicated.filter(d => looksLikeFailurePayload(d.value));
|
|
114
164
|
const hasHeavyDups = duplicated.some(d => d.count >= 1000);
|
|
115
165
|
const suggestions = [];
|
|
166
|
+
if (failurePayloads.length > 0) {
|
|
167
|
+
const totalFailureCopies = failurePayloads.reduce((sum, d) => sum + d.count, 0);
|
|
168
|
+
const failureBytes = failurePayloads.reduce((sum, d) => sum + d.total_size, 0);
|
|
169
|
+
suggestions.push(`⚠️ **Cached failure payloads detected:** ${failurePayloads.length} of the duplicated strings look like cached error/failure responses ` +
|
|
170
|
+
`(${totalFailureCopies.toLocaleString('en-US')} copies, ${formatBytes(failureBytes)}). ` +
|
|
171
|
+
'This usually means an upstream dependency is failing AND those failures are being cached. ' +
|
|
172
|
+
'Check the upstream call (permissions, timeouts, bad input) and avoid caching error responses (or cache them with a short TTL).');
|
|
173
|
+
}
|
|
116
174
|
if (hasHeavyDups) {
|
|
117
175
|
suggestions.push('**Suggested action:** Heavily duplicated strings often come from `JSON.parse()` or API responses. ' +
|
|
118
176
|
'Consider string interning with a `Map<string, string>` pool applied at ingestion time, ' +
|
|
119
177
|
'or deduplicating at the data source.');
|
|
120
178
|
}
|
|
121
|
-
const
|
|
179
|
+
const totalSavings = duplicated.reduce((sum, d) => sum + d.potential_savings, 0);
|
|
180
|
+
const summaryLine = appActionableCount > 0
|
|
181
|
+
? `${appActionableCount} of ${duplicated.length} entries are app-actionable`
|
|
182
|
+
: `${duplicated.length} entries (all framework-held)`;
|
|
183
|
+
const body = `Duplicated strings (${summaryLine}):\n\n${lines.join('\n')}\n\n**Total interning savings: ${formatBytes(totalSavings)}** (if each string were stored only once)`;
|
|
122
184
|
return toolResult(suggestions.length > 0
|
|
123
185
|
? `${body}\n\n---\n\n${suggestions.join('\n')}`
|
|
124
186
|
: body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicated-strings.js","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"duplicated-strings.js","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/eval.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/tools/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAmHvE,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/tools/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAmHvE,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsRpD"}
|