perf-skill 0.2.1 → 0.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 (50) hide show
  1. package/.claude-plugin/README.md +53 -0
  2. package/.claude-plugin/marketplace.json +58 -0
  3. package/.claude-plugin/plugin.json +40 -0
  4. package/CLAUDE.md +164 -0
  5. package/README.md +128 -109
  6. package/SKILL.md +86 -130
  7. package/dist/cli/init.d.ts +19 -3
  8. package/dist/cli/init.d.ts.map +1 -1
  9. package/dist/cli/init.js +107 -10
  10. package/dist/cli/init.js.map +1 -1
  11. package/dist/cli/main.js +72 -49
  12. package/dist/cli/main.js.map +1 -1
  13. package/dist/cli/platforms.d.ts +28 -0
  14. package/dist/cli/platforms.d.ts.map +1 -0
  15. package/dist/cli/platforms.js +238 -0
  16. package/dist/cli/platforms.js.map +1 -0
  17. package/dist/cli/template.d.ts +16 -0
  18. package/dist/cli/template.d.ts.map +1 -0
  19. package/dist/cli/template.js +157 -0
  20. package/dist/cli/template.js.map +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +71 -36
  23. package/dist/index.js.map +1 -1
  24. package/dist/llm/client.d.ts +6 -0
  25. package/dist/llm/client.d.ts.map +1 -1
  26. package/dist/llm/client.js +11 -2
  27. package/dist/llm/client.js.map +1 -1
  28. package/dist/llm/index.d.ts +1 -1
  29. package/dist/llm/index.d.ts.map +1 -1
  30. package/dist/llm/index.js +1 -1
  31. package/dist/llm/index.js.map +1 -1
  32. package/dist/skill/handler.d.ts +7 -0
  33. package/dist/skill/handler.d.ts.map +1 -1
  34. package/dist/skill/handler.js +24 -1
  35. package/dist/skill/handler.js.map +1 -1
  36. package/dist/skill/manifest.d.ts +4 -0
  37. package/dist/skill/manifest.d.ts.map +1 -1
  38. package/dist/skill/manifest.js +60 -39
  39. package/dist/skill/manifest.js.map +1 -1
  40. package/dist/types.d.ts +2 -0
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +12 -9
  43. package/dist/server/http.d.ts +0 -27
  44. package/dist/server/http.d.ts.map +0 -1
  45. package/dist/server/http.js +0 -285
  46. package/dist/server/http.js.map +0 -1
  47. package/dist/server/utils.d.ts +0 -15
  48. package/dist/server/utils.d.ts.map +0 -1
  49. package/dist/server/utils.js +0 -71
  50. package/dist/server/utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/skill/manifest.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,aAgL5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAqCnD"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/skill/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkBjD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,aAiL5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAqCnD"}
@@ -1,18 +1,38 @@
1
1
  /**
2
2
  * Skill manifest for AI platform integration
3
+ *
4
+ * This skill provides deterministic evidence extraction from pprof profiles.
5
+ * The host agent (Claude/Cursor/etc.) should use this evidence to generate
6
+ * optimization recommendations - the skill itself does not require LLM access.
3
7
  */
8
+ import { readFileSync } from "node:fs";
9
+ import { join, dirname } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+ // Read version from package.json
12
+ function getPackageVersion() {
13
+ try {
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ const pkgPath = join(__dirname, "..", "..", "package.json");
17
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
18
+ return pkg.version || "0.0.0";
19
+ }
20
+ catch {
21
+ return "0.0.0";
22
+ }
23
+ }
4
24
  /**
5
25
  * Full skill manifest with JSON schemas
6
26
  */
7
27
  export const SKILL_MANIFEST = {
8
- name: "pprof_ai_analyzer",
9
- description: "Convert pprof .pb.gz profiles to Markdown and generate AI-powered performance recommendations. Supports CPU and heap profiling analysis, profile comparison/diff, and actionable optimization suggestions.",
10
- version: "1.0.0",
28
+ name: "pprof_evidence_extractor",
29
+ description: "Convert pprof .pb.gz profiles to structured Markdown and JSON evidence for performance analysis. Produces deterministic hotspots, call paths, and metrics that can be used by any agent to generate optimization recommendations. No external API dependencies required.",
30
+ version: getPackageVersion(),
11
31
  inputSchema: {
12
32
  type: "object",
13
33
  oneOf: [
14
34
  {
15
- title: "Analyze Single Profile",
35
+ title: "Convert Profile to Evidence",
16
36
  properties: {
17
37
  action: { type: "string", const: "analyze" },
18
38
  profile_base64: {
@@ -27,30 +47,29 @@ export const SKILL_MANIFEST = {
27
47
  type: "string",
28
48
  enum: ["summary", "detailed", "adaptive"],
29
49
  default: "adaptive",
50
+ description: "Output format for the markdown report",
30
51
  },
31
52
  profile_type: {
32
53
  type: "string",
33
54
  enum: ["cpu", "heap", "auto"],
34
55
  default: "auto",
56
+ description: "Type of profile (auto-detected if not specified)",
35
57
  },
36
58
  max_hotspots: {
37
59
  type: "integer",
38
60
  minimum: 1,
39
61
  maximum: 50,
40
62
  default: 10,
63
+ description: "Maximum number of hotspots to include in output",
41
64
  },
42
65
  include_source: {
43
66
  type: "boolean",
44
67
  default: false,
45
- },
46
- mode: {
47
- type: "string",
48
- enum: ["convert-only", "analyze"],
49
- default: "analyze",
50
- description: "convert-only skips LLM analysis",
68
+ description: "Include source code snippets (requires source_dir)",
51
69
  },
52
70
  context: {
53
71
  type: "object",
72
+ description: "Optional context to include in the output",
54
73
  properties: {
55
74
  service_name: { type: "string" },
56
75
  scenario: { type: "string" },
@@ -83,6 +102,7 @@ export const SKILL_MANIFEST = {
83
102
  type: "string",
84
103
  enum: ["none", "scale-to-base-total", "per-second"],
85
104
  default: "scale-to-base-total",
105
+ description: "Normalization mode for comparing profiles of different durations",
86
106
  },
87
107
  max_regressions: {
88
108
  type: "integer",
@@ -103,71 +123,62 @@ export const SKILL_MANIFEST = {
103
123
  },
104
124
  outputSchema: {
105
125
  type: "object",
126
+ description: "Structured evidence for performance analysis. Use this data to generate recommendations.",
106
127
  properties: {
107
128
  markdown: {
108
129
  type: "string",
109
- description: "Full markdown report",
130
+ description: "Human-readable markdown report with hotspots and call paths",
110
131
  },
111
132
  profile_meta: {
112
133
  type: "object",
134
+ description: "Metadata about the profile",
113
135
  properties: {
114
136
  type: { type: "string", enum: ["cpu", "heap"] },
115
137
  duration_sec: { type: "number" },
116
138
  samples: { type: "integer" },
117
139
  sample_type: { type: "string" },
118
140
  unit: { type: "string" },
141
+ total_value: { type: "number" },
119
142
  },
120
143
  },
121
144
  hotspots: {
122
145
  type: "array",
146
+ description: "Top functions by resource consumption, ranked by impact",
123
147
  items: {
124
148
  type: "object",
125
149
  properties: {
126
- rank: { type: "integer" },
127
- function: { type: "string" },
128
- self_pct: { type: "number" },
129
- cum_pct: { type: "number" },
130
- location: { type: "string" },
131
- call_path: { type: "array", items: { type: "string" } },
150
+ rank: { type: "integer", description: "Rank by impact (1 = highest)" },
151
+ function: { type: "string", description: "Function name" },
152
+ self_pct: { type: "number", description: "Percentage of total spent in this function only" },
153
+ cum_pct: { type: "number", description: "Percentage including callees" },
154
+ self_value: { type: "number", description: "Absolute value (samples or bytes)" },
155
+ cum_value: { type: "number" },
156
+ location: { type: "string", description: "Source file:line if available" },
157
+ call_path: { type: "array", items: { type: "string" }, description: "Call stack from root" },
158
+ callers: { type: "array", items: { type: "string" } },
159
+ callees: { type: "array", items: { type: "string" } },
132
160
  },
133
161
  required: ["rank", "function"],
134
162
  },
135
163
  },
136
- recommendations: {
137
- type: "array",
138
- items: {
139
- type: "object",
140
- properties: {
141
- title: { type: "string" },
142
- rationale: { type: "string" },
143
- steps: { type: "array", items: { type: "string" } },
144
- expected_impact: { type: "string", enum: ["high", "medium", "low"] },
145
- risk: { type: "string", enum: ["high", "medium", "low"] },
146
- confidence: { type: "number", minimum: 0, maximum: 1 },
147
- },
148
- required: ["title", "rationale", "steps", "expected_impact", "risk", "confidence"],
149
- },
150
- },
151
- next_steps: {
152
- type: "array",
153
- items: { type: "string" },
154
- },
155
164
  // Diff-specific fields
156
165
  regressions: {
157
166
  type: "array",
167
+ description: "Functions that got slower (for diff analysis)",
158
168
  items: {
159
169
  type: "object",
160
170
  properties: {
161
171
  rank: { type: "integer" },
162
172
  function: { type: "string" },
163
- delta_self: { type: "number" },
164
- delta_self_pct: { type: "number" },
173
+ delta_self: { type: "number", description: "Change in self value" },
174
+ delta_self_pct: { type: "number", description: "Change as percentage of total" },
165
175
  change_type: { type: "string", enum: ["regression", "improvement", "new", "removed"] },
166
176
  },
167
177
  },
168
178
  },
169
179
  improvements: {
170
180
  type: "array",
181
+ description: "Functions that got faster (for diff analysis)",
171
182
  items: {
172
183
  type: "object",
173
184
  },
@@ -175,7 +186,17 @@ export const SKILL_MANIFEST = {
175
186
  summary: {
176
187
  type: "array",
177
188
  items: { type: "string" },
178
- description: "Executive summary points for diff",
189
+ description: "Executive summary points (for diff analysis)",
190
+ },
191
+ metrics: {
192
+ type: "object",
193
+ description: "Processing metrics",
194
+ properties: {
195
+ convertMs: { type: "number" },
196
+ totalMs: { type: "number" },
197
+ profileBytes: { type: "number" },
198
+ markdownChars: { type: "number" },
199
+ },
179
200
  },
180
201
  },
181
202
  required: ["markdown", "hotspots"],
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/skill/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/skill/manifest.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -152,6 +152,8 @@ export interface AnalyzeResult {
152
152
  llmJson?: unknown;
153
153
  /** LLM parse errors if any */
154
154
  llmErrors?: string[];
155
+ /** LLM analysis status */
156
+ llmStatus?: "success" | "failed" | "skipped";
155
157
  };
156
158
  /** Processing metrics */
157
159
  metrics?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "perf-skill",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "AI Skill for pprof profile analysis - convert .pb.gz to Markdown and generate structured performance recommendations",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -20,13 +20,18 @@
20
20
  "scripts": {
21
21
  "build": "tsc",
22
22
  "dev": "tsc --watch",
23
- "start": "node dist/server/http.js",
24
23
  "cli": "node --import tsx src/cli/main.ts",
25
24
  "test": "node --test --import tsx 'test/**/*.test.ts'",
26
25
  "lint": "eslint src --ext .ts",
27
26
  "clean": "rm -rf dist",
28
27
  "update-prompts": "node --import tsx scripts/update-prompt-fixtures.ts",
29
- "prepublishOnly": "npm run build"
28
+ "prepublishOnly": "npm run build",
29
+ "commit": "yarn git-cz"
30
+ },
31
+ "config": {
32
+ "commitizen": {
33
+ "path": "cz-conventional-changelog"
34
+ }
30
35
  },
31
36
  "keywords": [
32
37
  "pprof",
@@ -48,12 +53,7 @@
48
53
  "license": "MIT",
49
54
  "dependencies": {
50
55
  "@datadog/pprof": "^5.13.2",
51
- "@fastify/cors": "^11.2.0",
52
- "@fastify/helmet": "^13.0.2",
53
- "@fastify/multipart": "^9.4.0",
54
- "@fastify/rate-limit": "^10.3.0",
55
56
  "commander": "^14.0.3",
56
- "fastify": "^5.7.3",
57
57
  "openai": "^6.17.0",
58
58
  "pprof-format": "^2.2.1",
59
59
  "pprof-to-md": "^0.2.0",
@@ -63,6 +63,7 @@
63
63
  "@types/node": "^25.2.0",
64
64
  "@typescript-eslint/eslint-plugin": "^8.54.0",
65
65
  "@typescript-eslint/parser": "^8.54.0",
66
+ "commitizen": "^4.3.1",
66
67
  "eslint": "^9.39.2",
67
68
  "tsx": "^4.21.0",
68
69
  "typescript": "^5.9.3"
@@ -70,6 +71,8 @@
70
71
  "files": [
71
72
  "dist",
72
73
  "SKILL.md",
73
- "README.md"
74
+ "README.md",
75
+ "CLAUDE.md",
76
+ ".claude-plugin"
74
77
  ]
75
78
  }
@@ -1,27 +0,0 @@
1
- /**
2
- * HTTP API server for perf-skill
3
- */
4
- import { type FastifyInstance } from "fastify";
5
- import { analyze, diff } from "../index.js";
6
- export interface ServerOptions {
7
- port?: number;
8
- host?: string;
9
- maxFileSize?: number;
10
- enableCors?: boolean;
11
- corsOrigin?: string | string[] | boolean;
12
- enableHelmet?: boolean;
13
- enableRateLimit?: boolean;
14
- rateLimitMax?: number;
15
- rateLimitWindowMs?: number;
16
- analyzeFn?: typeof analyze;
17
- diffFn?: typeof diff;
18
- }
19
- /**
20
- * Create and configure Fastify server
21
- */
22
- export declare function createServer(options?: ServerOptions): Promise<FastifyInstance>;
23
- /**
24
- * Start the HTTP server
25
- */
26
- export declare function startServer(options?: ServerOptions): Promise<FastifyInstance>;
27
- //# sourceMappingURL=http.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAKxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAY5C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqSxF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiBvF"}
@@ -1,285 +0,0 @@
1
- /**
2
- * HTTP API server for perf-skill
3
- */
4
- import Fastify from "fastify";
5
- import multipart from "@fastify/multipart";
6
- import cors from "@fastify/cors";
7
- import helmet from "@fastify/helmet";
8
- import rateLimit from "@fastify/rate-limit";
9
- import { analyze, diff } from "../index.js";
10
- import { logger } from "../utils/logger.js";
11
- import { checkSizeLimit, DEFAULT_LIMITS } from "../utils/limits.js";
12
- import { cleanupUploadedFiles, parseOptionsField, parseBoolean, parseNumber, resolveMultipartFile, } from "./utils.js";
13
- /**
14
- * Create and configure Fastify server
15
- */
16
- export async function createServer(options = {}) {
17
- const server = Fastify({
18
- logger: process.env.LOG_FORMAT === "json",
19
- });
20
- const analyzeFn = options.analyzeFn ?? analyze;
21
- const diffFn = options.diffFn ?? diff;
22
- const corsEnabled = options.enableCors ?? parseBoolean(process.env.CORS_ENABLED, true);
23
- const helmetEnabled = options.enableHelmet ?? parseBoolean(process.env.HELMET_ENABLED, true);
24
- const rateLimitEnabled = options.enableRateLimit ?? parseBoolean(process.env.RATE_LIMIT_ENABLED, true);
25
- if (corsEnabled) {
26
- const originValue = options.corsOrigin ?? process.env.CORS_ORIGIN ?? true;
27
- const origin = typeof originValue === "string"
28
- ? originValue === "*"
29
- ? true
30
- : originValue.split(",").map((item) => item.trim()).filter(Boolean)
31
- : originValue;
32
- await server.register(cors, { origin });
33
- }
34
- if (helmetEnabled) {
35
- await server.register(helmet);
36
- }
37
- if (rateLimitEnabled) {
38
- const max = options.rateLimitMax ?? parseNumber(process.env.RATE_LIMIT_MAX, 60);
39
- const timeWindow = options.rateLimitWindowMs ?? parseNumber(process.env.RATE_LIMIT_WINDOW_MS, 60_000);
40
- if (max > 0) {
41
- await server.register(rateLimit, { max, timeWindow });
42
- }
43
- }
44
- // Register multipart plugin for file uploads
45
- await server.register(multipart, {
46
- attachFieldsToBody: true,
47
- limits: {
48
- fileSize: options.maxFileSize ?? DEFAULT_LIMITS.maxProfileBytes,
49
- },
50
- });
51
- // Health check
52
- server.get("/health", async () => {
53
- return { status: "ok", timestamp: new Date().toISOString() };
54
- });
55
- // API info
56
- server.get("/v1", async () => {
57
- return {
58
- name: "perf-skill",
59
- version: "1.0.0",
60
- endpoints: {
61
- analyze: "POST /v1/pprof/analyze",
62
- diff: "POST /v1/pprof/diff",
63
- convert: "POST /v1/pprof/convert",
64
- },
65
- };
66
- });
67
- // Analyze endpoint
68
- server.post("/v1/pprof/analyze", async (request, reply) => {
69
- const startTime = performance.now();
70
- try {
71
- // Handle multipart file upload
72
- const data = await resolveMultipartFile(request, "file");
73
- if (!data) {
74
- return reply.status(400).send({
75
- success: false,
76
- error: {
77
- code: "MISSING_FILE",
78
- message: "Profile file is required",
79
- },
80
- });
81
- }
82
- const profileBuffer = await data.toBuffer();
83
- checkSizeLimit(profileBuffer, DEFAULT_LIMITS.maxProfileBytes, "Profile");
84
- let options;
85
- try {
86
- options = parseOptionsField(request.body?.options);
87
- }
88
- catch (error) {
89
- return reply.status(400).send({
90
- success: false,
91
- error: {
92
- code: "INVALID_OPTIONS",
93
- message: error instanceof Error ? error.message : "Invalid options",
94
- },
95
- });
96
- }
97
- // Default to not including source in server mode for security
98
- if (options.includeSource === undefined) {
99
- options.includeSource = false;
100
- }
101
- logger.info("Analyze request received", {
102
- filename: data.filename,
103
- size: profileBuffer.length,
104
- mode: options.mode,
105
- });
106
- const result = await analyzeFn(profileBuffer, options);
107
- const response = {
108
- success: true,
109
- data: result,
110
- };
111
- logger.info("Analyze request completed", {
112
- durationMs: Math.round(performance.now() - startTime),
113
- hotspotsCount: result.hotspots.length,
114
- });
115
- return response;
116
- }
117
- catch (error) {
118
- logger.error("Analyze request failed", {
119
- error: error instanceof Error ? error.message : String(error),
120
- });
121
- return reply.status(500).send({
122
- success: false,
123
- error: {
124
- code: "ANALYSIS_ERROR",
125
- message: error instanceof Error ? error.message : "Analysis failed",
126
- },
127
- });
128
- }
129
- });
130
- // Convert-only endpoint (no LLM)
131
- server.post("/v1/pprof/convert", async (request, reply) => {
132
- try {
133
- const data = await resolveMultipartFile(request, "file");
134
- if (!data) {
135
- return reply.status(400).send({
136
- success: false,
137
- error: {
138
- code: "MISSING_FILE",
139
- message: "Profile file is required",
140
- },
141
- });
142
- }
143
- const profileBuffer = await data.toBuffer();
144
- checkSizeLimit(profileBuffer, DEFAULT_LIMITS.maxProfileBytes, "Profile");
145
- let parsedOptions;
146
- try {
147
- parsedOptions = parseOptionsField(request.body?.options);
148
- }
149
- catch (error) {
150
- return reply.status(400).send({
151
- success: false,
152
- error: {
153
- code: "INVALID_OPTIONS",
154
- message: error instanceof Error ? error.message : "Invalid options",
155
- },
156
- });
157
- }
158
- const options = {
159
- ...parsedOptions,
160
- mode: "convert-only",
161
- includeSource: false,
162
- };
163
- const result = await analyzeFn(profileBuffer, options);
164
- return {
165
- success: true,
166
- data: result,
167
- };
168
- }
169
- catch (error) {
170
- return reply.status(500).send({
171
- success: false,
172
- error: {
173
- code: "CONVERT_ERROR",
174
- message: error instanceof Error ? error.message : "Conversion failed",
175
- },
176
- });
177
- }
178
- });
179
- // Diff endpoint
180
- server.post("/v1/pprof/diff", async (request, reply) => {
181
- const startTime = performance.now();
182
- let files;
183
- try {
184
- // Expect two files: base and current
185
- files = await request.saveRequestFiles();
186
- if (files.length < 2) {
187
- return reply.status(400).send({
188
- success: false,
189
- error: {
190
- code: "MISSING_FILES",
191
- message: "Two profile files required (base and current)",
192
- },
193
- });
194
- }
195
- const baseFile = files.find(f => f.fieldname === "base") || files[0];
196
- const currentFile = files.find(f => f.fieldname === "current") || files[1];
197
- const { readFile } = await import("node:fs/promises");
198
- const baseBuffer = await readFile(baseFile.filepath);
199
- const currentBuffer = await readFile(currentFile.filepath);
200
- checkSizeLimit(baseBuffer, DEFAULT_LIMITS.maxProfileBytes, "Base profile");
201
- checkSizeLimit(currentBuffer, DEFAULT_LIMITS.maxProfileBytes, "Current profile");
202
- let options;
203
- try {
204
- options = parseOptionsField(request.body?.options);
205
- }
206
- catch (error) {
207
- return reply.status(400).send({
208
- success: false,
209
- error: {
210
- code: "INVALID_OPTIONS",
211
- message: error instanceof Error ? error.message : "Invalid options",
212
- },
213
- });
214
- }
215
- logger.info("Diff request received", {
216
- baseSize: baseBuffer.length,
217
- currentSize: currentBuffer.length,
218
- });
219
- const result = await diffFn(baseBuffer, currentBuffer, options);
220
- logger.info("Diff request completed", {
221
- durationMs: Math.round(performance.now() - startTime),
222
- regressions: result.regressions.length,
223
- improvements: result.improvements.length,
224
- });
225
- return {
226
- success: true,
227
- data: result,
228
- };
229
- }
230
- catch (error) {
231
- logger.error("Diff request failed", {
232
- error: error instanceof Error ? error.message : String(error),
233
- });
234
- return reply.status(500).send({
235
- success: false,
236
- error: {
237
- code: "DIFF_ERROR",
238
- message: error instanceof Error ? error.message : "Diff analysis failed",
239
- },
240
- });
241
- }
242
- finally {
243
- if (files) {
244
- await cleanupUploadedFiles(files);
245
- }
246
- }
247
- });
248
- // Error handler
249
- server.setErrorHandler((error, request, reply) => {
250
- const message = error instanceof Error ? error.message : String(error);
251
- logger.error("Server error", {
252
- error: message,
253
- url: request.url,
254
- });
255
- reply.status(500).send({
256
- success: false,
257
- error: {
258
- code: "INTERNAL_ERROR",
259
- message: "Internal server error",
260
- },
261
- });
262
- });
263
- return server;
264
- }
265
- /**
266
- * Start the HTTP server
267
- */
268
- export async function startServer(options = {}) {
269
- const server = await createServer(options);
270
- const port = options.port ?? 3000;
271
- const host = options.host ?? "0.0.0.0";
272
- try {
273
- await server.listen({ port, host });
274
- console.log(`perf-skill server listening on http://${host}:${port}`);
275
- console.log(`API docs: http://${host}:${port}/v1`);
276
- return server;
277
- }
278
- catch (error) {
279
- logger.error("Failed to start server", {
280
- error: error instanceof Error ? error.message : String(error),
281
- });
282
- throw error;
283
- }
284
- }
285
- //# sourceMappingURL=http.js.map