@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
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
* @format
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
|
+
import memlabCore from '@memlab/core';
|
|
11
|
+
const { utils, NumericSet } = memlabCore;
|
|
10
12
|
import { z } from 'zod';
|
|
11
13
|
import { getSnapshot, getSnapshotMetadata } from '../heap-state.js';
|
|
12
|
-
import { formatBytes, markdownTable, truncateNodeName, errorResult, toolResult, } from '../utils.js';
|
|
14
|
+
import { describeSkipped, formatBytes, formatNumber, markdownTable, truncateNodeName, errorResult, toolResult, } from '../utils.js';
|
|
15
|
+
import { isReactRefreshSignatureShape, REACT_REFRESH_REGISTRY_EDGE_NAMES, REACT_REFRESH_SIGNATURE_GATE_PROP, } from '../artifact-classes.js';
|
|
13
16
|
// Globals installed by browser dev tools / extensions. Anything retained ONLY
|
|
14
17
|
// through one of these would be garbage-collected in production — it's a
|
|
15
18
|
// profiling artifact, not a real leak (Feedback round 2 §6).
|
|
@@ -24,7 +27,157 @@ const DEV_GLOBAL_EDGE_NAMES = new Set([
|
|
|
24
27
|
'__RECOIL_DEVTOOLS_EXTENSION__',
|
|
25
28
|
'Debug', // window.Debug — common debugging handle (e.g. WhatsApp Web)
|
|
26
29
|
]);
|
|
30
|
+
// React Fast Refresh (react-refresh) bookkeeping, installed on the global by the
|
|
31
|
+
// DEV-only runtime. `$RefreshSig$` / `$RefreshReg$` close over the refresh
|
|
32
|
+
// runtime's module-scope registries — `allFamiliesByID`, `allSignaturesByType`,
|
|
33
|
+
// and the family/signature maps behind them — which hold every component type
|
|
34
|
+
// and hook signature the page has ever compiled, plus the fibers and DOM those
|
|
35
|
+
// types transitively reach.
|
|
36
|
+
//
|
|
37
|
+
// Neither the globals nor the registries exist in a production build, but the
|
|
38
|
+
// chain roots at the real Window (not at a devtools hook or the inspector), so
|
|
39
|
+
// every earlier check classified the whole family `production`. Measured cost of
|
|
40
|
+
// getting this wrong: on one WA Web round ~93 MB of a 137.7 MB "detached DOM
|
|
41
|
+
// leak" was Fast Refresh retention, and a later round reported a 16,375-entry /
|
|
42
|
+
// 1.2 MB `allFamiliesByID` Map as a production cache-like collection. Both were
|
|
43
|
+
// dev-build-only.
|
|
44
|
+
const REACT_REFRESH_GLOBAL_EDGE_NAMES = new Set([
|
|
45
|
+
'$RefreshSig$',
|
|
46
|
+
'$RefreshReg$',
|
|
47
|
+
]);
|
|
48
|
+
// Detecting Fast Refresh by its GLOBALS alone is not enough, and the gap is
|
|
49
|
+
// large rather than marginal. `$RefreshSig$` / `$RefreshReg$` are thin wrappers;
|
|
50
|
+
// the registries they talk to live in the refresh runtime's module scope and are
|
|
51
|
+
// reachable only through compiled-code constant pools
|
|
52
|
+
// (`system/TrustedWeakFixedArray`, `system/InstructionStream`), so the globals
|
|
53
|
+
// DOMINATE almost nothing and the registries stay classified `production`.
|
|
54
|
+
//
|
|
55
|
+
// Measured on a WhatsApp Web round: dev_artifacts reported
|
|
56
|
+
// `React Fast Refresh registry ($RefreshSig$) x2` and attributed 1.4 KB, while
|
|
57
|
+
// in the same snapshot the `allSignaturesByType` WeakMap's backing table alone
|
|
58
|
+
// was 4,096 KB and `allFamiliesByID` held 16,367 entries / 1.2 MB. The 4 MB was
|
|
59
|
+
// filed as a production optimization opportunity before being withdrawn.
|
|
60
|
+
//
|
|
61
|
+
// So match the registries by CONTENT as well, independent of retainer path:
|
|
62
|
+
//
|
|
63
|
+
// 1. the registry container, by the edge name that binds it in module scope;
|
|
64
|
+
// 2. the per-type signature record react-refresh stores via
|
|
65
|
+
// `setSignature(type, key, forceReset, getCustomHooks)`.
|
|
66
|
+
//
|
|
67
|
+
// Both signatures live in `artifact-classes`, which is where every
|
|
68
|
+
// content-matched non-production family is registered.
|
|
69
|
+
/**
|
|
70
|
+
* True when `node` is a react-refresh signature record. Callers gate on the
|
|
71
|
+
* rare property first; this confirms the rest.
|
|
72
|
+
*/
|
|
73
|
+
function isReactRefreshSignatureRecord(node) {
|
|
74
|
+
const propNames = [];
|
|
75
|
+
for (const edge of node.references) {
|
|
76
|
+
if (edge.type !== 'property')
|
|
77
|
+
continue;
|
|
78
|
+
propNames.push(String(edge.name_or_index));
|
|
79
|
+
}
|
|
80
|
+
return isReactRefreshSignatureShape(propNames);
|
|
81
|
+
}
|
|
82
|
+
// The automation/devtools *bridge* injected into the page by a CDP-driven
|
|
83
|
+
// harness (the browser MCP plugin, a browser-tools extension, Puppeteer helper
|
|
84
|
+
// bundles). This is the harness observing the app, not the app.
|
|
85
|
+
//
|
|
86
|
+
// Two independent signatures, both observed on real hunts:
|
|
87
|
+
// - `TOOL_DEFINITIONS`: the bridge's tool manifest, reached through its
|
|
88
|
+
// listener closure's scope chain. On one run it held 64 `.description`
|
|
89
|
+
// strings that `intern_opportunities` then reported as the single largest
|
|
90
|
+
// interning opportunity in the heap.
|
|
91
|
+
// - bridge entry points by name (`getDevToolBridge`,
|
|
92
|
+
// `BrowserToolsSuspenseInterop`), which show up as multi-MB `production`
|
|
93
|
+
// retainers in `dev_artifacts`' own table.
|
|
94
|
+
//
|
|
95
|
+
// Like `_debugStack` this is found by scanning edges rather than global roots,
|
|
96
|
+
// because the bridge is reached from ordinary app-side listeners.
|
|
97
|
+
const HARNESS_EDGE_NAMES = new Set(['TOOL_DEFINITIONS']);
|
|
98
|
+
const HARNESS_NODE_NAME_RE = /getDevToolBridge|BrowserToolsSuspenseInterop|__BROWSER_TOOLS_|__PUPPETEER_/;
|
|
27
99
|
const DEV_NODE_NAME_RE = /__REACT_DEVTOOLS|DEVTOOLS_GLOBAL_HOOK|ReactDevTools/;
|
|
100
|
+
// Blink accessibility caches. Under CDP-driven automation the a11y tree is
|
|
101
|
+
// materialized (and browser_take_snapshot inflates it further), so this native
|
|
102
|
+
// cache balloons and co-retains detached DOM — automation-inflated retention
|
|
103
|
+
// that is not present at that scale in a normal user session, so it should not
|
|
104
|
+
// be counted toward a production leak total (Feedback: WA Web hunts §A).
|
|
105
|
+
const AX_NODE_NAME_RE = /AXObjectCache|AXNodeObject|AXDirtyObject|AXComputedObject|blink::AX/;
|
|
106
|
+
// CDP / DevTools inspector retention. When DevTools — or a CDP-driven
|
|
107
|
+
// automation session (Puppeteer / the browser MCP) — is attached, any object
|
|
108
|
+
// passed to console.log (or a dev-build devConsole) is held by the inspector
|
|
109
|
+
// via edges on the "(Global handles)" synthetic node named ".../ DevTools
|
|
110
|
+
// console". Such an object, and any subtree it pins (e.g. a logged
|
|
111
|
+
// `{node}` keeping a detached DOM tree alive), would be garbage-collected in a
|
|
112
|
+
// real user session with DevTools closed, so retention ONLY through them is a
|
|
113
|
+
// measurement artifact, not a production leak. `dev_artifacts` previously
|
|
114
|
+
// missed this because it only knew about dev globals and the a11y cache, which
|
|
115
|
+
// caused console-retained detached DOM to be mis-reported as production-real
|
|
116
|
+
// (Feedback round 3 §A).
|
|
117
|
+
const GLOBAL_HANDLES_NODE_NAME = '(Global handles)';
|
|
118
|
+
const CONSOLE_HANDLE_EDGE_RE = /DevTools console/i;
|
|
119
|
+
// React DEV-build owner stacks. In a development build React attaches
|
|
120
|
+
// `_debugStack` (a captured `Error`) to fibers. That Error's `ErrorStackData`
|
|
121
|
+
// holds the captured stack-frame array, which holds whatever closures were on
|
|
122
|
+
// the stack — commonly the `batchedUpdates` closure whose scope still refers to
|
|
123
|
+
// the handler's `nativeEvent`, which in turn pins the DOM subtree that was being
|
|
124
|
+
// unmounted. The result is a detached subtree retained entirely by DEV-only
|
|
125
|
+
// bookkeeping.
|
|
126
|
+
//
|
|
127
|
+
// This family is invisible to the checks above because the chain is rooted at a
|
|
128
|
+
// LIVE DOM element's fiber, not at a dev global or the inspector — so it was
|
|
129
|
+
// classified `production` and read as a genuine unmount leak. It is production-
|
|
130
|
+
// safe (`_debugStack` does not exist in a production React build) and, because
|
|
131
|
+
// it hangs off whatever handler was running, it fires on ANY synthetic-click
|
|
132
|
+
// hammer that unmounts a subtree.
|
|
133
|
+
//
|
|
134
|
+
// Marking the Error itself as a dev root is enough: the existing dev-only
|
|
135
|
+
// reachability pass then attributes the whole ErrorStackData -> frames ->
|
|
136
|
+
// closure -> nativeEvent -> detached-subtree chain to it.
|
|
137
|
+
const REACT_DEBUG_STACK_EDGE_NAMES = new Set(['_debugStack', '_debugTask']);
|
|
138
|
+
const CATEGORY_LABEL = {
|
|
139
|
+
console: 'DevTools console (CDP inspector)',
|
|
140
|
+
a11y: 'a11y / CDP automation cache',
|
|
141
|
+
devGlobal: 'dev/extension global',
|
|
142
|
+
reactDebugStack: 'React DEV owner stack (_debugStack)',
|
|
143
|
+
reactFastRefresh: 'React Fast Refresh registry ($RefreshSig$)',
|
|
144
|
+
harness: 'automation/devtools bridge (test harness)',
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* One-line summary of the dev/automation roots present, as counts per family.
|
|
148
|
+
*
|
|
149
|
+
* The full list was printed on every call and is unbounded: each Blink a11y
|
|
150
|
+
* object and each bridge export is its own root, so a measured WhatsApp Web run
|
|
151
|
+
* spent ~1,500 tokens per call on a single comma-separated line of names, and an
|
|
152
|
+
* Ads Manager run repeated an entire multi-sentence React warning inside it.
|
|
153
|
+
* Nothing downstream keyed on the individual names — the reader needs to know
|
|
154
|
+
* WHICH FAMILIES are present, which is what the categories already encode.
|
|
155
|
+
* `show_roots: true` restores the full list for the rare case of chasing one
|
|
156
|
+
* specific root.
|
|
157
|
+
*/
|
|
158
|
+
export function summarizeDevRoots(devRoots, showAll = false) {
|
|
159
|
+
if (devRoots.byId.size === 0)
|
|
160
|
+
return 'none';
|
|
161
|
+
if (showAll) {
|
|
162
|
+
return [...new Set(devRoots.byId.values())].join(', ');
|
|
163
|
+
}
|
|
164
|
+
const byCat = new Map();
|
|
165
|
+
let uncategorized = 0;
|
|
166
|
+
for (const id of devRoots.byId.keys()) {
|
|
167
|
+
const cat = devRoots.categoryById.get(id);
|
|
168
|
+
if (cat == null) {
|
|
169
|
+
uncategorized++;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
byCat.set(cat, (byCat.get(cat) ?? 0) + 1);
|
|
173
|
+
}
|
|
174
|
+
const parts = [...byCat.entries()]
|
|
175
|
+
.sort((a, b) => b[1] - a[1])
|
|
176
|
+
.map(([cat, n]) => `${CATEGORY_LABEL[cat]} ×${n}`);
|
|
177
|
+
if (uncategorized > 0)
|
|
178
|
+
parts.push(`other ×${uncategorized}`);
|
|
179
|
+
return `${devRoots.byId.size} root(s) — ${parts.join(', ')}`;
|
|
180
|
+
}
|
|
28
181
|
/**
|
|
29
182
|
* Find the dev/extension "root" objects: the targets of dev-global edges on
|
|
30
183
|
* the Window/global object, plus any node whose own name marks it as a
|
|
@@ -32,6 +185,7 @@ const DEV_NODE_NAME_RE = /__REACT_DEVTOOLS|DEVTOOLS_GLOBAL_HOOK|ReactDevTools/;
|
|
|
32
185
|
*/
|
|
33
186
|
export function collectDevRoots(snapshot) {
|
|
34
187
|
const byId = new Map();
|
|
188
|
+
const categoryById = new Map();
|
|
35
189
|
snapshot.nodes.forEach(node => {
|
|
36
190
|
if (node.id <= 3)
|
|
37
191
|
return;
|
|
@@ -43,25 +197,244 @@ export function collectDevRoots(snapshot) {
|
|
|
43
197
|
const eName = String(edge.name_or_index);
|
|
44
198
|
if (DEV_GLOBAL_EDGE_NAMES.has(eName) && edge.toNode.id > 3) {
|
|
45
199
|
byId.set(edge.toNode.id, eName);
|
|
200
|
+
categoryById.set(edge.toNode.id, 'devGlobal');
|
|
201
|
+
}
|
|
202
|
+
if (REACT_REFRESH_GLOBAL_EDGE_NAMES.has(eName) && edge.toNode.id > 3) {
|
|
203
|
+
byId.set(edge.toNode.id, `${eName} (React Fast Refresh; absent in production builds)`);
|
|
204
|
+
categoryById.set(edge.toNode.id, 'reactFastRefresh');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Objects held only by the attached inspector's console (CDP global
|
|
209
|
+
// handles named ".../ DevTools console"). Mark just those targets — NOT the
|
|
210
|
+
// whole (Global handles) node, which also holds legitimate native/global
|
|
211
|
+
// handles for real app objects.
|
|
212
|
+
if (node.name === GLOBAL_HANDLES_NODE_NAME) {
|
|
213
|
+
for (const edge of node.references) {
|
|
214
|
+
if (CONSOLE_HANDLE_EDGE_RE.test(String(edge.name_or_index)) &&
|
|
215
|
+
edge.toNode.id > 3) {
|
|
216
|
+
byId.set(edge.toNode.id, 'DevTools console (CDP inspector-retained; GC-eligible with DevTools closed)');
|
|
217
|
+
categoryById.set(edge.toNode.id, 'console');
|
|
46
218
|
}
|
|
47
219
|
}
|
|
48
220
|
}
|
|
221
|
+
// React DEV owner stacks hang off fibers, which are reachable from LIVE
|
|
222
|
+
// DOM nodes — so they are found by scanning edges, not global roots. The
|
|
223
|
+
// automation bridge is reached the same way, from app-side listeners.
|
|
224
|
+
for (const edge of node.references) {
|
|
225
|
+
const eName = String(edge.name_or_index);
|
|
226
|
+
if (REACT_DEBUG_STACK_EDGE_NAMES.has(eName) && edge.toNode.id > 3) {
|
|
227
|
+
byId.set(edge.toNode.id, 'React DEV owner stack (_debugStack; absent in production builds)');
|
|
228
|
+
categoryById.set(edge.toNode.id, 'reactDebugStack');
|
|
229
|
+
}
|
|
230
|
+
if (HARNESS_EDGE_NAMES.has(eName) && edge.toNode.id > 3) {
|
|
231
|
+
byId.set(edge.toNode.id, `${eName} (automation/devtools bridge injected by the harness)`);
|
|
232
|
+
categoryById.set(edge.toNode.id, 'harness');
|
|
233
|
+
}
|
|
234
|
+
// Fast Refresh registries bound in the refresh runtime's module scope.
|
|
235
|
+
// Matched by edge name rather than by retainer path, because the path
|
|
236
|
+
// runs through compiled-code constant pools that no dev global dominates.
|
|
237
|
+
if (REACT_REFRESH_REGISTRY_EDGE_NAMES.has(eName) && edge.toNode.id > 3) {
|
|
238
|
+
byId.set(edge.toNode.id, `${eName} (React Fast Refresh registry; absent in production builds)`);
|
|
239
|
+
categoryById.set(edge.toNode.id, 'reactFastRefresh');
|
|
240
|
+
}
|
|
241
|
+
// The signature record itself, so entries survive being read out of a
|
|
242
|
+
// WeakMap whose table is not itself dominated by the registry edge.
|
|
243
|
+
if (eName === REACT_REFRESH_SIGNATURE_GATE_PROP &&
|
|
244
|
+
node.id > 3 &&
|
|
245
|
+
isReactRefreshSignatureRecord(node)) {
|
|
246
|
+
byId.set(node.id, 'react-refresh signature record ({forceReset, ownKey, fullKey, getCustomHooks}; absent in production builds)');
|
|
247
|
+
categoryById.set(node.id, 'reactFastRefresh');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
49
250
|
if (DEV_NODE_NAME_RE.test(node.name)) {
|
|
50
251
|
byId.set(node.id, node.name);
|
|
252
|
+
categoryById.set(node.id, 'devGlobal');
|
|
253
|
+
}
|
|
254
|
+
if (AX_NODE_NAME_RE.test(node.name)) {
|
|
255
|
+
byId.set(node.id, `${node.name} (a11y/CDP automation cache)`);
|
|
256
|
+
categoryById.set(node.id, 'a11y');
|
|
257
|
+
}
|
|
258
|
+
if (HARNESS_NODE_NAME_RE.test(node.name)) {
|
|
259
|
+
byId.set(node.id, `${node.name} (automation/devtools bridge)`);
|
|
260
|
+
categoryById.set(node.id, 'harness');
|
|
51
261
|
}
|
|
52
262
|
});
|
|
53
|
-
return { byId };
|
|
263
|
+
return { byId, categoryById };
|
|
54
264
|
}
|
|
55
265
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
266
|
+
* Reachability from GC roots with every dev/automation root treated as a sink
|
|
267
|
+
* (its outgoing edges are not followed). Returns a bitmap indexed by
|
|
268
|
+
* `node.nodeIndex`: 1 = still reachable from a real GC root without passing
|
|
269
|
+
* through a dev root (production-reachable), 0 = reachable ONLY through one or
|
|
270
|
+
* more dev roots (a dev/automation-only artifact).
|
|
271
|
+
*
|
|
272
|
+
* This is stricter and more complete than a dominator walk: when an object is
|
|
273
|
+
* co-retained by SEVERAL different dev roots (e.g. the DevTools console AND the
|
|
274
|
+
* a11y cache both point at the same detached-DOM subtree), no single dev root
|
|
275
|
+
* dominates it, so a dominator walk misses it — but it is still dev-only because
|
|
276
|
+
* every path to it passes through some dev root. This pass catches that case.
|
|
61
277
|
*/
|
|
62
|
-
export function
|
|
278
|
+
export function computeReachableWithoutDevRoots(snapshot, devRoots) {
|
|
279
|
+
const { byId } = devRoots;
|
|
280
|
+
const reached = new Uint8Array(snapshot.nodes.length);
|
|
281
|
+
const stack = [];
|
|
282
|
+
// Seed from the synthetic GC roots (the "(GC roots)" super-root and its
|
|
283
|
+
// synthetic children such as "(Global handles)"): all real objects are
|
|
284
|
+
// reachable from these. A dev root that is itself synthetic is seeded but not
|
|
285
|
+
// expanded.
|
|
286
|
+
snapshot.nodes.forEach(node => {
|
|
287
|
+
if (node.type !== 'synthetic' && node.id > 3)
|
|
288
|
+
return;
|
|
289
|
+
if (reached[node.nodeIndex])
|
|
290
|
+
return;
|
|
291
|
+
reached[node.nodeIndex] = 1;
|
|
292
|
+
if (!byId.has(node.id))
|
|
293
|
+
stack.push(node);
|
|
294
|
+
});
|
|
295
|
+
while (stack.length > 0) {
|
|
296
|
+
const node = stack.pop();
|
|
297
|
+
node.forEachReference((edge) => {
|
|
298
|
+
const to = edge.toNode;
|
|
299
|
+
if (reached[to.nodeIndex])
|
|
300
|
+
return;
|
|
301
|
+
reached[to.nodeIndex] = 1;
|
|
302
|
+
// Mark the dev root reached (it is held by a real global handle) but do
|
|
303
|
+
// NOT follow its edges — anything reachable only through it is dev-only.
|
|
304
|
+
if (!byId.has(to.id))
|
|
305
|
+
stack.push(to);
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
return reached;
|
|
309
|
+
}
|
|
310
|
+
const CATEGORY_BIT = {
|
|
311
|
+
console: 1,
|
|
312
|
+
a11y: 2,
|
|
313
|
+
devGlobal: 4,
|
|
314
|
+
reactDebugStack: 8,
|
|
315
|
+
reactFastRefresh: 16,
|
|
316
|
+
harness: 32,
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Whole-heap total of everything retained ONLY via dev/automation roots, plus a
|
|
320
|
+
* per-source breakdown.
|
|
321
|
+
*
|
|
322
|
+
* This is deliberately independent of any display threshold. The previous
|
|
323
|
+
* implementation accumulated the total inside the same loop that filtered
|
|
324
|
+
* candidates by `min_retained_size`, so the headline number only counted
|
|
325
|
+
* objects above the cutoff. With the 512 KB default that made a heap holding
|
|
326
|
+
* thousands of small console-retained objects report **0 B dev-only** — read by
|
|
327
|
+
* a caller as "this is production-real". Whole classes of artifact (per-event
|
|
328
|
+
* log strings, one logged object per interaction) are individually tiny and
|
|
329
|
+
* collectively large, which is exactly the case that matters.
|
|
330
|
+
*
|
|
331
|
+
* Attribution is a single BFS over the dev-only subgraph, seeded from each dev
|
|
332
|
+
* root's dev-only successors and OR-ing a category bit as it goes, so a subtree
|
|
333
|
+
* co-retained by several artifact families is counted under each.
|
|
334
|
+
*/
|
|
335
|
+
export function summarizeDevOnly(snapshot, devRoots, reached) {
|
|
336
|
+
const { byId, categoryById } = devRoots;
|
|
337
|
+
const mask = new Uint8Array(snapshot.nodes.length);
|
|
338
|
+
const stack = [];
|
|
339
|
+
const devOnlyIds = new NumericSet();
|
|
340
|
+
let nodes = 0;
|
|
341
|
+
// Seed: dev-only successors of each dev root, tagged with that root's family.
|
|
342
|
+
snapshot.nodes.forEach(node => {
|
|
343
|
+
const cat = categoryById.get(node.id);
|
|
344
|
+
if (cat == null || !byId.has(node.id))
|
|
345
|
+
return;
|
|
346
|
+
const bit = CATEGORY_BIT[cat];
|
|
347
|
+
node.forEachReference((edge) => {
|
|
348
|
+
const to = edge.toNode;
|
|
349
|
+
if (reached[to.nodeIndex])
|
|
350
|
+
return; // production-reachable, not an artifact
|
|
351
|
+
if ((mask[to.nodeIndex] & bit) !== 0)
|
|
352
|
+
return;
|
|
353
|
+
mask[to.nodeIndex] |= bit;
|
|
354
|
+
stack.push(to);
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
while (stack.length > 0) {
|
|
358
|
+
const node = stack.pop();
|
|
359
|
+
const bits = mask[node.nodeIndex];
|
|
360
|
+
node.forEachReference((edge) => {
|
|
361
|
+
const to = edge.toNode;
|
|
362
|
+
if (reached[to.nodeIndex])
|
|
363
|
+
return;
|
|
364
|
+
if ((mask[to.nodeIndex] & bits) === bits)
|
|
365
|
+
return; // nothing new to add
|
|
366
|
+
mask[to.nodeIndex] |= bits;
|
|
367
|
+
stack.push(to);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
const byCategory = new Map();
|
|
371
|
+
snapshot.nodes.forEach(node => {
|
|
372
|
+
if (node.id <= 3)
|
|
373
|
+
return;
|
|
374
|
+
if (reached[node.nodeIndex])
|
|
375
|
+
return;
|
|
376
|
+
nodes++;
|
|
377
|
+
devOnlyIds.add(node.id);
|
|
378
|
+
const bits = mask[node.nodeIndex];
|
|
379
|
+
for (const cat of Object.keys(CATEGORY_BIT)) {
|
|
380
|
+
if ((bits & CATEGORY_BIT[cat]) === 0)
|
|
381
|
+
continue;
|
|
382
|
+
const cur = byCategory.get(cat) ?? { nodes: 0, selfBytes: 0 };
|
|
383
|
+
cur.nodes++;
|
|
384
|
+
cur.selfBytes += node.self_size;
|
|
385
|
+
byCategory.set(cat, cur);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
// Dominator-deduplicated so nested artifacts are not double-counted.
|
|
389
|
+
const retained = nodes === 0
|
|
390
|
+
? 0
|
|
391
|
+
: utils.aggregateDominatorMetrics(devOnlyIds, snapshot, () => true, (node) => node.retainedSize);
|
|
392
|
+
return { nodes, retained, byCategory };
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Find a dev-root name on the node's shortest retainer path, for the "via"
|
|
396
|
+
* label. Best-effort: the shortest path usually runs through the dominant
|
|
397
|
+
* retainer; falls back to a generic label when it does not.
|
|
398
|
+
*/
|
|
399
|
+
function findDevRootVia(node, devRoots) {
|
|
400
|
+
let cur = node;
|
|
401
|
+
const seen = new Set();
|
|
402
|
+
let steps = 0;
|
|
403
|
+
while (cur && cur.hasPathEdge && steps < 1000) {
|
|
404
|
+
const edge = cur.pathEdge;
|
|
405
|
+
if (!edge)
|
|
406
|
+
break;
|
|
407
|
+
const from = edge.fromNode;
|
|
408
|
+
const via = devRoots.byId.get(from.id);
|
|
409
|
+
if (via != null)
|
|
410
|
+
return via;
|
|
411
|
+
if (seen.has(from.id))
|
|
412
|
+
break;
|
|
413
|
+
seen.add(from.id);
|
|
414
|
+
cur = from;
|
|
415
|
+
steps++;
|
|
416
|
+
}
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Classify whether a node is retained ONLY via dev/automation roots. Prefer the
|
|
421
|
+
* reachability bitmap from `computeReachableWithoutDevRoots` (rigorous and
|
|
422
|
+
* complete, including multi-dev-root co-retention). Without a bitmap, fall back
|
|
423
|
+
* to a dominator walk: if a dev root *dominates* the node, every path to it
|
|
424
|
+
* passes through that dev object — conservative, catches only single-dev-root
|
|
425
|
+
* retention.
|
|
426
|
+
*/
|
|
427
|
+
export function classifyDevOnly(node, devRoots, reached, maxWalk = 1000) {
|
|
63
428
|
if (devRoots.byId.size === 0)
|
|
64
429
|
return { devOnly: false, via: null };
|
|
430
|
+
if (reached != null) {
|
|
431
|
+
if (reached[node.nodeIndex])
|
|
432
|
+
return { devOnly: false, via: null };
|
|
433
|
+
return {
|
|
434
|
+
devOnly: true,
|
|
435
|
+
via: findDevRootVia(node, devRoots) ?? 'dev/automation roots',
|
|
436
|
+
};
|
|
437
|
+
}
|
|
65
438
|
let cur = node.dominatorNode ?? null;
|
|
66
439
|
let steps = 0;
|
|
67
440
|
while (cur && steps < maxWalk) {
|
|
@@ -76,7 +449,7 @@ export function classifyDevOnly(node, devRoots, maxWalk = 1000) {
|
|
|
76
449
|
return { devOnly: false, via: null };
|
|
77
450
|
}
|
|
78
451
|
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, …) —
|
|
452
|
+
server.tool('memlab_dev_artifacts', 'Classify large retainers as production-relevant vs. dev/automation-only (browser snapshots). Flags any object retained ONLY through a dev/extension global (__REACT_DEVTOOLS_GLOBAL_HOOK__, __REDUX_DEVTOOLS_EXTENSION__, window.Debug, …), through a Blink accessibility cache (AXObjectCacheImpl/AXNodeObject/AXDirtyObject) inflated by CDP-driven automation building the a11y tree, OR through the attached inspector\'s console — objects passed to console.log / a dev-build devConsole are held by DevTools/CDP via "(Global handles) → … / DevTools console" edges (and can pin a whole detached DOM subtree, e.g. a logged {node} ref), which are GC\'d once DevTools/automation detaches. All three are measurement artifacts that should not be counted as production leaks. Reports total bytes attributable to them so "241 MB leak!" headlines that are really DevTools / a11y-cache / console retention get caught.', {
|
|
80
453
|
limit: z
|
|
81
454
|
.number()
|
|
82
455
|
.optional()
|
|
@@ -92,30 +465,77 @@ export function registerDevArtifacts(server) {
|
|
|
92
465
|
.optional()
|
|
93
466
|
.default(false)
|
|
94
467
|
.describe('Show only the dev-only artifacts (default false: show both, dev-only flagged).'),
|
|
95
|
-
|
|
468
|
+
show_roots: z
|
|
469
|
+
.boolean()
|
|
470
|
+
.optional()
|
|
471
|
+
.default(false)
|
|
472
|
+
.describe('List every dev/automation root by name instead of summarizing them as counts per family (default false). The full list is unbounded — one root per a11y object and per bridge export — and cost ~1,500 tokens per call on a measured run. Use it only when chasing one specific root.'),
|
|
473
|
+
}, async ({ limit, min_retained_size, only_dev, show_roots }) => {
|
|
96
474
|
try {
|
|
97
475
|
const snapshot = getSnapshot();
|
|
98
476
|
const meta = getSnapshotMetadata();
|
|
99
477
|
const totalSize = meta?.totalSize ?? 0;
|
|
100
478
|
const devRoots = collectDevRoots(snapshot);
|
|
101
479
|
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.');
|
|
480
|
+
return toolResult('No dev/extension globals (__REACT_DEVTOOLS_GLOBAL_HOOK__, __REDUX_DEVTOOLS_EXTENSION__, window.Debug, …) or accessibility caches (AXObjectCacheImpl, …) found in this snapshot. ' +
|
|
481
|
+
'Either this is a production/clean capture, or none were installed — large retainers here are NOT dev/automation artifacts.');
|
|
104
482
|
}
|
|
483
|
+
// One reachability pass (dev roots as sinks) drives every
|
|
484
|
+
// classification below — catches multi-dev-root co-retention that a
|
|
485
|
+
// per-node dominator walk misses.
|
|
486
|
+
const reached = computeReachableWithoutDevRoots(snapshot, devRoots);
|
|
105
487
|
const cands = [];
|
|
106
|
-
|
|
488
|
+
// Whole-heap total, independent of `min_retained_size` (see
|
|
489
|
+
// summarizeDevOnly): the headline number must never be filtered by the
|
|
490
|
+
// display threshold.
|
|
491
|
+
const totals = summarizeDevOnly(snapshot, devRoots, reached);
|
|
492
|
+
let examined = 0;
|
|
493
|
+
let skippedBySize = 0;
|
|
494
|
+
// Dev-only objects that fall UNDER the display threshold, aggregated by
|
|
495
|
+
// class. The headline total already counts them, but the table did not
|
|
496
|
+
// show them at any size, so the common shape of an automation artifact —
|
|
497
|
+
// thousands of ~10 KB console-retained records, none individually near
|
|
498
|
+
// the 512 KB default — was invisible: a reader saw "N MB is dev-only",
|
|
499
|
+
// scanned an empty-looking table, and concluded there was nothing to
|
|
500
|
+
// discount. Grouping restores them without lowering the threshold.
|
|
501
|
+
const belowByClass = new Map();
|
|
502
|
+
let belowDevOnlyCount = 0;
|
|
503
|
+
let belowDevOnlyBytes = 0;
|
|
107
504
|
snapshot.nodes.forEach(node => {
|
|
108
505
|
if (node.id <= 3)
|
|
109
506
|
return;
|
|
110
|
-
if (node.retainedSize < min_retained_size)
|
|
111
|
-
return;
|
|
112
507
|
if (node.type !== 'object' &&
|
|
113
508
|
node.type !== 'closure' &&
|
|
114
509
|
node.type !== 'array')
|
|
115
510
|
return;
|
|
116
|
-
|
|
117
|
-
if (
|
|
118
|
-
|
|
511
|
+
examined++;
|
|
512
|
+
if (node.retainedSize < min_retained_size) {
|
|
513
|
+
skippedBySize++;
|
|
514
|
+
// Test reachability directly rather than via classifyDevOnly: the
|
|
515
|
+
// latter also resolves the "via" label by walking retainers, which
|
|
516
|
+
// is far too expensive to pay per node on the below-threshold tail.
|
|
517
|
+
if (reached[node.nodeIndex] === 0) {
|
|
518
|
+
belowDevOnlyCount++;
|
|
519
|
+
// SELF size, not retained: retained sizes overlap wherever these
|
|
520
|
+
// objects nest, so summing them across a class reports more than
|
|
521
|
+
// exists. Self size is additive, and matches the units the
|
|
522
|
+
// "By source" breakdown above already uses.
|
|
523
|
+
belowDevOnlyBytes += node.self_size;
|
|
524
|
+
const key = node.name.length > 0
|
|
525
|
+
? truncateNodeName(node.name, node.type, node.self_size, 40)
|
|
526
|
+
: `(unnamed ${node.type})`;
|
|
527
|
+
const e = belowByClass.get(key);
|
|
528
|
+
if (e) {
|
|
529
|
+
e.count++;
|
|
530
|
+
e.bytes += node.self_size;
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
belowByClass.set(key, { count: 1, bytes: node.self_size });
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
const { devOnly, via } = classifyDevOnly(node, devRoots, reached);
|
|
119
539
|
if (only_dev && !devOnly)
|
|
120
540
|
return;
|
|
121
541
|
// keep top-N by retained size
|
|
@@ -129,16 +549,22 @@ export function registerDevArtifacts(server) {
|
|
|
129
549
|
if (cands.length > limit)
|
|
130
550
|
cands.length = limit;
|
|
131
551
|
});
|
|
552
|
+
const breakdown = [...totals.byCategory.entries()]
|
|
553
|
+
.sort((a, b) => b[1].selfBytes - a[1].selfBytes)
|
|
554
|
+
.map(([cat, v]) => `${CATEGORY_LABEL[cat]} ${formatBytes(v.selfBytes)} self across ${formatNumber(v.nodes)} objects`);
|
|
132
555
|
const lines = [
|
|
133
556
|
'## Dev-only artifact classification',
|
|
134
557
|
'',
|
|
135
|
-
`Dev/
|
|
136
|
-
`Total retained held ONLY via dev artifacts: **${formatBytes(
|
|
558
|
+
`Dev/automation roots present: ${summarizeDevRoots(devRoots, show_roots)}`,
|
|
559
|
+
`Total retained held ONLY via dev/automation artifacts: **${formatBytes(totals.retained)}** across **${formatNumber(totals.nodes)} objects**` +
|
|
137
560
|
(totalSize > 0
|
|
138
|
-
? ` (${Math.min(100, (
|
|
561
|
+
? ` (${Math.min(100, (totals.retained / totalSize) * 100).toFixed(1)}% of heap — exclude from production leak totals)`
|
|
139
562
|
: ''),
|
|
140
|
-
'',
|
|
141
563
|
];
|
|
564
|
+
if (breakdown.length > 0) {
|
|
565
|
+
lines.push(`By source: ${breakdown.join(' · ')}`);
|
|
566
|
+
}
|
|
567
|
+
lines.push('_This total covers the whole heap and is NOT limited by `min_retained_size` — high-count/low-size artifacts (per-event log strings, one logged object per interaction) are included._', '', "> ⚠️ **This is not the whole artifact bill.** This tool measures RETENTION-BY-A-DEV-ROOT (dev/extension globals, the inspector console, a11y caches, Fast Refresh, the automation bridge). It does NOT count **V8 JIT warmup** — `system/Code`, `InstructionStream`, `BytecodeArray`, `ProtectedFixedArray` — which is a separate and often larger bucket, and which grows simply because a hunt exercises new code paths. On one measured round this tool reported 4.8 MB / 1.5% dev-only while JIT warmup accounted for +5.7 MB of that round's 10.8 MB of growth. For the growth-side view of both, run `memlab_explain_delta` with `include_artifacts: true` against the baseline rung.", '');
|
|
142
568
|
if (cands.length > 0) {
|
|
143
569
|
const headers = ['ID', 'Name', 'Type', 'Retained', 'Classification'];
|
|
144
570
|
const rightCols = new Set([3]);
|
|
@@ -154,7 +580,24 @@ export function registerDevArtifacts(server) {
|
|
|
154
580
|
else {
|
|
155
581
|
lines.push('No objects matched the size threshold.');
|
|
156
582
|
}
|
|
157
|
-
lines.push('',
|
|
583
|
+
lines.push('', describeSkipped(examined, skippedBySize, `min_retained_size (${formatBytes(min_retained_size)})`));
|
|
584
|
+
// Below-threshold dev-only artifacts, grouped so a large aggregate made
|
|
585
|
+
// of small objects is visible in the table rather than only in the
|
|
586
|
+
// headline total.
|
|
587
|
+
if (belowDevOnlyCount > 0) {
|
|
588
|
+
const top = [...belowByClass.entries()]
|
|
589
|
+
.sort((a, b) => b[1].bytes - a[1].bytes)
|
|
590
|
+
.slice(0, 8);
|
|
591
|
+
lines.push('', `### Below \`min_retained_size\` — dev-only, aggregated by class`, '', `**${formatNumber(belowDevOnlyCount)} dev-only object(s) totalling ${formatBytes(belowDevOnlyBytes)} of self size** are individually under the ${formatBytes(min_retained_size)} threshold, so none appears above. This is the usual shape of an automation artifact: many small records, no single large one.`, '', markdownTable(['Class', 'Count', 'Self (sum)'], top.map(([name, v]) => [
|
|
592
|
+
name,
|
|
593
|
+
formatNumber(v.count),
|
|
594
|
+
formatBytes(v.bytes),
|
|
595
|
+
]), new Set([1, 2])));
|
|
596
|
+
if (belowByClass.size > top.length) {
|
|
597
|
+
lines.push('', `_… +${formatNumber(belowByClass.size - top.length)} more class(es). Lower \`min_retained_size\` to list individual objects._`);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
lines.push('', '_"dev-only" = the object\'s dominator chain passes through a dev/extension global, a Blink a11y cache, or an inspector "DevTools console" global handle, so every retainer path goes through it. Dev-global-retained objects would be GC\'d in production; a11y-cache and DevTools-console retention are automation/inspector-inflated (the a11y tree is materialized by CDP; console-logged objects are held by the attached inspector) and not present in a normal user session with DevTools closed. Either way, discount from production leak totals. Verify with `memlab_retainer_trace`._');
|
|
158
601
|
return toolResult(lines.join('\n'));
|
|
159
602
|
}
|
|
160
603
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-artifacts.js","sourceRoot":"","sources":["../../src/tools/dev-artifacts.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-artifacts.js","sourceRoot":"","sources":["../../src/tools/dev-artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAmHvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgX7D"}
|