@memlab/mcp-server 2.1.0 → 2.3.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 (162) hide show
  1. package/README.md +88 -3
  2. package/dist/analysis-budget.d.ts +71 -0
  3. package/dist/analysis-budget.d.ts.map +1 -0
  4. package/dist/analysis-budget.js +118 -0
  5. package/dist/analysis-budget.js.map +1 -0
  6. package/dist/guardrail.d.ts +24 -0
  7. package/dist/guardrail.d.ts.map +1 -0
  8. package/dist/guardrail.js +65 -0
  9. package/dist/guardrail.js.map +1 -0
  10. package/dist/heap-state.d.ts +46 -1
  11. package/dist/heap-state.d.ts.map +1 -1
  12. package/dist/heap-state.js +142 -10
  13. package/dist/heap-state.js.map +1 -1
  14. package/dist/index.js +36 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/tools/array-group-by.d.ts +12 -0
  17. package/dist/tools/array-group-by.d.ts.map +1 -0
  18. package/dist/tools/array-group-by.js +191 -0
  19. package/dist/tools/array-group-by.js.map +1 -0
  20. package/dist/tools/auto-investigate.d.ts.map +1 -1
  21. package/dist/tools/auto-investigate.js +999 -37
  22. package/dist/tools/auto-investigate.js.map +1 -1
  23. package/dist/tools/cache-analysis.d.ts.map +1 -1
  24. package/dist/tools/cache-analysis.js +438 -21
  25. package/dist/tools/cache-analysis.js.map +1 -1
  26. package/dist/tools/check-health.d.ts.map +1 -1
  27. package/dist/tools/check-health.js +261 -1
  28. package/dist/tools/check-health.js.map +1 -1
  29. package/dist/tools/class-histogram.d.ts.map +1 -1
  30. package/dist/tools/class-histogram.js +142 -33
  31. package/dist/tools/class-histogram.js.map +1 -1
  32. package/dist/tools/closure-inspection.d.ts.map +1 -1
  33. package/dist/tools/closure-inspection.js +238 -25
  34. package/dist/tools/closure-inspection.js.map +1 -1
  35. package/dist/tools/detached-dom.d.ts.map +1 -1
  36. package/dist/tools/detached-dom.js +25 -3
  37. package/dist/tools/detached-dom.js.map +1 -1
  38. package/dist/tools/dev-artifacts.d.ts +33 -0
  39. package/dist/tools/dev-artifacts.d.ts.map +1 -0
  40. package/dist/tools/dev-artifacts.js +165 -0
  41. package/dist/tools/dev-artifacts.js.map +1 -0
  42. package/dist/tools/diff-snapshots.d.ts.map +1 -1
  43. package/dist/tools/diff-snapshots.js +113 -18
  44. package/dist/tools/diff-snapshots.js.map +1 -1
  45. package/dist/tools/duplicated-strings.d.ts.map +1 -1
  46. package/dist/tools/duplicated-strings.js +74 -12
  47. package/dist/tools/duplicated-strings.js.map +1 -1
  48. package/dist/tools/eval.d.ts.map +1 -1
  49. package/dist/tools/eval.js +189 -10
  50. package/dist/tools/eval.js.map +1 -1
  51. package/dist/tools/event-listener-leaks.d.ts.map +1 -1
  52. package/dist/tools/event-listener-leaks.js +235 -13
  53. package/dist/tools/event-listener-leaks.js.map +1 -1
  54. package/dist/tools/event-registry.d.ts +12 -0
  55. package/dist/tools/event-registry.d.ts.map +1 -0
  56. package/dist/tools/event-registry.js +183 -0
  57. package/dist/tools/event-registry.js.map +1 -0
  58. package/dist/tools/find-by-property.d.ts.map +1 -1
  59. package/dist/tools/find-by-property.js +113 -31
  60. package/dist/tools/find-by-property.js.map +1 -1
  61. package/dist/tools/find-by-shape.d.ts +12 -0
  62. package/dist/tools/find-by-shape.d.ts.map +1 -0
  63. package/dist/tools/find-by-shape.js +178 -0
  64. package/dist/tools/find-by-shape.js.map +1 -0
  65. package/dist/tools/find-nodes-by-class.d.ts.map +1 -1
  66. package/dist/tools/find-nodes-by-class.js +50 -6
  67. package/dist/tools/find-nodes-by-class.js.map +1 -1
  68. package/dist/tools/for-each.d.ts.map +1 -1
  69. package/dist/tools/for-each.js +1 -1
  70. package/dist/tools/for-each.js.map +1 -1
  71. package/dist/tools/get-node.d.ts.map +1 -1
  72. package/dist/tools/get-node.js +6 -0
  73. package/dist/tools/get-node.js.map +1 -1
  74. package/dist/tools/get-string.d.ts +12 -0
  75. package/dist/tools/get-string.d.ts.map +1 -0
  76. package/dist/tools/get-string.js +223 -0
  77. package/dist/tools/get-string.js.map +1 -0
  78. package/dist/tools/get-value.d.ts +12 -0
  79. package/dist/tools/get-value.d.ts.map +1 -0
  80. package/dist/tools/get-value.js +152 -0
  81. package/dist/tools/get-value.js.map +1 -0
  82. package/dist/tools/global-variables.d.ts.map +1 -1
  83. package/dist/tools/global-variables.js +54 -34
  84. package/dist/tools/global-variables.js.map +1 -1
  85. package/dist/tools/growth-signals.d.ts +12 -0
  86. package/dist/tools/growth-signals.d.ts.map +1 -0
  87. package/dist/tools/growth-signals.js +211 -0
  88. package/dist/tools/growth-signals.js.map +1 -0
  89. package/dist/tools/intern-opportunities.d.ts +12 -0
  90. package/dist/tools/intern-opportunities.d.ts.map +1 -0
  91. package/dist/tools/intern-opportunities.js +289 -0
  92. package/dist/tools/intern-opportunities.js.map +1 -0
  93. package/dist/tools/load-snapshot.d.ts +10 -0
  94. package/dist/tools/load-snapshot.d.ts.map +1 -1
  95. package/dist/tools/load-snapshot.js +152 -15
  96. package/dist/tools/load-snapshot.js.map +1 -1
  97. package/dist/tools/object-cost-breakdown.d.ts +12 -0
  98. package/dist/tools/object-cost-breakdown.d.ts.map +1 -0
  99. package/dist/tools/object-cost-breakdown.js +439 -0
  100. package/dist/tools/object-cost-breakdown.js.map +1 -0
  101. package/dist/tools/object-shape.d.ts.map +1 -1
  102. package/dist/tools/object-shape.js +95 -2
  103. package/dist/tools/object-shape.js.map +1 -1
  104. package/dist/tools/pinch-points.d.ts.map +1 -1
  105. package/dist/tools/pinch-points.js +9 -9
  106. package/dist/tools/pinch-points.js.map +1 -1
  107. package/dist/tools/property-distribution.d.ts +12 -0
  108. package/dist/tools/property-distribution.d.ts.map +1 -0
  109. package/dist/tools/property-distribution.js +168 -0
  110. package/dist/tools/property-distribution.js.map +1 -0
  111. package/dist/tools/quick-diagnosis.d.ts.map +1 -1
  112. package/dist/tools/quick-diagnosis.js +56 -19
  113. package/dist/tools/quick-diagnosis.js.map +1 -1
  114. package/dist/tools/retainer-summary.d.ts.map +1 -1
  115. package/dist/tools/retainer-summary.js +90 -5
  116. package/dist/tools/retainer-summary.js.map +1 -1
  117. package/dist/tools/retainer-trace.d.ts.map +1 -1
  118. package/dist/tools/retainer-trace.js +74 -22
  119. package/dist/tools/retainer-trace.js.map +1 -1
  120. package/dist/tools/search-nodes.d.ts.map +1 -1
  121. package/dist/tools/search-nodes.js +10 -3
  122. package/dist/tools/search-nodes.js.map +1 -1
  123. package/dist/tools/search-strings.d.ts +12 -0
  124. package/dist/tools/search-strings.d.ts.map +1 -0
  125. package/dist/tools/search-strings.js +182 -0
  126. package/dist/tools/search-strings.js.map +1 -0
  127. package/dist/tools/sequence-analysis.d.ts +12 -0
  128. package/dist/tools/sequence-analysis.d.ts.map +1 -0
  129. package/dist/tools/sequence-analysis.js +234 -0
  130. package/dist/tools/sequence-analysis.js.map +1 -0
  131. package/dist/tools/server-status.d.ts +12 -0
  132. package/dist/tools/server-status.d.ts.map +1 -0
  133. package/dist/tools/server-status.js +41 -0
  134. package/dist/tools/server-status.js.map +1 -0
  135. package/dist/tools/shape-histogram.d.ts.map +1 -1
  136. package/dist/tools/shape-histogram.js +61 -16
  137. package/dist/tools/shape-histogram.js.map +1 -1
  138. package/dist/tools/sliced-strings.d.ts.map +1 -1
  139. package/dist/tools/sliced-strings.js +16 -11
  140. package/dist/tools/sliced-strings.js.map +1 -1
  141. package/dist/tools/snapshot-summary.d.ts.map +1 -1
  142. package/dist/tools/snapshot-summary.js +55 -13
  143. package/dist/tools/snapshot-summary.js.map +1 -1
  144. package/dist/tools/snapshots.d.ts +12 -0
  145. package/dist/tools/snapshots.d.ts.map +1 -0
  146. package/dist/tools/snapshots.js +93 -0
  147. package/dist/tools/snapshots.js.map +1 -0
  148. package/dist/tools/stale-collections.d.ts.map +1 -1
  149. package/dist/tools/stale-collections.js +248 -7
  150. package/dist/tools/stale-collections.js.map +1 -1
  151. package/dist/tools/trace-dominators.d.ts.map +1 -1
  152. package/dist/tools/trace-dominators.js +28 -1
  153. package/dist/tools/trace-dominators.js.map +1 -1
  154. package/dist/tools/weakmap-entries.d.ts +12 -0
  155. package/dist/tools/weakmap-entries.d.ts.map +1 -0
  156. package/dist/tools/weakmap-entries.js +156 -0
  157. package/dist/tools/weakmap-entries.js.map +1 -0
  158. package/dist/utils.d.ts +81 -2
  159. package/dist/utils.d.ts.map +1 -1
  160. package/dist/utils.js +303 -35
  161. package/dist/utils.js.map +1 -1
  162. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"heap-state.js","sourceRoot":"","sources":["../src/heap-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,IAAI,eAAe,GAAyB,IAAI,CAAC;AACjD,IAAI,eAAe,GAA4B,IAAI,CAAC;AAEpD,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,eAAe,EAAE,QAAQ,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,eAAe,EAAE,GAAG,IAAI,SAAS,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAuB,EACvB,QAAgB,EAChB,QAA4C;IAE5C,eAAe,GAAG,QAAQ,CAAC;IAC3B,eAAe,GAAG,EAAC,QAAQ,EAAE,GAAG,QAAQ,EAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"heap-state.js","sourceRoot":"","sources":["../src/heap-state.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
12
12
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
13
13
  import memlabCore from '@memlab/core';
14
14
  const { config, ErrorHandling } = memlabCore;
15
+ import { installAnalysisGuardrail } from './guardrail.js';
15
16
  // Ensure errors throw exceptions instead of calling process.exit(1),
16
17
  // so the MCP server can return proper error responses to the client.
17
18
  config.errorHandling = ErrorHandling.Throw;
@@ -51,10 +52,29 @@ import { registerShapeHistogram } from './tools/shape-histogram.js';
51
52
  import { registerQuickDiagnosis } from './tools/quick-diagnosis.js';
52
53
  import { registerReferrerSummary } from './tools/referrer-summary.js';
53
54
  import { registerEventListenerLeaks } from './tools/event-listener-leaks.js';
55
+ import { registerFindByShape } from './tools/find-by-shape.js';
56
+ import { registerWeakMapEntries } from './tools/weakmap-entries.js';
57
+ import { registerGetValue } from './tools/get-value.js';
58
+ import { registerGetString } from './tools/get-string.js';
59
+ import { registerSearchStrings } from './tools/search-strings.js';
60
+ import { registerArrayGroupBy } from './tools/array-group-by.js';
61
+ import { registerInternOpportunities } from './tools/intern-opportunities.js';
62
+ import { registerObjectCostBreakdown } from './tools/object-cost-breakdown.js';
63
+ import { registerSnapshots } from './tools/snapshots.js';
64
+ import { registerPropertyDistribution } from './tools/property-distribution.js';
65
+ import { registerGrowthSignals } from './tools/growth-signals.js';
66
+ import { registerServerStatus } from './tools/server-status.js';
67
+ import { registerDevArtifacts } from './tools/dev-artifacts.js';
68
+ import { registerSequenceAnalysis } from './tools/sequence-analysis.js';
69
+ import { registerEventRegistry } from './tools/event-registry.js';
54
70
  const server = new McpServer({
55
71
  name: 'memlab',
56
- version: '2.4.0',
72
+ version: '2.12.0',
57
73
  });
74
+ // Wrap every tool with a wall-clock guardrail (default 90s, override per-call
75
+ // with timeout_ms or globally with MEMLAB_ANALYSIS_TIMEOUT_MS). Must run before
76
+ // the tools are registered so their handlers are wrapped.
77
+ installAnalysisGuardrail(server);
58
78
  registerLoadSnapshot(server);
59
79
  registerSnapshotSummary(server);
60
80
  registerLargestObjects(server);
@@ -89,8 +109,23 @@ registerShapeHistogram(server);
89
109
  registerQuickDiagnosis(server);
90
110
  registerReferrerSummary(server);
91
111
  registerEventListenerLeaks(server);
112
+ registerFindByShape(server);
113
+ registerWeakMapEntries(server);
114
+ registerGetValue(server);
115
+ registerGetString(server);
116
+ registerSearchStrings(server);
92
117
  registerEval(server);
93
118
  registerForEach(server);
119
+ registerArrayGroupBy(server);
120
+ registerInternOpportunities(server);
121
+ registerObjectCostBreakdown(server);
122
+ registerSnapshots(server);
123
+ registerPropertyDistribution(server);
124
+ registerGrowthSignals(server);
125
+ registerServerStatus(server);
126
+ registerDevArtifacts(server);
127
+ registerSequenceAnalysis(server);
128
+ registerEventRegistry(server);
94
129
  async function main() {
95
130
  const transport = new StdioServerTransport();
96
131
  await server.connect(transport);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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 registerArrayGroupBy(server: McpServer): void;
12
+ //# sourceMappingURL=array-group-by.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-group-by.d.ts","sourceRoot":"","sources":["../../src/tools/array-group-by.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAWvE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwO5D"}
@@ -0,0 +1,191 @@
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, } from '../utils.js';
13
+ export function registerArrayGroupBy(server) {
14
+ server.tool('memlab_array_group_by', 'Iterate through array (or Map/Set) elements, extract a named property from each, and ' +
15
+ 'group/count by the target value. Eliminates the most common memlab_eval boilerplate — ' +
16
+ '"iterate array, extract property, group by shape" — in a single tool call. ' +
17
+ 'Example: given a listener array where each element has a "context" property, ' +
18
+ 'this reports "649× ChatMsgsCollection, 1× MsgCollection, 1× Mirror". ' +
19
+ 'Use group_by to control grouping: "name" (constructor name), "type" (node type), or "id" (unique node IDs).', {
20
+ node_id: z
21
+ .number()
22
+ .describe('The numeric ID of the Array, Map, or Set node to iterate over'),
23
+ element_property: z
24
+ .string()
25
+ .describe('Property name to extract from each element (e.g., "context", "callback", "key")'),
26
+ group_by: z
27
+ .enum(['name', 'type', 'id'])
28
+ .optional()
29
+ .default('name')
30
+ .describe('How to group the extracted targets: "name" groups by constructor/class name (default), ' +
31
+ '"type" groups by V8 node type, "id" counts unique node IDs'),
32
+ second_property: z
33
+ .string()
34
+ .optional()
35
+ .describe('Optional second property to extract alongside element_property. ' +
36
+ 'When set, reports the distribution of the second property within each group. ' +
37
+ 'Example: element_property="context", second_property="callback" shows ' +
38
+ 'which callbacks are used with each context class.'),
39
+ limit: z
40
+ .number()
41
+ .optional()
42
+ .default(20)
43
+ .describe('Maximum number of groups to return (default 20)'),
44
+ }, async ({ node_id, element_property, group_by, second_property, limit }) => {
45
+ try {
46
+ const snapshot = getSnapshot();
47
+ const node = snapshot.getNodeById(node_id);
48
+ if (!node) {
49
+ return errorResult(`Node @${node_id} not found`);
50
+ }
51
+ const elements = [];
52
+ if (node.name === 'Map' || node.name === 'Set') {
53
+ for (const edge of node.references) {
54
+ if (String(edge.name_or_index) === 'table' &&
55
+ edge.toNode.type === 'array') {
56
+ for (const te of edge.toNode.references) {
57
+ if (te.toNode.id <= 3)
58
+ continue;
59
+ if (te.toNode.name === 'undefined' ||
60
+ te.toNode.name === 'the_hole')
61
+ continue;
62
+ elements.push({ elementNode: te.toNode });
63
+ }
64
+ break;
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ for (const edge of node.references) {
70
+ if (edge.type !== 'element')
71
+ continue;
72
+ if (edge.toNode.id <= 3)
73
+ continue;
74
+ elements.push({ elementNode: edge.toNode });
75
+ }
76
+ }
77
+ if (elements.length === 0) {
78
+ return toolResult(`@${node_id} (${node.name}) has no iterable elements. ` +
79
+ `Make sure this is an Array, Map, or Set node.`);
80
+ }
81
+ const groups = new Map();
82
+ let missingProperty = 0;
83
+ let totalElements = 0;
84
+ for (const { elementNode } of elements) {
85
+ totalElements++;
86
+ let targetNode = null;
87
+ let secondTargetNode = null;
88
+ for (const edge of elementNode.references) {
89
+ const eName = String(edge.name_or_index);
90
+ if (eName === element_property) {
91
+ targetNode = edge.toNode;
92
+ }
93
+ if (second_property && eName === second_property) {
94
+ secondTargetNode = edge.toNode;
95
+ }
96
+ }
97
+ if (!targetNode) {
98
+ missingProperty++;
99
+ continue;
100
+ }
101
+ let groupKey;
102
+ switch (group_by) {
103
+ case 'type':
104
+ groupKey = targetNode.type;
105
+ break;
106
+ case 'id':
107
+ groupKey = `@${targetNode.id} ${targetNode.name}`;
108
+ break;
109
+ default:
110
+ groupKey = targetNode.name;
111
+ }
112
+ const existing = groups.get(groupKey);
113
+ if (existing) {
114
+ existing.count++;
115
+ existing.totalRetained += targetNode.retainedSize;
116
+ if (second_property && secondTargetNode) {
117
+ if (!existing.secondaryDistribution) {
118
+ existing.secondaryDistribution = new Map();
119
+ }
120
+ const secKey = secondTargetNode.name;
121
+ existing.secondaryDistribution.set(secKey, (existing.secondaryDistribution.get(secKey) ?? 0) + 1);
122
+ }
123
+ }
124
+ else {
125
+ const secondaryDist = second_property && secondTargetNode
126
+ ? new Map([[secondTargetNode.name, 1]])
127
+ : undefined;
128
+ groups.set(groupKey, {
129
+ count: 1,
130
+ exampleTargetId: targetNode.id,
131
+ totalRetained: targetNode.retainedSize,
132
+ secondaryDistribution: secondaryDist,
133
+ });
134
+ }
135
+ }
136
+ const sorted = [...groups.entries()]
137
+ .sort((a, b) => b[1].count - a[1].count)
138
+ .slice(0, limit);
139
+ const lines = [
140
+ `Property \`${element_property}\` across ${formatNumber(totalElements)} elements of @${node_id} (${node.name}):`,
141
+ '',
142
+ ];
143
+ const headers = [
144
+ group_by === 'id' ? 'Target' : `Target ${group_by}`,
145
+ 'Count',
146
+ '%',
147
+ 'Total Retained',
148
+ 'Example',
149
+ ];
150
+ const rightCols = new Set([1, 2, 3]);
151
+ const rows = sorted.map(([key, info]) => {
152
+ const pct = ((info.count / totalElements) * 100).toFixed(1) + '%';
153
+ return [
154
+ key,
155
+ formatNumber(info.count),
156
+ pct,
157
+ formatBytes(info.totalRetained),
158
+ `@${info.exampleTargetId}`,
159
+ ];
160
+ });
161
+ lines.push(markdownTable(headers, rows, rightCols));
162
+ if (sorted.length < groups.size) {
163
+ lines.push('', `… and ${groups.size - sorted.length} more group(s)`);
164
+ }
165
+ if (missingProperty > 0) {
166
+ lines.push('', `${formatNumber(missingProperty)} element(s) missing property \`${element_property}\``);
167
+ }
168
+ if (second_property) {
169
+ const hasSecondary = sorted.some(([, info]) => info.secondaryDistribution && info.secondaryDistribution.size > 0);
170
+ if (hasSecondary) {
171
+ lines.push('', `**\`${second_property}\` distribution per group:**`);
172
+ for (const [key, info] of sorted.slice(0, 10)) {
173
+ if (!info.secondaryDistribution ||
174
+ info.secondaryDistribution.size === 0)
175
+ continue;
176
+ const secSorted = [...info.secondaryDistribution.entries()]
177
+ .sort((a, b) => b[1] - a[1])
178
+ .slice(0, 5);
179
+ const parts = secSorted.map(([name, count]) => `${count}× ${name}`);
180
+ lines.push(`- ${key}: ${parts.join(', ')}`);
181
+ }
182
+ }
183
+ }
184
+ return toolResult(lines.join('\n'));
185
+ }
186
+ catch (err) {
187
+ return errorResult(err);
188
+ }
189
+ });
190
+ }
191
+ //# sourceMappingURL=array-group-by.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-group-by.js","sourceRoot":"","sources":["../../src/tools/array-group-by.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,YAAY,EACZ,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,uFAAuF;QACrF,wFAAwF;QACxF,6EAA6E;QAC7E,+EAA+E;QAC/E,uEAAuE;QACvE,6GAA6G,EAC/G;QACE,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,CACP,+DAA+D,CAChE;QACH,gBAAgB,EAAE,CAAC;aAChB,MAAM,EAAE;aACR,QAAQ,CACP,iFAAiF,CAClF;QACH,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;aAC5B,QAAQ,EAAE;aACV,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CACP,yFAAyF;YACvF,4DAA4D,CAC/D;QACH,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,kEAAkE;YAChE,+EAA+E;YAC/E,wEAAwE;YACxE,mDAAmD,CACtD;QACH,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,iDAAiD,CAAC;KAC/D,EACD,KAAK,EAAE,EAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAC,EAAE,EAAE;QACtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,WAAW,CAAC,SAAS,OAAO,YAAY,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,QAAQ,GAAsC,EAAE,CAAC;YAEvD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IACE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,OAAO;wBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,EAC5B,CAAC;wBACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;4BACxC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;gCAAE,SAAS;4BAChC,IACE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;gCAC9B,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU;gCAE7B,SAAS;4BACX,QAAQ,CAAC,IAAI,CAAC,EAAC,WAAW,EAAE,EAAE,CAAC,MAAM,EAAC,CAAC,CAAC;wBAC1C,CAAC;wBACD,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;wBAAE,SAAS;oBACtC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;wBAAE,SAAS;oBAClC,QAAQ,CAAC,IAAI,CAAC,EAAC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAC,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,UAAU,CACf,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,8BAA8B;oBACrD,+CAA+C,CAClD,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAQnB,CAAC;YACJ,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,aAAa,GAAG,CAAC,CAAC;YAEtB,KAAK,MAAM,EAAC,WAAW,EAAC,IAAI,QAAQ,EAAE,CAAC;gBACrC,aAAa,EAAE,CAAC;gBAChB,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,IAAI,gBAAgB,GAAG,IAAI,CAAC;gBAE5B,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;oBAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;oBACzC,IAAI,KAAK,KAAK,gBAAgB,EAAE,CAAC;wBAC/B,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC3B,CAAC;oBACD,IAAI,eAAe,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;wBACjD,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;oBACjC,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,eAAe,EAAE,CAAC;oBAClB,SAAS;gBACX,CAAC;gBAED,IAAI,QAAgB,CAAC;gBACrB,QAAQ,QAAQ,EAAE,CAAC;oBACjB,KAAK,MAAM;wBACT,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;wBAC3B,MAAM;oBACR,KAAK,IAAI;wBACP,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;wBAClD,MAAM;oBACR;wBACE,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;gBAC/B,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtC,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACjB,QAAQ,CAAC,aAAa,IAAI,UAAU,CAAC,YAAY,CAAC;oBAClD,IAAI,eAAe,IAAI,gBAAgB,EAAE,CAAC;wBACxC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;4BACpC,QAAQ,CAAC,qBAAqB,GAAG,IAAI,GAAG,EAAE,CAAC;wBAC7C,CAAC;wBACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC;wBACrC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAChC,MAAM,EACN,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CACtD,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,aAAa,GACjB,eAAe,IAAI,gBAAgB;wBACjC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;wBACvC,CAAC,CAAC,SAAS,CAAC;oBAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;wBACnB,KAAK,EAAE,CAAC;wBACR,eAAe,EAAE,UAAU,CAAC,EAAE;wBAC9B,aAAa,EAAE,UAAU,CAAC,YAAY;wBACtC,qBAAqB,EAAE,aAAa;qBACrC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;iBACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;iBACvC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEnB,MAAM,KAAK,GAAG;gBACZ,cAAc,gBAAgB,aAAa,YAAY,CAAC,aAAa,CAAC,iBAAiB,OAAO,KAAK,IAAI,CAAC,IAAI,IAAI;gBAChH,EAAE;aACH,CAAC;YAEF,MAAM,OAAO,GAAG;gBACd,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE;gBACnD,OAAO;gBACP,GAAG;gBACH,gBAAgB;gBAChB,SAAS;aACV,CAAC;YACF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;gBACtC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAClE,OAAO;oBACL,GAAG;oBACH,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;oBACxB,GAAG;oBACH,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;oBAC/B,IAAI,IAAI,CAAC,eAAe,EAAE;iBAC3B,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YAEpD,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CACR,EAAE,EACF,GAAG,YAAY,CAAC,eAAe,CAAC,kCAAkC,gBAAgB,IAAI,CACvF,CAAC;YACJ,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CACX,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,GAAG,CAAC,CACpE,CAAC;gBACF,IAAI,YAAY,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CACR,EAAE,EACF,OAAO,eAAe,8BAA8B,CACrD,CAAC;oBACF,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;wBAC9C,IACE,CAAC,IAAI,CAAC,qBAAqB;4BAC3B,IAAI,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC;4BAErC,SAAS;wBACX,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;6BACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;6BAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBACf,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CACzB,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,IAAI,EAAE,CACvC,CAAC;wBACF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC9C,CAAC;gBACH,CAAC;YACH,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 +1 @@
1
- {"version":3,"file":"auto-investigate.d.ts","sourceRoot":"","sources":["../../src/tools/auto-investigate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAqiBvE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0X/D"}
1
+ {"version":3,"file":"auto-investigate.d.ts","sourceRoot":"","sources":["../../src/tools/auto-investigate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yCAAyC,CAAC;AAm9CvE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAirB/D"}