@memlab/mcp-server 2.18.1 → 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 +30 -16
- package/bin/.eslintrc.js +26 -0
- package/bin/memlab-cli.js +313 -0
- 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/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/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/guardrail.d.ts.map +1 -1
- package/dist/guardrail.js +13 -0
- package/dist/guardrail.js.map +1 -1
- 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 +109 -2
- package/dist/heap-state.d.ts.map +1 -1
- package/dist/heap-state.js +194 -3
- package/dist/heap-state.js.map +1 -1
- package/dist/index.js +102 -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/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/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/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 +55 -0
- package/dist/string-index.d.ts.map +1 -0
- package/dist/string-index.js +99 -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 +404 -0
- package/dist/tools/analyze-run.js.map +1 -0
- 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 +30 -0
- package/dist/tools/app-heap.d.ts.map +1 -0
- package/dist/tools/app-heap.js +106 -0
- package/dist/tools/app-heap.js.map +1 -0
- 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 +12 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +196 -0
- package/dist/tools/batch.js.map +1 -0
- 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 +240 -14
- 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/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-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 +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 +5 -0
- package/dist/tools/detached-dom.d.ts.map +1 -1
- package/dist/tools/detached-dom.js +368 -22
- 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 +685 -24
- 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/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 +49 -40
- 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 +79 -0
- package/dist/tools/eval.d.ts.map +1 -1
- package/dist/tools/eval.js +2523 -197
- 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 +12 -0
- package/dist/tools/explain-delta.d.ts.map +1 -0
- package/dist/tools/explain-delta.js +221 -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 +203 -0
- package/dist/tools/finding-index.d.ts.map +1 -0
- package/dist/tools/finding-index.js +566 -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-referrers.d.ts.map +1 -1
- package/dist/tools/get-referrers.js +17 -0
- package/dist/tools/get-referrers.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/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 +280 -0
- package/dist/tools/hypothesis.js.map +1 -0
- 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 +116 -50
- 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 +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 +6 -2
- package/dist/tools/largest-objects.js.map +1 -1
- package/dist/tools/leak-report.d.ts +35 -0
- package/dist/tools/leak-report.d.ts.map +1 -0
- package/dist/tools/leak-report.js +398 -0
- package/dist/tools/leak-report.js.map +1 -0
- package/dist/tools/load-snapshot.d.ts +29 -0
- package/dist/tools/load-snapshot.d.ts.map +1 -1
- package/dist/tools/load-snapshot.js +294 -23
- 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/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/object-shape.d.ts.map +1 -1
- package/dist/tools/object-shape.js +53 -5
- 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/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-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 +18 -0
- package/dist/tools/retainer-summary.d.ts.map +1 -1
- package/dist/tools/retainer-summary.js +210 -51
- 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 +14 -2
- 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/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 +53 -0
- package/dist/tools/sequence-analysis.d.ts.map +1 -1
- package/dist/tools/sequence-analysis.js +313 -89
- 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/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 +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 +7 -5
- 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 +492 -0
- package/dist/tools/tools-index.js.map +1 -0
- 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 +23 -0
- package/dist/tools/verify-fix.d.ts.map +1 -0
- package/dist/tools/verify-fix.js +219 -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/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 +238 -3
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +507 -15
- package/dist/utils.js.map +1 -1
- package/package.json +7 -6
|
@@ -0,0 +1,215 @@
|
|
|
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, shouldEmitNote } from '../heap-state.js';
|
|
12
|
+
import { errorResult, toolResult, formatBytes, formatNumber, markdownTable, suggestionsSuppressed, nearestNamedOwner, } from '../utils.js';
|
|
13
|
+
// Shared with memlab_cache_analysis on purpose: a pre-sized ring buffer is the
|
|
14
|
+
// one shape that is indistinguishable from an unbounded cache by size alone,
|
|
15
|
+
// and a second copy of that heuristic would drift from the first.
|
|
16
|
+
import { looksLikeRingBuffer } from './cache-analysis.js';
|
|
17
|
+
// The elements-store facts live in one module so cost_breakdown, this tool and
|
|
18
|
+
// `helpers.elements` cannot disagree about the same object's capacity.
|
|
19
|
+
import { STORE_HEADER_BYTES, FORGIVEN_TAIL_SLOTS, getElementsIndex, } from '../heap-shapes.js';
|
|
20
|
+
/** What a reader should DO about the group, from which half of the waste dominates. */
|
|
21
|
+
function diagnose(group) {
|
|
22
|
+
if (group.ring) {
|
|
23
|
+
return 'PRE-SIZED RING BUFFER — the owner carries a write cursor and/or a capacity control, so the empty slots are the design, not a leak; the question is whether the configured capacity is right, not whether to trim it';
|
|
24
|
+
}
|
|
25
|
+
const hole = group.holeSlots;
|
|
26
|
+
const slack = group.slackSlots;
|
|
27
|
+
if (hole > slack * 2) {
|
|
28
|
+
return 'sparse keys — the written indices are strided or scattered, so the store is sized for a range it never fills; re-key densely (or use a Map)';
|
|
29
|
+
}
|
|
30
|
+
if (slack > hole * 2) {
|
|
31
|
+
return group.used === 0
|
|
32
|
+
? 'allocated but never filled — the store is sized and then left empty'
|
|
33
|
+
: 'over-allocated — capacity far exceeds the highest key written; presize to the real length';
|
|
34
|
+
}
|
|
35
|
+
return 'both sparse keys and excess capacity';
|
|
36
|
+
}
|
|
37
|
+
export function registerSparseElements(server) {
|
|
38
|
+
server.tool('memlab_sparse_elements', 'Find integer-keyed objects and arrays whose ELEMENTS BACKING STORE is mostly holes — memory V8 has allocated and the application never uses. This is the waste a class histogram cannot see: the store is a `(object elements)` FixedArray charged to no class, and each instance is individually small, so the cost only appears once instances are grouped by owner. Two distinct causes are separated in the output: sparse/strided keys (indices scattered across a range the store must span) and over-allocation (capacity far past the highest key). Groups are labelled by the nearest named property up the retainer chain (`getterImpl.$$cache`), which is what you can grep for. Complements memlab_cache_analysis (entry counts in Maps/Sets) and memlab_object_cost_breakdown (where one class’s bytes go).', {
|
|
39
|
+
min_capacity: z
|
|
40
|
+
.number()
|
|
41
|
+
.optional()
|
|
42
|
+
.default(32)
|
|
43
|
+
.describe('Ignore backing stores smaller than this many slots (default 32). Below it, V8’s own growth floor dominates and every short array looks empty.'),
|
|
44
|
+
max_occupancy: z
|
|
45
|
+
.number()
|
|
46
|
+
.optional()
|
|
47
|
+
.default(0.5)
|
|
48
|
+
.describe('Only count an instance when at most this fraction of its slots hold a value (default 0.5). Raise toward 1 to include stores that are merely over-allocated.'),
|
|
49
|
+
min_group_bytes: z
|
|
50
|
+
.number()
|
|
51
|
+
.optional()
|
|
52
|
+
.default(4096)
|
|
53
|
+
.describe('Drop groups wasting less than this many bytes in total (default 4096).'),
|
|
54
|
+
limit: z
|
|
55
|
+
.number()
|
|
56
|
+
.optional()
|
|
57
|
+
.default(20)
|
|
58
|
+
.describe('Maximum number of groups to report (default 20).'),
|
|
59
|
+
max_hops: z
|
|
60
|
+
.number()
|
|
61
|
+
.optional()
|
|
62
|
+
.default(6)
|
|
63
|
+
.describe('How far up the retainer chain to look for a named owner before giving up and grouping as unattributed (default 6).'),
|
|
64
|
+
}, async ({ min_capacity, max_occupancy, min_group_bytes, limit, max_hops }) => {
|
|
65
|
+
try {
|
|
66
|
+
const snapshot = getSnapshot();
|
|
67
|
+
// The structural pass is memoized per snapshot (see heap-shapes.ts):
|
|
68
|
+
// repeated calls while tuning min_capacity / max_occupancy — the normal
|
|
69
|
+
// way this tool is used — cost one full walk, not one per call.
|
|
70
|
+
const index = getElementsIndex(snapshot);
|
|
71
|
+
const slotBytes = index.slotBytes;
|
|
72
|
+
const groups = new Map();
|
|
73
|
+
let unmeasurable = 0;
|
|
74
|
+
let unmeasurableBytes = 0;
|
|
75
|
+
let dictionaries = 0;
|
|
76
|
+
let examined = 0;
|
|
77
|
+
for (let i = 0; i < index.count; i++) {
|
|
78
|
+
const storeBytes = index.storeBytes[i];
|
|
79
|
+
const rawUsed = index.used[i];
|
|
80
|
+
const capacity = Math.floor((storeBytes - STORE_HEADER_BYTES) / slotBytes);
|
|
81
|
+
const span = index.maxIndex[i] + 1;
|
|
82
|
+
if (span > capacity) {
|
|
83
|
+
// Keys reach past the dense capacity: this is a NumberDictionary,
|
|
84
|
+
// where a hole costs nothing and "waste" is not defined.
|
|
85
|
+
dictionaries++;
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (capacity < min_capacity)
|
|
89
|
+
continue;
|
|
90
|
+
examined++;
|
|
91
|
+
if (rawUsed === 0) {
|
|
92
|
+
unmeasurable++;
|
|
93
|
+
unmeasurableBytes += storeBytes;
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (rawUsed / capacity > max_occupancy)
|
|
97
|
+
continue;
|
|
98
|
+
const holeSlots = span - rawUsed;
|
|
99
|
+
const slackSlots = Math.max(0, capacity - span - FORGIVEN_TAIL_SLOTS);
|
|
100
|
+
if (holeSlots + slackSlots === 0)
|
|
101
|
+
continue;
|
|
102
|
+
// Resolving the node is deferred to here on purpose: attribution is
|
|
103
|
+
// the expensive part and only the survivors of the filters need it.
|
|
104
|
+
const node = snapshot.getNodeById(index.ownerIds[i]);
|
|
105
|
+
if (node == null)
|
|
106
|
+
continue;
|
|
107
|
+
const attributed = nearestNamedOwner(node, { maxHops: max_hops });
|
|
108
|
+
const key = attributed
|
|
109
|
+
? attributed.label
|
|
110
|
+
: `(unattributed) ${node.name}`;
|
|
111
|
+
let group = groups.get(key);
|
|
112
|
+
if (!group) {
|
|
113
|
+
group = {
|
|
114
|
+
key,
|
|
115
|
+
className: node.name,
|
|
116
|
+
count: 0,
|
|
117
|
+
capacity: 0,
|
|
118
|
+
used: 0,
|
|
119
|
+
holeSlots: 0,
|
|
120
|
+
slackSlots: 0,
|
|
121
|
+
exampleId: node.id,
|
|
122
|
+
exampleCapacity: capacity,
|
|
123
|
+
exampleUsed: rawUsed,
|
|
124
|
+
exampleSpan: span,
|
|
125
|
+
ring: looksLikeRingBuffer(attributed?.ownerNode ?? null),
|
|
126
|
+
};
|
|
127
|
+
groups.set(key, group);
|
|
128
|
+
}
|
|
129
|
+
if (group.className !== node.name)
|
|
130
|
+
group.className = 'mixed';
|
|
131
|
+
group.count++;
|
|
132
|
+
group.capacity += capacity;
|
|
133
|
+
group.used += rawUsed;
|
|
134
|
+
group.holeSlots += holeSlots;
|
|
135
|
+
group.slackSlots += slackSlots;
|
|
136
|
+
// Keep the worst instance as the example so a follow-up trace lands
|
|
137
|
+
// on a representative object rather than the first one scanned.
|
|
138
|
+
const waste = holeSlots + slackSlots;
|
|
139
|
+
const exampleWaste = group.exampleSpan -
|
|
140
|
+
group.exampleUsed +
|
|
141
|
+
Math.max(0, group.exampleCapacity - group.exampleSpan - FORGIVEN_TAIL_SLOTS);
|
|
142
|
+
if (waste > exampleWaste) {
|
|
143
|
+
group.exampleId = node.id;
|
|
144
|
+
group.exampleCapacity = capacity;
|
|
145
|
+
group.exampleUsed = rawUsed;
|
|
146
|
+
group.exampleSpan = span;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const ranked = [...groups.values()]
|
|
150
|
+
.map(g => ({ g, waste: (g.holeSlots + g.slackSlots) * slotBytes }))
|
|
151
|
+
.filter(r => r.waste >= min_group_bytes)
|
|
152
|
+
.sort((a, b) => b.waste - a.waste);
|
|
153
|
+
const dropped = groups.size - ranked.length;
|
|
154
|
+
const shown = ranked.slice(0, limit);
|
|
155
|
+
const totalWaste = ranked.reduce((sum, r) => sum + r.waste, 0);
|
|
156
|
+
const lines = [
|
|
157
|
+
'## Sparse elements backing stores',
|
|
158
|
+
'',
|
|
159
|
+
`Scanned ${formatNumber(index.count)} objects with an elements store; ${formatNumber(examined)} were dense and at least ${formatNumber(min_capacity)} slots. Slot width calibrated to **${slotBytes} bytes** (${slotBytes === 4 ? 'pointer-compressed' : 'uncompressed'} heap).`,
|
|
160
|
+
'',
|
|
161
|
+
];
|
|
162
|
+
if (shown.length === 0) {
|
|
163
|
+
lines.push(`No group wastes ${formatBytes(min_group_bytes)} or more. Lower \`min_group_bytes\`, raise \`max_occupancy\`, or lower \`min_capacity\` to widen the scan.`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
lines.push(`**${formatBytes(totalWaste)}** of unused slots across ${formatNumber(ranked.length)} owner group(s)${dropped > 0 ? `; ${formatNumber(dropped)} smaller group(s) below the ${formatBytes(min_group_bytes)} floor were dropped` : ''}.`, '', markdownTable([
|
|
167
|
+
'Owner',
|
|
168
|
+
'Class',
|
|
169
|
+
'Count',
|
|
170
|
+
'Slots used / cap',
|
|
171
|
+
'Holes',
|
|
172
|
+
'Slack',
|
|
173
|
+
'Wasted',
|
|
174
|
+
], shown.map(({ g, waste }) => [
|
|
175
|
+
g.ring ? `${g.key} (ring)` : g.key,
|
|
176
|
+
g.className,
|
|
177
|
+
formatNumber(g.count),
|
|
178
|
+
`${formatNumber(g.used)} / ${formatNumber(g.capacity)} (${Math.round((g.used / g.capacity) * 100)}%)`,
|
|
179
|
+
formatBytes(g.holeSlots * slotBytes),
|
|
180
|
+
formatBytes(g.slackSlots * slotBytes),
|
|
181
|
+
formatBytes(waste),
|
|
182
|
+
]), new Set([2, 3, 4, 5, 6])), '', '### What to do about each', '');
|
|
183
|
+
for (const { g, waste } of shown) {
|
|
184
|
+
lines.push(`- **${g.key}** — ${formatBytes(waste)} across ${formatNumber(g.count)} instance(s). ${diagnose(g)}. Worst example \`@${g.exampleId}\`: ${formatNumber(g.exampleUsed)} value(s) spread over ${formatNumber(g.exampleSpan)} slot(s) in a ${formatNumber(g.exampleCapacity)}-slot store.`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// The per-call NUMBERS stay; the standing EXPLANATION of what
|
|
188
|
+
// "unmeasurable" and "dictionary-mode" mean is the same paragraph every
|
|
189
|
+
// call and is a third of this tool's output. Printed in full once per
|
|
190
|
+
// session, then pointed at (memlab_snapshots({repeat_notes:true})
|
|
191
|
+
// brings it back).
|
|
192
|
+
const longCaveats = shouldEmitNote('sparse-elements:caveats');
|
|
193
|
+
lines.push('', '### Coverage and caveats', '', longCaveats
|
|
194
|
+
? `- ${formatNumber(unmeasurable)} store(s) holding ${formatBytes(unmeasurableBytes)} were skipped as UNMEASURABLE: a slot holding a small integer emits no edge a snapshot can see, so an array of numbers and an array of holes are indistinguishable. Anything storing only numbers is therefore invisible to this tool — not absent from it.`
|
|
195
|
+
: `- UNMEASURABLE (all-SMI or all-hole): ${formatNumber(unmeasurable)} store(s), ${formatBytes(unmeasurableBytes)}.`, longCaveats
|
|
196
|
+
? `- ${formatNumber(dictionaries)} store(s) were dictionary-mode (keys past the dense capacity), where holes cost nothing and are correctly not reported.`
|
|
197
|
+
: `- Dictionary-mode (excluded): ${formatNumber(dictionaries)} store(s).`, ...(longCaveats
|
|
198
|
+
? [
|
|
199
|
+
`- Occupancy is a LOWER bound and waste an UPPER bound for the same reason: a store mixing numbers and objects reads as emptier than it is.`,
|
|
200
|
+
`- Up to ${formatNumber(FORGIVEN_TAIL_SLOTS)} tail slots per instance are forgiven — that is V8’s minimum growth increment, not something the application can give back.`,
|
|
201
|
+
]
|
|
202
|
+
: [
|
|
203
|
+
`- Occupancy is a lower bound; ${formatNumber(FORGIVEN_TAIL_SLOTS)} tail slots per instance are forgiven. _(Full explanation printed once per session — memlab_snapshots({repeat_notes: true}) to see it again.)_`,
|
|
204
|
+
]));
|
|
205
|
+
if (!suggestionsSuppressed() && shown.length > 0) {
|
|
206
|
+
lines.push('', '**Suggested next steps**', `- \`memlab_retainer_trace({node_id: ${shown[0].g.exampleId}})\` — confirm the owner label against the real path.`, `- \`memlab_get_references({node_id: ${shown[0].g.exampleId}})\` — read the actual key layout that produced the holes.`);
|
|
207
|
+
}
|
|
208
|
+
return toolResult(lines.join('\n'));
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
return errorResult(err);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=sparse-elements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparse-elements.js","sourceRoot":"","sources":["../../src/tools/sparse-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAE,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,+EAA+E;AAC/E,6EAA6E;AAC7E,kEAAkE;AAClE,OAAO,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AACxD,+EAA+E;AAC/E,uEAAuE;AACvE,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AA6B3B,uFAAuF;AACvF,SAAS,QAAQ,CAAC,KAAY;IAC5B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,qNAAqN,CAAC;IAC/N,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;IAC/B,IAAI,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,6IAA6I,CAAC;IACvJ,CAAC;IACD,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC;YACrB,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,2FAA2F,CAAC;IAClG,CAAC;IACD,OAAO,sCAAsC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,0xBAA0xB,EAC1xB;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CACP,+IAA+I,CAChJ;QACH,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,GAAG,CAAC;aACZ,QAAQ,CACP,6JAA6J,CAC9J;QACH,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,IAAI,CAAC;aACb,QAAQ,CACP,wEAAwE,CACzE;QACH,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,kDAAkD,CAAC;QAC/D,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CACP,oHAAoH,CACrH;KACJ,EACD,KAAK,EAAE,EAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAE/B,qEAAqE;YACrE,wEAAwE;YACxE,gEAAgE;YAChE,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YAElC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;YACxC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,iBAAiB,GAAG,CAAC,CAAC;YAC1B,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;YAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,CAAC,UAAU,GAAG,kBAAkB,CAAC,GAAG,SAAS,CAC9C,CAAC;gBACF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;oBACpB,kEAAkE;oBAClE,yDAAyD;oBACzD,YAAY,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBACD,IAAI,QAAQ,GAAG,YAAY;oBAAE,SAAS;gBACtC,QAAQ,EAAE,CAAC;gBACX,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;oBAClB,YAAY,EAAE,CAAC;oBACf,iBAAiB,IAAI,UAAU,CAAC;oBAChC,SAAS;gBACX,CAAC;gBACD,IAAI,OAAO,GAAG,QAAQ,GAAG,aAAa;oBAAE,SAAS;gBAEjD,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC;gBACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,mBAAmB,CAAC,CAAC;gBACtE,IAAI,SAAS,GAAG,UAAU,KAAK,CAAC;oBAAE,SAAS;gBAE3C,oEAAoE;gBACpE,oEAAoE;gBACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,IAAI,IAAI,IAAI,IAAI;oBAAE,SAAS;gBAC3B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAC,OAAO,EAAE,QAAQ,EAAC,CAAC,CAAC;gBAChE,MAAM,GAAG,GAAG,UAAU;oBACpB,CAAC,CAAC,UAAU,CAAC,KAAK;oBAClB,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClC,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,KAAK,GAAG;wBACN,GAAG;wBACH,SAAS,EAAE,IAAI,CAAC,IAAI;wBACpB,KAAK,EAAE,CAAC;wBACR,QAAQ,EAAE,CAAC;wBACX,IAAI,EAAE,CAAC;wBACP,SAAS,EAAE,CAAC;wBACZ,UAAU,EAAE,CAAC;wBACb,SAAS,EAAE,IAAI,CAAC,EAAE;wBAClB,eAAe,EAAE,QAAQ;wBACzB,WAAW,EAAE,OAAO;wBACpB,WAAW,EAAE,IAAI;wBACjB,IAAI,EAAE,mBAAmB,CAAC,UAAU,EAAE,SAAS,IAAI,IAAI,CAAC;qBACzD,CAAC;oBACF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACzB,CAAC;gBACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI;oBAAE,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC7D,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC;gBAC3B,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;gBACtB,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC;gBAC7B,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC;gBAC/B,oEAAoE;gBACpE,gEAAgE;gBAChE,MAAM,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;gBACrC,MAAM,YAAY,GAChB,KAAK,CAAC,WAAW;oBACjB,KAAK,CAAC,WAAW;oBACjB,IAAI,CAAC,GAAG,CACN,CAAC,EACD,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,WAAW,GAAG,mBAAmB,CAChE,CAAC;gBACJ,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;oBACzB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC1B,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;oBACjC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;oBAC5B,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS,EAAC,CAAC,CAAC;iBAChE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,eAAe,CAAC;iBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAE/D,MAAM,KAAK,GAAa;gBACtB,mCAAmC;gBACnC,EAAE;gBACF,WAAW,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,YAAY,CAAC,QAAQ,CAAC,4BAA4B,YAAY,CAAC,YAAY,CAAC,sCAAsC,SAAS,aAAa,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,SAAS;gBAChR,EAAE;aACH,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CACR,mBAAmB,WAAW,CAAC,eAAe,CAAC,4GAA4G,CAC5J,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CACR,KAAK,WAAW,CAAC,UAAU,CAAC,6BAA6B,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,+BAA+B,WAAW,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,GAAG,EACtO,EAAE,EACF,aAAa,CACX;oBACE,OAAO;oBACP,OAAO;oBACP,OAAO;oBACP,kBAAkB;oBAClB,OAAO;oBACP,OAAO;oBACP,QAAQ;iBACT,EACD,KAAK,CAAC,GAAG,CAAC,CAAC,EAAC,CAAC,EAAE,KAAK,EAAC,EAAE,EAAE,CAAC;oBACxB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;oBAClC,CAAC,CAAC,SAAS;oBACX,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;oBACrB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,IAAI;oBACrG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC;oBACpC,WAAW,CAAC,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC;oBACrC,WAAW,CAAC,KAAK,CAAC;iBACnB,CAAC,EACF,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CACzB,EACD,EAAE,EACF,2BAA2B,EAC3B,EAAE,CACH,CAAC;gBACF,KAAK,MAAM,EAAC,CAAC,EAAE,KAAK,EAAC,IAAI,KAAK,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,CAAC,GAAG,QAAQ,WAAW,CAAC,KAAK,CAAC,WAAW,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,SAAS,OAAO,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,yBAAyB,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,iBAAiB,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,CACxR,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,8DAA8D;YAC9D,wEAAwE;YACxE,sEAAsE;YACtE,kEAAkE;YAClE,mBAAmB;YACnB,MAAM,WAAW,GAAG,cAAc,CAAC,yBAAyB,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CACR,EAAE,EACF,0BAA0B,EAC1B,EAAE,EACF,WAAW;gBACT,CAAC,CAAC,KAAK,YAAY,CAAC,YAAY,CAAC,qBAAqB,WAAW,CAAC,iBAAiB,CAAC,6PAA6P;gBACjV,CAAC,CAAC,yCAAyC,YAAY,CAAC,YAAY,CAAC,cAAc,WAAW,CAAC,iBAAiB,CAAC,GAAG,EACtH,WAAW;gBACT,CAAC,CAAC,KAAK,YAAY,CAAC,YAAY,CAAC,yHAAyH;gBAC1J,CAAC,CAAC,iCAAiC,YAAY,CAAC,YAAY,CAAC,YAAY,EAC3E,GAAG,CAAC,WAAW;gBACb,CAAC,CAAC;oBACE,4IAA4I;oBAC5I,WAAW,YAAY,CAAC,mBAAmB,CAAC,6HAA6H;iBAC1K;gBACH,CAAC,CAAC;oBACE,iCAAiC,YAAY,CAAC,mBAAmB,CAAC,gJAAgJ;iBACnN,CAAC,CACP,CAAC;YAEF,IAAI,CAAC,qBAAqB,EAAE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,0BAA0B,EAC1B,uCAAuC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,uDAAuD,EAClH,uCAAuC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,4DAA4D,CACxH,CAAC;YACJ,CAAC;YAED,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"}
|
|
@@ -8,5 +8,22 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
/**
|
|
12
|
+
* What to say when the scan surfaced nothing.
|
|
13
|
+
*
|
|
14
|
+
* A scan that ran out of budget found nothing YET. Emitting "No stale
|
|
15
|
+
* collections found" over a partial scan states a negative the tool never
|
|
16
|
+
* established — and the verdict is the line a reader keeps, so the PARTIAL
|
|
17
|
+
* warning printed above it does not undo the impression. Measured output that
|
|
18
|
+
* prompted this:
|
|
19
|
+
*
|
|
20
|
+
* ⚠ Scan hit the 45,000ms time budget after 22,528 entries — results are PARTIAL.
|
|
21
|
+
* No stale collections found.
|
|
22
|
+
*
|
|
23
|
+
* The two lines contradict each other. This is precisely the UNANALYZED-vs-
|
|
24
|
+
* no-leak distinction the analysis protocol exists to enforce, so the tool must
|
|
25
|
+
* not blur it in its own output.
|
|
26
|
+
*/
|
|
27
|
+
export declare function emptyScanVerdict(timedOut: boolean, scanned: number): string;
|
|
11
28
|
export declare function registerStaleCollections(server: McpServer): void;
|
|
12
29
|
//# sourceMappingURL=stale-collections.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale-collections.d.ts","sourceRoot":"","sources":["../../src/tools/stale-collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAoKvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"stale-collections.d.ts","sourceRoot":"","sources":["../../src/tools/stale-collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAoKvE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS3E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoQhE"}
|
|
@@ -146,6 +146,31 @@ function hasTerminalStatus(node) {
|
|
|
146
146
|
}
|
|
147
147
|
return false;
|
|
148
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* What to say when the scan surfaced nothing.
|
|
151
|
+
*
|
|
152
|
+
* A scan that ran out of budget found nothing YET. Emitting "No stale
|
|
153
|
+
* collections found" over a partial scan states a negative the tool never
|
|
154
|
+
* established — and the verdict is the line a reader keeps, so the PARTIAL
|
|
155
|
+
* warning printed above it does not undo the impression. Measured output that
|
|
156
|
+
* prompted this:
|
|
157
|
+
*
|
|
158
|
+
* ⚠ Scan hit the 45,000ms time budget after 22,528 entries — results are PARTIAL.
|
|
159
|
+
* No stale collections found.
|
|
160
|
+
*
|
|
161
|
+
* The two lines contradict each other. This is precisely the UNANALYZED-vs-
|
|
162
|
+
* no-leak distinction the analysis protocol exists to enforce, so the tool must
|
|
163
|
+
* not blur it in its own output.
|
|
164
|
+
*/
|
|
165
|
+
export function emptyScanVerdict(timedOut, scanned) {
|
|
166
|
+
if (!timedOut)
|
|
167
|
+
return 'No stale collections found.';
|
|
168
|
+
return (`**INCONCLUSIVE — the scan did not finish.** ${formatNumber(scanned)} entries were ` +
|
|
169
|
+
'examined before the budget ran out, and no stale collection was found *in that prefix*. ' +
|
|
170
|
+
'This is NOT evidence that none exists, and must not be recorded as a clean negative.\n\n' +
|
|
171
|
+
'To turn it into one, re-run with a higher `timeout_ms`, a narrower `detect_modes`, ' +
|
|
172
|
+
'or a higher `min_stale_count` — and check that the re-run reports no PARTIAL warning.');
|
|
173
|
+
}
|
|
149
174
|
export function registerStaleCollections(server) {
|
|
150
175
|
server.tool('memlab_stale_collections', 'Find Map, Set, and Array collections holding stale references. Detects: (1) detached DOM / ' +
|
|
151
176
|
'unmounted Fiber nodes, (2) entries with a status/state property stuck at terminal values ' +
|
|
@@ -320,6 +345,9 @@ export function registerStaleCollections(server) {
|
|
|
320
345
|
}
|
|
321
346
|
const scanNote = scanNotes.length > 0 ? scanNotes.join('\n') + '\n\n' : '';
|
|
322
347
|
if (topResults.length === 0) {
|
|
348
|
+
if (timedOut) {
|
|
349
|
+
return toolResult(scanNote + emptyScanVerdict(true, scanned));
|
|
350
|
+
}
|
|
323
351
|
const env = getSnapshotEnv();
|
|
324
352
|
if (env === 'node') {
|
|
325
353
|
return toolResult(scanNote +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stale-collections.js","sourceRoot":"","sources":["../../src/tools/stale-collections.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stale-collections.js","sourceRoot":"","sources":["../../src/tools/stale-collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-patterns.d.ts","sourceRoot":"","sources":["../../src/tools/string-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"string-patterns.d.ts","sourceRoot":"","sources":["../../src/tools/string-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAkBvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmI9D"}
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* @oncall memory_lab
|
|
9
9
|
*/
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
-
import { getSnapshot } from '../heap-state.js';
|
|
11
|
+
import { getSnapshot, isLightSnapshot } from '../heap-state.js';
|
|
12
|
+
import { withAnonymizedBanner } from '../anonymized-snapshot.js';
|
|
12
13
|
import { formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
|
|
13
14
|
function extractPrefix(value, prefixLen) {
|
|
14
15
|
if (value.length <= prefixLen)
|
|
@@ -38,7 +39,8 @@ export function registerStringPatterns(server) {
|
|
|
38
39
|
.describe('Maximum number of groups to return (default 20)'),
|
|
39
40
|
}, async ({ prefix_length, min_count, min_total_size, limit }) => {
|
|
40
41
|
try {
|
|
41
|
-
const snapshot = getSnapshot();
|
|
42
|
+
const snapshot = getSnapshot({ allowLight: true });
|
|
43
|
+
const light = isLightSnapshot();
|
|
42
44
|
const groups = new Map();
|
|
43
45
|
snapshot.nodes.forEach(node => {
|
|
44
46
|
if (node.type !== 'string')
|
|
@@ -86,7 +88,7 @@ export function registerStringPatterns(server) {
|
|
|
86
88
|
'Prefix',
|
|
87
89
|
'Count',
|
|
88
90
|
'Total Size',
|
|
89
|
-
'Retained',
|
|
91
|
+
light ? 'Retained (n/a)' : 'Retained',
|
|
90
92
|
'Len Range',
|
|
91
93
|
'Examples',
|
|
92
94
|
];
|
|
@@ -100,12 +102,12 @@ export function registerStringPatterns(server) {
|
|
|
100
102
|
displayPrefix,
|
|
101
103
|
formatNumber(g.count),
|
|
102
104
|
formatBytes(g.total_self_size),
|
|
103
|
-
formatBytes(g.total_retained_size),
|
|
105
|
+
light ? 'n/a (light)' : formatBytes(g.total_retained_size),
|
|
104
106
|
lenRange,
|
|
105
107
|
g.example_ids.map(id => `@${id}`).join(', '),
|
|
106
108
|
];
|
|
107
109
|
});
|
|
108
|
-
return toolResult(`String patterns (prefix_length=${prefix_length}, ${formatNumber(filtered.length)} groups matching filters, showing ${rows.length})\n\n${markdownTable(headers, rows, rightCols)}`);
|
|
110
|
+
return toolResult(withAnonymizedBanner(snapshot, `String patterns (prefix_length=${prefix_length}, ${formatNumber(filtered.length)} groups matching filters, showing ${rows.length})\n\n${markdownTable(headers, rows, rightCols)}`));
|
|
109
111
|
}
|
|
110
112
|
catch (err) {
|
|
111
113
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"string-patterns.js","sourceRoot":"","sources":["../../src/tools/string-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"string-patterns.js","sourceRoot":"","sources":["../../src/tools/string-patterns.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 registerToolsIndex(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=tools-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools-index.d.ts","sourceRoot":"","sources":["../../src/tools/tools-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAmavE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkH1D"}
|