@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
@@ -0,0 +1,183 @@
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 { toolResult, formatNumber } from '../utils.js';
13
+ /**
14
+ * Is a population one-per-live-owner, or is it piling up?
15
+ *
16
+ * This is the question that decides whether a finding is a leak or a standing
17
+ * O(N) cost, and it changes what the fix has to do — bound the structure, or
18
+ * just make it cheaper. It was answered by hand, with an eval, every time.
19
+ *
20
+ * Measured case: 419 `locale_change` subscriptions against 391 live chat
21
+ * models. One per live owner. Reported as a leak until that ratio was computed,
22
+ * at which point it became "structural, remove the per-owner cost" — a
23
+ * different diff with a different claim.
24
+ *
25
+ * The ratio is the whole output. ~1.0 is structural. Well above 1.0 means
26
+ * owners are accumulating records. Far below 1.0 means most owners have none,
27
+ * which usually means the shape matched something other than what was intended.
28
+ */
29
+ function shapeKeys(node) {
30
+ const keys = new Set();
31
+ for (const e of node.references) {
32
+ if (e.type !== 'property')
33
+ continue;
34
+ const n = String(e.name_or_index);
35
+ if (n === '__proto__' || n === 'map')
36
+ continue;
37
+ keys.add(n);
38
+ }
39
+ return keys;
40
+ }
41
+ export function registerPopulationVsOwners(server) {
42
+ server.tool('memlab_population_vs_owners', 'Decide whether a population is STRUCTURAL (about one record per live owner) or ACCUMULATING (owners are collecting records), by counting both and reporting the ratio. ' +
43
+ 'This is the question that separates "a leak" from "a standing O(number-of-owners) cost", and the two need different fixes and different claims — but nothing computed it, so it got hand-written as an eval, or skipped. Measured case: 419 listener records against 391 live models is one per owner, which turned a reported leak into a per-owner cost and changed the fix. ' +
44
+ 'Give it the records (by class or by property shape) and the owner class. It also names the owners holding the most records, which is where a real accumulation shows up even when the overall ratio looks fine.', {
45
+ record_class: z
46
+ .string()
47
+ .optional()
48
+ .describe('Class name of the record population (as reported by memlab_class_histogram). Use this OR record_shape.'),
49
+ record_shape: z
50
+ .array(z.string())
51
+ .optional()
52
+ .describe('Property names every record carries, e.g. ["callback","context"]. Use this OR record_class. Preferred on a minified heap, where every record class is `Object` or `t`.'),
53
+ owner_edge: z
54
+ .string()
55
+ .optional()
56
+ .default('context')
57
+ .describe('The edge on a record that points at its owner (default "context"; also common: "target", "model", "subscriber").'),
58
+ owner_class: z
59
+ .string()
60
+ .optional()
61
+ .describe('Class name of the owners, used to count how many are LIVE in the heap. Omit to infer it from the most common owner class among the records.'),
62
+ limit: z
63
+ .number()
64
+ .optional()
65
+ .default(8)
66
+ .describe('How many top owners to list (default 8).'),
67
+ }, async ({ record_class, record_shape, owner_edge, owner_class, limit }) => {
68
+ const snapshot = getSnapshot();
69
+ if (!snapshot) {
70
+ return toolResult('Error: No heap snapshot loaded. Use memlab_load_snapshot first.');
71
+ }
72
+ if (!record_class && (!record_shape || record_shape.length === 0)) {
73
+ return toolResult('Error: give either `record_class` or `record_shape`. On a minified heap prefer `record_shape` — every record class is `Object` or a one-letter name, so a class filter selects far too much.');
74
+ }
75
+ const wantShape = new Set(record_shape ?? []);
76
+ const perOwner = new Map();
77
+ const ownerClassCount = new Map();
78
+ let records = 0;
79
+ let recordsWithoutOwner = 0;
80
+ snapshot.nodes.forEach(node => {
81
+ if (record_class != null && node.name !== record_class)
82
+ return;
83
+ if (wantShape.size > 0) {
84
+ const keys = shapeKeys(node);
85
+ for (const k of wantShape) {
86
+ if (!keys.has(k))
87
+ return;
88
+ }
89
+ }
90
+ records++;
91
+ let owner = null;
92
+ for (const e of node.references) {
93
+ if (String(e.name_or_index) === owner_edge) {
94
+ owner = e.toNode;
95
+ break;
96
+ }
97
+ }
98
+ if (!owner) {
99
+ recordsWithoutOwner++;
100
+ return;
101
+ }
102
+ perOwner.set(owner.id, (perOwner.get(owner.id) ?? 0) + 1);
103
+ ownerClassCount.set(owner.name, (ownerClassCount.get(owner.name) ?? 0) + 1);
104
+ });
105
+ if (records === 0) {
106
+ return toolResult('No records matched. On a minified heap a `record_class` filter usually matches nothing useful — try `record_shape` with the property names from `memlab_shape_histogram` or `memlab_identify`.');
107
+ }
108
+ const inferredOwnerClass = owner_class ??
109
+ [...ownerClassCount.entries()].sort((a, b) => b[1] - a[1])[0]?.[0];
110
+ // How many owners of that class are alive, whether or not they hold a
111
+ // record. This is the denominator that makes the ratio mean something.
112
+ let liveOwners = 0;
113
+ if (inferredOwnerClass != null) {
114
+ snapshot.nodes.forEach(node => {
115
+ if (node.name === inferredOwnerClass)
116
+ liveOwners++;
117
+ });
118
+ }
119
+ const distinctOwners = perOwner.size;
120
+ // Records with no owner edge are excluded from the numerator, which is
121
+ // what the footnote below tells the reader. Counting them inflates
122
+ // "records per live owner" and can push a structural population over the
123
+ // ACCUMULATING threshold on the strength of records that have no owner
124
+ // at all.
125
+ const recordsWithOwner = records - recordsWithoutOwner;
126
+ const ratio = liveOwners > 0 ? recordsWithOwner / liveOwners : NaN;
127
+ // A ratio far BELOW 1.0 is not a mild version of "structural" — it means
128
+ // most live owners hold no record at all, which in practice means the
129
+ // filter selected something other than the intended population. Reporting
130
+ // it as STRUCTURAL states the reassuring conclusion ("not a leak") on the
131
+ // strength of a match that did not happen.
132
+ const underMatched = Number.isFinite(ratio) && ratio < 0.5;
133
+ const tooFewRecords = records < 10;
134
+ const internalOwner = inferredOwnerClass != null &&
135
+ (inferredOwnerClass.startsWith('system /') ||
136
+ inferredOwnerClass.startsWith('(') ||
137
+ inferredOwnerClass === 'Object');
138
+ const verdict = !Number.isFinite(ratio)
139
+ ? 'UNKNOWN — could not count live owners'
140
+ : underMatched
141
+ ? `UNDER-MATCHED — only ${formatNumber(recordsWithOwner)} owned record(s) against ${formatNumber(liveOwners)} live owner(s), so most owners hold none. Treat this as a filter that missed, NOT as evidence of "not a leak": re-check \`record_shape\`/\`record_class\` against \`memlab_shape_histogram\`, and \`owner_edge\` against \`memlab_object_shape\` on one record.`
142
+ : ratio <= 1.25
143
+ ? 'STRUCTURAL — about one record per live owner. This is a standing O(owners) cost, not accumulation: it scales with user data, not with time. A fix should remove the per-owner cost; do not describe it as a leak.'
144
+ : ratio >= 2
145
+ ? 'ACCUMULATING — owners are holding several records each. Look at the top owners below; that is where the extra records are.'
146
+ : 'BORDERLINE — slightly more than one record per owner. Check the top owners, and confirm against a ladder before calling it either way.';
147
+ const top = [...perOwner.entries()]
148
+ .sort((a, b) => b[1] - a[1])
149
+ .slice(0, limit);
150
+ const out = [
151
+ `## Population vs owners`,
152
+ '',
153
+ `- Records matched: **${formatNumber(records)}**${record_class ? ` (class \`${record_class}\`)` : ` (shape \`${[...wantShape].join(', ')}\`)`}`,
154
+ `- Distinct owners holding at least one: **${formatNumber(distinctOwners)}** (via \`.${owner_edge}\`)`,
155
+ `- Live owners of class \`${inferredOwnerClass ?? '(unknown)'}\` in the heap: **${formatNumber(liveOwners)}**${owner_class ? '' : ' _(class inferred from the records)_'}`,
156
+ `- **Records per live owner: ${Number.isFinite(ratio) ? ratio.toFixed(2) : 'n/a'}**`,
157
+ '',
158
+ `**${verdict}**`,
159
+ ];
160
+ if (tooFewRecords) {
161
+ out.push('', `> ⚠ ${formatNumber(records)} record(s) is too small a population to characterise. Any ratio from it is noise; widen the filter before drawing a conclusion either way.`);
162
+ }
163
+ if (internalOwner) {
164
+ out.push('', `> ⚠ The owner class resolved to \`${inferredOwnerClass}\`, which is a V8 internal or a generic container rather than an application object. \`.${owner_edge}\` is almost certainly not the edge that points at the real owner — find the right one with \`memlab_object_shape\` on one record, or pass \`owner_class\` explicitly.`);
165
+ }
166
+ if (recordsWithoutOwner > 0) {
167
+ out.push('', `_${formatNumber(recordsWithoutOwner)} record(s) had no \`.${owner_edge}\` edge and are excluded from the ratio. If that is most of them, the owner edge is probably named something else._`);
168
+ }
169
+ if (distinctOwners > liveOwners && liveOwners > 0) {
170
+ out.push('', `> ⚠ More distinct owners hold records (${formatNumber(distinctOwners)}) than there are live owners of that class (${formatNumber(liveOwners)}). The surplus owners are unreachable except through these records — that IS an accumulation, and those owners are being kept alive by it.`);
171
+ }
172
+ if (top.length > 0) {
173
+ out.push('', '### Owners holding the most records', '');
174
+ for (const [ownerId, count] of top) {
175
+ const n = snapshot.getNodeById(ownerId);
176
+ out.push(`- @${ownerId} \`${n?.name ?? '?'}\` — ${formatNumber(count)} record(s)`);
177
+ }
178
+ }
179
+ out.push('', '_One snapshot gives the ratio, not a rate. A structural verdict means "not growing per owner"; it does not mean the owner count itself is bounded. Confirm with `memlab_ladder_probe` if the owner population might be what grows._');
180
+ return toolResult(out.join('\n'));
181
+ });
182
+ }
183
+ //# sourceMappingURL=population-vs-owners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"population-vs-owners.js","sourceRoot":"","sources":["../../src/tools/population-vs-owners.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
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
+ /**
12
+ * The heap's VOCABULARY: every distinct property name, with how many objects
13
+ * carry it and which classes those are.
14
+ *
15
+ * There was no way to ask this. `memlab_find_by_property` and
16
+ * `helpers.withProp` both require you to already know the name;
17
+ * `memlab_property_distribution` reports the VALUES of one known property. So
18
+ * the names of the collections that matter — `vcMutationLog`, `postBuffers`,
19
+ * `tracedInteractions`, `visualChangeRecordList` — could only be learned by
20
+ * reading retainer traces one at a time and noticing them.
21
+ *
22
+ * Grepping the vocabulary is a fast and genuinely different way in: a pattern
23
+ * like `/log$|buffer|queue|cache|pending|trace/i` surfaces the app's own
24
+ * accumulator names in one indexed pass, and each one is then a
25
+ * `memlab_collection_trend` locator or a `helpers.withProp` lookup away from a
26
+ * measurement.
27
+ */
28
+ export declare function registerPropertyNames(server: McpServer): void;
29
+ //# sourceMappingURL=property-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-names.d.ts","sourceRoot":"","sources":["../../src/tools/property-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAUvE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2H7D"}
@@ -0,0 +1,131 @@
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 { errorResult, formatNumber, markdownTable, toolResult, } from '../utils.js';
13
+ /**
14
+ * The heap's VOCABULARY: every distinct property name, with how many objects
15
+ * carry it and which classes those are.
16
+ *
17
+ * There was no way to ask this. `memlab_find_by_property` and
18
+ * `helpers.withProp` both require you to already know the name;
19
+ * `memlab_property_distribution` reports the VALUES of one known property. So
20
+ * the names of the collections that matter — `vcMutationLog`, `postBuffers`,
21
+ * `tracedInteractions`, `visualChangeRecordList` — could only be learned by
22
+ * reading retainer traces one at a time and noticing them.
23
+ *
24
+ * Grepping the vocabulary is a fast and genuinely different way in: a pattern
25
+ * like `/log$|buffer|queue|cache|pending|trace/i` surfaces the app's own
26
+ * accumulator names in one indexed pass, and each one is then a
27
+ * `memlab_collection_trend` locator or a `helpers.withProp` lookup away from a
28
+ * measurement.
29
+ */
30
+ export function registerPropertyNames(server) {
31
+ server.tool('memlab_property_names', "Index the heap's VOCABULARY: every distinct property name, how many objects carry it, and the classes that do. " +
32
+ 'Nothing else answers "what property names exist here?" — memlab_find_by_property and helpers.withProp need the name up front, and memlab_property_distribution reports the VALUES of a name you already have. ' +
33
+ 'This is the way to DISCOVER an app\'s accumulators instead of stumbling on them in a retainer trace: a pattern like "log$|buffer|queue|cache|pending|trace" surfaces their names in one pass, and each result is then a memlab_collection_trend locator or a helpers.withProp lookup away from being measured. ' +
34
+ 'Also useful in reverse — a name you expected and do NOT find is evidence the code path never ran.', {
35
+ pattern: z
36
+ .string()
37
+ .optional()
38
+ .describe('Case-insensitive regex (or plain substring) to filter property names. Omit to list the most common names.'),
39
+ min_count: z
40
+ .number()
41
+ .optional()
42
+ .default(2)
43
+ .describe('Ignore names carried by fewer objects than this (default 2).'),
44
+ limit: z
45
+ .number()
46
+ .optional()
47
+ .default(40)
48
+ .describe('Maximum names to report (default 40).'),
49
+ sort_by: z
50
+ .enum(['count', 'name'])
51
+ .optional()
52
+ .default('count')
53
+ .describe('Sort by carrier count (default) or alphabetically.'),
54
+ }, async ({ pattern, min_count, limit, sort_by }) => {
55
+ try {
56
+ const snapshot = getSnapshot();
57
+ if (!snapshot) {
58
+ return errorResult('No heap snapshot loaded. Use memlab_load_snapshot first.');
59
+ }
60
+ let re = null;
61
+ if (pattern != null && pattern.length > 0) {
62
+ try {
63
+ re = new RegExp(pattern, 'i');
64
+ }
65
+ catch {
66
+ re = new RegExp(pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
67
+ }
68
+ }
69
+ const counts = new Map();
70
+ const classes = new Map();
71
+ snapshot.nodes.forEach((node) => {
72
+ if (node.id <= 3)
73
+ return;
74
+ if (node.type !== 'object')
75
+ return;
76
+ for (const edge of node.references) {
77
+ if (edge.type !== 'property')
78
+ continue;
79
+ const name = String(edge.name_or_index);
80
+ if (name === '__proto__' || name === '')
81
+ continue;
82
+ if (re != null && !re.test(name))
83
+ continue;
84
+ counts.set(name, (counts.get(name) ?? 0) + 1);
85
+ let c = classes.get(name);
86
+ if (!c) {
87
+ c = new Map();
88
+ classes.set(name, c);
89
+ }
90
+ c.set(node.name, (c.get(node.name) ?? 0) + 1);
91
+ }
92
+ });
93
+ const rows = [...counts.entries()].filter(([, c]) => c >= min_count);
94
+ rows.sort(sort_by === 'name'
95
+ ? (a, b) => a[0].localeCompare(b[0])
96
+ : (a, b) => b[1] - a[1]);
97
+ const lines = [
98
+ '## Property-name index',
99
+ '',
100
+ `${formatNumber(rows.length)} distinct property name(s)` +
101
+ (re != null ? ` matching \`${pattern}\`` : '') +
102
+ ` carried by at least ${formatNumber(min_count)} object(s).`,
103
+ '',
104
+ ];
105
+ if (rows.length === 0) {
106
+ lines.push(re != null
107
+ ? `_No property name matches \`${pattern}\`. If you expected one, that is itself evidence — either the code path never ran in this capture, or the field is minified._`
108
+ : '_No property names found._');
109
+ return toolResult(lines.join('\n'));
110
+ }
111
+ lines.push(markdownTable(['Property', 'Objects', 'Top carrier classes'], rows.slice(0, limit).map(([name, count]) => {
112
+ const cls = [...(classes.get(name) ?? new Map()).entries()]
113
+ .sort((a, b) => b[1] - a[1])
114
+ .slice(0, 3)
115
+ .map(([c, n]) => `${c} (${formatNumber(n)})`)
116
+ .join(', ');
117
+ return [
118
+ name.length > 44 ? name.slice(0, 41) + '…' : name,
119
+ formatNumber(count),
120
+ cls.length > 70 ? cls.slice(0, 67) + '…' : cls,
121
+ ];
122
+ }), new Set([1])));
123
+ lines.push('', '**Next:** `memlab_collection_trend({locators: ["<CarrierClass>.<property>"]})` to see whether it grows across a ladder, `memlab_find_by_property` to list the carriers, or `memlab_property_distribution` for the value cardinality of one name.');
124
+ return toolResult(lines.join('\n'));
125
+ }
126
+ catch (error) {
127
+ return errorResult(`Failed to index property names: ${error instanceof Error ? error.message : String(error)}`);
128
+ }
129
+ });
130
+ }
131
+ //# sourceMappingURL=property-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-names.js","sourceRoot":"","sources":["../../src/tools/property-names.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quick-diagnosis.d.ts","sourceRoot":"","sources":["../../src/tools/quick-diagnosis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAoDvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoT9D"}
1
+ {"version":3,"file":"quick-diagnosis.d.ts","sourceRoot":"","sources":["../../src/tools/quick-diagnosis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAsDvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwT9D"}
@@ -11,6 +11,8 @@ import memlabCore from '@memlab/core';
11
11
  const { utils, NumericSet } = memlabCore;
12
12
  import { z } from 'zod';
13
13
  import { getSnapshot, getSnapshotMetadata, getSnapshotEnv, } from '../heap-state.js';
14
+ import { singleSnapshotCaveat } from './next-measurement.js';
15
+ import { withAnonymizedBanner } from '../anonymized-snapshot.js';
14
16
  import { isNodeWorthInspecting, filterLargestObjects, truncateNodeName, formatBytes, formatNumber, markdownTable, errorResult, toolResult, } from '../utils.js';
15
17
  function sanitizeForTable(s) {
16
18
  return s.replace(/[\n\r\t]/g, ' ').replace(/\|/g, '¦');
@@ -248,7 +250,11 @@ export function registerQuickDiagnosis(server) {
248
250
  const ratio = (stringCount / objectCount).toFixed(1);
249
251
  lines.push('## ⚠️ High String Duplication Ratio', '', `**${formatNumber(stringCount)} strings / ${formatNumber(objectCount)} objects = ${ratio}:1 ratio** with ${heavyDupCount} string(s) having >100K copies.`, '', 'This pattern strongly indicates JSON.parse output or API response data where column values are not interned. String interning at the parse boundary could save significant memory.', '', '**Next step:** `memlab_intern_opportunities` to see savings grouped by property × parent shape.', '');
250
252
  }
251
- return toolResult(lines.join('\n'));
253
+ const caveat = singleSnapshotCaveat();
254
+ if (caveat != null) {
255
+ lines.push('', caveat);
256
+ }
257
+ return toolResult(withAnonymizedBanner(snapshot, lines.join('\n')));
252
258
  }
253
259
  catch (err) {
254
260
  return errorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"quick-diagnosis.js","sourceRoot":"","sources":["../../src/tools/quick-diagnosis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,MAAM,EAAC,KAAK,EAAE,UAAU,EAAC,GAAG,UAAU,CAAC;AACvC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,SAAS,gBAAgB,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAe;IACxC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;YAChC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC/D,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,IACE,IAAI,CAAC,IAAI,KAAK,UAAU;YACxB,IAAI,CAAC,IAAI,KAAK,SAAS;YACvB,IAAI,CAAC,IAAI,KAAK,UAAU,EACxB,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;gBAAE,MAAM;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,iUAAiU;QAC/T,2ZAA2Z,EAC7Z;QACE,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,mDAAmD,CAAC;QAChE,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,iDAAiD,CAAC;QAC9D,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,+CAA+C,CAAC;QAC5D,mBAAmB,EAAE,CAAC;aACnB,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,gVAAgV,CACjV;KACJ,EACD,KAAK,EAAE,EAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAC,EAAE,EAAE;QACrE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;YAE7B,6BAA6B;YAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8C,CAAC;YAExE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,SAAS,EAAE,CAAC;gBACZ,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC;gBAChC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;gBACpC,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAC,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC1B,SAAS,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GACZ,GAAG,KAAK,SAAS;gBACf,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,GAAG,KAAK,MAAM;oBACd,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,SAAS,CAAC;YAElB,MAAM,KAAK,GAAa;gBACtB,mBAAmB;gBACnB,EAAE;gBACF,iBAAiB,IAAI,EAAE,QAAQ,IAAI,SAAS,iBAAiB,YAAY,CAAC,SAAS,CAAC,iBAAiB,YAAY,CAAC,SAAS,CAAC,gBAAgB,WAAW,CAAC,aAAa,CAAC,eAAe,QAAQ,EAAE;gBAC/L,EAAE;aACH,CAAC;YAEF,+DAA+D;YAC/D,MAAM,UAAU,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAC1C,CAAC;YACF,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBACjD,IAAI;gBACJ,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;gBACzB,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC;aAC7B,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CACR,mBAAmB,EACnB,EAAE,EACF,aAAa,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,EACnD,EAAE,CACH,CAAC;YAEF,qCAAqC;YACrC,MAAM,OAAO,GAAG,oBAAoB,CAClC,QAAQ,EACR,CAAC,IAAe,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAChD,WAAW,CACZ,CAAC;YAEF,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,EAAE,EAAE;gBACV,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;gBACjD,CAAC,CAAC,IAAI;gBACN,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;gBAC3B,iBAAiB,CAAC,CAAC,CAAC;aACrB,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CACR,UAAU,OAAO,CAAC,MAAM,2BAA2B,EACnD,EAAE,EACF,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,EAChD,EAAE,CACH,CAAC;YAEF,qCAAqC;YACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EASrB,CAAC;YAEJ,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC;oBAAE,OAAO;gBACzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC;oBACxC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;oBACxC,IAAI,KAAK,CAAC,QAAQ;wBAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClD,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE;wBAChB,KAAK,EAAE,CAAC;wBACR,eAAe,EAAE,IAAI,CAAC,SAAS;wBAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,oEAAoE;wBACpE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;wBAChE,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CACxB,CAAC;YAEF,qEAAqE;YACrE,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;gBACjD,IAAI,KAAK,GAAkB,IAAI,CAAC;gBAChC,IAAI,mBAAmB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACtC,KAAK,GAAG,KAAK,CAAC,yBAAyB,CACrC,CAAC,CAAC,QAAQ,EACV,QAAQ,EACR,GAAG,EAAE,CAAC,IAAI,EACV,CAAC,IAAe,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CACvC,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC;gBACrC,OAAO,EAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YAEH,MAAM,kBAAkB,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC;YAEhD,MAAM,WAAW,GAAG,YAAY;iBAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;iBAC/B,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACzB,MAAM,YAAY,GAAG,mBAAmB;gBACtC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;gBAClD,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACpC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,MAAM,IAAI,GAAG,gBAAgB,CAC3B,OAAO,EACP,CAAC,CAAC,IAAI,EACN,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,EACvC,EAAE,CACH,CAAC;gBACF,MAAM,MAAM,GACV,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,kBAAkB,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtE,6DAA6D;gBAC7D,+DAA+D;gBAC/D,oEAAoE;gBACpE,gCAAgC;gBAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChE,MAAM,QAAQ,GACZ,MAAM,IAAI,IAAI;oBACZ,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,MAAM,GAAG,GAAG;wBACZ,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAChC,OAAO;oBACL,IAAI;oBACJ,CAAC,CAAC,IAAI;oBACN,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;oBACrB,mBAAmB;wBACjB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;wBAC3B,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;oBACtC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;iBACjD,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CACR,2BAA2B,SAAS,CAAC,MAAM,GAAG,EAC9C,EAAE,EACF,aAAa,CAAC,YAAY,EAAE,SAAS,EAAE,cAAc,CAAC,EACtD,EAAE,CACH,CAAC;YACF,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CACR,4SAA4S,EAC5S,EAAE,CACH,CAAC;YACJ,CAAC;YAED,wCAAwC;YACxC,MAAM,SAAS,GAAG,IAAI,GAAG,EAGtB,CAAC;YAEJ,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO;gBACnC,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB;oBAAE,OAAO;gBAClD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBACrB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC;gBAClC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAC,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;iBAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;iBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;iBACjD,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAEzB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;gBAChE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;oBAChD,MAAM,OAAO,GACX,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;oBACvD,MAAM,OAAO,GACX,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;oBAC5C,OAAO;wBACL,gBAAgB,CAAC,OAAO,CAAC;wBACzB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;wBACzB,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;wBAC7B,WAAW,CAAC,OAAO,CAAC;qBACrB,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;oBAC3D,MAAM,OAAO,GACX,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvD,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;gBAC3C,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEN,KAAK,CAAC,IAAI,CACR,8BAA8B,OAAO,CAAC,MAAM,GAAG,EAC/C,EAAE,EACF,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,CAAC,EAChD,EAAE,EACF,8BAA8B,WAAW,CAAC,eAAe,CAAC,iCAAiC,EAC3F,EAAE,CACH,CAAC;YACJ,CAAC;YAED,gEAAgE;YAChE,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CACtC,CAAC,MAAM,CAAC;YAET,IACE,WAAW,GAAG,CAAC;gBACf,WAAW,GAAG,WAAW,GAAG,CAAC;gBAC7B,aAAa,GAAG,CAAC,EACjB,CAAC;gBACD,MAAM,KAAK,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrD,KAAK,CAAC,IAAI,CACR,qCAAqC,EACrC,EAAE,EACF,KAAK,YAAY,CAAC,WAAW,CAAC,cAAc,YAAY,CAAC,WAAW,CAAC,cAAc,KAAK,mBAAmB,aAAa,iCAAiC,EACzJ,EAAE,EACF,oLAAoL,EACpL,EAAE,EACF,iGAAiG,EACjG,EAAE,CACH,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"}
1
+ {"version":3,"file":"quick-diagnosis.js","sourceRoot":"","sources":["../../src/tools/quick-diagnosis.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 registerReactOwners(server: McpServer): void;
12
+ //# sourceMappingURL=react-owners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-owners.d.ts","sourceRoot":"","sources":["../../src/tools/react-owners.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA+DvE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2K3D"}
@@ -0,0 +1,167 @@
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 { nearestFiber, fiberComponentName, isUpdateRecord, UPDATE_RECORD_FIELDS, } from '../react-shapes.js';
13
+ import { errorResult, toolResult, formatNumber, markdownTable, suggestionsSuppressed, } from '../utils.js';
14
+ /** Resolve a population from whichever of the three selectors was given. */
15
+ function resolvePopulation(snapshot, nodeIds, shape, updateRecords) {
16
+ if (nodeIds != null && nodeIds.length > 0) {
17
+ const nodes = [];
18
+ for (const id of nodeIds) {
19
+ const n = snapshot.getNodeById(id);
20
+ if (n != null)
21
+ nodes.push(n);
22
+ }
23
+ return { nodes, how: `${formatNumber(nodes.length)} node id(s)` };
24
+ }
25
+ if (updateRecords) {
26
+ const nodes = [];
27
+ snapshot.nodes.forEach(node => {
28
+ if (isUpdateRecord(node))
29
+ nodes.push(node);
30
+ });
31
+ return {
32
+ nodes,
33
+ how: `React update records (\`${UPDATE_RECORD_FIELDS.join('`, `')}\`)`,
34
+ };
35
+ }
36
+ const want = new Set(shape ?? []);
37
+ const nodes = [];
38
+ snapshot.nodes.forEach(node => {
39
+ if (node.type !== 'object')
40
+ return;
41
+ // Collect the NAMES rather than counting edges. A node can carry more than
42
+ // one property edge under the same name, and counting them made `matched`
43
+ // exceed `want.size`, so the strict equality below dropped a node that has
44
+ // every wanted property — the opposite of what the filter is for.
45
+ const matched = new Set();
46
+ for (const edge of node.references) {
47
+ if (edge.type !== 'property')
48
+ continue;
49
+ const name = String(edge.name_or_index);
50
+ if (want.has(name))
51
+ matched.add(name);
52
+ if (matched.size === want.size)
53
+ break;
54
+ }
55
+ if (matched.size === want.size)
56
+ nodes.push(node);
57
+ });
58
+ return { nodes, how: `shape \`${[...want].join('`, `')}\`` };
59
+ }
60
+ export function registerReactOwners(server) {
61
+ server.tool('memlab_react_owners', 'Name the React COMPONENT behind a population of plain `Object`s. Fibers, hooks, update queues and update records are all `Object` in a production bundle, so every class-name heuristic — including memlab_get_referrers and helpers.owner — walks straight past them: on one measured population `owner()` returned `(none)` for 100% of 1,645 records. This walks each node up to its owning fiber (preferring `memoizedState` / `queue` / `baseQueue` / `next`) and resolves `elementType` through all three of its shapes (function closure, host string, and the `render`/`type` indirection memo and forwardRef add), then groups the population by component. Turning "Object grew 13/cycle" into "BaseTooltipSimple, 13 mounted, one record each" is the step that makes a finding filable.', {
62
+ node_ids: z
63
+ .array(z.number())
64
+ .optional()
65
+ .describe('Explicit population to attribute. Takes precedence over `shape` and `update_records`.'),
66
+ shape: z
67
+ .array(z.string())
68
+ .optional()
69
+ .describe('Find the population by own-property names, e.g. ["action","lane","next"]. A node matches when it carries ALL of them.'),
70
+ update_records: z
71
+ .boolean()
72
+ .optional()
73
+ .default(false)
74
+ .describe('Use the built-in React update-record shape instead of `shape` — the eager-bailout leak family. Equivalent to passing that literal, without having to remember it.'),
75
+ max_hops: z
76
+ .number()
77
+ .optional()
78
+ .default(12)
79
+ .describe('How far up the referrer chain to look for a fiber before giving up (default 12).'),
80
+ limit: z
81
+ .number()
82
+ .optional()
83
+ .default(25)
84
+ .describe('Maximum components to report (default 25).'),
85
+ }, async ({ node_ids, shape, update_records, max_hops, limit }) => {
86
+ try {
87
+ const snapshot = getSnapshot();
88
+ if ((node_ids == null || node_ids.length === 0) &&
89
+ (shape == null || shape.length === 0) &&
90
+ !update_records) {
91
+ return errorResult('Pass `node_ids`, or `shape` (own-property names), or `update_records: true`.');
92
+ }
93
+ const { nodes, how } = resolvePopulation(snapshot, node_ids, shape, update_records ?? false);
94
+ if (nodes.length === 0) {
95
+ return toolResult(`No nodes matched ${how}. If you used \`shape\`, check the names with \`memlab_property_names\` — a shape test against a property the bundle renamed silently matches nothing.`);
96
+ }
97
+ const byComponent = new Map();
98
+ let unattributed = 0;
99
+ for (const node of nodes) {
100
+ const fiber = nearestFiber(node, max_hops);
101
+ if (fiber == null) {
102
+ unattributed++;
103
+ continue;
104
+ }
105
+ // An unnamed fiber is still an ANSWER — it groups records that share
106
+ // an owner — so it gets a bucket rather than being discarded.
107
+ const name = fiberComponentName(fiber) ?? `(unnamed fiber)`;
108
+ let bucket = byComponent.get(name);
109
+ if (!bucket) {
110
+ bucket = {
111
+ component: name,
112
+ records: 0,
113
+ fibers: new Set(),
114
+ exampleRecord: node.id,
115
+ exampleFiber: fiber.id,
116
+ };
117
+ byComponent.set(name, bucket);
118
+ }
119
+ bucket.records++;
120
+ bucket.fibers.add(fiber.id);
121
+ }
122
+ const ranked = [...byComponent.values()].sort((a, b) => b.records - a.records);
123
+ const shown = ranked.slice(0, limit);
124
+ const lines = [
125
+ `## React owners for ${formatNumber(nodes.length)} node(s) — ${how}`,
126
+ '',
127
+ markdownTable([
128
+ 'Component',
129
+ 'Records',
130
+ 'Owning fibers',
131
+ 'Records / fiber',
132
+ 'Example',
133
+ ], shown.map(b => [
134
+ b.component,
135
+ formatNumber(b.records),
136
+ formatNumber(b.fibers.size),
137
+ (b.records / b.fibers.size).toFixed(1),
138
+ `@${b.exampleRecord} → fiber @${b.exampleFiber}`,
139
+ ]), new Set([1, 2, 3])),
140
+ '',
141
+ ];
142
+ if (ranked.length > shown.length) {
143
+ lines.push(`_${formatNumber(ranked.length - shown.length)} further component(s) not shown; raise \`limit\`._`, '');
144
+ }
145
+ // The ratio is the verdict, and it is the thing most often skipped.
146
+ // One record per mounted owner is a structural baseline, however large
147
+ // the absolute count; many records per owner is accumulation.
148
+ const accumulating = shown.filter(b => b.records / b.fibers.size >= 2);
149
+ lines.push('### Structural or accumulating?', '', accumulating.length === 0
150
+ ? 'Every component above holds about ONE record per owning fiber. That is a structural baseline — the population scales with how many components are mounted, not with how long the session ran. A growing total with a flat ratio means more mounts, not a leak.'
151
+ : `${accumulating.length} component(s) hold two or more records per owning fiber: ${accumulating
152
+ .map(b => `**${b.component}** (${(b.records / b.fibers.size).toFixed(1)})`)
153
+ .join(', ')}. That is accumulation — the owner is collecting records rather than replacing them. Confirm across a ladder before filing: the number that separates a leak from "more hooks mounted" is whether the FIBER count stays flat while the record count grows.`, '');
154
+ if (unattributed > 0) {
155
+ lines.push(`_${formatNumber(unattributed)} node(s) (${Math.round((unattributed / nodes.length) * 100)}%) reached no fiber within ${max_hops} hops and are not represented above. Raise \`max_hops\`, or check whether they are owned by something that is not React at all._`, '');
156
+ }
157
+ if (!suggestionsSuppressed() && shown.length > 0) {
158
+ lines.push('**Suggested next steps**', `- \`memlab_chain_walk({start_id: ${shown[0].exampleRecord}, next_edges: ["next"]})\` — how long is this owner's chain, and does it terminate or cycle?`, `- \`memlab_population_vs_owners\` — the same structural-vs-accumulating question across the whole heap.`, `- \`memlab_verify_fix({metric_kind: "pending_chain"})\` — once you have a before and after ladder.`);
159
+ }
160
+ return toolResult(lines.join('\n'));
161
+ }
162
+ catch (err) {
163
+ return errorResult(err);
164
+ }
165
+ });
166
+ }
167
+ //# sourceMappingURL=react-owners.js.map