@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.
Files changed (374) hide show
  1. package/README.md +30 -16
  2. package/bin/.eslintrc.js +26 -0
  3. package/bin/memlab-cli.js +313 -0
  4. package/dist/anonymized-snapshot.d.ts +75 -0
  5. package/dist/anonymized-snapshot.d.ts.map +1 -0
  6. package/dist/anonymized-snapshot.js +101 -0
  7. package/dist/anonymized-snapshot.js.map +1 -0
  8. package/dist/artifact-classes.d.ts +86 -0
  9. package/dist/artifact-classes.d.ts.map +1 -0
  10. package/dist/artifact-classes.js +261 -0
  11. package/dist/artifact-classes.js.map +1 -0
  12. package/dist/capture-mode.d.ts +60 -0
  13. package/dist/capture-mode.d.ts.map +1 -0
  14. package/dist/capture-mode.js +39 -0
  15. package/dist/capture-mode.js.map +1 -0
  16. package/dist/eval-hints.d.ts +41 -0
  17. package/dist/eval-hints.d.ts.map +1 -0
  18. package/dist/eval-hints.js +115 -0
  19. package/dist/eval-hints.js.map +1 -0
  20. package/dist/guardrail.d.ts.map +1 -1
  21. package/dist/guardrail.js +13 -0
  22. package/dist/guardrail.js.map +1 -1
  23. package/dist/heap-budget.d.ts +32 -0
  24. package/dist/heap-budget.d.ts.map +1 -0
  25. package/dist/heap-budget.js +90 -0
  26. package/dist/heap-budget.js.map +1 -0
  27. package/dist/heap-shapes.d.ts +148 -0
  28. package/dist/heap-shapes.d.ts.map +1 -0
  29. package/dist/heap-shapes.js +193 -0
  30. package/dist/heap-shapes.js.map +1 -0
  31. package/dist/heap-state.d.ts +109 -2
  32. package/dist/heap-state.d.ts.map +1 -1
  33. package/dist/heap-state.js +194 -3
  34. package/dist/heap-state.js.map +1 -1
  35. package/dist/index.js +102 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/progress.d.ts +25 -0
  38. package/dist/progress.d.ts.map +1 -0
  39. package/dist/progress.js +46 -0
  40. package/dist/progress.js.map +1 -0
  41. package/dist/react-shapes.d.ts +42 -0
  42. package/dist/react-shapes.d.ts.map +1 -0
  43. package/dist/react-shapes.js +149 -0
  44. package/dist/react-shapes.js.map +1 -0
  45. package/dist/result-handles.d.ts +11 -0
  46. package/dist/result-handles.d.ts.map +1 -0
  47. package/dist/result-handles.js +77 -0
  48. package/dist/result-handles.js.map +1 -0
  49. package/dist/server-version.d.ts +19 -0
  50. package/dist/server-version.d.ts.map +1 -0
  51. package/dist/server-version.js +19 -0
  52. package/dist/server-version.js.map +1 -0
  53. package/dist/snapshot-borrow.d.ts +67 -0
  54. package/dist/snapshot-borrow.d.ts.map +1 -0
  55. package/dist/snapshot-borrow.js +113 -0
  56. package/dist/snapshot-borrow.js.map +1 -0
  57. package/dist/string-index.d.ts +55 -0
  58. package/dist/string-index.d.ts.map +1 -0
  59. package/dist/string-index.js +99 -0
  60. package/dist/string-index.js.map +1 -0
  61. package/dist/tool-registry.d.ts +42 -0
  62. package/dist/tool-registry.d.ts.map +1 -0
  63. package/dist/tool-registry.js +20 -0
  64. package/dist/tool-registry.js.map +1 -0
  65. package/dist/tools/analyze-run.d.ts +12 -0
  66. package/dist/tools/analyze-run.d.ts.map +1 -0
  67. package/dist/tools/analyze-run.js +404 -0
  68. package/dist/tools/analyze-run.js.map +1 -0
  69. package/dist/tools/anonymize-snapshot.d.ts +12 -0
  70. package/dist/tools/anonymize-snapshot.d.ts.map +1 -0
  71. package/dist/tools/anonymize-snapshot.js +159 -0
  72. package/dist/tools/anonymize-snapshot.js.map +1 -0
  73. package/dist/tools/app-config.d.ts +12 -0
  74. package/dist/tools/app-config.d.ts.map +1 -0
  75. package/dist/tools/app-config.js +217 -0
  76. package/dist/tools/app-config.js.map +1 -0
  77. package/dist/tools/app-heap.d.ts +30 -0
  78. package/dist/tools/app-heap.d.ts.map +1 -0
  79. package/dist/tools/app-heap.js +106 -0
  80. package/dist/tools/app-heap.js.map +1 -0
  81. package/dist/tools/artifact-budget.d.ts +12 -0
  82. package/dist/tools/artifact-budget.d.ts.map +1 -0
  83. package/dist/tools/artifact-budget.js +219 -0
  84. package/dist/tools/artifact-budget.js.map +1 -0
  85. package/dist/tools/async-census.d.ts +12 -0
  86. package/dist/tools/async-census.d.ts.map +1 -0
  87. package/dist/tools/async-census.js +243 -0
  88. package/dist/tools/async-census.js.map +1 -0
  89. package/dist/tools/auto-investigate.d.ts.map +1 -1
  90. package/dist/tools/auto-investigate.js +54 -5
  91. package/dist/tools/auto-investigate.js.map +1 -1
  92. package/dist/tools/batch.d.ts +12 -0
  93. package/dist/tools/batch.d.ts.map +1 -0
  94. package/dist/tools/batch.js +196 -0
  95. package/dist/tools/batch.js.map +1 -0
  96. package/dist/tools/cache-analysis.d.ts +15 -0
  97. package/dist/tools/cache-analysis.d.ts.map +1 -1
  98. package/dist/tools/cache-analysis.js +240 -14
  99. package/dist/tools/cache-analysis.js.map +1 -1
  100. package/dist/tools/census-diff.d.ts +55 -0
  101. package/dist/tools/census-diff.d.ts.map +1 -0
  102. package/dist/tools/census-diff.js +228 -0
  103. package/dist/tools/census-diff.js.map +1 -0
  104. package/dist/tools/chain-walk.d.ts +12 -0
  105. package/dist/tools/chain-walk.d.ts.map +1 -0
  106. package/dist/tools/chain-walk.js +184 -0
  107. package/dist/tools/chain-walk.js.map +1 -0
  108. package/dist/tools/class-histogram.d.ts.map +1 -1
  109. package/dist/tools/class-histogram.js +14 -3
  110. package/dist/tools/class-histogram.js.map +1 -1
  111. package/dist/tools/collection-diff.d.ts +44 -0
  112. package/dist/tools/collection-diff.d.ts.map +1 -0
  113. package/dist/tools/collection-diff.js +343 -0
  114. package/dist/tools/collection-diff.js.map +1 -0
  115. package/dist/tools/collection-trend.d.ts +55 -0
  116. package/dist/tools/collection-trend.d.ts.map +1 -0
  117. package/dist/tools/collection-trend.js +315 -0
  118. package/dist/tools/collection-trend.js.map +1 -0
  119. package/dist/tools/detached-dom.d.ts +5 -0
  120. package/dist/tools/detached-dom.d.ts.map +1 -1
  121. package/dist/tools/detached-dom.js +368 -22
  122. package/dist/tools/detached-dom.js.map +1 -1
  123. package/dist/tools/dev-artifacts.d.ts +62 -6
  124. package/dist/tools/dev-artifacts.d.ts.map +1 -1
  125. package/dist/tools/dev-artifacts.js +685 -24
  126. package/dist/tools/dev-artifacts.js.map +1 -1
  127. package/dist/tools/diff-snapshots.d.ts.map +1 -1
  128. package/dist/tools/diff-snapshots.js +18 -2
  129. package/dist/tools/diff-snapshots.js.map +1 -1
  130. package/dist/tools/dom-audit.d.ts +37 -0
  131. package/dist/tools/dom-audit.d.ts.map +1 -0
  132. package/dist/tools/dom-audit.js +247 -0
  133. package/dist/tools/dom-audit.js.map +1 -0
  134. package/dist/tools/dominator-attribution.d.ts +12 -0
  135. package/dist/tools/dominator-attribution.d.ts.map +1 -0
  136. package/dist/tools/dominator-attribution.js +189 -0
  137. package/dist/tools/dominator-attribution.js.map +1 -0
  138. package/dist/tools/dominator-chain.d.ts +12 -0
  139. package/dist/tools/dominator-chain.d.ts.map +1 -0
  140. package/dist/tools/dominator-chain.js +92 -0
  141. package/dist/tools/dominator-chain.js.map +1 -0
  142. package/dist/tools/duplicate-objects.d.ts +12 -0
  143. package/dist/tools/duplicate-objects.d.ts.map +1 -0
  144. package/dist/tools/duplicate-objects.js +172 -0
  145. package/dist/tools/duplicate-objects.js.map +1 -0
  146. package/dist/tools/duplicated-strings.d.ts.map +1 -1
  147. package/dist/tools/duplicated-strings.js +49 -40
  148. package/dist/tools/duplicated-strings.js.map +1 -1
  149. package/dist/tools/eval-across.d.ts +12 -0
  150. package/dist/tools/eval-across.d.ts.map +1 -0
  151. package/dist/tools/eval-across.js +135 -0
  152. package/dist/tools/eval-across.js.map +1 -0
  153. package/dist/tools/eval.d.ts +79 -0
  154. package/dist/tools/eval.d.ts.map +1 -1
  155. package/dist/tools/eval.js +2523 -197
  156. package/dist/tools/eval.js.map +1 -1
  157. package/dist/tools/event-listener-leaks.d.ts.map +1 -1
  158. package/dist/tools/event-listener-leaks.js +42 -17
  159. package/dist/tools/event-listener-leaks.js.map +1 -1
  160. package/dist/tools/event-registry.d.ts.map +1 -1
  161. package/dist/tools/event-registry.js +42 -8
  162. package/dist/tools/event-registry.js.map +1 -1
  163. package/dist/tools/explain-delta.d.ts +12 -0
  164. package/dist/tools/explain-delta.d.ts.map +1 -0
  165. package/dist/tools/explain-delta.js +221 -0
  166. package/dist/tools/explain-delta.js.map +1 -0
  167. package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
  168. package/dist/tools/find-nodes-by-class.js +112 -13
  169. package/dist/tools/find-nodes-by-class.js.map +1 -1
  170. package/dist/tools/finding-index.d.ts +203 -0
  171. package/dist/tools/finding-index.d.ts.map +1 -0
  172. package/dist/tools/finding-index.js +566 -0
  173. package/dist/tools/finding-index.js.map +1 -0
  174. package/dist/tools/for-each.d.ts.map +1 -1
  175. package/dist/tools/for-each.js +15 -3
  176. package/dist/tools/for-each.js.map +1 -1
  177. package/dist/tools/get-referrers.d.ts.map +1 -1
  178. package/dist/tools/get-referrers.js +17 -0
  179. package/dist/tools/get-referrers.js.map +1 -1
  180. package/dist/tools/get-value.d.ts +16 -0
  181. package/dist/tools/get-value.d.ts.map +1 -1
  182. package/dist/tools/get-value.js +96 -2
  183. package/dist/tools/get-value.js.map +1 -1
  184. package/dist/tools/hunt-report.d.ts +12 -0
  185. package/dist/tools/hunt-report.d.ts.map +1 -0
  186. package/dist/tools/hunt-report.js +186 -0
  187. package/dist/tools/hunt-report.js.map +1 -0
  188. package/dist/tools/hypothesis.d.ts +12 -0
  189. package/dist/tools/hypothesis.d.ts.map +1 -0
  190. package/dist/tools/hypothesis.js +280 -0
  191. package/dist/tools/hypothesis.js.map +1 -0
  192. package/dist/tools/id-space-audit.d.ts +12 -0
  193. package/dist/tools/id-space-audit.d.ts.map +1 -0
  194. package/dist/tools/id-space-audit.js +262 -0
  195. package/dist/tools/id-space-audit.js.map +1 -0
  196. package/dist/tools/identify.d.ts +12 -0
  197. package/dist/tools/identify.d.ts.map +1 -0
  198. package/dist/tools/identify.js +205 -0
  199. package/dist/tools/identify.js.map +1 -0
  200. package/dist/tools/identity-diff.d.ts +12 -0
  201. package/dist/tools/identity-diff.d.ts.map +1 -0
  202. package/dist/tools/identity-diff.js +188 -0
  203. package/dist/tools/identity-diff.js.map +1 -0
  204. package/dist/tools/intern-opportunities.d.ts.map +1 -1
  205. package/dist/tools/intern-opportunities.js +116 -50
  206. package/dist/tools/intern-opportunities.js.map +1 -1
  207. package/dist/tools/ladder-probe.d.ts +65 -0
  208. package/dist/tools/ladder-probe.d.ts.map +1 -0
  209. package/dist/tools/ladder-probe.js +445 -0
  210. package/dist/tools/ladder-probe.js.map +1 -0
  211. package/dist/tools/ladder.d.ts +33 -0
  212. package/dist/tools/ladder.d.ts.map +1 -0
  213. package/dist/tools/ladder.js +266 -0
  214. package/dist/tools/ladder.js.map +1 -0
  215. package/dist/tools/largest-objects.d.ts.map +1 -1
  216. package/dist/tools/largest-objects.js +6 -2
  217. package/dist/tools/largest-objects.js.map +1 -1
  218. package/dist/tools/leak-report.d.ts +35 -0
  219. package/dist/tools/leak-report.d.ts.map +1 -0
  220. package/dist/tools/leak-report.js +398 -0
  221. package/dist/tools/leak-report.js.map +1 -0
  222. package/dist/tools/load-snapshot.d.ts +29 -0
  223. package/dist/tools/load-snapshot.d.ts.map +1 -1
  224. package/dist/tools/load-snapshot.js +294 -23
  225. package/dist/tools/load-snapshot.js.map +1 -1
  226. package/dist/tools/map-entries.d.ts +12 -0
  227. package/dist/tools/map-entries.d.ts.map +1 -0
  228. package/dist/tools/map-entries.js +139 -0
  229. package/dist/tools/map-entries.js.map +1 -0
  230. package/dist/tools/match-object.d.ts +12 -0
  231. package/dist/tools/match-object.d.ts.map +1 -0
  232. package/dist/tools/match-object.js +165 -0
  233. package/dist/tools/match-object.js.map +1 -0
  234. package/dist/tools/metric.d.ts +13 -0
  235. package/dist/tools/metric.d.ts.map +1 -0
  236. package/dist/tools/metric.js +185 -0
  237. package/dist/tools/metric.js.map +1 -0
  238. package/dist/tools/module-attribution.d.ts +36 -0
  239. package/dist/tools/module-attribution.d.ts.map +1 -0
  240. package/dist/tools/module-attribution.js +235 -0
  241. package/dist/tools/module-attribution.js.map +1 -0
  242. package/dist/tools/next-measurement.d.ts +26 -0
  243. package/dist/tools/next-measurement.d.ts.map +1 -0
  244. package/dist/tools/next-measurement.js +149 -0
  245. package/dist/tools/next-measurement.js.map +1 -0
  246. package/dist/tools/object-cost-breakdown.d.ts.map +1 -1
  247. package/dist/tools/object-cost-breakdown.js +64 -0
  248. package/dist/tools/object-cost-breakdown.js.map +1 -1
  249. package/dist/tools/object-shape.d.ts.map +1 -1
  250. package/dist/tools/object-shape.js +53 -5
  251. package/dist/tools/object-shape.js.map +1 -1
  252. package/dist/tools/population-diff.d.ts +57 -0
  253. package/dist/tools/population-diff.d.ts.map +1 -0
  254. package/dist/tools/population-diff.js +338 -0
  255. package/dist/tools/population-diff.js.map +1 -0
  256. package/dist/tools/population-vs-owners.d.ts +12 -0
  257. package/dist/tools/population-vs-owners.d.ts.map +1 -0
  258. package/dist/tools/population-vs-owners.js +183 -0
  259. package/dist/tools/population-vs-owners.js.map +1 -0
  260. package/dist/tools/property-names.d.ts +29 -0
  261. package/dist/tools/property-names.d.ts.map +1 -0
  262. package/dist/tools/property-names.js +131 -0
  263. package/dist/tools/property-names.js.map +1 -0
  264. package/dist/tools/quick-diagnosis.d.ts.map +1 -1
  265. package/dist/tools/quick-diagnosis.js +7 -1
  266. package/dist/tools/quick-diagnosis.js.map +1 -1
  267. package/dist/tools/react-owners.d.ts +12 -0
  268. package/dist/tools/react-owners.d.ts.map +1 -0
  269. package/dist/tools/react-owners.js +167 -0
  270. package/dist/tools/react-owners.js.map +1 -0
  271. package/dist/tools/react-update-queues.d.ts +12 -0
  272. package/dist/tools/react-update-queues.d.ts.map +1 -0
  273. package/dist/tools/react-update-queues.js +173 -0
  274. package/dist/tools/react-update-queues.js.map +1 -0
  275. package/dist/tools/replicate.d.ts +49 -0
  276. package/dist/tools/replicate.d.ts.map +1 -0
  277. package/dist/tools/replicate.js +241 -0
  278. package/dist/tools/replicate.js.map +1 -0
  279. package/dist/tools/retainer-diff.d.ts +12 -0
  280. package/dist/tools/retainer-diff.d.ts.map +1 -0
  281. package/dist/tools/retainer-diff.js +168 -0
  282. package/dist/tools/retainer-diff.js.map +1 -0
  283. package/dist/tools/retainer-layers.d.ts +23 -0
  284. package/dist/tools/retainer-layers.d.ts.map +1 -0
  285. package/dist/tools/retainer-layers.js +179 -0
  286. package/dist/tools/retainer-layers.js.map +1 -0
  287. package/dist/tools/retainer-summary.d.ts +18 -0
  288. package/dist/tools/retainer-summary.d.ts.map +1 -1
  289. package/dist/tools/retainer-summary.js +210 -51
  290. package/dist/tools/retainer-summary.js.map +1 -1
  291. package/dist/tools/retainer-trace.d.ts.map +1 -1
  292. package/dist/tools/retainer-trace.js +14 -2
  293. package/dist/tools/retainer-trace.js.map +1 -1
  294. package/dist/tools/round-audit.d.ts +66 -0
  295. package/dist/tools/round-audit.d.ts.map +1 -0
  296. package/dist/tools/round-audit.js +258 -0
  297. package/dist/tools/round-audit.js.map +1 -0
  298. package/dist/tools/round-digest.d.ts +12 -0
  299. package/dist/tools/round-digest.d.ts.map +1 -0
  300. package/dist/tools/round-digest.js +190 -0
  301. package/dist/tools/round-digest.js.map +1 -0
  302. package/dist/tools/script-census.d.ts +12 -0
  303. package/dist/tools/script-census.d.ts.map +1 -0
  304. package/dist/tools/script-census.js +182 -0
  305. package/dist/tools/script-census.js.map +1 -0
  306. package/dist/tools/search-nodes.d.ts.map +1 -1
  307. package/dist/tools/search-nodes.js +5 -1
  308. package/dist/tools/search-nodes.js.map +1 -1
  309. package/dist/tools/search-strings.d.ts.map +1 -1
  310. package/dist/tools/search-strings.js +53 -7
  311. package/dist/tools/search-strings.js.map +1 -1
  312. package/dist/tools/sequence-analysis.d.ts +53 -0
  313. package/dist/tools/sequence-analysis.d.ts.map +1 -1
  314. package/dist/tools/sequence-analysis.js +313 -89
  315. package/dist/tools/sequence-analysis.js.map +1 -1
  316. package/dist/tools/server-status.d.ts.map +1 -1
  317. package/dist/tools/server-status.js +4 -1
  318. package/dist/tools/server-status.js.map +1 -1
  319. package/dist/tools/settle-check.d.ts +12 -0
  320. package/dist/tools/settle-check.d.ts.map +1 -0
  321. package/dist/tools/settle-check.js +188 -0
  322. package/dist/tools/settle-check.js.map +1 -0
  323. package/dist/tools/shape-histogram.d.ts.map +1 -1
  324. package/dist/tools/shape-histogram.js +9 -2
  325. package/dist/tools/shape-histogram.js.map +1 -1
  326. package/dist/tools/sliced-strings.d.ts.map +1 -1
  327. package/dist/tools/sliced-strings.js +2 -1
  328. package/dist/tools/sliced-strings.js.map +1 -1
  329. package/dist/tools/snapshots.d.ts.map +1 -1
  330. package/dist/tools/snapshots.js +24 -6
  331. package/dist/tools/snapshots.js.map +1 -1
  332. package/dist/tools/sparse-elements.d.ts +12 -0
  333. package/dist/tools/sparse-elements.d.ts.map +1 -0
  334. package/dist/tools/sparse-elements.js +215 -0
  335. package/dist/tools/sparse-elements.js.map +1 -0
  336. package/dist/tools/stale-collections.d.ts +17 -0
  337. package/dist/tools/stale-collections.d.ts.map +1 -1
  338. package/dist/tools/stale-collections.js +28 -0
  339. package/dist/tools/stale-collections.js.map +1 -1
  340. package/dist/tools/string-patterns.d.ts.map +1 -1
  341. package/dist/tools/string-patterns.js +7 -5
  342. package/dist/tools/string-patterns.js.map +1 -1
  343. package/dist/tools/tools-index.d.ts +12 -0
  344. package/dist/tools/tools-index.d.ts.map +1 -0
  345. package/dist/tools/tools-index.js +492 -0
  346. package/dist/tools/tools-index.js.map +1 -0
  347. package/dist/tools/trace-all.d.ts +42 -0
  348. package/dist/tools/trace-all.d.ts.map +1 -0
  349. package/dist/tools/trace-all.js +263 -0
  350. package/dist/tools/trace-all.js.map +1 -0
  351. package/dist/tools/unit-cost.d.ts +12 -0
  352. package/dist/tools/unit-cost.d.ts.map +1 -0
  353. package/dist/tools/unit-cost.js +219 -0
  354. package/dist/tools/unit-cost.js.map +1 -0
  355. package/dist/tools/verify-fix.d.ts +23 -0
  356. package/dist/tools/verify-fix.d.ts.map +1 -0
  357. package/dist/tools/verify-fix.js +219 -0
  358. package/dist/tools/verify-fix.js.map +1 -0
  359. package/dist/tools/weakmap-entries.d.ts.map +1 -1
  360. package/dist/tools/weakmap-entries.js +6 -1
  361. package/dist/tools/weakmap-entries.js.map +1 -1
  362. package/dist/tools/weakref-census.d.ts +15 -0
  363. package/dist/tools/weakref-census.d.ts.map +1 -0
  364. package/dist/tools/weakref-census.js +147 -0
  365. package/dist/tools/weakref-census.js.map +1 -0
  366. package/dist/tools/what-if.d.ts +12 -0
  367. package/dist/tools/what-if.d.ts.map +1 -0
  368. package/dist/tools/what-if.js +285 -0
  369. package/dist/tools/what-if.js.map +1 -0
  370. package/dist/utils.d.ts +238 -3
  371. package/dist/utils.d.ts.map +1 -1
  372. package/dist/utils.js +507 -15
  373. package/dist/utils.js.map +1 -1
  374. package/package.json +7 -6
@@ -9,9 +9,11 @@
9
9
  */
10
10
  import { z } from 'zod';
11
11
  import { getSnapshot } from '../heap-state.js';
12
+ import { resolveSavedNodeIds } from '../result-handles.js';
12
13
  import { formatBytes, formatNumber, formatNodeInline, markdownTable, errorResult, toolResult, } from '../utils.js';
13
14
  export function registerObjectShape(server) {
14
- server.tool('memlab_object_shape', 'Show the shape/structure of one or more heap objects: all named properties with target node types and sizes. Filters out internal/hidden edges to show only user-visible properties. Supports batch inspection via node_ids to compare multiple objects side-by-side in a single call.', {
15
+ server.tool('memlab_object_shape', 'Show the shape/structure of one or more heap objects: all named properties with target node types and sizes. Filters out internal/hidden edges to show only user-visible properties. Supports batch inspection via node_ids to compare multiple objects side-by-side in a single call. ' +
16
+ 'Accepts a class_name instead of ids: every other tool reports classes by NAME (memlab_class_histogram, memlab_sequence_analysis, memlab_leak_report), so requiring an id here forced a memlab_find_nodes_by_class round-trip — a second whole-heap scan, on a server where loading the snapshot took minutes — just to answer "what shape is this class?".', {
15
17
  node_id: z
16
18
  .number()
17
19
  .optional()
@@ -20,6 +22,19 @@ export function registerObjectShape(server) {
20
22
  .array(z.number())
21
23
  .optional()
22
24
  .describe('Array of node IDs to inspect in a single call (batch mode). Returns shape for each node.'),
25
+ from_result: z
26
+ .string()
27
+ .optional()
28
+ .describe('Read the node ids from a result saved by memlab_eval ({save_as} / helpers.save) instead of listing them. Avoids round-tripping a long id list through the transcript.'),
29
+ class_name: z
30
+ .string()
31
+ .optional()
32
+ .describe('Inspect instances of this class by NAME instead of by id (exact match on the node name, as reported by memlab_class_histogram / memlab_sequence_analysis). Samples the largest instances by retained size — see sample_count. Ignored when node_id/node_ids is given.'),
33
+ sample_count: z
34
+ .number()
35
+ .optional()
36
+ .default(3)
37
+ .describe('How many instances to sample when class_name is used (default 3, max 20). The largest by retained size, so a shape read from them is representative of the memory rather than of an arbitrary instance.'),
23
38
  include_internal: z
24
39
  .boolean()
25
40
  .optional()
@@ -35,12 +50,45 @@ export function registerObjectShape(server) {
35
50
  .optional()
36
51
  .default(50)
37
52
  .describe('Maximum number of properties to return per node (default 50)'),
38
- }, async ({ node_id, node_ids, include_internal, non_null_only, limit }) => {
53
+ }, async ({ node_id, node_ids, from_result, class_name, sample_count, include_internal, non_null_only, limit, }) => {
39
54
  try {
40
55
  const snapshot = getSnapshot();
41
- const ids = node_ids ?? (node_id != null ? [node_id] : []);
56
+ let ids = node_ids ??
57
+ (from_result != null ? resolveSavedNodeIds(from_result) : null) ??
58
+ (node_id != null ? [node_id] : []);
59
+ let classNote = '';
60
+ if (ids.length === 0 && class_name != null && class_name !== '') {
61
+ // Pick the largest instances by retained size: a shape read from the
62
+ // biggest instances describes where the memory actually is, whereas an
63
+ // arbitrary instance may be an empty or partially-initialized one.
64
+ const want = Math.min(Math.max(1, sample_count), 20);
65
+ const best = [];
66
+ let total = 0;
67
+ snapshot.nodes.forEach(node => {
68
+ if (node.id <= 3)
69
+ return;
70
+ if (node.name !== class_name)
71
+ return;
72
+ total++;
73
+ let i = 0;
74
+ while (i < best.length &&
75
+ best[i].retainedSize >= node.retainedSize) {
76
+ i++;
77
+ }
78
+ if (i < want) {
79
+ best.splice(i, 0, node);
80
+ if (best.length > want)
81
+ best.length = want;
82
+ }
83
+ });
84
+ if (total === 0) {
85
+ return errorResult(`No nodes named "${class_name}" found. Class names are matched exactly and are case-sensitive; check the spelling against memlab_class_histogram, or use memlab_search_nodes({name_pattern}) for a regex match.`);
86
+ }
87
+ ids = best.map(n => n.id);
88
+ classNote = `Sampling ${formatNumber(ids.length)} of ${formatNumber(total)} \`${class_name}\` instance(s), largest by retained size.\n\n`;
89
+ }
42
90
  if (ids.length === 0) {
43
- return errorResult('Provide either node_id or node_ids to inspect.');
91
+ return errorResult('Provide node_id, node_ids, from_result, or class_name to inspect.');
44
92
  }
45
93
  if (ids.length > 20) {
46
94
  return errorResult('Maximum 20 nodes per batch. Reduce node_ids count.');
@@ -202,7 +250,7 @@ export function registerObjectShape(server) {
202
250
  sections.unshift(`**Shape overlap:** ${overlapSummary}`);
203
251
  }
204
252
  }
205
- return toolResult(sections.join('\n\n---\n\n'));
253
+ return toolResult(classNote + sections.join('\n\n---\n\n'));
206
254
  }
207
255
  catch (err) {
208
256
  return errorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"object-shape.js","sourceRoot":"","sources":["../../src/tools/object-shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object-shape.js","sourceRoot":"","sources":["../../src/tools/object-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
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 { IHeapNode } from '@memlab/core';
11
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
+ /**
13
+ * A population selector: which nodes the comparison is about.
14
+ *
15
+ * `detached` is the motivating case — see the tool description — but the same
16
+ * question ("is this the SAME set, or a set of the same size?") applies to any
17
+ * population a hunt is tracking.
18
+ */
19
+ export type Population = {
20
+ kind: 'detached';
21
+ } | {
22
+ kind: 'class';
23
+ name: string;
24
+ } | {
25
+ kind: 'shape';
26
+ props: string[];
27
+ };
28
+ export declare function parsePopulation(spec: string): Population;
29
+ /**
30
+ * Membership test for a population selector. Shared with
31
+ * `memlab_dominator_attribution` so the two tools cannot drift on what, for
32
+ * example, "detached" means — a difference there would make their numbers
33
+ * silently incomparable.
34
+ */
35
+ export declare function makeMembershipTest(pop: Population): (node: IHeapNode) => boolean;
36
+ interface Bucket {
37
+ count: number;
38
+ selfSize: number;
39
+ }
40
+ interface Census {
41
+ buckets: Map<string, Bucket>;
42
+ total: number;
43
+ totalSelf: number;
44
+ }
45
+ /**
46
+ * The verdict this tool exists to produce. Equal totals have three distinct
47
+ * causes and they call for opposite conclusions, so the headline states which
48
+ * one holds rather than leaving the reader to infer it from the table.
49
+ */
50
+ export declare function summarizeComposition(a: Census, b: Census): {
51
+ headline: string;
52
+ added: number;
53
+ removed: number;
54
+ };
55
+ export declare function registerPopulationDiff(server: McpServer): void;
56
+ export {};
57
+ //# sourceMappingURL=population-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"population-diff.d.ts","sourceRoot":"","sources":["../../src/tools/population-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAgB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAmBvE;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAClB;IAAC,IAAI,EAAE,UAAU,CAAA;CAAC,GAClB;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAC7B;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC;AAErC,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAyBxD;AAOD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,UAAU,GACd,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAyB9B;AA8ED,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,MAAM;IACd,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AA0BD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CA6BpD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiN9D"}
@@ -0,0 +1,338 @@
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 { getCurrentHandle, getMetadataByHandle, getSnapshotByHandle, listSnapshots, } from '../heap-state.js';
12
+ import { errorResult, formatBytes, formatNumber, isNodeWorthInspecting, markdownTable, toolResult, truncateNodeName, } from '../utils.js';
13
+ import { normalizeClassName } from './sequence-analysis.js';
14
+ export function parsePopulation(spec) {
15
+ const trimmed = spec.trim();
16
+ if (trimmed === 'detached')
17
+ return { kind: 'detached' };
18
+ if (trimmed.startsWith('class:')) {
19
+ const name = trimmed.slice('class:'.length).trim();
20
+ if (name.length === 0) {
21
+ throw new Error('Empty class name in population "class:".');
22
+ }
23
+ return { kind: 'class', name };
24
+ }
25
+ if (trimmed.startsWith('shape:')) {
26
+ const props = trimmed
27
+ .slice('shape:'.length)
28
+ .replace(/^\[|\]$/g, '')
29
+ .split(',')
30
+ .map(s => s.trim().replace(/^["']|["']$/g, ''))
31
+ .filter(s => s.length > 0);
32
+ if (props.length === 0) {
33
+ throw new Error('Empty property list in population "shape:".');
34
+ }
35
+ return { kind: 'shape', props };
36
+ }
37
+ throw new Error(`Unrecognized population "${spec}". Use "detached", "class:<ClassName>", or "shape:prop1,prop2".`);
38
+ }
39
+ function isDetached(node) {
40
+ if (node.id <= 3)
41
+ return false;
42
+ return node.is_detached || node.name.startsWith('Detached ');
43
+ }
44
+ /**
45
+ * Membership test for a population selector. Shared with
46
+ * `memlab_dominator_attribution` so the two tools cannot drift on what, for
47
+ * example, "detached" means — a difference there would make their numbers
48
+ * silently incomparable.
49
+ */
50
+ export function makeMembershipTest(pop) {
51
+ switch (pop.kind) {
52
+ case 'detached':
53
+ return isDetached;
54
+ case 'class': {
55
+ const want = pop.name;
56
+ return (node) => node.id > 3 && node.name === want;
57
+ }
58
+ case 'shape': {
59
+ const want = pop.props;
60
+ return (node) => {
61
+ if (node.id <= 3 || node.type !== 'object')
62
+ return false;
63
+ let hits = 0;
64
+ const seen = new Set();
65
+ for (const edge of node.references) {
66
+ if (edge.type !== 'property')
67
+ continue;
68
+ const name = String(edge.name_or_index);
69
+ if (!want.includes(name) || seen.has(name))
70
+ continue;
71
+ seen.add(name);
72
+ if (++hits === want.length)
73
+ return true;
74
+ }
75
+ return false;
76
+ };
77
+ }
78
+ }
79
+ }
80
+ // Bound on the upward dominator walk when grouping by owner, mirroring
81
+ // `boundedDominatorRetainedSize`. A truncated walk yields '(no owner found)'
82
+ // rather than a wrong owner.
83
+ const MAX_OWNER_HOPS = 500;
84
+ function domTagKey(name) {
85
+ const detached = name.startsWith('Detached ') ? 'Detached ' : '';
86
+ const bare = detached ? name.slice(9) : name;
87
+ const tag = bare.match(/^<(\w+)/)?.[1];
88
+ return tag ? `${detached}<${tag}>` : normalizeClassName(name);
89
+ }
90
+ function ownerKey(node) {
91
+ let cur = node.dominatorNode ?? null;
92
+ let hops = 0;
93
+ while (cur && hops++ < MAX_OWNER_HOPS) {
94
+ if (cur.id === node.id)
95
+ break;
96
+ if (cur.name !== '(GC roots)' &&
97
+ cur.id > 3 &&
98
+ isNodeWorthInspecting(cur) &&
99
+ !isDetached(cur)) {
100
+ // Deliberately NOT keyed by node id: ids are per-capture, so an id key
101
+ // would make every bucket "added" in the target and "removed" in the
102
+ // baseline. The owner's CLASS is what is comparable across snapshots.
103
+ return normalizeClassName(truncateNodeName(cur.name, cur.type, cur.self_size, 60));
104
+ }
105
+ const next = cur.dominatorNode ?? null;
106
+ if (!next || next.id === cur.id)
107
+ break;
108
+ cur = next;
109
+ }
110
+ return '(no owner — dominated by the GC root)';
111
+ }
112
+ function shapeKey(node) {
113
+ const props = [];
114
+ for (const edge of node.references) {
115
+ if (edge.type !== 'property')
116
+ continue;
117
+ const name = String(edge.name_or_index);
118
+ if (name === '__proto__')
119
+ continue;
120
+ props.push(name);
121
+ }
122
+ if (props.length === 0)
123
+ return '(no properties)';
124
+ props.sort();
125
+ const joined = props.join(',');
126
+ return joined.length > 80 ? joined.slice(0, 77) + '…' : joined;
127
+ }
128
+ function makeKeyFn(groupBy, pop) {
129
+ switch (groupBy) {
130
+ case 'owner':
131
+ return ownerKey;
132
+ case 'type':
133
+ return (node) => node.type;
134
+ case 'shape':
135
+ return shapeKey;
136
+ case 'class':
137
+ return pop.kind === 'detached'
138
+ ? (node) => domTagKey(node.name)
139
+ : (node) => normalizeClassName(node.name);
140
+ }
141
+ }
142
+ function census(snapshot, isMember, keyOf) {
143
+ const buckets = new Map();
144
+ let total = 0;
145
+ let totalSelf = 0;
146
+ snapshot.nodes.forEach(node => {
147
+ if (!isMember(node))
148
+ return;
149
+ total++;
150
+ totalSelf += node.self_size;
151
+ const key = keyOf(node);
152
+ const b = buckets.get(key);
153
+ if (b) {
154
+ b.count++;
155
+ b.selfSize += node.self_size;
156
+ }
157
+ else {
158
+ buckets.set(key, { count: 1, selfSize: node.self_size });
159
+ }
160
+ });
161
+ return { buckets, total, totalSelf };
162
+ }
163
+ /**
164
+ * The verdict this tool exists to produce. Equal totals have three distinct
165
+ * causes and they call for opposite conclusions, so the headline states which
166
+ * one holds rather than leaving the reader to infer it from the table.
167
+ */
168
+ export function summarizeComposition(a, b) {
169
+ let added = 0;
170
+ let removed = 0;
171
+ for (const key of new Set([...a.buckets.keys(), ...b.buckets.keys()])) {
172
+ const d = (b.buckets.get(key)?.count ?? 0) - (a.buckets.get(key)?.count ?? 0);
173
+ if (d > 0)
174
+ added += d;
175
+ else
176
+ removed += -d;
177
+ }
178
+ const netTotal = b.total - a.total;
179
+ if (added === 0 && removed === 0) {
180
+ return {
181
+ headline: `✅ **Identical composition** — every one of the ${formatNumber(a.buckets.size)} bucket(s) has the same count at both ends. The population did not just stay the same SIZE, it stayed the same population.`,
182
+ added,
183
+ removed,
184
+ };
185
+ }
186
+ if (netTotal === 0) {
187
+ return {
188
+ headline: `⚠ **Equal totals, DIFFERENT composition** — ${formatNumber(added)} member(s) appeared and ${formatNumber(removed)} disappeared, and they cancel out. Do NOT read the equal total as "nothing changed": the round stranded and freed in equal measure, which is exactly what a leak paired with an eviction looks like.`,
189
+ added,
190
+ removed,
191
+ };
192
+ }
193
+ return {
194
+ headline: `Population ${netTotal > 0 ? 'grew' : 'shrank'} by **${formatNumber(Math.abs(netTotal))}** (${formatNumber(a.total)} → ${formatNumber(b.total)}); ${formatNumber(added)} appeared, ${formatNumber(removed)} disappeared.`,
195
+ added,
196
+ removed,
197
+ };
198
+ }
199
+ export function registerPopulationDiff(server) {
200
+ server.tool('memlab_population_diff', 'Compare the COMPOSITION of a population between two loaded snapshots, not just its size. Equal totals are not identity: a round that strands N objects and frees N others reports the same count at both ends, and reading that as "nothing leaked" is a wrong verdict a count comparison cannot catch. This breaks the population into buckets (class, dominator-owner class, node type, or object shape), reports both ends per bucket, and states which of the three cases holds — identical composition / equal totals but different composition / net growth. ' +
201
+ 'Populations: "detached" (all detached DOM), "class:<ClassName>", or "shape:prop1,prop2" (objects carrying all of those properties). ' +
202
+ 'Buckets are keyed by CLASS, never by node id — ids are per-capture, so an id-keyed comparison reports every member as both added and removed. Both snapshots must be resident: load them with keep_previous:true.', {
203
+ baseline_handle: z
204
+ .string()
205
+ .describe('Handle of the earlier snapshot (memlab_snapshots lists them).'),
206
+ target_handle: z
207
+ .string()
208
+ .optional()
209
+ .describe('Handle of the later snapshot. Defaults to the current snapshot.'),
210
+ population: z
211
+ .string()
212
+ .describe('Which nodes to compare: "detached", "class:<ClassName>", or "shape:prop1,prop2".'),
213
+ group_by: z
214
+ .enum(['class', 'owner', 'type', 'shape'])
215
+ .optional()
216
+ .describe('Composition axis. "class" = the member\'s own class (for detached DOM, its element tag); "owner" = the class of its nearest accountable dominator (needs a full, non-light load); "type" = heap node type; "shape" = its sorted property-name set. Defaults to "owner" for a class: population (the members already share a class, so their own name carries no information) and "class" otherwise.'),
217
+ limit: z
218
+ .number()
219
+ .optional()
220
+ .default(25)
221
+ .describe('Maximum buckets to show in the table (default 25).'),
222
+ min_delta: z
223
+ .number()
224
+ .optional()
225
+ .default(0)
226
+ .describe('Hide buckets whose count moved by less than this (default 0: show everything, since an unchanged bucket is itself evidence).'),
227
+ }, async ({ baseline_handle, target_handle, population, group_by, limit, min_delta, }) => {
228
+ try {
229
+ const pop = parsePopulation(population);
230
+ const targetHandle = target_handle ?? getCurrentHandle();
231
+ if (targetHandle == null) {
232
+ return errorResult('No current snapshot; pass target_handle.');
233
+ }
234
+ if (targetHandle === baseline_handle) {
235
+ return errorResult('baseline_handle and target_handle are the same snapshot.');
236
+ }
237
+ const baseline = getSnapshotByHandle(baseline_handle);
238
+ const target = getSnapshotByHandle(targetHandle);
239
+ if (baseline == null || target == null) {
240
+ const available = listSnapshots()
241
+ .map(m => m.handle)
242
+ .join(', ');
243
+ return errorResult(`Both snapshots must be resident. Missing: ${baseline == null ? baseline_handle : targetHandle}. Resident: ${available || '(none)'}. Load with memlab_load_snapshot({file_path, keep_previous: true}).`);
244
+ }
245
+ const groupBy = group_by ?? (pop.kind === 'class' ? 'owner' : 'class');
246
+ if (groupBy === 'owner') {
247
+ for (const h of [baseline_handle, targetHandle]) {
248
+ if (getMetadataByHandle(h)?.light) {
249
+ return errorResult(`Snapshot "${h}" was loaded in LIGHT mode and has no dominator tree, which group_by:"owner" requires. Reload it without light, or group by "class" / "type" / "shape".`);
250
+ }
251
+ }
252
+ }
253
+ const isMember = makeMembershipTest(pop);
254
+ const keyOf = makeKeyFn(groupBy, pop);
255
+ const a = census(baseline, isMember, keyOf);
256
+ const b = census(target, isMember, keyOf);
257
+ if (a.total === 0 && b.total === 0) {
258
+ return toolResult(`No nodes match population \`${population}\` in either snapshot — nothing to compare. Check the class name with \`memlab_class_histogram\`, or the property names with \`memlab_shape_histogram\`.`);
259
+ }
260
+ const { headline, added, removed } = summarizeComposition(a, b);
261
+ const keys = new Set([...a.buckets.keys(), ...b.buckets.keys()]);
262
+ const rows = [];
263
+ for (const key of keys) {
264
+ const before = a.buckets.get(key);
265
+ const after = b.buckets.get(key);
266
+ const delta = (after?.count ?? 0) - (before?.count ?? 0);
267
+ if (Math.abs(delta) < min_delta)
268
+ continue;
269
+ rows.push({
270
+ key,
271
+ before: before?.count ?? 0,
272
+ after: after?.count ?? 0,
273
+ delta,
274
+ bytesDelta: (after?.selfSize ?? 0) - (before?.selfSize ?? 0),
275
+ });
276
+ }
277
+ // Movers first (largest |Δ|), then the stable buckets by size — the
278
+ // stable ones are the evidence behind an "identical composition"
279
+ // verdict, so they are shown, just not ahead of the changes.
280
+ rows.sort((x, y) => Math.abs(y.delta) - Math.abs(x.delta) || y.after - x.after);
281
+ const shown = rows.slice(0, limit);
282
+ const addedKeys = [...keys].filter(k => !a.buckets.has(k) && b.buckets.has(k));
283
+ const removedKeys = [...keys].filter(k => a.buckets.has(k) && !b.buckets.has(k));
284
+ const axisLabel = groupBy === 'owner'
285
+ ? 'Owner (dominator class)'
286
+ : groupBy === 'shape'
287
+ ? 'Shape (property names)'
288
+ : groupBy === 'type'
289
+ ? 'Node type'
290
+ : 'Class';
291
+ const lines = [
292
+ `## Population diff \`${population}\` by ${groupBy}: "${baseline_handle}" → "${targetHandle}"`,
293
+ '',
294
+ `Members: ${formatNumber(a.total)} (${formatBytes(a.totalSelf)} self) → ${formatNumber(b.total)} (${formatBytes(b.totalSelf)} self), across ${formatNumber(a.buckets.size)} → ${formatNumber(b.buckets.size)} bucket(s).`,
295
+ '',
296
+ headline,
297
+ '',
298
+ markdownTable([axisLabel, 'Before', 'After', 'Δ count', 'Δ self'], shown.map(r => [
299
+ r.key.length > 52 ? r.key.slice(0, 49) + '…' : r.key,
300
+ formatNumber(r.before),
301
+ formatNumber(r.after),
302
+ r.delta === 0
303
+ ? '—'
304
+ : `${r.delta > 0 ? '+' : '−'}${formatNumber(Math.abs(r.delta))}`,
305
+ r.bytesDelta === 0
306
+ ? '—'
307
+ : `${r.bytesDelta > 0 ? '+' : '−'}${formatBytes(Math.abs(r.bytesDelta))}`,
308
+ ]), new Set([1, 2, 3, 4])),
309
+ ];
310
+ if (rows.length > shown.length) {
311
+ lines.push('', `_${formatNumber(rows.length - shown.length)} further bucket(s) not shown (raise \`limit\`)._`);
312
+ }
313
+ if (addedKeys.length > 0) {
314
+ lines.push('', `**Buckets present only in the target (${formatNumber(addedKeys.length)}):** ${addedKeys
315
+ .slice(0, 15)
316
+ .map(k => `\`${k}\``)
317
+ .join(', ')}${addedKeys.length > 15 ? ', …' : ''}`);
318
+ }
319
+ if (removedKeys.length > 0) {
320
+ lines.push('', `**Buckets present only in the baseline (${formatNumber(removedKeys.length)}):** ${removedKeys
321
+ .slice(0, 15)
322
+ .map(k => `\`${k}\``)
323
+ .join(', ')}${removedKeys.length > 15 ? ', …' : ''}`);
324
+ }
325
+ if (added > 0 || removed > 0) {
326
+ lines.push('', `_Churn is measured per bucket, so it is a LOWER bound on how many individual objects were replaced: two members swapping within one bucket are invisible here. Node identity cannot be tracked across captures — ids are per-capture — so this is the strongest available statement._`);
327
+ }
328
+ lines.push('', `**Next:** ${groupBy === 'owner'
329
+ ? 'Use `memlab_dominator_attribution` on the owners that moved to measure how much each actually pins.'
330
+ : 'Re-run with `group_by: "owner"` to see WHICH object holds the buckets that moved, then `memlab_dominator_attribution` to size each owner.'}`);
331
+ return toolResult(lines.join('\n'));
332
+ }
333
+ catch (err) {
334
+ return errorResult(err);
335
+ }
336
+ });
337
+ }
338
+ //# sourceMappingURL=population-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"population-diff.js","sourceRoot":"","sources":["../../src/tools/population-diff.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 registerPopulationVsOwners(server: McpServer): void;
12
+ //# sourceMappingURL=population-vs-owners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"population-vs-owners.d.ts","sourceRoot":"","sources":["../../src/tools/population-vs-owners.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAkCvE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2LlE"}