@memlab/mcp-server 2.3.0 → 2.52.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 (205) hide show
  1. package/README.md +18 -14
  2. package/bin/.eslintrc.js +26 -0
  3. package/bin/memlab-cli.js +313 -0
  4. package/dist/artifact-classes.d.ts +86 -0
  5. package/dist/artifact-classes.d.ts.map +1 -0
  6. package/dist/artifact-classes.js +261 -0
  7. package/dist/artifact-classes.js.map +1 -0
  8. package/dist/capture-mode.d.ts +60 -0
  9. package/dist/capture-mode.d.ts.map +1 -0
  10. package/dist/capture-mode.js +39 -0
  11. package/dist/capture-mode.js.map +1 -0
  12. package/dist/guardrail.d.ts.map +1 -1
  13. package/dist/guardrail.js +13 -0
  14. package/dist/guardrail.js.map +1 -1
  15. package/dist/heap-state.d.ts +96 -2
  16. package/dist/heap-state.d.ts.map +1 -1
  17. package/dist/heap-state.js +197 -2
  18. package/dist/heap-state.js.map +1 -1
  19. package/dist/index.js +41 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/progress.d.ts +25 -0
  22. package/dist/progress.d.ts.map +1 -0
  23. package/dist/progress.js +46 -0
  24. package/dist/progress.js.map +1 -0
  25. package/dist/result-handles.d.ts +11 -0
  26. package/dist/result-handles.d.ts.map +1 -0
  27. package/dist/result-handles.js +77 -0
  28. package/dist/result-handles.js.map +1 -0
  29. package/dist/string-index.d.ts +55 -0
  30. package/dist/string-index.d.ts.map +1 -0
  31. package/dist/string-index.js +91 -0
  32. package/dist/string-index.js.map +1 -0
  33. package/dist/tool-registry.d.ts +42 -0
  34. package/dist/tool-registry.d.ts.map +1 -0
  35. package/dist/tool-registry.js +20 -0
  36. package/dist/tool-registry.js.map +1 -0
  37. package/dist/tools/analyze-run.d.ts +12 -0
  38. package/dist/tools/analyze-run.d.ts.map +1 -0
  39. package/dist/tools/analyze-run.js +343 -0
  40. package/dist/tools/analyze-run.js.map +1 -0
  41. package/dist/tools/app-heap.d.ts +12 -0
  42. package/dist/tools/app-heap.d.ts.map +1 -0
  43. package/dist/tools/app-heap.js +140 -0
  44. package/dist/tools/app-heap.js.map +1 -0
  45. package/dist/tools/auto-investigate.d.ts.map +1 -1
  46. package/dist/tools/auto-investigate.js +91 -49
  47. package/dist/tools/auto-investigate.js.map +1 -1
  48. package/dist/tools/batch.d.ts +12 -0
  49. package/dist/tools/batch.d.ts.map +1 -0
  50. package/dist/tools/batch.js +168 -0
  51. package/dist/tools/batch.js.map +1 -0
  52. package/dist/tools/cache-analysis.d.ts.map +1 -1
  53. package/dist/tools/cache-analysis.js +156 -5
  54. package/dist/tools/cache-analysis.js.map +1 -1
  55. package/dist/tools/class-histogram.d.ts.map +1 -1
  56. package/dist/tools/class-histogram.js +14 -3
  57. package/dist/tools/class-histogram.js.map +1 -1
  58. package/dist/tools/collection-trend.d.ts +55 -0
  59. package/dist/tools/collection-trend.d.ts.map +1 -0
  60. package/dist/tools/collection-trend.js +315 -0
  61. package/dist/tools/collection-trend.js.map +1 -0
  62. package/dist/tools/detached-dom.d.ts +2 -0
  63. package/dist/tools/detached-dom.d.ts.map +1 -1
  64. package/dist/tools/detached-dom.js +291 -20
  65. package/dist/tools/detached-dom.js.map +1 -1
  66. package/dist/tools/dev-artifacts.d.ts +62 -6
  67. package/dist/tools/dev-artifacts.d.ts.map +1 -1
  68. package/dist/tools/dev-artifacts.js +466 -23
  69. package/dist/tools/dev-artifacts.js.map +1 -1
  70. package/dist/tools/diff-snapshots.d.ts.map +1 -1
  71. package/dist/tools/diff-snapshots.js +101 -44
  72. package/dist/tools/diff-snapshots.js.map +1 -1
  73. package/dist/tools/dominator-attribution.d.ts +12 -0
  74. package/dist/tools/dominator-attribution.d.ts.map +1 -0
  75. package/dist/tools/dominator-attribution.js +189 -0
  76. package/dist/tools/dominator-attribution.js.map +1 -0
  77. package/dist/tools/dominator-chain.d.ts +12 -0
  78. package/dist/tools/dominator-chain.d.ts.map +1 -0
  79. package/dist/tools/dominator-chain.js +92 -0
  80. package/dist/tools/dominator-chain.js.map +1 -0
  81. package/dist/tools/duplicate-objects.d.ts +12 -0
  82. package/dist/tools/duplicate-objects.d.ts.map +1 -0
  83. package/dist/tools/duplicate-objects.js +172 -0
  84. package/dist/tools/duplicate-objects.js.map +1 -0
  85. package/dist/tools/duplicated-strings.d.ts.map +1 -1
  86. package/dist/tools/duplicated-strings.js +46 -38
  87. package/dist/tools/duplicated-strings.js.map +1 -1
  88. package/dist/tools/eval.d.ts +1 -0
  89. package/dist/tools/eval.d.ts.map +1 -1
  90. package/dist/tools/eval.js +787 -30
  91. package/dist/tools/eval.js.map +1 -1
  92. package/dist/tools/explain-delta.d.ts +12 -0
  93. package/dist/tools/explain-delta.d.ts.map +1 -0
  94. package/dist/tools/explain-delta.js +170 -0
  95. package/dist/tools/explain-delta.js.map +1 -0
  96. package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
  97. package/dist/tools/find-nodes-by-class.js +112 -13
  98. package/dist/tools/find-nodes-by-class.js.map +1 -1
  99. package/dist/tools/finding-index.d.ts +22 -0
  100. package/dist/tools/finding-index.d.ts.map +1 -0
  101. package/dist/tools/finding-index.js +247 -0
  102. package/dist/tools/finding-index.js.map +1 -0
  103. package/dist/tools/for-each.d.ts.map +1 -1
  104. package/dist/tools/for-each.js +15 -3
  105. package/dist/tools/for-each.js.map +1 -1
  106. package/dist/tools/get-references.d.ts.map +1 -1
  107. package/dist/tools/get-references.js +35 -6
  108. package/dist/tools/get-references.js.map +1 -1
  109. package/dist/tools/get-referrers.d.ts.map +1 -1
  110. package/dist/tools/get-referrers.js +52 -6
  111. package/dist/tools/get-referrers.js.map +1 -1
  112. package/dist/tools/hunt-report.d.ts +12 -0
  113. package/dist/tools/hunt-report.d.ts.map +1 -0
  114. package/dist/tools/hunt-report.js +186 -0
  115. package/dist/tools/hunt-report.js.map +1 -0
  116. package/dist/tools/hypothesis.d.ts +12 -0
  117. package/dist/tools/hypothesis.d.ts.map +1 -0
  118. package/dist/tools/hypothesis.js +221 -0
  119. package/dist/tools/hypothesis.js.map +1 -0
  120. package/dist/tools/intern-opportunities.d.ts.map +1 -1
  121. package/dist/tools/intern-opportunities.js +721 -75
  122. package/dist/tools/intern-opportunities.js.map +1 -1
  123. package/dist/tools/ladder.d.ts +33 -0
  124. package/dist/tools/ladder.d.ts.map +1 -0
  125. package/dist/tools/ladder.js +266 -0
  126. package/dist/tools/ladder.js.map +1 -0
  127. package/dist/tools/largest-objects.d.ts.map +1 -1
  128. package/dist/tools/largest-objects.js +43 -16
  129. package/dist/tools/largest-objects.js.map +1 -1
  130. package/dist/tools/leak-report.d.ts +12 -0
  131. package/dist/tools/leak-report.d.ts.map +1 -0
  132. package/dist/tools/leak-report.js +256 -0
  133. package/dist/tools/leak-report.js.map +1 -0
  134. package/dist/tools/load-snapshot.d.ts +78 -0
  135. package/dist/tools/load-snapshot.d.ts.map +1 -1
  136. package/dist/tools/load-snapshot.js +519 -29
  137. package/dist/tools/load-snapshot.js.map +1 -1
  138. package/dist/tools/map-entries.d.ts +12 -0
  139. package/dist/tools/map-entries.d.ts.map +1 -0
  140. package/dist/tools/map-entries.js +139 -0
  141. package/dist/tools/map-entries.js.map +1 -0
  142. package/dist/tools/match-object.d.ts +12 -0
  143. package/dist/tools/match-object.d.ts.map +1 -0
  144. package/dist/tools/match-object.js +165 -0
  145. package/dist/tools/match-object.js.map +1 -0
  146. package/dist/tools/object-shape.d.ts.map +1 -1
  147. package/dist/tools/object-shape.js +92 -30
  148. package/dist/tools/object-shape.js.map +1 -1
  149. package/dist/tools/population-diff.d.ts +57 -0
  150. package/dist/tools/population-diff.d.ts.map +1 -0
  151. package/dist/tools/population-diff.js +338 -0
  152. package/dist/tools/population-diff.js.map +1 -0
  153. package/dist/tools/quick-diagnosis.d.ts.map +1 -1
  154. package/dist/tools/quick-diagnosis.js +12 -4
  155. package/dist/tools/quick-diagnosis.js.map +1 -1
  156. package/dist/tools/retainer-layers.d.ts +23 -0
  157. package/dist/tools/retainer-layers.d.ts.map +1 -0
  158. package/dist/tools/retainer-layers.js +179 -0
  159. package/dist/tools/retainer-layers.js.map +1 -0
  160. package/dist/tools/retainer-summary.d.ts +1 -0
  161. package/dist/tools/retainer-summary.d.ts.map +1 -1
  162. package/dist/tools/retainer-summary.js +128 -32
  163. package/dist/tools/retainer-summary.js.map +1 -1
  164. package/dist/tools/retainer-trace.d.ts.map +1 -1
  165. package/dist/tools/retainer-trace.js +105 -25
  166. package/dist/tools/retainer-trace.js.map +1 -1
  167. package/dist/tools/search-nodes.d.ts.map +1 -1
  168. package/dist/tools/search-nodes.js +5 -1
  169. package/dist/tools/search-nodes.js.map +1 -1
  170. package/dist/tools/search-strings.d.ts.map +1 -1
  171. package/dist/tools/search-strings.js +53 -7
  172. package/dist/tools/search-strings.js.map +1 -1
  173. package/dist/tools/sequence-analysis.d.ts +49 -0
  174. package/dist/tools/sequence-analysis.d.ts.map +1 -1
  175. package/dist/tools/sequence-analysis.js +268 -78
  176. package/dist/tools/sequence-analysis.js.map +1 -1
  177. package/dist/tools/shape-histogram.d.ts.map +1 -1
  178. package/dist/tools/shape-histogram.js +9 -2
  179. package/dist/tools/shape-histogram.js.map +1 -1
  180. package/dist/tools/sliced-strings.d.ts.map +1 -1
  181. package/dist/tools/sliced-strings.js +22 -4
  182. package/dist/tools/sliced-strings.js.map +1 -1
  183. package/dist/tools/snapshot-header.d.ts +28 -0
  184. package/dist/tools/snapshot-header.d.ts.map +1 -0
  185. package/dist/tools/snapshot-header.js +111 -0
  186. package/dist/tools/snapshot-header.js.map +1 -0
  187. package/dist/tools/string-patterns.d.ts.map +1 -1
  188. package/dist/tools/string-patterns.js +5 -4
  189. package/dist/tools/string-patterns.js.map +1 -1
  190. package/dist/tools/tools-index.d.ts +12 -0
  191. package/dist/tools/tools-index.d.ts.map +1 -0
  192. package/dist/tools/tools-index.js +342 -0
  193. package/dist/tools/tools-index.js.map +1 -0
  194. package/dist/tools/verify-fix.d.ts +23 -0
  195. package/dist/tools/verify-fix.d.ts.map +1 -0
  196. package/dist/tools/verify-fix.js +211 -0
  197. package/dist/tools/verify-fix.js.map +1 -0
  198. package/dist/tools/weakmap-entries.d.ts.map +1 -1
  199. package/dist/tools/weakmap-entries.js +6 -1
  200. package/dist/tools/weakmap-entries.js.map +1 -1
  201. package/dist/utils.d.ts +204 -1
  202. package/dist/utils.d.ts.map +1 -1
  203. package/dist/utils.js +478 -8
  204. package/dist/utils.js.map +1 -1
  205. package/package.json +5 -4
@@ -0,0 +1,172 @@
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 { formatBytes, formatNumber, markdownTable, errorResult, toolResult, suggestionsSuppressed, objectContentSignature, IDENTITY_PROPS, } from '../utils.js';
13
+ function readTypename(node) {
14
+ for (const edge of node.references) {
15
+ if (edge.type === 'property' &&
16
+ String(edge.name_or_index) === '__typename') {
17
+ const t = edge.toNode;
18
+ return t.isString ? (t.toStringNode()?.stringValue ?? null) : null;
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ export function registerDuplicateObjects(server) {
24
+ server.tool('memlab_duplicate_objects', 'Find structurally-identical DUPLICATE objects — instances that carry the same content repeated many times, which a class histogram or shape histogram cannot see (they group by class or by property-NAME set, not by VALUE). Groups object instances by a shallow content signature (sorted property names + each scalar value; object-valued props marked generically) and reports, per signature, the instance count and the reclaimable own-bytes of the redundant copies. ' +
25
+ 'This surfaces "materialize a canonical/default record once", "share a frozen default", or "intern the object" wins — e.g. thousands of normalized store records that are all the same all-default spec. ' +
26
+ 'Scope the scan with `class_name` (constructor, e.g. "Object") and/or `typename` (the `__typename` property value, e.g. "AdCreativeFeatureSpecAttachment") — for normalized GraphQL/Relay stores `typename` is usually what you want since every record is a generic `Object`. ' +
27
+ 'Per-instance identity fields (id, __id, __ref, key, clientMutationId) are EXCLUDED from the signature by default so records that differ only by their data-id still collapse together (override with `ignore_properties`). ' +
28
+ 'Caveat: numeric property VALUES are not recoverable from the heap-snapshot format, so a number field contributes only a generic marker — two objects differing only in a numeric field (SMI or double) hash to the same signature and are reported as duplicates. String, boolean, null and object-valued properties are compared (objects generically, so nested content is not).', {
29
+ class_name: z
30
+ .string()
31
+ .optional()
32
+ .describe('Restrict to objects with this constructor name (e.g. "Object"). Omit to scan every object-type node.'),
33
+ typename: z
34
+ .string()
35
+ .optional()
36
+ .describe('Restrict to objects whose `__typename` property equals this value (normalized GraphQL/Relay records). Combine with or instead of class_name.'),
37
+ min_count: z
38
+ .number()
39
+ .optional()
40
+ .default(50)
41
+ .describe('Only report signature groups with at least this many instances (default 50). Raise to focus on the most-duplicated content.'),
42
+ min_dup_ratio: z
43
+ .number()
44
+ .optional()
45
+ .describe('Only report signature groups whose instance count is at least this multiple of 1 distinct content (i.e. count ≥ min_dup_ratio). Optional extra filter on top of min_count.'),
46
+ limit: z
47
+ .number()
48
+ .optional()
49
+ .default(20)
50
+ .describe('Maximum number of signature groups to return (default 20).'),
51
+ max_string_len: z
52
+ .number()
53
+ .optional()
54
+ .default(40)
55
+ .describe('Cap on the length of string values folded into the signature (default 40). Two strings that differ only past this cap are treated as equal — lower it to be more lenient, raise it to be stricter.'),
56
+ ignore_properties: z
57
+ .array(z.string())
58
+ .optional()
59
+ .describe('Property names to EXCLUDE from the content signature — per-instance identity/unique fields (a data-id, a key) that would otherwise make every record look distinct and hide real duplicates. Defaults to id, __id, __ref, key, clientMutationId. Pass [] to include every property.'),
60
+ }, async ({ class_name, typename, min_count, min_dup_ratio, limit, max_string_len, ignore_properties, }) => {
61
+ try {
62
+ const snapshot = getSnapshot();
63
+ const ignoreProps = ignore_properties
64
+ ? new Set(ignore_properties)
65
+ : IDENTITY_PROPS;
66
+ const groups = new Map();
67
+ let scopeCount = 0;
68
+ let scopeSelf = 0;
69
+ snapshot.nodes.forEach((node) => {
70
+ if (node.type !== 'object')
71
+ return;
72
+ if (node.id <= 3)
73
+ return;
74
+ if (class_name && node.name !== class_name)
75
+ return;
76
+ if (typename && readTypename(node) !== typename)
77
+ return;
78
+ const sig = objectContentSignature(node, {
79
+ maxStringLen: max_string_len,
80
+ ignoreProps,
81
+ });
82
+ if (sig === '')
83
+ return; // no own properties — nothing to dedupe on
84
+ scopeCount++;
85
+ scopeSelf += node.self_size;
86
+ const g = groups.get(sig);
87
+ if (g) {
88
+ g.count++;
89
+ g.totalSelf += node.self_size;
90
+ }
91
+ else {
92
+ groups.set(sig, {
93
+ count: 1,
94
+ totalSelf: node.self_size,
95
+ exampleId: node.id,
96
+ });
97
+ }
98
+ });
99
+ if (scopeCount === 0) {
100
+ return toolResult('No matching objects found. Loosen `class_name` / `typename`, or check the value with `memlab_property_distribution(property:"__typename")` / `memlab_class_histogram`.');
101
+ }
102
+ const distinct = groups.size;
103
+ // Reclaimable = own-bytes of the redundant copies (all but one per
104
+ // signature) — what deduping/sharing a canonical instance would free.
105
+ // Shared child subtrees are NOT included (this is a lower bound on the
106
+ // structural win, an honest own-bytes figure).
107
+ let totalReclaimable = 0;
108
+ for (const g of groups.values()) {
109
+ totalReclaimable += g.totalSelf * ((g.count - 1) / g.count);
110
+ }
111
+ const ranked = [...groups.entries()]
112
+ .map(([sig, g]) => ({
113
+ sig,
114
+ ...g,
115
+ reclaimable: g.totalSelf * ((g.count - 1) / g.count),
116
+ }))
117
+ .filter(g => g.count >= min_count)
118
+ .filter(g => min_dup_ratio == null || g.count >= min_dup_ratio);
119
+ ranked.sort((a, b) => b.reclaimable - a.reclaimable);
120
+ const shown = ranked.slice(0, limit);
121
+ const scopeLabel = [
122
+ class_name ? `class \`${class_name}\`` : null,
123
+ typename ? `__typename \`${typename}\`` : null,
124
+ ]
125
+ .filter(Boolean)
126
+ .join(' + ') || 'all objects';
127
+ const lines = [
128
+ `## Duplicate objects — ${scopeLabel}`,
129
+ '',
130
+ `**${formatNumber(scopeCount)}** instances in scope collapse to **${formatNumber(distinct)}** distinct contents ` +
131
+ `(dup ratio **${(scopeCount / Math.max(1, distinct)).toFixed(1)}×**). ` +
132
+ `Reclaimable own-bytes if deduped to one-per-content: **~${formatBytes(totalReclaimable)}** ` +
133
+ `of ${formatBytes(scopeSelf)} total self size.`,
134
+ '',
135
+ ];
136
+ if (shown.length === 0) {
137
+ lines.push(`No single content is shared by ≥ ${min_count} instances` +
138
+ (min_dup_ratio != null ? ` (and ≥ ${min_dup_ratio}× dup)` : '') +
139
+ '. The instances are structurally varied (real data), not duplicates. Lower `min_count` to see smaller groups.');
140
+ return toolResult(lines.join('\n'));
141
+ }
142
+ const headers = [
143
+ 'Count',
144
+ 'Self each',
145
+ 'Reclaimable',
146
+ 'Example',
147
+ 'Signature',
148
+ ];
149
+ const rightCols = new Set([0, 1, 2]);
150
+ const rows = shown.map(g => {
151
+ const avg = g.totalSelf / g.count;
152
+ const sigShown = g.sig.length > 90 ? g.sig.slice(0, 90) + '…' : g.sig;
153
+ return [
154
+ formatNumber(g.count),
155
+ formatBytes(avg),
156
+ formatBytes(g.reclaimable),
157
+ `@${g.exampleId}`,
158
+ sigShown,
159
+ ];
160
+ });
161
+ lines.push(markdownTable(headers, rows, rightCols));
162
+ if (!suggestionsSuppressed()) {
163
+ lines.push('', '**Suggested next steps:**', `- Inspect a duplicate: \`memlab_object_shape(${shown[0].exampleId})\``, `- Trace why they are retained: \`memlab_retainer_trace(${shown[0].exampleId})\``, '- If these are normalized store records, the fix is usually at the resolver/normalizer: return a shared canonical instance (or null) for all-default content instead of materializing one per key.');
164
+ }
165
+ return toolResult(lines.join('\n'));
166
+ }
167
+ catch (err) {
168
+ return errorResult(err);
169
+ }
170
+ });
171
+ }
172
+ //# sourceMappingURL=duplicate-objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-objects.js","sourceRoot":"","sources":["../../src/tools/duplicate-objects.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"duplicated-strings.d.ts","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAUvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgOjE"}
1
+ {"version":3,"file":"duplicated-strings.d.ts","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAavE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6OjE"}
@@ -9,7 +9,9 @@
9
9
  */
10
10
  import { z } from 'zod';
11
11
  import { getSnapshot } from '../heap-state.js';
12
- import { formatBytes, errorResult, toolResult, looksLikeFailurePayload, } from '../utils.js';
12
+ import { formatBytes, errorResult, toolResult, looksLikeFailurePayload, suggestionsSuppressed, } from '../utils.js';
13
+ import { classifyNonProductionString } from '../artifact-classes.js';
14
+ import { buildStringIndex, stringIndexIsCached } from '../string-index.js';
13
15
  export function registerDuplicatedStrings(server) {
14
16
  server.tool('memlab_duplicated_strings', 'Find duplicated string instances in the heap. Shows strings that appear multiple times, ranked by total retained size — a common source of memory waste. Use after memlab_class_histogram shows high string counts. ' +
15
17
  '⚠ Full-heap scan — slow and memory-heavy on very large heaps (millions of nodes); raise min_count to bound the work.', {
@@ -31,50 +33,29 @@ export function registerDuplicatedStrings(server) {
31
33
  }, async ({ limit, min_count, include_node_ids }) => {
32
34
  try {
33
35
  const snapshot = getSnapshot();
34
- // Build frequency map: string value -> { count, totalSize, exampleIds }
35
- const stringMap = new Map();
36
- snapshot.nodes.forEach(node => {
37
- if (node.type !== 'string')
38
- return;
39
- // Skip sliced strings (they share backing storage)
40
- if (node.name === 'system / SlicedString')
41
- return;
42
- const strNode = node.toStringNode();
43
- if (!strNode)
44
- return;
45
- const value = strNode.stringValue;
46
- const entry = stringMap.get(value);
47
- if (entry) {
48
- entry.count++;
49
- entry.total_size += node.retainedSize;
50
- if (entry.example_node_ids.length < 3) {
51
- entry.example_node_ids.push(node.id);
52
- }
53
- }
54
- else {
55
- stringMap.set(value, {
56
- count: 1,
57
- total_size: node.retainedSize,
58
- example_node_ids: [node.id],
59
- });
60
- }
61
- });
36
+ // Shared with memlab_intern_opportunities, which needs the same
37
+ // value -> {count, size, ids} map. Cached per snapshot, so running the
38
+ // two back to back (the common case) walks every string node once
39
+ // instead of twice.
40
+ const reused = stringIndexIsCached();
41
+ const { byValue: stringMap } = buildStringIndex(snapshot);
62
42
  const duplicated = Array.from(stringMap.entries())
63
43
  .filter(([, stats]) => stats.count >= min_count)
64
- .sort((a, b) => b[1].total_size - a[1].total_size)
44
+ .sort((a, b) => b[1].totalSize - a[1].totalSize)
65
45
  .slice(0, limit)
66
46
  .map(([value, stats]) => {
67
- const per_copy_size = stats.count > 0 ? stats.total_size / stats.count : 0;
47
+ const per_copy_size = stats.count > 0 ? stats.totalSize / stats.count : 0;
68
48
  const potential_savings = (stats.count - 1) * per_copy_size;
69
49
  return {
70
50
  value: value.length > 200 ? value.substring(0, 200) + '...' : value,
71
51
  count: stats.count,
72
- total_size: stats.total_size,
73
- total_size_formatted: formatBytes(stats.total_size),
52
+ total_size: stats.totalSize,
53
+ total_size_formatted: formatBytes(stats.totalSize),
74
54
  potential_savings,
75
- example_node_ids: stats.example_node_ids,
55
+ example_node_ids: stats.exampleIds.slice(0, 3),
76
56
  field_context: null,
77
57
  actionability: null,
58
+ harness_what: null,
78
59
  };
79
60
  });
80
61
  if (duplicated.length === 0) {
@@ -131,7 +112,19 @@ export function registerDuplicatedStrings(server) {
131
112
  }
132
113
  }
133
114
  }
134
- if (appCount > 0 && frameworkCount > 0) {
115
+ // Non-production content outranks the app/framework split: whether it
116
+ // was injected by the measurement harness or exists only in a DEV
117
+ // build, it is not memory the shipped app has, so it must never be
118
+ // counted toward an interning win (see classifyNonProductionString).
119
+ const nonProd = classifyNonProductionString(d.value);
120
+ if (nonProd != null) {
121
+ d.actionability = 'harness';
122
+ d.harness_what =
123
+ nonProd.kind === 'dev-build'
124
+ ? `${nonProd.what} — DEV build only, absent in production`
125
+ : nonProd.what;
126
+ }
127
+ else if (appCount > 0 && frameworkCount > 0) {
135
128
  d.actionability = 'mixed';
136
129
  }
137
130
  else if (frameworkCount > 0) {
@@ -142,6 +135,8 @@ export function registerDuplicatedStrings(server) {
142
135
  }
143
136
  }
144
137
  const appActionableCount = duplicated.filter(d => d.actionability === 'app' || d.actionability === 'mixed').length;
138
+ const harnessEntries = duplicated.filter(d => d.actionability === 'harness');
139
+ const harnessBytes = harnessEntries.reduce((sum, d) => sum + d.potential_savings, 0);
145
140
  const lines = duplicated.map((d, i) => {
146
141
  const val = d.value.length > 80 ? d.value.slice(0, 80) + '...' : d.value;
147
142
  const nodeIdsPart = include_node_ids
@@ -150,7 +145,11 @@ export function registerDuplicatedStrings(server) {
150
145
  const context = d.field_context
151
146
  ? `\n commonly held as: ${d.field_context}`
152
147
  : '';
153
- const actionLabel = d.actionability ? ` [${d.actionability}]` : '';
148
+ const actionLabel = d.actionability === 'harness'
149
+ ? ` [harness — ${d.harness_what ?? 'measurement harness'}; not app memory]`
150
+ : d.actionability
151
+ ? ` [${d.actionability}]`
152
+ : '';
154
153
  const savingsLabel = d.potential_savings > 0
155
154
  ? `, savings: ${formatBytes(d.potential_savings)}`
156
155
  : '';
@@ -176,11 +175,20 @@ export function registerDuplicatedStrings(server) {
176
175
  'Consider string interning with a `Map<string, string>` pool applied at ingestion time, ' +
177
176
  'or deduplicating at the data source.');
178
177
  }
179
- const totalSavings = duplicated.reduce((sum, d) => sum + d.potential_savings, 0);
178
+ // Harness content is excluded from the headline: the number a caller
179
+ // acts on must be reclaimable from the application.
180
+ const totalSavings = duplicated.reduce((sum, d) => d.actionability === 'harness' ? sum : sum + d.potential_savings, 0);
180
181
  const summaryLine = appActionableCount > 0
181
182
  ? `${appActionableCount} of ${duplicated.length} entries are app-actionable`
182
183
  : `${duplicated.length} entries (all framework-held)`;
183
- const body = `Duplicated strings (${summaryLine}):\n\n${lines.join('\n')}\n\n**Total interning savings: ${formatBytes(totalSavings)}** (if each string were stored only once)`;
184
+ const harnessNote = harnessEntries.length > 0
185
+ ? `\n\n⚠️ **${harnessEntries.length} entr${harnessEntries.length === 1 ? 'y' : 'ies'} (${formatBytes(harnessBytes)}) excluded from the total as measurement-harness content** — the CDP/devtools bridge injected into the page to drive this session, not application memory. Interning it reclaims nothing in production.`
186
+ : '';
187
+ // The two string tools answer different questions and their outputs
188
+ // used to restate each other. Say which is which, once, and note that
189
+ // the expensive scan is shared rather than repeated.
190
+ const relatedNote = `\n\n_This is the raw per-VALUE duplication table. \`memlab_intern_opportunities\` groups the same strings by property x parent shape and estimates what a canonical intern pool would actually reclaim (accounting for co-retention and the length cap) — use it to decide whether to write the fix, and this to see the values. It reuses this snapshot's string scan${reused ? ', which was itself already cached' : ''}, so running both costs one pass over the string nodes, not two._`;
191
+ const body = `Duplicated strings (${summaryLine}):\n\n${lines.join('\n')}\n\n**Total interning savings: ${formatBytes(totalSavings)}** (if each string were stored only once, harness content excluded)${harnessNote}${suggestionsSuppressed() ? '' : relatedNote}`;
184
192
  return toolResult(suggestions.length > 0
185
193
  ? `${body}\n\n---\n\n${suggestions.join('\n')}`
186
194
  : body);
@@ -1 +1 @@
1
- {"version":3,"file":"duplicated-strings.js","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,sNAAsN;QACpN,sHAAsH,EACxH;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,wCAAwC,CAAC;QACrD,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CACP,+GAA+G,CAChH;QACH,gBAAgB,EAAE,CAAC;aAChB,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,iIAAiI,CAClI;KACJ,EACD,KAAK,EAAE,EAAC,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAC,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAE/B,wEAAwE;YACxE,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,mDAAmD;gBACnD,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB;oBAAE,OAAO;gBAElD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,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;oBACtC,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE;wBACnB,KAAK,EAAE,CAAC;wBACR,UAAU,EAAE,IAAI,CAAC,YAAY;wBAC7B,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;qBAC5B,CAAC,CAAC;gBACL,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,SAAS,CAAC;iBAC/C,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,KAAK,CAAC;iBACf,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;gBACtB,MAAM,aAAa,GACjB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM,iBAAiB,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC;gBAC5D,OAAO;oBACL,KAAK,EACH,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK;oBAC9D,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,oBAAoB,EAAE,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC;oBACnD,iBAAiB;oBACjB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,aAAa,EAAE,IAAqB;oBACpC,aAAa,EAAE,IAAqB;iBACrC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEL,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;YAED,iEAAiE;YACjE,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBACxC,MAAM,UAAU,GAAG,IAAI,GAAG,EAGvB,CAAC;gBACJ,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACjC,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;4BAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;4BACvC,IAAI,KAAK,EAAE,CAAC;gCACV,KAAK,CAAC,KAAK,EAAE,CAAC;4BAChB,CAAC;iCAAM,CAAC;gCACN,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE;oCACvB,KAAK,EAAE,CAAC;oCACR,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;iCAC7B,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAClC,CAAC,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,aAAa,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC;gBAC9E,CAAC;gBAED,oDAAoD;gBACpD,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,IAAI,cAAc,GAAG,CAAC,CAAC;gBACvB,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBAC3C,MAAM,WAAW,GACf,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;4BAC/B,QAAQ,KAAK,QAAQ;4BACrB,QAAQ,KAAK,qBAAqB;4BAClC,QAAQ,KAAK,KAAK;4BAClB,QAAQ,KAAK,OAAO;4BACpB,QAAQ,KAAK,UAAU,CAAC;wBAC1B,IAAI,WAAW,EAAE,CAAC;4BAChB,cAAc,EAAE,CAAC;wBACnB,CAAC;6BAAM,CAAC;4BACN,QAAQ,EAAE,CAAC;wBACb,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,QAAQ,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;oBACvC,CAAC,CAAC,aAAa,GAAG,OAAO,CAAC;gBAC5B,CAAC;qBAAM,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;oBAC9B,CAAC,CAAC,aAAa,GAAG,WAAW,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,KAAK,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO,CAC9D,CAAC,MAAM,CAAC;YAET,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,GAAG,GACP,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/D,MAAM,WAAW,GAAG,gBAAgB;oBAClC,CAAC,CAAC,YAAY,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBAClE,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa;oBAC7B,CAAC,CAAC,0BAA0B,CAAC,CAAC,aAAa,EAAE;oBAC7C,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,MAAM,YAAY,GAChB,CAAC,CAAC,iBAAiB,GAAG,CAAC;oBACrB,CAAC,CAAC,cAAc,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE;oBAClD,CAAC,CAAC,EAAE,CAAC;gBACT,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,oBAAoB,SAAS,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,EAAE,CAAC;YACxI,CAAC,CAAC,CAAC;YACH,mEAAmE;YACnE,oEAAoE;YACpE,uEAAuE;YACvE,sCAAsC;YACtC,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC5C,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CACjC,CAAC;YAEF,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,kBAAkB,GAAG,eAAe,CAAC,MAAM,CAC/C,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EACzB,CAAC,CACF,CAAC;gBACF,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAC9B,CAAC,CACF,CAAC;gBACF,WAAW,CAAC,IAAI,CACd,4CAA4C,eAAe,CAAC,MAAM,sEAAsE;oBACtI,IAAI,kBAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,WAAW,CAAC,YAAY,CAAC,KAAK;oBACxF,4FAA4F;oBAC5F,gIAAgI,CACnI,CAAC;YACJ,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,WAAW,CAAC,IAAI,CACd,oGAAoG;oBAClG,yFAAyF;oBACzF,sCAAsC,CACzC,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CACpC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,iBAAiB,EACrC,CAAC,CACF,CAAC;YAEF,MAAM,WAAW,GACf,kBAAkB,GAAG,CAAC;gBACpB,CAAC,CAAC,GAAG,kBAAkB,OAAO,UAAU,CAAC,MAAM,6BAA6B;gBAC5E,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,+BAA+B,CAAC;YAE1D,MAAM,IAAI,GAAG,uBAAuB,WAAW,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,WAAW,CAAC,YAAY,CAAC,2CAA2C,CAAC;YAC/K,OAAO,UAAU,CACf,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,GAAG,IAAI,cAAc,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/C,CAAC,CAAC,IAAI,CACT,CAAC;QACJ,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":"duplicated-strings.js","sourceRoot":"","sources":["../../src/tools/duplicated-strings.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,6 @@
8
8
  * @oncall memory_lab
9
9
  */
10
10
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
+ export declare function unwrapNode<T>(node: T): T;
11
12
  export declare function registerEval(server: McpServer): void;
12
13
  //# sourceMappingURL=eval.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/tools/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAmHvE,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsRpD"}
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/tools/eval.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AA4EvE,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAMxC;AA0ID,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAy7BpD"}