@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":"get-value.js","sourceRoot":"","sources":["../../src/tools/get-value.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,
|
|
1
|
+
{"version":3,"file":"get-value.js","sourceRoot":"","sources":["../../src/tools/get-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hypothesis.d.ts","sourceRoot":"","sources":["../../src/tools/hypothesis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"hypothesis.d.ts","sourceRoot":"","sources":["../../src/tools/hypothesis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAkDvE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuU1D"}
|
package/dist/tools/hypothesis.js
CHANGED
|
@@ -14,7 +14,7 @@ import memlabHeapAnalysis from '@memlab/heap-analysis';
|
|
|
14
14
|
const { getFullHeapFromFile } = memlabHeapAnalysis;
|
|
15
15
|
import { resolveSnapshotPath } from './load-snapshot.js';
|
|
16
16
|
import { resolveLadderPaths } from './ladder.js';
|
|
17
|
-
import { formatBytes, formatNumber, markdownTable,
|
|
17
|
+
import { errorResult, formatBytes, formatNumber, markdownTable, pathsHeader, toolResult, } from '../utils.js';
|
|
18
18
|
// Property names used to fingerprint a shape, matching the other shape tools.
|
|
19
19
|
const SHAPE_PROP_CAP = 12;
|
|
20
20
|
// Shapes tracked per rung. Once this many distinct shapes are seen, tracking
|
|
@@ -59,8 +59,18 @@ export function registerHypothesis(server) {
|
|
|
59
59
|
.array(z.string())
|
|
60
60
|
.min(1)
|
|
61
61
|
.describe('Ordered snapshot paths (oldest first). Local paths, manifold:// URLs, bare filenames, or a single ["ladder:<name>"] reference to a ladder saved with memlab_ladder.'),
|
|
62
|
+
predicates: z
|
|
63
|
+
.array(z.object({
|
|
64
|
+
label: z.string().describe('Short name for this hypothesis.'),
|
|
65
|
+
predicate: z
|
|
66
|
+
.string()
|
|
67
|
+
.describe('The expression, as for `predicate`.'),
|
|
68
|
+
}))
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('Test SEVERAL hypotheses in the same pass. Each rung is loaded and walked ONCE and every predicate is applied to each node, so N theories cost what one costs — the load and the walk are the expensive parts, not the predicate. Use this when a question has several candidate explanations: testing them together also makes their counts directly comparable, which sequential calls do not guarantee if a rung is reloaded in between. Mutually exclusive with `predicate`.'),
|
|
62
71
|
predicate: z
|
|
63
72
|
.string()
|
|
73
|
+
.optional()
|
|
64
74
|
.describe('JavaScript expression over `node` returning a boolean, e.g. `node.name === "Map" && node.retainedSize > 10000`, or `node.type === "closure" && node.name.includes("chat")`. Evaluated in a sandbox with no I/O; only the node is exposed. Compiled once and applied per node, so keep it cheap — avoid walking `node.references` for every node in a multi-million-node heap.'),
|
|
65
75
|
group_by_shape: z
|
|
66
76
|
.boolean()
|
|
@@ -76,17 +86,30 @@ export function registerHypothesis(server) {
|
|
|
76
86
|
.number()
|
|
77
87
|
.optional()
|
|
78
88
|
.describe('Per-file size ceiling in MB; see memlab_load_snapshot.'),
|
|
79
|
-
}, async ({ paths, predicate, group_by_shape, limit, max_file_size_mb }) => {
|
|
89
|
+
}, async ({ paths, predicate, predicates, group_by_shape, limit, max_file_size_mb, }) => {
|
|
80
90
|
try {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
// the node it is called with and no ambient capability.
|
|
85
|
-
test = vm.runInNewContext(`(function(node){ return !!(${predicate}); })`, Object.create(null), { timeout: 1000 });
|
|
91
|
+
const batch = predicates != null && predicates.length > 0;
|
|
92
|
+
if (batch && predicate != null) {
|
|
93
|
+
return errorResult('Pass `predicate` OR `predicates`, not both — with both there is no single expression the verdict could be about.');
|
|
86
94
|
}
|
|
87
|
-
|
|
88
|
-
return errorResult(`
|
|
95
|
+
if (!batch && (predicate == null || predicate === '')) {
|
|
96
|
+
return errorResult('Pass `predicate` (one hypothesis) or `predicates` (several tested in the same pass).');
|
|
89
97
|
}
|
|
98
|
+
const specs = batch
|
|
99
|
+
? (predicates ?? [])
|
|
100
|
+
: [{ label: predicate, predicate: predicate }];
|
|
101
|
+
const tests = [];
|
|
102
|
+
for (const spec of specs) {
|
|
103
|
+
try {
|
|
104
|
+
// Compiled ONCE, in a context with nothing in it: the predicate gets
|
|
105
|
+
// the node it is called with and no ambient capability.
|
|
106
|
+
tests.push(vm.runInNewContext(`(function(node){ return !!(${spec.predicate}); })`, Object.create(null), { timeout: 1000 }));
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
return errorResult(`Could not compile predicate${batch ? ` "${spec.label}"` : ''}: ${e instanceof Error ? e.message : String(e)}. It must be a JavaScript EXPRESSION over \`node\` (no statements, no return).`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Per rung, per predicate. One walk feeds all of them.
|
|
90
113
|
const rungs = [];
|
|
91
114
|
const { paths: rungPaths } = resolveLadderPaths(paths);
|
|
92
115
|
for (const p of rungPaths) {
|
|
@@ -99,38 +122,42 @@ export function registerHypothesis(server) {
|
|
|
99
122
|
return errorResult(`${p} is ${sizeMB.toFixed(0)} MB, over the ${max_file_size_mb} MB limit.`);
|
|
100
123
|
}
|
|
101
124
|
const snapshot = await getFullHeapFromFile(localPath);
|
|
102
|
-
|
|
103
|
-
|
|
125
|
+
const matched = specs.map(() => 0);
|
|
126
|
+
const selfBytes = specs.map(() => 0);
|
|
104
127
|
let scanned = 0;
|
|
105
128
|
let predicateError = null;
|
|
129
|
+
let failingLabel = '';
|
|
106
130
|
// memlab's nodes.forEach has no early exit, so a predicate that throws
|
|
107
131
|
// on the first node would otherwise still walk every remaining node in
|
|
108
132
|
// a multi-million-node heap before the error is reported. Throwing a
|
|
109
133
|
// sentinel out of the callback actually stops the walk.
|
|
110
134
|
class AbortWalk extends Error {
|
|
111
135
|
}
|
|
112
|
-
const shapes = new Map();
|
|
136
|
+
const shapes = specs.map(() => new Map());
|
|
113
137
|
try {
|
|
114
138
|
snapshot.nodes.forEach(node => {
|
|
115
139
|
scanned++;
|
|
116
|
-
let
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
140
|
+
for (let t = 0; t < tests.length; t++) {
|
|
141
|
+
let hit = false;
|
|
142
|
+
try {
|
|
143
|
+
hit = tests[t](node);
|
|
144
|
+
}
|
|
145
|
+
catch (e) {
|
|
146
|
+
// Report the predicate's own failure rather than a silent
|
|
147
|
+
// zero: a predicate that throws on the first node would
|
|
148
|
+
// otherwise look exactly like a hypothesis that is false.
|
|
149
|
+
predicateError = e instanceof Error ? e.message : String(e);
|
|
150
|
+
failingLabel = specs[t].label;
|
|
151
|
+
throw new AbortWalk();
|
|
152
|
+
}
|
|
153
|
+
if (!hit)
|
|
154
|
+
continue;
|
|
155
|
+
matched[t]++;
|
|
156
|
+
selfBytes[t] += node.self_size;
|
|
157
|
+
if (group_by_shape && shapes[t].size < MAX_SHAPES) {
|
|
158
|
+
const k = shapeKey(node);
|
|
159
|
+
shapes[t].set(k, (shapes[t].get(k) ?? 0) + 1);
|
|
160
|
+
}
|
|
134
161
|
}
|
|
135
162
|
});
|
|
136
163
|
}
|
|
@@ -139,7 +166,7 @@ export function registerHypothesis(server) {
|
|
|
139
166
|
throw e;
|
|
140
167
|
}
|
|
141
168
|
if (predicateError != null) {
|
|
142
|
-
return errorResult(`Predicate threw while scanning ${p}: ${predicateError}. Guard against missing fields — it is applied to every node in the heap, not just the ones you have in mind.`);
|
|
169
|
+
return errorResult(`Predicate${batch ? ` "${failingLabel}"` : ''} threw while scanning ${p}: ${predicateError}. Guard against missing fields — it is applied to every node in the heap, not just the ones you have in mind.`);
|
|
143
170
|
}
|
|
144
171
|
rungs.push({
|
|
145
172
|
label: fetchedFrom ?? p.replace(/^.*\//, ''),
|
|
@@ -149,43 +176,75 @@ export function registerHypothesis(server) {
|
|
|
149
176
|
shapes,
|
|
150
177
|
});
|
|
151
178
|
}
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
179
|
+
const lines = [];
|
|
180
|
+
if (batch) {
|
|
181
|
+
// One row per hypothesis, so the candidate explanations are compared
|
|
182
|
+
// side by side rather than across separate calls whose rungs may not
|
|
183
|
+
// have been the same load.
|
|
184
|
+
lines.push(`## ${specs.length} hypotheses across ${rungs.length} snapshot(s)`, '', markdownTable([
|
|
185
|
+
'Hypothesis',
|
|
186
|
+
...rungs.map((r, i) => `#${i + 1}`),
|
|
187
|
+
...(rungs.length > 1 ? ['Δ', 'Trend'] : []),
|
|
188
|
+
], specs.map((spec, t) => {
|
|
189
|
+
const per = rungs.map(r => r.matched[t]);
|
|
190
|
+
const net = per[per.length - 1] - per[0];
|
|
191
|
+
return [
|
|
192
|
+
spec.label.length > 40
|
|
193
|
+
? spec.label.slice(0, 37) + '…'
|
|
194
|
+
: spec.label,
|
|
195
|
+
...per.map(c => formatNumber(c)),
|
|
196
|
+
...(rungs.length > 1
|
|
197
|
+
? [
|
|
198
|
+
`${net >= 0 ? '+' : '−'}${formatNumber(Math.abs(net))}`,
|
|
199
|
+
trendOf(per),
|
|
200
|
+
]
|
|
201
|
+
: []),
|
|
202
|
+
];
|
|
203
|
+
}), new Set(rungs.map((_, i) => i + 1).concat([rungs.length + 1]))), '', `_All ${specs.length} predicates were applied in the SAME walk of each rung, so the counts are of one heap state and are directly comparable. Rungs: ${rungs.map(r => r.label).join(' → ')}._`);
|
|
204
|
+
const allZero = specs.every((_, t) => rungs.every(r => r.matched[t] === 0));
|
|
205
|
+
if (allZero) {
|
|
206
|
+
lines.push('', '_Every hypothesis matched zero nodes in every rung. All predicates compiled and ran against every node, so these are real negatives — check the class/property names with `memlab_class_histogram` before concluding the theories are all wrong._');
|
|
207
|
+
}
|
|
170
208
|
if (rungs.length === 2) {
|
|
171
209
|
lines.push('', '> ⚠️ With 2 rungs "↑ every step" is the same statement as "grew overall" and cannot separate a trend from a single GC-band sample. Add a third rung.');
|
|
172
210
|
}
|
|
173
211
|
}
|
|
174
212
|
else {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
213
|
+
const counts = rungs.map(r => r.matched[0]);
|
|
214
|
+
const net = counts[counts.length - 1] - counts[0];
|
|
215
|
+
lines.push(`## Hypothesis across ${rungs.length} snapshot(s)`, '', `\`${predicate}\``, '', markdownTable(['#', 'Snapshot', 'Matches', 'Self size', 'Scanned'], rungs.map((r, i) => [
|
|
216
|
+
String(i + 1),
|
|
217
|
+
r.label.length > 38 ? '…' + r.label.slice(-37) : r.label,
|
|
218
|
+
formatNumber(r.matched[0]),
|
|
219
|
+
formatBytes(r.selfBytes[0]),
|
|
220
|
+
formatNumber(r.scanned),
|
|
221
|
+
]), new Set([2, 3, 4])), '');
|
|
222
|
+
if (rungs.length > 1) {
|
|
223
|
+
lines.push(`**Verdict: ${trendOf(counts)}** — ${net >= 0 ? '+' : '−'}${formatNumber(Math.abs(net))} matches across the ladder (${formatNumber(counts[0])} → ${formatNumber(counts[counts.length - 1])}).`);
|
|
224
|
+
if (rungs.length === 2) {
|
|
225
|
+
lines.push('', '> ⚠️ With 2 rungs "↑ every step" is the same statement as "grew overall" and cannot separate a trend from a single GC-band sample. Add a third rung.');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
lines.push('_Single snapshot: this is a count, not a trend. Pass an ordered ladder to test whether the hypothesis holds over time._');
|
|
230
|
+
}
|
|
231
|
+
if (counts.every(c => c === 0)) {
|
|
232
|
+
lines.push('', '_Zero matches in every rung. The predicate compiled and ran against every node, so this is a real negative — the hypothesis is false as written, or the property/class is named differently than assumed (check with `memlab_class_histogram`)._');
|
|
233
|
+
}
|
|
179
234
|
}
|
|
180
235
|
if (group_by_shape) {
|
|
181
236
|
const allShapes = new Set();
|
|
182
237
|
for (const r of rungs)
|
|
183
|
-
for (const
|
|
184
|
-
|
|
238
|
+
for (const m of r.shapes)
|
|
239
|
+
for (const k of m.keys())
|
|
240
|
+
allShapes.add(k);
|
|
185
241
|
const shapeRows = [...allShapes]
|
|
186
242
|
.map(k => ({
|
|
187
243
|
shape: k,
|
|
188
|
-
|
|
244
|
+
// Summed across predicates in batch mode: a shape breakdown per
|
|
245
|
+
// hypothesis would be a table per hypothesis, which is not what
|
|
246
|
+
// this flag is for.
|
|
247
|
+
per: rungs.map(r => r.shapes.reduce((a, m) => a + (m.get(k) ?? 0), 0)),
|
|
189
248
|
}))
|
|
190
249
|
.map(x => ({
|
|
191
250
|
...x,
|
|
@@ -206,12 +265,12 @@ export function registerHypothesis(server) {
|
|
|
206
265
|
`${r.net >= 0 ? '+' : '−'}${formatNumber(Math.abs(r.net))}`,
|
|
207
266
|
...(rungs.length > 1 ? [trendOf(r.per)] : []),
|
|
208
267
|
]), new Set(rungs.map((_, i) => i + 1).concat([rungs.length + 1]))));
|
|
209
|
-
if (rungs.some(r => r.shapes.size >= MAX_SHAPES)) {
|
|
268
|
+
if (rungs.some(r => r.shapes.some(m => m.size >= MAX_SHAPES))) {
|
|
210
269
|
lines.push('', `_⚠ Shape tracking capped at ${formatNumber(MAX_SHAPES)} distinct shapes per rung; the tail is not counted. Narrow the predicate._`);
|
|
211
270
|
}
|
|
212
271
|
}
|
|
213
272
|
}
|
|
214
|
-
return toolResult(lines.join('\n'));
|
|
273
|
+
return toolResult(lines.join('\n'), pathsHeader(rungPaths.map(p => p.replace(/^.*\//, ''))));
|
|
215
274
|
}
|
|
216
275
|
catch (err) {
|
|
217
276
|
return errorResult(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hypothesis.js","sourceRoot":"","sources":["../../src/tools/hypothesis.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hypothesis.js","sourceRoot":"","sources":["../../src/tools/hypothesis.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 registerIdSpaceAudit(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=id-space-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-space-audit.d.ts","sourceRoot":"","sources":["../../src/tools/id-space-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAuEvE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgR5D"}
|
|
@@ -0,0 +1,262 @@
|
|
|
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 { getElementsIndex, STORE_HEADER_BYTES, FORGIVEN_TAIL_SLOTS, } from '../heap-shapes.js';
|
|
13
|
+
import { errorResult, toolResult, formatBytes, formatNumber, markdownTable, nearestNamedOwner, suggestionsSuppressed, } from '../utils.js';
|
|
14
|
+
/** Upper bound on keys read per structure before they are sampled down. */
|
|
15
|
+
const MAX_KEYS_READ = 8192;
|
|
16
|
+
/** Keys kept per structure for comparison, sampled evenly across the range. */
|
|
17
|
+
const MAX_KEYS_PER_STRUCTURE = 512;
|
|
18
|
+
/**
|
|
19
|
+
* Reduce a key set to the keys that carry information about the ALLOCATOR.
|
|
20
|
+
*
|
|
21
|
+
* The first version of this compared raw key sets and clustered 395 unrelated
|
|
22
|
+
* structures into one, because every array on earth contains 0, 1, 2, 3 — a
|
|
23
|
+
* densely packed array of length L has exactly the keys 0..L-1, so it overlaps
|
|
24
|
+
* heavily with every other array and the similarity score means nothing.
|
|
25
|
+
*
|
|
26
|
+
* A key is informative only when it is LARGER than the number of keys written,
|
|
27
|
+
* which is precisely the condition "this index came from somewhere other than a
|
|
28
|
+
* running counter local to this structure". A dense array contributes nothing
|
|
29
|
+
* and drops out; a table subscripted by a global id keeps almost all of its
|
|
30
|
+
* keys.
|
|
31
|
+
*/
|
|
32
|
+
function sparseSignature(keys, used) {
|
|
33
|
+
const floor = Math.max(used, keys.length);
|
|
34
|
+
return keys.filter(k => k >= floor);
|
|
35
|
+
}
|
|
36
|
+
/** Evenly spaced sample, so a prefix cannot bias the comparison toward low ids. */
|
|
37
|
+
function sampleEvenly(keys, n) {
|
|
38
|
+
if (keys.length <= n)
|
|
39
|
+
return keys;
|
|
40
|
+
const out = [];
|
|
41
|
+
const stride = keys.length / n;
|
|
42
|
+
for (let i = 0; i < n; i++)
|
|
43
|
+
out.push(keys[Math.floor(i * stride)]);
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/** |A ∩ B| / |A ∪ B| over the sampled key sets. */
|
|
47
|
+
function jaccard(a, b) {
|
|
48
|
+
const [small, large] = a.size <= b.size ? [a, b] : [b, a];
|
|
49
|
+
let shared = 0;
|
|
50
|
+
for (const k of small)
|
|
51
|
+
if (large.has(k))
|
|
52
|
+
shared++;
|
|
53
|
+
const union = a.size + b.size - shared;
|
|
54
|
+
return union === 0 ? 0 : shared / union;
|
|
55
|
+
}
|
|
56
|
+
export function registerIdSpaceAudit(server) {
|
|
57
|
+
server.tool('memlab_id_space_audit', 'Find SEPARATE integer-keyed structures that are indexed by the SAME sparse id space. One global counter handed out as an array index leaves every table that uses it sized for the whole id range and mostly holes — and each table looks like an isolated small finding until they are clustered. On one capture three separately-reported groups (a name table, a ref array and a placeholder map) all wrote keys 191 and 212 among others: one design problem, one re-keying fix, reported as three unrelated rows. Clusters by key-set similarity (Jaccard over sampled indices) and reports the combined waste per cluster, which is the number a fix is worth. Complements memlab_sparse_elements, which finds the individual sparse stores but cannot see that several share an allocator.', {
|
|
58
|
+
min_keys: z
|
|
59
|
+
.number()
|
|
60
|
+
.optional()
|
|
61
|
+
.default(4)
|
|
62
|
+
.describe('Ignore structures with fewer than this many SPARSE keys (default 4) — a key counts only when it is larger than the number of keys written, since a densely packed array has keys 0..N-1 by construction and overlaps with everything.'),
|
|
63
|
+
min_similarity: z
|
|
64
|
+
.number()
|
|
65
|
+
.optional()
|
|
66
|
+
.default(0.25)
|
|
67
|
+
.describe('Jaccard threshold for two structures to join a cluster (default 0.25). Lower it to catch tables that use disjoint ranges of one counter; raise it to demand near-identical key sets.'),
|
|
68
|
+
min_cluster_waste: z
|
|
69
|
+
.number()
|
|
70
|
+
.optional()
|
|
71
|
+
.default(4096)
|
|
72
|
+
.describe('Drop clusters whose combined unused capacity is below this many bytes (default 4096).'),
|
|
73
|
+
max_structures: z
|
|
74
|
+
.number()
|
|
75
|
+
.optional()
|
|
76
|
+
.default(400)
|
|
77
|
+
.describe('Cap on how many sparse structures are compared (default 400). Comparison is pairwise, so this bounds the cost at O(n²) on the LARGEST structures — the ones a shared id space would actually cost something in.'),
|
|
78
|
+
limit: z
|
|
79
|
+
.number()
|
|
80
|
+
.optional()
|
|
81
|
+
.default(10)
|
|
82
|
+
.describe('Maximum clusters to report (default 10).'),
|
|
83
|
+
}, async ({ min_keys, min_similarity, min_cluster_waste, max_structures, limit, }) => {
|
|
84
|
+
try {
|
|
85
|
+
const snapshot = getSnapshot();
|
|
86
|
+
const index = getElementsIndex(snapshot);
|
|
87
|
+
const slotBytes = index.slotBytes;
|
|
88
|
+
// Only SPARSE structures can share a sparse id space, and only the
|
|
89
|
+
// biggest ones matter — so rank by waste before paying for key reads.
|
|
90
|
+
const candidates = [];
|
|
91
|
+
for (let i = 0; i < index.count; i++) {
|
|
92
|
+
const capacity = Math.floor((index.storeBytes[i] - STORE_HEADER_BYTES) / slotBytes);
|
|
93
|
+
const span = index.maxIndex[i] + 1;
|
|
94
|
+
if (span > capacity)
|
|
95
|
+
continue; // dictionary
|
|
96
|
+
const used = index.used[i];
|
|
97
|
+
if (used < min_keys)
|
|
98
|
+
continue;
|
|
99
|
+
if (used / capacity > 0.6)
|
|
100
|
+
continue;
|
|
101
|
+
const waste = span - used + Math.max(0, capacity - span - FORGIVEN_TAIL_SLOTS);
|
|
102
|
+
if (waste <= 0)
|
|
103
|
+
continue;
|
|
104
|
+
candidates.push({ i, waste });
|
|
105
|
+
}
|
|
106
|
+
candidates.sort((a, b) => b.waste - a.waste);
|
|
107
|
+
const picked = candidates.slice(0, max_structures);
|
|
108
|
+
const structures = [];
|
|
109
|
+
for (const { i, waste } of picked) {
|
|
110
|
+
const node = snapshot.getNodeById(index.ownerIds[i]);
|
|
111
|
+
if (node == null)
|
|
112
|
+
continue;
|
|
113
|
+
const keys = [];
|
|
114
|
+
for (const edge of node.references) {
|
|
115
|
+
if (edge.type !== 'element')
|
|
116
|
+
continue;
|
|
117
|
+
if (keys.length >= MAX_KEYS_READ)
|
|
118
|
+
break;
|
|
119
|
+
keys.push(Number(edge.name_or_index));
|
|
120
|
+
}
|
|
121
|
+
if (keys.length === 0) {
|
|
122
|
+
// JSArray shape: the indices live on the store, not the owner.
|
|
123
|
+
const store = snapshot.getNodeById(
|
|
124
|
+
// The store is not in the index; re-read it from the owner.
|
|
125
|
+
node.references.find(e => e.type === 'internal' &&
|
|
126
|
+
String(e.name_or_index) === 'elements')?.toNode.id ?? -1);
|
|
127
|
+
if (store != null) {
|
|
128
|
+
for (const edge of store.references) {
|
|
129
|
+
const name = String(edge.name_or_index);
|
|
130
|
+
if (!/^\d+$/.test(name))
|
|
131
|
+
continue;
|
|
132
|
+
if (keys.length >= MAX_KEYS_READ)
|
|
133
|
+
break;
|
|
134
|
+
keys.push(Number(name));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Only the keys that say something about the allocator.
|
|
139
|
+
const signature = sampleEvenly(sparseSignature(keys, index.used[i]), MAX_KEYS_PER_STRUCTURE);
|
|
140
|
+
if (signature.length < min_keys)
|
|
141
|
+
continue;
|
|
142
|
+
const capacity = Math.floor((index.storeBytes[i] - STORE_HEADER_BYTES) / slotBytes);
|
|
143
|
+
structures.push({
|
|
144
|
+
nodeId: node.id,
|
|
145
|
+
label: nearestNamedOwner(node, { maxHops: 6 })?.label ??
|
|
146
|
+
`(unattributed) ${node.name}`,
|
|
147
|
+
keys: signature,
|
|
148
|
+
keySet: new Set(signature),
|
|
149
|
+
capacity,
|
|
150
|
+
used: index.used[i],
|
|
151
|
+
wasteSlots: waste,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (structures.length < 2) {
|
|
155
|
+
return toolResult(`Only ${formatNumber(structures.length)} structure(s) had at least ${formatNumber(min_keys)} keys larger than their own key count, so there is nothing to cluster. A densely packed array contributes no evidence about an allocator — its keys are 0..N-1 by construction.\n\n` +
|
|
156
|
+
'Note that a structure holding only small integers is invisible here — a snapshot cannot distinguish an all-SMI array from an all-hole one. Run `memlab_sparse_elements` for the per-structure view.');
|
|
157
|
+
}
|
|
158
|
+
// Union-find over the similarity graph: a shared allocator can show up
|
|
159
|
+
// as a chain (A~B, B~C) even when A and C use disjoint ranges of it.
|
|
160
|
+
const parent = structures.map((_, i) => i);
|
|
161
|
+
const find = (x) => {
|
|
162
|
+
let r = x;
|
|
163
|
+
while (parent[r] !== r)
|
|
164
|
+
r = parent[r];
|
|
165
|
+
while (parent[x] !== r) {
|
|
166
|
+
const next = parent[x];
|
|
167
|
+
parent[x] = r;
|
|
168
|
+
x = next;
|
|
169
|
+
}
|
|
170
|
+
return r;
|
|
171
|
+
};
|
|
172
|
+
const union = (a, b) => {
|
|
173
|
+
const ra = find(a);
|
|
174
|
+
const rb = find(b);
|
|
175
|
+
if (ra !== rb)
|
|
176
|
+
parent[rb] = ra;
|
|
177
|
+
};
|
|
178
|
+
for (let a = 0; a < structures.length; a++) {
|
|
179
|
+
for (let b = a + 1; b < structures.length; b++) {
|
|
180
|
+
if (jaccard(structures[a].keySet, structures[b].keySet) >=
|
|
181
|
+
min_similarity) {
|
|
182
|
+
union(a, b);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const clusters = new Map();
|
|
187
|
+
for (let i = 0; i < structures.length; i++) {
|
|
188
|
+
const root = find(i);
|
|
189
|
+
const arr = clusters.get(root) ?? [];
|
|
190
|
+
arr.push(i);
|
|
191
|
+
clusters.set(root, arr);
|
|
192
|
+
}
|
|
193
|
+
const ranked = [...clusters.values()]
|
|
194
|
+
.filter(members => members.length >= 2)
|
|
195
|
+
.map(members => {
|
|
196
|
+
const wasteBytes = members.reduce((s, i) => s + structures[i].wasteSlots, 0) *
|
|
197
|
+
slotBytes;
|
|
198
|
+
const shared = new Set(structures[members[0]].keySet);
|
|
199
|
+
for (const i of members.slice(1)) {
|
|
200
|
+
for (const k of [...shared]) {
|
|
201
|
+
if (!structures[i].keySet.has(k))
|
|
202
|
+
shared.delete(k);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return { members, wasteBytes, shared };
|
|
206
|
+
})
|
|
207
|
+
.filter(c => c.wasteBytes >= min_cluster_waste)
|
|
208
|
+
.sort((a, b) => b.wasteBytes - a.wasteBytes);
|
|
209
|
+
const lines = [
|
|
210
|
+
'## Shared integer id spaces',
|
|
211
|
+
'',
|
|
212
|
+
`Compared ${formatNumber(structures.length)} sparse integer-keyed structure(s) (the ${formatNumber(picked.length)} with the most unused capacity, of ${formatNumber(candidates.length)} sparse in total).`,
|
|
213
|
+
'',
|
|
214
|
+
];
|
|
215
|
+
if (ranked.length === 0) {
|
|
216
|
+
lines.push(`No two structures share at least ${Math.round(min_similarity * 100)}% of their keys. Each sparse store here has its own key space, so there is no single re-keying that would fix several at once — treat the \`memlab_sparse_elements\` rows as independent.`);
|
|
217
|
+
return toolResult(lines.join('\n'));
|
|
218
|
+
}
|
|
219
|
+
for (const cluster of ranked.slice(0, limit)) {
|
|
220
|
+
const allMembers = cluster.members
|
|
221
|
+
.map(i => structures[i])
|
|
222
|
+
.sort((a, b) => b.wasteSlots - a.wasteSlots);
|
|
223
|
+
// A cluster can legitimately have hundreds of members (one cache per
|
|
224
|
+
// model). Showing them all buries the point, which is the COMBINED
|
|
225
|
+
// number and the distinct owners.
|
|
226
|
+
const members = allMembers.slice(0, 12);
|
|
227
|
+
lines.push(`### ${formatNumber(allMembers.length)} structures sharing one id space — **${formatBytes(cluster.wasteBytes)}** unused between them`, '', `Distinct owners: ${[...new Set(allMembers.map(m => m.label))]
|
|
228
|
+
.slice(0, 8)
|
|
229
|
+
.map(l => `\`${l}\``)
|
|
230
|
+
.join(', ')}${new Set(allMembers.map(m => m.label)).size > 8 ? ', …' : ''}`, '', markdownTable(['Structure', 'Sparse keys', 'Used / cap', 'Unused', 'Node'], members.map(m => [
|
|
231
|
+
m.label,
|
|
232
|
+
formatNumber(m.keys.length),
|
|
233
|
+
`${formatNumber(m.used)} / ${formatNumber(m.capacity)}`,
|
|
234
|
+
formatBytes(m.wasteSlots * slotBytes),
|
|
235
|
+
`@${m.nodeId}`,
|
|
236
|
+
]), new Set([1, 2, 3])), allMembers.length > members.length
|
|
237
|
+
? `_${formatNumber(allMembers.length - members.length)} further member(s) in this cluster not shown._`
|
|
238
|
+
: '', '');
|
|
239
|
+
if (cluster.shared.size > 0) {
|
|
240
|
+
const sample = [...cluster.shared]
|
|
241
|
+
.sort((a, b) => a - b)
|
|
242
|
+
.slice(0, 12);
|
|
243
|
+
lines.push(`Keys written by EVERY member: ${sample.map(k => `\`${k}\``).join(', ')}${cluster.shared.size > sample.length ? `, +${formatNumber(cluster.shared.size - sample.length)} more` : ''}. ` +
|
|
244
|
+
'Indices agreeing across unrelated structures is what an id allocator handed out as an array subscript looks like.', '');
|
|
245
|
+
}
|
|
246
|
+
lines.push(`**Fix once, pay off ${formatNumber(allMembers.length)} times:** assign these ids densely at first use (or key the structures by a \`Map\` instead of an array subscript). Sizing any one of them alone recovers only its own share.`, '');
|
|
247
|
+
}
|
|
248
|
+
if (ranked.length > limit) {
|
|
249
|
+
lines.push(`_${formatNumber(ranked.length - limit)} further cluster(s) not shown; raise \`limit\`._`, '');
|
|
250
|
+
}
|
|
251
|
+
lines.push(`_Compared on SPARSE keys only — indices at or below a structure's own key count are dropped, because a densely packed array has keys 0..N-1 by construction and would otherwise match everything. Up to ${formatNumber(MAX_KEYS_PER_STRUCTURE)} keys per structure, sampled evenly across the range, so a high score is strong evidence and a low one on very large key sets is not proof they differ._`);
|
|
252
|
+
if (!suggestionsSuppressed()) {
|
|
253
|
+
lines.push('', '**Suggested next steps**', `- \`memlab_sparse_elements\` — the per-structure view these clusters are built from.`, `- \`memlab_retainer_trace\` on a member node id — confirm the owner label before writing the fix.`);
|
|
254
|
+
}
|
|
255
|
+
return toolResult(lines.join('\n'));
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
return errorResult(err);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=id-space-audit.js.map
|