@perfbase/mcp 1.0.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 (54) hide show
  1. package/README.md +76 -0
  2. package/dist/decoder/decompress.d.ts +25 -0
  3. package/dist/decoder/decompress.d.ts.map +1 -0
  4. package/dist/decoder/decompress.js +79 -0
  5. package/dist/decoder/decompress.js.map +1 -0
  6. package/dist/decoder/trie-walker.d.ts +34 -0
  7. package/dist/decoder/trie-walker.d.ts.map +1 -0
  8. package/dist/decoder/trie-walker.js +159 -0
  9. package/dist/decoder/trie-walker.js.map +1 -0
  10. package/dist/decoder/types.d.ts +188 -0
  11. package/dist/decoder/types.d.ts.map +1 -0
  12. package/dist/decoder/types.js +6 -0
  13. package/dist/decoder/types.js.map +1 -0
  14. package/dist/index.d.ts +9 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +309 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/resources/profile-metadata.d.ts +14 -0
  19. package/dist/resources/profile-metadata.d.ts.map +1 -0
  20. package/dist/resources/profile-metadata.js +41 -0
  21. package/dist/resources/profile-metadata.js.map +1 -0
  22. package/dist/tools/cpu-intensive.d.ts +37 -0
  23. package/dist/tools/cpu-intensive.d.ts.map +1 -0
  24. package/dist/tools/cpu-intensive.js +64 -0
  25. package/dist/tools/cpu-intensive.js.map +1 -0
  26. package/dist/tools/database-queries.d.ts +33 -0
  27. package/dist/tools/database-queries.d.ts.map +1 -0
  28. package/dist/tools/database-queries.js +133 -0
  29. package/dist/tools/database-queries.js.map +1 -0
  30. package/dist/tools/memory-hogs.d.ts +38 -0
  31. package/dist/tools/memory-hogs.d.ts.map +1 -0
  32. package/dist/tools/memory-hogs.js +65 -0
  33. package/dist/tools/memory-hogs.js.map +1 -0
  34. package/dist/tools/most-called.d.ts +36 -0
  35. package/dist/tools/most-called.d.ts.map +1 -0
  36. package/dist/tools/most-called.js +59 -0
  37. package/dist/tools/most-called.js.map +1 -0
  38. package/dist/tools/n-plus-one.d.ts +29 -0
  39. package/dist/tools/n-plus-one.d.ts.map +1 -0
  40. package/dist/tools/n-plus-one.js +137 -0
  41. package/dist/tools/n-plus-one.js.map +1 -0
  42. package/dist/tools/slowest-functions.d.ts +36 -0
  43. package/dist/tools/slowest-functions.d.ts.map +1 -0
  44. package/dist/tools/slowest-functions.js +59 -0
  45. package/dist/tools/slowest-functions.js.map +1 -0
  46. package/dist/tools/summary.d.ts +42 -0
  47. package/dist/tools/summary.d.ts.map +1 -0
  48. package/dist/tools/summary.js +118 -0
  49. package/dist/tools/summary.js.map +1 -0
  50. package/dist/utils/formatting.d.ts +48 -0
  51. package/dist/utils/formatting.d.ts.map +1 -0
  52. package/dist/utils/formatting.js +109 -0
  53. package/dist/utils/formatting.js.map +1 -0
  54. package/package.json +44 -0
package/dist/index.js ADDED
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PerfBase MCP Server
4
+ *
5
+ * Provides tools for analyzing PerfBase profiler data through the
6
+ * Model Context Protocol (MCP).
7
+ */
8
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
9
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ErrorCode, McpError, } from '@modelcontextprotocol/sdk/types.js';
11
+ // Tools
12
+ import { slowestFunctionsSchema, getSlowestFunctions, formatSlowestFunctionsOutput, } from './tools/slowest-functions.js';
13
+ import { mostCalledSchema, getMostCalledFunctions, formatMostCalledOutput, } from './tools/most-called.js';
14
+ import { cpuIntensiveSchema, getCpuIntensiveFunctions, formatCpuIntensiveOutput, } from './tools/cpu-intensive.js';
15
+ import { memoryHogsSchema, getMemoryHogs, formatMemoryHogsOutput, } from './tools/memory-hogs.js';
16
+ import { databaseQueriesSchema, getDatabaseQueries, formatDatabaseQueriesOutput, } from './tools/database-queries.js';
17
+ import { nPlusOneSchema, detectNPlusOne, formatNPlusOneOutput, } from './tools/n-plus-one.js';
18
+ import { summarySchema, getProfileSummary, formatSummaryOutput, } from './tools/summary.js';
19
+ // Resources
20
+ import { getProfileMetadata, formatMetadataAsJson, } from './resources/profile-metadata.js';
21
+ // Tool definitions for MCP
22
+ const TOOLS = [
23
+ {
24
+ name: 'get_slowest_functions',
25
+ description: 'Get the slowest functions by total wall time from a PerfBase profile. Useful for identifying performance bottlenecks.',
26
+ inputSchema: {
27
+ type: 'object',
28
+ properties: {
29
+ filePath: {
30
+ type: 'string',
31
+ description: 'Absolute path to the PerfBase profile file (.bin)',
32
+ },
33
+ span: {
34
+ type: 'string',
35
+ description: 'Optional: filter to a specific span name',
36
+ },
37
+ limit: {
38
+ type: 'number',
39
+ description: 'Maximum number of results (default: 20)',
40
+ default: 20,
41
+ },
42
+ },
43
+ required: ['filePath'],
44
+ },
45
+ },
46
+ {
47
+ name: 'get_most_called_functions',
48
+ description: 'Get the most frequently called functions from a PerfBase profile. Useful for finding hot paths.',
49
+ inputSchema: {
50
+ type: 'object',
51
+ properties: {
52
+ filePath: {
53
+ type: 'string',
54
+ description: 'Absolute path to the PerfBase profile file (.bin)',
55
+ },
56
+ span: {
57
+ type: 'string',
58
+ description: 'Optional: filter to a specific span name',
59
+ },
60
+ limit: {
61
+ type: 'number',
62
+ description: 'Maximum number of results (default: 20)',
63
+ default: 20,
64
+ },
65
+ },
66
+ required: ['filePath'],
67
+ },
68
+ },
69
+ {
70
+ name: 'get_cpu_intensive_functions',
71
+ description: 'Get functions with highest CPU time from a PerfBase profile. Useful for identifying compute-bound code.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ filePath: {
76
+ type: 'string',
77
+ description: 'Absolute path to the PerfBase profile file (.bin)',
78
+ },
79
+ span: {
80
+ type: 'string',
81
+ description: 'Optional: filter to a specific span name',
82
+ },
83
+ limit: {
84
+ type: 'number',
85
+ description: 'Maximum number of results (default: 20)',
86
+ default: 20,
87
+ },
88
+ },
89
+ required: ['filePath'],
90
+ },
91
+ },
92
+ {
93
+ name: 'get_memory_hogs',
94
+ description: 'Get functions with highest memory allocation from a PerfBase profile. Useful for finding memory-intensive code.',
95
+ inputSchema: {
96
+ type: 'object',
97
+ properties: {
98
+ filePath: {
99
+ type: 'string',
100
+ description: 'Absolute path to the PerfBase profile file (.bin)',
101
+ },
102
+ span: {
103
+ type: 'string',
104
+ description: 'Optional: filter to a specific span name',
105
+ },
106
+ limit: {
107
+ type: 'number',
108
+ description: 'Maximum number of results (default: 20)',
109
+ default: 20,
110
+ },
111
+ },
112
+ required: ['filePath'],
113
+ },
114
+ },
115
+ {
116
+ name: 'get_database_queries',
117
+ description: 'Extract and analyze database operations (PDO, mysqli, MongoDB, Redis, etc.) from a PerfBase profile.',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ filePath: {
122
+ type: 'string',
123
+ description: 'Absolute path to the PerfBase profile file (.bin)',
124
+ },
125
+ span: {
126
+ type: 'string',
127
+ description: 'Optional: filter to a specific span name',
128
+ },
129
+ limit: {
130
+ type: 'number',
131
+ description: 'Maximum number of results (default: 50)',
132
+ default: 50,
133
+ },
134
+ },
135
+ required: ['filePath'],
136
+ },
137
+ },
138
+ {
139
+ name: 'detect_n_plus_one',
140
+ description: 'Detect N+1 query patterns in a PerfBase profile. Finds repeated similar queries that could be optimized.',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: {
144
+ filePath: {
145
+ type: 'string',
146
+ description: 'Absolute path to the PerfBase profile file (.bin)',
147
+ },
148
+ span: {
149
+ type: 'string',
150
+ description: 'Optional: filter to a specific span name',
151
+ },
152
+ minRepetitions: {
153
+ type: 'number',
154
+ description: 'Minimum number of similar queries to flag as N+1 (default: 5)',
155
+ default: 5,
156
+ },
157
+ },
158
+ required: ['filePath'],
159
+ },
160
+ },
161
+ {
162
+ name: 'get_profile_summary',
163
+ description: 'Get an overall summary of a PerfBase profile including spans, totals, and top functions.',
164
+ inputSchema: {
165
+ type: 'object',
166
+ properties: {
167
+ filePath: {
168
+ type: 'string',
169
+ description: 'Absolute path to the PerfBase profile file (.bin)',
170
+ },
171
+ },
172
+ required: ['filePath'],
173
+ },
174
+ },
175
+ ];
176
+ // Create server instance
177
+ const server = new Server({
178
+ name: 'perfbase',
179
+ version: '1.0.0',
180
+ }, {
181
+ capabilities: {
182
+ tools: {},
183
+ resources: {},
184
+ },
185
+ });
186
+ // Handle list tools request
187
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
188
+ return { tools: TOOLS };
189
+ });
190
+ // Handle tool calls
191
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
192
+ const { name, arguments: args } = request.params;
193
+ try {
194
+ switch (name) {
195
+ case 'get_slowest_functions': {
196
+ const input = slowestFunctionsSchema.parse(args);
197
+ const result = await getSlowestFunctions(input);
198
+ return {
199
+ content: [
200
+ { type: 'text', text: formatSlowestFunctionsOutput(result) },
201
+ ],
202
+ };
203
+ }
204
+ case 'get_most_called_functions': {
205
+ const input = mostCalledSchema.parse(args);
206
+ const result = await getMostCalledFunctions(input);
207
+ return {
208
+ content: [{ type: 'text', text: formatMostCalledOutput(result) }],
209
+ };
210
+ }
211
+ case 'get_cpu_intensive_functions': {
212
+ const input = cpuIntensiveSchema.parse(args);
213
+ const result = await getCpuIntensiveFunctions(input);
214
+ return {
215
+ content: [{ type: 'text', text: formatCpuIntensiveOutput(result) }],
216
+ };
217
+ }
218
+ case 'get_memory_hogs': {
219
+ const input = memoryHogsSchema.parse(args);
220
+ const result = await getMemoryHogs(input);
221
+ return {
222
+ content: [{ type: 'text', text: formatMemoryHogsOutput(result) }],
223
+ };
224
+ }
225
+ case 'get_database_queries': {
226
+ const input = databaseQueriesSchema.parse(args);
227
+ const result = await getDatabaseQueries(input);
228
+ return {
229
+ content: [
230
+ { type: 'text', text: formatDatabaseQueriesOutput(result) },
231
+ ],
232
+ };
233
+ }
234
+ case 'detect_n_plus_one': {
235
+ const input = nPlusOneSchema.parse(args);
236
+ const result = await detectNPlusOne(input);
237
+ return {
238
+ content: [{ type: 'text', text: formatNPlusOneOutput(result) }],
239
+ };
240
+ }
241
+ case 'get_profile_summary': {
242
+ const input = summarySchema.parse(args);
243
+ const result = await getProfileSummary(input);
244
+ return {
245
+ content: [{ type: 'text', text: formatSummaryOutput(result) }],
246
+ };
247
+ }
248
+ default:
249
+ throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
250
+ }
251
+ }
252
+ catch (error) {
253
+ if (error instanceof McpError) {
254
+ throw error;
255
+ }
256
+ const message = error instanceof Error ? error.message : String(error);
257
+ throw new McpError(ErrorCode.InternalError, `Tool error: ${message}`);
258
+ }
259
+ });
260
+ // Handle list resources request
261
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
262
+ return {
263
+ resources: [
264
+ {
265
+ uri: 'perfbase://profile/{path}/metadata',
266
+ name: 'Profile Metadata',
267
+ description: 'Get metadata about a PerfBase profile including spans, system stats, and attributes',
268
+ mimeType: 'application/json',
269
+ },
270
+ ],
271
+ };
272
+ });
273
+ // Handle read resource request
274
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
275
+ const { uri } = request.params;
276
+ // Parse perfbase://profile/{path}/metadata
277
+ const match = uri.match(/^perfbase:\/\/profile\/(.+)\/metadata$/);
278
+ if (match) {
279
+ const filePath = decodeURIComponent(match[1]);
280
+ try {
281
+ const metadata = await getProfileMetadata(filePath);
282
+ return {
283
+ contents: [
284
+ {
285
+ uri,
286
+ mimeType: 'application/json',
287
+ text: formatMetadataAsJson(metadata),
288
+ },
289
+ ],
290
+ };
291
+ }
292
+ catch (error) {
293
+ const message = error instanceof Error ? error.message : String(error);
294
+ throw new McpError(ErrorCode.InternalError, `Failed to read profile: ${message}`);
295
+ }
296
+ }
297
+ throw new McpError(ErrorCode.InvalidRequest, `Unknown resource URI: ${uri}`);
298
+ });
299
+ // Start the server
300
+ async function main() {
301
+ const transport = new StdioServerTransport();
302
+ await server.connect(transport);
303
+ console.error('PerfBase MCP server started');
304
+ }
305
+ main().catch((error) => {
306
+ console.error('Failed to start server:', error);
307
+ process.exit(1);
308
+ });
309
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Resource: profile metadata
3
+ * Exposes profile metadata via MCP resources
4
+ */
5
+ import type { ProfileMetadata } from '../decoder/types.js';
6
+ /**
7
+ * Get metadata for a profile file
8
+ */
9
+ export declare function getProfileMetadata(filePath: string): Promise<ProfileMetadata>;
10
+ /**
11
+ * Format metadata as JSON for resource response
12
+ */
13
+ export declare function formatMetadataAsJson(metadata: ProfileMetadata): string;
14
+ //# sourceMappingURL=profile-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-metadata.d.ts","sourceRoot":"","sources":["../../src/resources/profile-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAUnF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoBtE"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Resource: profile metadata
3
+ * Exposes profile metadata via MCP resources
4
+ */
5
+ import { loadProfile } from '../decoder/decompress.js';
6
+ import { getSpanNames, countFunctions } from '../decoder/trie-walker.js';
7
+ import { formatBytes } from '../utils/formatting.js';
8
+ /**
9
+ * Get metadata for a profile file
10
+ */
11
+ export async function getProfileMetadata(filePath) {
12
+ const data = await loadProfile(filePath);
13
+ return {
14
+ spans: getSpanNames(data),
15
+ systemStats: data.s,
16
+ attributes: data.a,
17
+ functionCount: countFunctions(data),
18
+ files: data.f,
19
+ };
20
+ }
21
+ /**
22
+ * Format metadata as JSON for resource response
23
+ */
24
+ export function formatMetadataAsJson(metadata) {
25
+ return JSON.stringify({
26
+ spans: metadata.spans,
27
+ functionCount: metadata.functionCount,
28
+ filesCount: metadata.files.length,
29
+ systemStats: metadata.systemStats
30
+ ? {
31
+ peakMemory: metadata.systemStats.peak_memory
32
+ ? formatBytes(metadata.systemStats.peak_memory)
33
+ : undefined,
34
+ cpuPercent: metadata.systemStats.cpu_percent,
35
+ loadAvg1m: metadata.systemStats.load_avg_1m,
36
+ }
37
+ : undefined,
38
+ attributes: metadata.attributes,
39
+ }, null, 2);
40
+ }
41
+ //# sourceMappingURL=profile-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-metadata.js","sourceRoot":"","sources":["../../src/resources/profile-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEzC,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QACzB,WAAW,EAAE,IAAI,CAAC,CAAC;QACnB,UAAU,EAAE,IAAI,CAAC,CAAC;QAClB,aAAa,EAAE,cAAc,CAAC,IAAI,CAAC;QACnC,KAAK,EAAE,IAAI,CAAC,CAAC;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAyB;IAC5D,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;QACjC,WAAW,EAAE,QAAQ,CAAC,WAAW;YAC/B,CAAC,CAAC;gBACE,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW;oBAC1C,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC;oBAC/C,CAAC,CAAC,SAAS;gBACb,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW;gBAC5C,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,WAAW;aAC5C;YACH,CAAC,CAAC,SAAS;QACb,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Tool: get_cpu_intensive_functions
3
+ * Returns functions sorted by CPU time
4
+ */
5
+ import { z } from 'zod';
6
+ export declare const cpuIntensiveSchema: z.ZodObject<{
7
+ filePath: z.ZodString;
8
+ span: z.ZodOptional<z.ZodString>;
9
+ limit: z.ZodDefault<z.ZodNumber>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ filePath: string;
12
+ limit: number;
13
+ span?: string | undefined;
14
+ }, {
15
+ filePath: string;
16
+ span?: string | undefined;
17
+ limit?: number | undefined;
18
+ }>;
19
+ export type CpuIntensiveInput = z.infer<typeof cpuIntensiveSchema>;
20
+ export interface CpuIntensiveResult {
21
+ functions: Array<{
22
+ rank: number;
23
+ name: string;
24
+ callPath: string;
25
+ location?: string;
26
+ callCount: number;
27
+ totalCpuTime: string;
28
+ avgCpuTime: string;
29
+ percentOfCpu: string;
30
+ wallVsCpuRatio: string;
31
+ }>;
32
+ totalCpuTime: string;
33
+ totalFunctions: number;
34
+ }
35
+ export declare function getCpuIntensiveFunctions(input: CpuIntensiveInput): Promise<CpuIntensiveResult>;
36
+ export declare function formatCpuIntensiveOutput(result: CpuIntensiveResult): string;
37
+ //# sourceMappingURL=cpu-intensive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu-intensive.d.ts","sourceRoot":"","sources":["../../src/tools/cpu-intensive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA6B7B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA0B3E"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Tool: get_cpu_intensive_functions
3
+ * Returns functions sorted by CPU time
4
+ */
5
+ import { z } from 'zod';
6
+ import { loadProfile } from '../decoder/decompress.js';
7
+ import { walkTrie, sortByField } from '../decoder/trie-walker.js';
8
+ import { formatTime, formatNumber, formatLocation } from '../utils/formatting.js';
9
+ export const cpuIntensiveSchema = z.object({
10
+ filePath: z.string().describe('Path to the PerfBase profile file'),
11
+ span: z.string().optional().describe('Filter to a specific span name'),
12
+ limit: z.number().int().positive().default(20).describe('Maximum number of results'),
13
+ });
14
+ export async function getCpuIntensiveFunctions(input) {
15
+ const data = await loadProfile(input.filePath);
16
+ const allFunctions = walkTrie(data, input.span);
17
+ // Calculate total CPU time
18
+ const totalCpu = allFunctions.reduce((sum, f) => sum + f.totalCpuTime, 0);
19
+ // Sort by total CPU time
20
+ const sorted = sortByField(allFunctions, 'totalCpuTime', input.limit);
21
+ return {
22
+ functions: sorted.map((f, i) => ({
23
+ rank: i + 1,
24
+ name: f.name,
25
+ callPath: f.callPath,
26
+ location: f.file ? formatLocation(f.file, f.line) : undefined,
27
+ callCount: f.callCount,
28
+ totalCpuTime: formatTime(f.totalCpuTime),
29
+ avgCpuTime: formatTime(f.avgCpuTime),
30
+ percentOfCpu: totalCpu > 0 ? `${((f.totalCpuTime / totalCpu) * 100).toFixed(2)}%` : '0%',
31
+ wallVsCpuRatio: f.totalCpuTime > 0
32
+ ? `${(f.totalWallTime / f.totalCpuTime).toFixed(2)}x`
33
+ : 'N/A',
34
+ })),
35
+ totalCpuTime: formatTime(totalCpu),
36
+ totalFunctions: allFunctions.length,
37
+ };
38
+ }
39
+ export function formatCpuIntensiveOutput(result) {
40
+ const lines = [
41
+ `# CPU-Intensive Functions`,
42
+ ``,
43
+ `Total CPU time: ${result.totalCpuTime}`,
44
+ `Total functions analyzed: ${formatNumber(result.totalFunctions)}`,
45
+ ``,
46
+ `> **Wall vs CPU ratio**: Higher values indicate I/O-bound operations (waiting).`,
47
+ `> A ratio close to 1.0 indicates CPU-bound operations.`,
48
+ ``,
49
+ ];
50
+ for (const f of result.functions) {
51
+ lines.push(`## ${f.rank}. ${f.name}`);
52
+ lines.push(`- **Call Path**: ${f.callPath}`);
53
+ if (f.location) {
54
+ lines.push(`- **Location**: ${f.location}`);
55
+ }
56
+ lines.push(`- **Calls**: ${formatNumber(f.callCount)}`);
57
+ lines.push(`- **Total CPU Time**: ${f.totalCpuTime} (${f.percentOfCpu})`);
58
+ lines.push(`- **Avg CPU Time**: ${f.avgCpuTime}`);
59
+ lines.push(`- **Wall/CPU Ratio**: ${f.wallVsCpuRatio}`);
60
+ lines.push(``);
61
+ }
62
+ return lines.join('\n');
63
+ }
64
+ //# sourceMappingURL=cpu-intensive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cpu-intensive.js","sourceRoot":"","sources":["../../src/tools/cpu-intensive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Tool: get_database_queries
3
+ * Extracts and analyzes database operations from the profile
4
+ */
5
+ import { z } from 'zod';
6
+ import type { DatabaseQuery } from '../decoder/types.js';
7
+ export declare const databaseQueriesSchema: z.ZodObject<{
8
+ filePath: z.ZodString;
9
+ span: z.ZodOptional<z.ZodString>;
10
+ limit: z.ZodDefault<z.ZodNumber>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ filePath: string;
13
+ limit: number;
14
+ span?: string | undefined;
15
+ }, {
16
+ filePath: string;
17
+ span?: string | undefined;
18
+ limit?: number | undefined;
19
+ }>;
20
+ export type DatabaseQueriesInput = z.infer<typeof databaseQueriesSchema>;
21
+ export interface DatabaseQueriesResult {
22
+ queries: DatabaseQuery[];
23
+ totalQueries: number;
24
+ totalTime: string;
25
+ avgTimePerQuery: string;
26
+ byType: Record<string, {
27
+ count: number;
28
+ totalTime: string;
29
+ }>;
30
+ }
31
+ export declare function getDatabaseQueries(input: DatabaseQueriesInput): Promise<DatabaseQueriesResult>;
32
+ export declare function formatDatabaseQueriesOutput(result: DatabaseQueriesResult): string;
33
+ //# sourceMappingURL=database-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-queries.d.ts","sourceRoot":"","sources":["../../src/tools/database-queries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEvE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AA4CzE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CA2ChC;AAaD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CA4BjF"}