@memlab/mcp-server 2.52.0 → 2.86.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 +22 -2
- package/dist/anonymized-snapshot.d.ts +75 -0
- package/dist/anonymized-snapshot.d.ts.map +1 -0
- package/dist/anonymized-snapshot.js +101 -0
- package/dist/anonymized-snapshot.js.map +1 -0
- package/dist/eval-hints.d.ts +41 -0
- package/dist/eval-hints.d.ts.map +1 -0
- package/dist/eval-hints.js +115 -0
- package/dist/eval-hints.js.map +1 -0
- package/dist/heap-budget.d.ts +32 -0
- package/dist/heap-budget.d.ts.map +1 -0
- package/dist/heap-budget.js +90 -0
- package/dist/heap-budget.js.map +1 -0
- package/dist/heap-shapes.d.ts +148 -0
- package/dist/heap-shapes.d.ts.map +1 -0
- package/dist/heap-shapes.js +193 -0
- package/dist/heap-shapes.js.map +1 -0
- package/dist/heap-state.d.ts +20 -0
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +8 -1
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +64 -1
- package/dist/index.js.map +1 -1
- package/dist/react-shapes.d.ts +42 -0
- package/dist/react-shapes.d.ts.map +1 -0
- package/dist/react-shapes.js +149 -0
- package/dist/react-shapes.js.map +1 -0
- package/dist/server-version.d.ts +19 -0
- package/dist/server-version.d.ts.map +1 -0
- package/dist/server-version.js +19 -0
- package/dist/server-version.js.map +1 -0
- package/dist/snapshot-borrow.d.ts +67 -0
- package/dist/snapshot-borrow.d.ts.map +1 -0
- package/dist/snapshot-borrow.js +113 -0
- package/dist/snapshot-borrow.js.map +1 -0
- package/dist/string-index.d.ts.map +1 -1
- package/dist/string-index.js +8 -0
- package/dist/string-index.js.map +1 -1
- package/dist/tools/analyze-run.d.ts.map +1 -1
- package/dist/tools/analyze-run.js +79 -18
- package/dist/tools/analyze-run.js.map +1 -1
- package/dist/tools/anonymize-snapshot.d.ts +12 -0
- package/dist/tools/anonymize-snapshot.d.ts.map +1 -0
- package/dist/tools/anonymize-snapshot.js +159 -0
- package/dist/tools/anonymize-snapshot.js.map +1 -0
- package/dist/tools/app-config.d.ts +12 -0
- package/dist/tools/app-config.d.ts.map +1 -0
- package/dist/tools/app-config.js +217 -0
- package/dist/tools/app-config.js.map +1 -0
- package/dist/tools/app-heap.d.ts +18 -0
- package/dist/tools/app-heap.d.ts.map +1 -1
- package/dist/tools/app-heap.js +12 -46
- package/dist/tools/app-heap.js.map +1 -1
- package/dist/tools/artifact-budget.d.ts +12 -0
- package/dist/tools/artifact-budget.d.ts.map +1 -0
- package/dist/tools/artifact-budget.js +219 -0
- package/dist/tools/artifact-budget.js.map +1 -0
- package/dist/tools/async-census.d.ts +12 -0
- package/dist/tools/async-census.d.ts.map +1 -0
- package/dist/tools/async-census.js +243 -0
- package/dist/tools/async-census.js.map +1 -0
- package/dist/tools/auto-investigate.d.ts.map +1 -1
- package/dist/tools/auto-investigate.js +54 -5
- package/dist/tools/auto-investigate.js.map +1 -1
- package/dist/tools/batch.d.ts.map +1 -1
- package/dist/tools/batch.js +33 -5
- package/dist/tools/batch.js.map +1 -1
- package/dist/tools/cache-analysis.d.ts +15 -0
- package/dist/tools/cache-analysis.d.ts.map +1 -1
- package/dist/tools/cache-analysis.js +85 -10
- package/dist/tools/cache-analysis.js.map +1 -1
- package/dist/tools/census-diff.d.ts +55 -0
- package/dist/tools/census-diff.d.ts.map +1 -0
- package/dist/tools/census-diff.js +228 -0
- package/dist/tools/census-diff.js.map +1 -0
- package/dist/tools/chain-walk.d.ts +12 -0
- package/dist/tools/chain-walk.d.ts.map +1 -0
- package/dist/tools/chain-walk.js +184 -0
- package/dist/tools/chain-walk.js.map +1 -0
- package/dist/tools/collection-diff.d.ts +44 -0
- package/dist/tools/collection-diff.d.ts.map +1 -0
- package/dist/tools/collection-diff.js +343 -0
- package/dist/tools/collection-diff.js.map +1 -0
- package/dist/tools/collection-trend.d.ts.map +1 -1
- package/dist/tools/collection-trend.js +2 -2
- package/dist/tools/collection-trend.js.map +1 -1
- package/dist/tools/detached-dom.d.ts +3 -0
- package/dist/tools/detached-dom.d.ts.map +1 -1
- package/dist/tools/detached-dom.js +78 -3
- package/dist/tools/detached-dom.js.map +1 -1
- package/dist/tools/dev-artifacts.d.ts.map +1 -1
- package/dist/tools/dev-artifacts.js +221 -3
- 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 +18 -2
- package/dist/tools/diff-snapshots.js.map +1 -1
- package/dist/tools/dom-audit.d.ts +37 -0
- package/dist/tools/dom-audit.d.ts.map +1 -0
- package/dist/tools/dom-audit.js +247 -0
- package/dist/tools/dom-audit.js.map +1 -0
- package/dist/tools/duplicated-strings.d.ts.map +1 -1
- package/dist/tools/duplicated-strings.js +3 -2
- package/dist/tools/duplicated-strings.js.map +1 -1
- package/dist/tools/eval-across.d.ts +12 -0
- package/dist/tools/eval-across.d.ts.map +1 -0
- package/dist/tools/eval-across.js +135 -0
- package/dist/tools/eval-across.js.map +1 -0
- package/dist/tools/eval.d.ts +78 -0
- package/dist/tools/eval.d.ts.map +1 -1
- package/dist/tools/eval.js +2270 -701
- 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 +42 -17
- package/dist/tools/event-listener-leaks.js.map +1 -1
- package/dist/tools/event-registry.d.ts.map +1 -1
- package/dist/tools/event-registry.js +42 -8
- package/dist/tools/event-registry.js.map +1 -1
- package/dist/tools/explain-delta.d.ts.map +1 -1
- package/dist/tools/explain-delta.js +61 -10
- package/dist/tools/explain-delta.js.map +1 -1
- package/dist/tools/finding-index.d.ts +181 -0
- package/dist/tools/finding-index.d.ts.map +1 -1
- package/dist/tools/finding-index.js +343 -24
- package/dist/tools/finding-index.js.map +1 -1
- package/dist/tools/get-value.d.ts +16 -0
- package/dist/tools/get-value.d.ts.map +1 -1
- package/dist/tools/get-value.js +96 -2
- package/dist/tools/get-value.js.map +1 -1
- package/dist/tools/hypothesis.d.ts.map +1 -1
- package/dist/tools/hypothesis.js +117 -58
- package/dist/tools/hypothesis.js.map +1 -1
- package/dist/tools/id-space-audit.d.ts +12 -0
- package/dist/tools/id-space-audit.d.ts.map +1 -0
- package/dist/tools/id-space-audit.js +262 -0
- package/dist/tools/id-space-audit.js.map +1 -0
- package/dist/tools/identify.d.ts +12 -0
- package/dist/tools/identify.d.ts.map +1 -0
- package/dist/tools/identify.js +205 -0
- package/dist/tools/identify.js.map +1 -0
- package/dist/tools/identity-diff.d.ts +12 -0
- package/dist/tools/identity-diff.d.ts.map +1 -0
- package/dist/tools/identity-diff.js +188 -0
- package/dist/tools/identity-diff.js.map +1 -0
- package/dist/tools/intern-opportunities.d.ts.map +1 -1
- package/dist/tools/intern-opportunities.js +4 -3
- package/dist/tools/intern-opportunities.js.map +1 -1
- package/dist/tools/ladder-probe.d.ts +65 -0
- package/dist/tools/ladder-probe.d.ts.map +1 -0
- package/dist/tools/ladder-probe.js +445 -0
- package/dist/tools/ladder-probe.js.map +1 -0
- package/dist/tools/ladder.d.ts.map +1 -1
- package/dist/tools/ladder.js +5 -5
- package/dist/tools/ladder.js.map +1 -1
- package/dist/tools/leak-report.d.ts +23 -0
- package/dist/tools/leak-report.d.ts.map +1 -1
- package/dist/tools/leak-report.js +153 -11
- package/dist/tools/leak-report.js.map +1 -1
- package/dist/tools/load-snapshot.d.ts +11 -0
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +83 -10
- package/dist/tools/load-snapshot.js.map +1 -1
- package/dist/tools/metric.d.ts +13 -0
- package/dist/tools/metric.d.ts.map +1 -0
- package/dist/tools/metric.js +185 -0
- package/dist/tools/metric.js.map +1 -0
- package/dist/tools/module-attribution.d.ts +36 -0
- package/dist/tools/module-attribution.d.ts.map +1 -0
- package/dist/tools/module-attribution.js +235 -0
- package/dist/tools/module-attribution.js.map +1 -0
- package/dist/tools/next-measurement.d.ts +26 -0
- package/dist/tools/next-measurement.d.ts.map +1 -0
- package/dist/tools/next-measurement.js +149 -0
- package/dist/tools/next-measurement.js.map +1 -0
- package/dist/tools/object-cost-breakdown.d.ts.map +1 -1
- package/dist/tools/object-cost-breakdown.js +64 -0
- package/dist/tools/object-cost-breakdown.js.map +1 -1
- package/dist/tools/population-vs-owners.d.ts +12 -0
- package/dist/tools/population-vs-owners.d.ts.map +1 -0
- package/dist/tools/population-vs-owners.js +183 -0
- package/dist/tools/population-vs-owners.js.map +1 -0
- package/dist/tools/property-names.d.ts +29 -0
- package/dist/tools/property-names.d.ts.map +1 -0
- package/dist/tools/property-names.js +131 -0
- package/dist/tools/property-names.js.map +1 -0
- package/dist/tools/quick-diagnosis.d.ts.map +1 -1
- package/dist/tools/quick-diagnosis.js +7 -1
- package/dist/tools/quick-diagnosis.js.map +1 -1
- package/dist/tools/react-owners.d.ts +12 -0
- package/dist/tools/react-owners.d.ts.map +1 -0
- package/dist/tools/react-owners.js +167 -0
- package/dist/tools/react-owners.js.map +1 -0
- package/dist/tools/react-update-queues.d.ts +12 -0
- package/dist/tools/react-update-queues.d.ts.map +1 -0
- package/dist/tools/react-update-queues.js +173 -0
- package/dist/tools/react-update-queues.js.map +1 -0
- package/dist/tools/replicate.d.ts +49 -0
- package/dist/tools/replicate.d.ts.map +1 -0
- package/dist/tools/replicate.js +241 -0
- package/dist/tools/replicate.js.map +1 -0
- package/dist/tools/retainer-diff.d.ts +12 -0
- package/dist/tools/retainer-diff.d.ts.map +1 -0
- package/dist/tools/retainer-diff.js +168 -0
- package/dist/tools/retainer-diff.js.map +1 -0
- package/dist/tools/retainer-summary.d.ts +17 -0
- package/dist/tools/retainer-summary.d.ts.map +1 -1
- package/dist/tools/retainer-summary.js +85 -22
- 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 +11 -1
- package/dist/tools/retainer-trace.js.map +1 -1
- package/dist/tools/round-audit.d.ts +66 -0
- package/dist/tools/round-audit.d.ts.map +1 -0
- package/dist/tools/round-audit.js +258 -0
- package/dist/tools/round-audit.js.map +1 -0
- package/dist/tools/round-digest.d.ts +12 -0
- package/dist/tools/round-digest.d.ts.map +1 -0
- package/dist/tools/round-digest.js +190 -0
- package/dist/tools/round-digest.js.map +1 -0
- package/dist/tools/script-census.d.ts +12 -0
- package/dist/tools/script-census.d.ts.map +1 -0
- package/dist/tools/script-census.js +182 -0
- package/dist/tools/script-census.js.map +1 -0
- package/dist/tools/sequence-analysis.d.ts +4 -0
- package/dist/tools/sequence-analysis.d.ts.map +1 -1
- package/dist/tools/sequence-analysis.js +53 -9
- package/dist/tools/sequence-analysis.js.map +1 -1
- package/dist/tools/server-status.d.ts.map +1 -1
- package/dist/tools/server-status.js +4 -1
- package/dist/tools/server-status.js.map +1 -1
- package/dist/tools/settle-check.d.ts +12 -0
- package/dist/tools/settle-check.d.ts.map +1 -0
- package/dist/tools/settle-check.js +188 -0
- package/dist/tools/settle-check.js.map +1 -0
- package/dist/tools/sliced-strings.d.ts.map +1 -1
- package/dist/tools/sliced-strings.js +2 -1
- package/dist/tools/sliced-strings.js.map +1 -1
- package/dist/tools/snapshots.d.ts.map +1 -1
- package/dist/tools/snapshots.js +24 -6
- package/dist/tools/snapshots.js.map +1 -1
- package/dist/tools/sparse-elements.d.ts +12 -0
- package/dist/tools/sparse-elements.d.ts.map +1 -0
- package/dist/tools/sparse-elements.js +215 -0
- package/dist/tools/sparse-elements.js.map +1 -0
- package/dist/tools/stale-collections.d.ts +17 -0
- package/dist/tools/stale-collections.d.ts.map +1 -1
- package/dist/tools/stale-collections.js +28 -0
- package/dist/tools/stale-collections.js.map +1 -1
- package/dist/tools/string-patterns.d.ts.map +1 -1
- package/dist/tools/string-patterns.js +2 -1
- package/dist/tools/string-patterns.js.map +1 -1
- package/dist/tools/tools-index.d.ts.map +1 -1
- package/dist/tools/tools-index.js +155 -5
- package/dist/tools/tools-index.js.map +1 -1
- package/dist/tools/trace-all.d.ts +42 -0
- package/dist/tools/trace-all.d.ts.map +1 -0
- package/dist/tools/trace-all.js +263 -0
- package/dist/tools/trace-all.js.map +1 -0
- package/dist/tools/unit-cost.d.ts +12 -0
- package/dist/tools/unit-cost.d.ts.map +1 -0
- package/dist/tools/unit-cost.js +219 -0
- package/dist/tools/unit-cost.js.map +1 -0
- package/dist/tools/verify-fix.d.ts.map +1 -1
- package/dist/tools/verify-fix.js +11 -3
- package/dist/tools/verify-fix.js.map +1 -1
- package/dist/tools/weakref-census.d.ts +15 -0
- package/dist/tools/weakref-census.d.ts.map +1 -0
- package/dist/tools/weakref-census.js +147 -0
- package/dist/tools/weakref-census.js.map +1 -0
- package/dist/tools/what-if.d.ts +12 -0
- package/dist/tools/what-if.d.ts.map +1 -0
- package/dist/tools/what-if.js +285 -0
- package/dist/tools/what-if.js.map +1 -0
- package/dist/utils.d.ts +92 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +172 -5
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-run.js","sourceRoot":"","sources":["../../src/tools/analyze-run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyze-run.js","sourceRoot":"","sources":["../../src/tools/analyze-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
* @oncall memory_lab
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
export declare function registerAnonymizeSnapshot(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=anonymize-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymize-snapshot.d.ts","sourceRoot":"","sources":["../../src/tools/anonymize-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAgGvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkJjE"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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 fs from 'fs';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import memlabCore from '@memlab/core';
|
|
14
|
+
import { resolveSnapshotPath } from './load-snapshot.js';
|
|
15
|
+
import { errorResult, formatBytes, formatNumber, textResult } from '../utils.js';
|
|
16
|
+
const { anonymizeHeapSnapshotFile, auditHeapSnapshotFile, resolveForComparison } = memlabCore;
|
|
17
|
+
/**
|
|
18
|
+
* memlab_anonymize_snapshot — make a capture shareable, and say what is left.
|
|
19
|
+
*
|
|
20
|
+
* A heap snapshot is a verbatim dump of everything the page had in memory:
|
|
21
|
+
* message bodies, tokens, account identifiers, serialized DOM. Attaching one to
|
|
22
|
+
* a task, or handing it to a model, publishes all of it.
|
|
23
|
+
*
|
|
24
|
+
* The reason this is a tool rather than advice is that doing it by hand goes
|
|
25
|
+
* wrong in a way that looks fine. One capture anonymized by hand had every
|
|
26
|
+
* string VALUE replaced — and still carried 26,303 account handles and 1,325
|
|
27
|
+
* serialized DOM fragments in the clear, because those are property names and
|
|
28
|
+
* node names rather than string values. Nothing in the file looked suspicious;
|
|
29
|
+
* the redaction was visibly thorough where anyone would think to look.
|
|
30
|
+
*
|
|
31
|
+
* So the output always ends with what was NOT removed. A tool that lists only
|
|
32
|
+
* what it took invites the reader to assume the rest was safe.
|
|
33
|
+
*/
|
|
34
|
+
function renderReport(report, wroteTo, inputLabel, inputBytes, outputBytes, elapsedMs) {
|
|
35
|
+
const lines = [];
|
|
36
|
+
lines.push(wroteTo != null
|
|
37
|
+
? `# Anonymized \`${inputLabel}\` → \`${wroteTo}\``
|
|
38
|
+
: `# Anonymization audit of \`${inputLabel}\` (nothing written)`);
|
|
39
|
+
lines.push('');
|
|
40
|
+
lines.push(`Mode \`${report.mode}\`${report.salted ? ' (salted)' : ' (unsalted)'} · ` +
|
|
41
|
+
`${formatBytes(inputBytes)} in` +
|
|
42
|
+
(outputBytes != null ? ` · ${formatBytes(outputBytes)} out` : '') +
|
|
43
|
+
` · ${(elapsedMs / 1000).toFixed(1)}s`);
|
|
44
|
+
lines.push('');
|
|
45
|
+
lines.push('## Removed');
|
|
46
|
+
lines.push('');
|
|
47
|
+
lines.push('| what | count |');
|
|
48
|
+
lines.push('| --- | ---: |');
|
|
49
|
+
lines.push(`| heap string values (every string on the heap) | ${formatNumber(report.valuesRedacted)} |`);
|
|
50
|
+
for (const rule of report.contentRedactedByRule) {
|
|
51
|
+
lines.push(`| ${rule.rule} | ${formatNumber(rule.count)} |`);
|
|
52
|
+
}
|
|
53
|
+
lines.push(`| _string table entries_ | _${formatNumber(report.stringTableSize)} total, ${formatNumber(report.entriesSplit)} split to preserve a label_ |`);
|
|
54
|
+
lines.push('');
|
|
55
|
+
lines.push('Class names, function names and ordinary property keys are deliberately kept, so retainer traces, ' +
|
|
56
|
+
'class histograms, dominator trees and shape analyses all still work on the result.');
|
|
57
|
+
lines.push('');
|
|
58
|
+
lines.push('## Still in the clear — review before sharing');
|
|
59
|
+
lines.push('');
|
|
60
|
+
if (report.unclassifiedLabelFamilies.length === 0) {
|
|
61
|
+
lines.push('No machine-generated-looking labels remain.');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
lines.push('| count | shape | examples |');
|
|
65
|
+
lines.push('| ---: | --- | --- |');
|
|
66
|
+
for (const family of report.unclassifiedLabelFamilies) {
|
|
67
|
+
const examples = family.examples
|
|
68
|
+
.map(e => (e.length > 38 ? `${e.slice(0, 35)}…` : e))
|
|
69
|
+
.map(e => `\`${e.replace(/\|/g, '\\|')}\``)
|
|
70
|
+
.join(' ');
|
|
71
|
+
lines.push(`| ${formatNumber(family.count)} | \`${family.shape}\` | ${examples} |`);
|
|
72
|
+
}
|
|
73
|
+
lines.push('');
|
|
74
|
+
lines.push('**Anything above that is an identifier in THIS application is a residual leak.** No fixed rule set can know ' +
|
|
75
|
+
"an application's own identifier scheme, which is why they are reported rather than guessed at. To remove one, " +
|
|
76
|
+
're-run from the API with a `shouldRedact` callback (`@memlab/core`), or add it to `extra_patterns`.');
|
|
77
|
+
}
|
|
78
|
+
return lines.join('\n');
|
|
79
|
+
}
|
|
80
|
+
export function registerAnonymizeSnapshot(server) {
|
|
81
|
+
server.tool('memlab_anonymize_snapshot', 'Rewrite a .heapsnapshot so it can be shared: replaces the content of every string on the heap, plus any property name or node name that looks like an identifier, a credential or serialized DOM — while KEEPING class names, function names and ordinary property keys, so retainer traces, histograms, dominator trees and shape analyses still work on the result. Lengths are preserved exactly, and by default so is distinctness, so duplication and interning figures stay accurate. Always reports what it did NOT remove: a capture anonymized by hand had every string value replaced and still carried 26,303 account handles as property names. Set audit_only to inspect a capture someone else anonymized without writing anything. Set salt for anything leaving your trust boundary, and reuse one salt across a set of snapshots so they stay comparable.', {
|
|
82
|
+
file_path: z
|
|
83
|
+
.string()
|
|
84
|
+
.describe('A local absolute path to a .heapsnapshot file, a manifold:// URL, or a bare snapshot filename to fetch.'),
|
|
85
|
+
output_path: z
|
|
86
|
+
.string()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('Absolute path to write the anonymized snapshot to. Required unless audit_only is set. Must differ from the input.'),
|
|
89
|
+
audit_only: z
|
|
90
|
+
.boolean()
|
|
91
|
+
.default(false)
|
|
92
|
+
.describe('Report what would be redacted and what would be left in the clear, without writing a file.'),
|
|
93
|
+
mode: z
|
|
94
|
+
.enum(['stable', 'uniform'])
|
|
95
|
+
.default('stable')
|
|
96
|
+
.describe('"stable" (default) keeps distinct values distinct, so duplication and interning figures remain accurate. "uniform" replaces every character with "?", which leaks less but collapses distinct values of equal length together and makes every duplication figure fiction.'),
|
|
97
|
+
salt: z
|
|
98
|
+
.string()
|
|
99
|
+
.optional()
|
|
100
|
+
.describe('Salt for the replacement text. Without one the mapping is identical in every capture — convenient for diffing a ladder, but it lets anyone holding a candidate value confirm its presence. Use the SAME salt for every file in a set.'),
|
|
101
|
+
extra_patterns: z
|
|
102
|
+
.array(z.string())
|
|
103
|
+
.optional()
|
|
104
|
+
.describe('Additional regular expressions; any string table entry matching one is redacted wherever it appears. Use this for identifier schemes specific to this application.'),
|
|
105
|
+
keep_patterns: z
|
|
106
|
+
.array(z.string())
|
|
107
|
+
.optional()
|
|
108
|
+
.describe('Regular expressions that must never be redacted; these win over every built-in rule.'),
|
|
109
|
+
}, async ({ file_path, output_path, audit_only, mode, salt, extra_patterns, keep_patterns, }) => {
|
|
110
|
+
try {
|
|
111
|
+
let resolved;
|
|
112
|
+
try {
|
|
113
|
+
resolved = resolveSnapshotPath(file_path).localPath;
|
|
114
|
+
}
|
|
115
|
+
catch (fetchErr) {
|
|
116
|
+
const msg = fetchErr instanceof Error ? fetchErr.message : String(fetchErr);
|
|
117
|
+
return errorResult(new Error(`Failed to resolve "${file_path}": ${msg}`));
|
|
118
|
+
}
|
|
119
|
+
if (!fs.existsSync(resolved)) {
|
|
120
|
+
return errorResult(new Error(`File not found: ${resolved}`));
|
|
121
|
+
}
|
|
122
|
+
let extraPatterns;
|
|
123
|
+
let keepPatterns;
|
|
124
|
+
try {
|
|
125
|
+
extraPatterns = extra_patterns?.map(p => new RegExp(p));
|
|
126
|
+
keepPatterns = keep_patterns?.map(p => new RegExp(p));
|
|
127
|
+
}
|
|
128
|
+
catch (reErr) {
|
|
129
|
+
return errorResult(new Error(`Invalid regular expression: ${reErr instanceof Error ? reErr.message : String(reErr)}`));
|
|
130
|
+
}
|
|
131
|
+
const options = { mode, salt, extraPatterns, keepPatterns };
|
|
132
|
+
const inputBytes = fs.statSync(resolved).size;
|
|
133
|
+
const inputLabel = path.basename(resolved);
|
|
134
|
+
const started = Date.now();
|
|
135
|
+
if (audit_only) {
|
|
136
|
+
const report = await auditHeapSnapshotFile(resolved, options);
|
|
137
|
+
return textResult(renderReport(report, null, inputLabel, inputBytes, null, Date.now() - started));
|
|
138
|
+
}
|
|
139
|
+
if (!output_path) {
|
|
140
|
+
// Not defaulted to a path beside the input on purpose: writing an
|
|
141
|
+
// anonymized copy somewhere the caller did not name is how a capture
|
|
142
|
+
// gets shared by accident.
|
|
143
|
+
return errorResult(new Error('Set output_path to write the anonymized snapshot to, or audit_only:true to only report what would be redacted.'));
|
|
144
|
+
}
|
|
145
|
+
// Canonical comparison, not `path.resolve`: a symlink pointing at the
|
|
146
|
+
// input resolves to a different string but the same file, and writing
|
|
147
|
+
// there destroys the only unredacted copy.
|
|
148
|
+
if (resolveForComparison(output_path) === resolveForComparison(resolved)) {
|
|
149
|
+
return errorResult(new Error('output_path must differ from the input; anonymizing in place would destroy the only unredacted copy.'));
|
|
150
|
+
}
|
|
151
|
+
const report = await anonymizeHeapSnapshotFile(resolved, output_path, options);
|
|
152
|
+
return textResult(renderReport(report, output_path, inputLabel, inputBytes, fs.statSync(output_path).size, Date.now() - started));
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
return errorResult(err);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=anonymize-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anonymize-snapshot.js","sourceRoot":"","sources":["../../src/tools/anonymize-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
* @oncall memory_lab
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
export declare function registerAppConfig(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=app-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-config.d.ts","sourceRoot":"","sources":["../../src/tools/app-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAuHvE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwIzD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
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 } from '../heap-state.js';
|
|
12
|
+
import { calibrateSmiDecode, decodeSmi } from './get-value.js';
|
|
13
|
+
import { errorResult, formatNumber, markdownTable, toolResult, } from '../utils.js';
|
|
14
|
+
/**
|
|
15
|
+
* Reading a feature flag out of a heap snapshot.
|
|
16
|
+
*
|
|
17
|
+
* Half of "is this leak still there?" is "was the fix even ON in this capture?",
|
|
18
|
+
* and that question was being answered by inference: the code says the cleanup
|
|
19
|
+
* is gated, the capture looks like the cleanup did not run, therefore the gate
|
|
20
|
+
* was off. That reasoning is circular — the same evidence is what the gate is
|
|
21
|
+
* being invoked to explain. The snapshot contains the answer, because the
|
|
22
|
+
* config the app read is still resident in it.
|
|
23
|
+
*
|
|
24
|
+
* A flag registry is recognised by shape rather than by name: many entries,
|
|
25
|
+
* keys shaped like config identifiers, values that are booleans or small
|
|
26
|
+
* numbers. That is deliberately generic — the tool should not need to know
|
|
27
|
+
* about any one company's flag system to read one.
|
|
28
|
+
*/
|
|
29
|
+
const CONFIG_KEY_RE = /^[a-z][a-z0-9]*(?:[_.][a-z0-9]+){1,}$/;
|
|
30
|
+
const MAX_ARRAY_ELEMENTS = 6;
|
|
31
|
+
function readValue(node, smiTrusted, depth = 0) {
|
|
32
|
+
// A config entry is very often an array rather than a scalar: a flag record
|
|
33
|
+
// carrying [code, type, prod-default, debug-default], a tuple of thresholds,
|
|
34
|
+
// an allowlist. Reporting those as "(unreadable)" makes the tool answer
|
|
35
|
+
// "no" to a question it can actually answer, which is worse than not asking.
|
|
36
|
+
if (depth === 0 && node.type === 'object' && node.name === 'Array') {
|
|
37
|
+
const parts = [];
|
|
38
|
+
let count = 0;
|
|
39
|
+
for (const edge of node.references) {
|
|
40
|
+
if (edge.type !== 'element')
|
|
41
|
+
continue;
|
|
42
|
+
count++;
|
|
43
|
+
if (parts.length >= MAX_ARRAY_ELEMENTS)
|
|
44
|
+
continue;
|
|
45
|
+
const { value } = readValue(edge.toNode, smiTrusted, depth + 1);
|
|
46
|
+
parts.push(value === null ? '?' : String(value));
|
|
47
|
+
}
|
|
48
|
+
if (count === 0)
|
|
49
|
+
return { value: '[]' };
|
|
50
|
+
return {
|
|
51
|
+
value: `[${parts.join(', ')}${count > parts.length ? `, …+${count - parts.length}` : ''}]`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// V8 reports the shared `true`/`false` oddballs as type "native", not
|
|
55
|
+
// "object" — keying on the type here silently turned every boolean flag in
|
|
56
|
+
// the heap into "(unreadable)".
|
|
57
|
+
if (node.name === 'true' || node.name === 'false') {
|
|
58
|
+
return { value: node.name === 'true' };
|
|
59
|
+
}
|
|
60
|
+
if (node.type === 'string' || node.type === 'concatenated string') {
|
|
61
|
+
return { value: node.name };
|
|
62
|
+
}
|
|
63
|
+
if (node.type === 'number') {
|
|
64
|
+
const smi = decodeSmi(node);
|
|
65
|
+
if (smi != null) {
|
|
66
|
+
// When the calibration failed, the decode is wrong often enough that
|
|
67
|
+
// printing it is worse than printing nothing: a bogus id is
|
|
68
|
+
// indistinguishable from a real one and gets quoted downstream. Suppress
|
|
69
|
+
// the value and keep the note. Booleans and strings are read directly and
|
|
70
|
+
// stay trustworthy either way.
|
|
71
|
+
return smiTrusted
|
|
72
|
+
? { value: smi }
|
|
73
|
+
: { value: null, note: 'SMI decode unverified in this capture' };
|
|
74
|
+
}
|
|
75
|
+
// A heap number's value is not stored in the snapshot at all.
|
|
76
|
+
return {
|
|
77
|
+
value: null,
|
|
78
|
+
note: 'heap number — value not recorded in the capture',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
if (node.name === 'null' || node.name === 'undefined') {
|
|
82
|
+
return { value: null, note: node.name };
|
|
83
|
+
}
|
|
84
|
+
return { value: null, note: `${node.name} (${node.type})` };
|
|
85
|
+
}
|
|
86
|
+
function collectRegistries(snapshot, minEntries) {
|
|
87
|
+
const out = [];
|
|
88
|
+
snapshot.nodes.forEach(node => {
|
|
89
|
+
if (node.id <= 3 || node.type !== 'object')
|
|
90
|
+
return;
|
|
91
|
+
const entries = [];
|
|
92
|
+
let props = 0;
|
|
93
|
+
for (const edge of node.references) {
|
|
94
|
+
if (edge.type !== 'property')
|
|
95
|
+
continue;
|
|
96
|
+
props++;
|
|
97
|
+
// Bail early on objects that are plainly not registries; walking every
|
|
98
|
+
// property of every object in a 2.5M-node heap otherwise dominates.
|
|
99
|
+
if (props > 5000)
|
|
100
|
+
break;
|
|
101
|
+
const key = String(edge.name_or_index);
|
|
102
|
+
if (!CONFIG_KEY_RE.test(key))
|
|
103
|
+
continue;
|
|
104
|
+
entries.push({ key, node: edge.toNode });
|
|
105
|
+
}
|
|
106
|
+
if (entries.length >= minEntries)
|
|
107
|
+
out.push({ node, entries });
|
|
108
|
+
});
|
|
109
|
+
return out.sort((a, b) => b.entries.length - a.entries.length);
|
|
110
|
+
}
|
|
111
|
+
export function registerAppConfig(server) {
|
|
112
|
+
server.tool('memlab_app_config', 'Read the feature flags and config values the app was actually running with, out of the snapshot itself.\n\n' +
|
|
113
|
+
'Half of "is this leak still there?" is "was the fix even enabled in this capture?" — and that gets answered by inference: the code says the cleanup is gated, the capture looks like the cleanup did not run, therefore the gate was off. That is circular, because the same evidence is what the gate is being invoked to explain. The config the app read is still resident in the heap, so the question is answerable directly.\n\n' +
|
|
114
|
+
'Registries are found by SHAPE, not by name — an object with many entries whose keys look like config identifiers (`some_feature_enabled`, `web.thing.limit`) and whose values are booleans or small numbers. `key` looks up one flag across every registry found.', {
|
|
115
|
+
key: z
|
|
116
|
+
.string()
|
|
117
|
+
.optional()
|
|
118
|
+
.describe('Look up this exact config key (or a substring of it) across all registries found, and report its value.'),
|
|
119
|
+
min_entries: z
|
|
120
|
+
.number()
|
|
121
|
+
.optional()
|
|
122
|
+
.default(20)
|
|
123
|
+
.describe('Minimum config-shaped keys for an object to count as a registry (default 20). Lower it if the app splits config across small objects.'),
|
|
124
|
+
limit: z
|
|
125
|
+
.number()
|
|
126
|
+
.optional()
|
|
127
|
+
.default(10)
|
|
128
|
+
.describe('Registries (or matching keys) to report (default 10).'),
|
|
129
|
+
samples: z
|
|
130
|
+
.number()
|
|
131
|
+
.optional()
|
|
132
|
+
.default(5)
|
|
133
|
+
.describe('Sample entries to show per registry in discover mode.'),
|
|
134
|
+
}, async ({ key, min_entries, limit, samples }) => {
|
|
135
|
+
try {
|
|
136
|
+
const snapshot = getSnapshot({ allowLight: true });
|
|
137
|
+
const calibration = calibrateSmiDecode(snapshot, 25);
|
|
138
|
+
const smiTrusted = calibration.verdict === 'holds';
|
|
139
|
+
const registries = collectRegistries(snapshot, min_entries);
|
|
140
|
+
if (registries.length === 0) {
|
|
141
|
+
return toolResult([
|
|
142
|
+
`No config-shaped registry found (needed ≥ ${formatNumber(min_entries)} keys matching \`${CONFIG_KEY_RE.source}\` on one object).`,
|
|
143
|
+
'',
|
|
144
|
+
'That is a statement about the shape looked for, not about the app: config held in a Map, keyed by camelCase, or split across many small objects will not match. Try a lower `min_entries`, or find it directly with `memlab_find_by_property` on a flag name you already know.',
|
|
145
|
+
].join('\n'));
|
|
146
|
+
}
|
|
147
|
+
if (key != null && key !== '') {
|
|
148
|
+
const needle = key.toLowerCase();
|
|
149
|
+
const hits = [];
|
|
150
|
+
for (const reg of registries) {
|
|
151
|
+
for (const e of reg.entries) {
|
|
152
|
+
if (!e.key.toLowerCase().includes(needle))
|
|
153
|
+
continue;
|
|
154
|
+
const { value, note } = readValue(e.node, smiTrusted);
|
|
155
|
+
hits.push({ reg, key: e.key, value, note });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (hits.length === 0) {
|
|
159
|
+
return toolResult(`No key matching \`${key}\` in the ${formatNumber(registries.length)} registry/registries found (${formatNumber(registries.reduce((a, r) => a + r.entries.length, 0))} keys total). The flag may be held under a different name, or read once and never stored.\n\n` +
|
|
160
|
+
'IMPORTANT: this tool discovers config REGISTRIES — objects holding many flag entries. ' +
|
|
161
|
+
'A gate read through a per-call API that keeps no registry (a Gatekeeper-style `gk(name)` lookup, ' +
|
|
162
|
+
'a function that returns a value without storing it) is structurally invisible here and will ALWAYS miss. ' +
|
|
163
|
+
'A miss is therefore not evidence that the gate was off; it is not evidence of anything. ' +
|
|
164
|
+
'Confirm the gate state from the code path or the experiment console instead.');
|
|
165
|
+
}
|
|
166
|
+
const rows = hits
|
|
167
|
+
.slice(0, limit)
|
|
168
|
+
.map(h => [
|
|
169
|
+
h.key,
|
|
170
|
+
h.value === null ? '(unreadable)' : String(h.value),
|
|
171
|
+
`@${h.reg.node.id} ${h.reg.node.name}`,
|
|
172
|
+
h.note ?? '',
|
|
173
|
+
]);
|
|
174
|
+
return toolResult([
|
|
175
|
+
`## Config lookup: \`${key}\``,
|
|
176
|
+
'',
|
|
177
|
+
markdownTable(['Key', 'Value', 'Registry', 'Note'], rows, new Set()),
|
|
178
|
+
'',
|
|
179
|
+
hits.length > limit
|
|
180
|
+
? `_${formatNumber(hits.length - limit)} further match(es); raise \`limit\` or pass the exact key._\n`
|
|
181
|
+
: '',
|
|
182
|
+
'_This is the value RESIDENT in the capture, which is what the app read — not what the config service would return now. A value the app read once and never stored is not here at all, and absence is not evidence the flag was off._',
|
|
183
|
+
'',
|
|
184
|
+
'_An ARRAY value is the record exactly as stored. For a flag-definition record (`[code, type, prod-default, debug-default]` and similar) those are the DEFAULTS, and the value the app resolved at runtime may differ — check where the app reads the record before quoting an element as the effective setting._',
|
|
185
|
+
].join('\n'));
|
|
186
|
+
}
|
|
187
|
+
const rows = registries.slice(0, limit).map(r => {
|
|
188
|
+
const sample = r.entries
|
|
189
|
+
.slice(0, samples)
|
|
190
|
+
.map(e => {
|
|
191
|
+
const { value } = readValue(e.node, smiTrusted);
|
|
192
|
+
return `${e.key}=${value === null ? '?' : String(value)}`;
|
|
193
|
+
})
|
|
194
|
+
.join(', ');
|
|
195
|
+
return [
|
|
196
|
+
`@${r.node.id} ${r.node.name}`,
|
|
197
|
+
formatNumber(r.entries.length),
|
|
198
|
+
sample.length > 90 ? sample.slice(0, 87) + '…' : sample,
|
|
199
|
+
];
|
|
200
|
+
});
|
|
201
|
+
return toolResult([
|
|
202
|
+
`## Config registries (${formatNumber(registries.length)} found)`,
|
|
203
|
+
'',
|
|
204
|
+
markdownTable(['Object', 'Config-shaped keys', 'Sample'], rows, new Set([1])),
|
|
205
|
+
'',
|
|
206
|
+
smiTrusted
|
|
207
|
+
? ''
|
|
208
|
+
: '⚠ Numeric values come from the SMI node-id decode, and the self-check against known array lengths FAILED in this capture — treat every number above as unverified.\n',
|
|
209
|
+
'Look one up with `memlab_app_config({key: "..."})`. Boolean and string values are read directly; a heap number\'s value is not recorded in a snapshot at all and reports as unreadable.',
|
|
210
|
+
].join('\n'));
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
return errorResult(err);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=app-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../src/tools/app-config.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/app-heap.d.ts
CHANGED
|
@@ -8,5 +8,23 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
/**
|
|
12
|
+
* How much of this heap is actually the APPLICATION?
|
|
13
|
+
*
|
|
14
|
+
* A dev-build heap is mostly not the app. Measured on one WhatsApp Web capture:
|
|
15
|
+
* `system / ExternalStringData` — the bundle's own source text — was 56% of a
|
|
16
|
+
* 311 MB heap, single strings in it retained 84.9 / 22.5 / 17.8 / 10.2 MB, and
|
|
17
|
+
* code-related memory came to roughly two thirds of the total. So "drive to
|
|
18
|
+
* 600 MB" is mostly an instruction to load more bundle, the number is not
|
|
19
|
+
* comparable to production, and a threshold expressed against it is measuring
|
|
20
|
+
* the wrong thing.
|
|
21
|
+
*
|
|
22
|
+
* The split below is deliberately coarse and named, not a single magic number:
|
|
23
|
+
* a reader has to be able to see WHICH bucket dominates, because that is what
|
|
24
|
+
* decides whether the capture is usable at all.
|
|
25
|
+
*
|
|
26
|
+
* The partition itself lives in `heap-budget.ts`, shared with
|
|
27
|
+
* `memlab_artifact_budget` so the two cannot report different splits.
|
|
28
|
+
*/
|
|
11
29
|
export declare function registerAppHeap(server: McpServer): void;
|
|
12
30
|
//# sourceMappingURL=app-heap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-heap.d.ts","sourceRoot":"","sources":["../../src/tools/app-heap.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"app-heap.d.ts","sourceRoot":"","sources":["../../src/tools/app-heap.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAYvE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoGvD"}
|
package/dist/tools/app-heap.js
CHANGED
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { getSnapshot, getSnapshotMetadata } from '../heap-state.js';
|
|
12
12
|
import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
|
-
import {
|
|
14
|
-
import { collectDevRoots, computeReachableWithoutDevRoots, } from './dev-artifacts.js';
|
|
13
|
+
import { computeHeapBudget } from '../heap-budget.js';
|
|
15
14
|
/**
|
|
16
15
|
* How much of this heap is actually the APPLICATION?
|
|
17
16
|
*
|
|
@@ -26,11 +25,10 @@ import { collectDevRoots, computeReachableWithoutDevRoots, } from './dev-artifac
|
|
|
26
25
|
* The split below is deliberately coarse and named, not a single magic number:
|
|
27
26
|
* a reader has to be able to see WHICH bucket dominates, because that is what
|
|
28
27
|
* decides whether the capture is usable at all.
|
|
28
|
+
*
|
|
29
|
+
* The partition itself lives in `heap-budget.ts`, shared with
|
|
30
|
+
* `memlab_artifact_budget` so the two cannot report different splits.
|
|
29
31
|
*/
|
|
30
|
-
const CODE_TYPES = new Set(['code']);
|
|
31
|
-
// Bundle source text and the V8 structures that hold it. These exist because
|
|
32
|
-
// the app was *loaded*, not because it did anything.
|
|
33
|
-
const BUNDLE_NAME_RE = /ExternalStringData|InstructionStream|BytecodeArray|SharedFunctionInfo|ScopeInfo|UncompiledData|FeedbackVector|FeedbackMetadata|FeedbackCell|ClosureFeedbackCellArray|\(constant pool\)|ConstantPool/;
|
|
34
32
|
export function registerAppHeap(server) {
|
|
35
33
|
server.tool('memlab_app_heap', 'Report APP-ATTRIBUTABLE heap: total self size minus bundle/code memory, minus dev-build artifacts, minus measurement-harness content — the part of the heap that is actually the application. ' +
|
|
36
34
|
'On a dev build the raw number is mostly not the app: a measured WhatsApp Web capture had bundle source text (`system / ExternalStringData`) at 56% of a 311 MB heap and code-related memory at roughly two thirds of the total. A leak-hunt threshold expressed against the raw total therefore mostly measures how much bundle has loaded, and is not comparable to production at all. ' +
|
|
@@ -40,48 +38,16 @@ export function registerAppHeap(server) {
|
|
|
40
38
|
.optional()
|
|
41
39
|
.default(true)
|
|
42
40
|
.describe('Show the per-bucket table (default true). The breakdown is the point — which bucket dominates decides whether the capture is usable.'),
|
|
43
|
-
|
|
41
|
+
summary_only: z
|
|
42
|
+
.boolean()
|
|
43
|
+
.optional()
|
|
44
|
+
.default(false)
|
|
45
|
+
.describe("Headline figure only, suppressing the per-bucket table. Equivalent to `show_breakdown: false`; accepted under the name the other tools use so a caller trimming a whole round's output does not have to remember which flag each tool spells it with."),
|
|
46
|
+
}, async ({ show_breakdown, summary_only }) => {
|
|
44
47
|
try {
|
|
45
48
|
const snapshot = getSnapshot();
|
|
46
49
|
const meta = getSnapshotMetadata();
|
|
47
|
-
const
|
|
48
|
-
const reached = devRoots.byId.size > 0
|
|
49
|
-
? computeReachableWithoutDevRoots(snapshot, devRoots)
|
|
50
|
-
: null;
|
|
51
|
-
let total = 0;
|
|
52
|
-
let code = 0;
|
|
53
|
-
let bundle = 0;
|
|
54
|
-
let devOnly = 0;
|
|
55
|
-
let artifact = 0;
|
|
56
|
-
let app = 0;
|
|
57
|
-
let appNodes = 0;
|
|
58
|
-
const isDevOnly = (node) => reached != null && reached[node.nodeIndex] === 0;
|
|
59
|
-
snapshot.nodes.forEach(node => {
|
|
60
|
-
if (node.id <= 3)
|
|
61
|
-
return;
|
|
62
|
-
const size = node.self_size;
|
|
63
|
-
total += size;
|
|
64
|
-
// Precedence matters: a node is counted once, in the most specific
|
|
65
|
-
// bucket that explains why it is NOT app memory.
|
|
66
|
-
if (isDevOnly(node)) {
|
|
67
|
-
devOnly += size;
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (CODE_TYPES.has(node.type)) {
|
|
71
|
-
code += size;
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
if (BUNDLE_NAME_RE.test(node.name)) {
|
|
75
|
-
bundle += size;
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (classifyArtifact(node.name) != null) {
|
|
79
|
-
artifact += size;
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
app += size;
|
|
83
|
-
appNodes++;
|
|
84
|
-
});
|
|
50
|
+
const { total, app, appNodes, bundle, code, devOnly, artifact } = computeHeapBudget(snapshot);
|
|
85
51
|
const pct = (n) => total > 0 ? `${((n / total) * 100).toFixed(1)}%` : '—';
|
|
86
52
|
const lines = [
|
|
87
53
|
'## App-attributable heap',
|
|
@@ -91,7 +57,7 @@ export function registerAppHeap(server) {
|
|
|
91
57
|
'.',
|
|
92
58
|
'',
|
|
93
59
|
];
|
|
94
|
-
if (show_breakdown) {
|
|
60
|
+
if (show_breakdown && !summary_only) {
|
|
95
61
|
lines.push(markdownTable(['Bucket', 'Self size', '% of heap', 'What it is'], [
|
|
96
62
|
[
|
|
97
63
|
'App',
|