bug-report-mcp-server
Version:
AI协作档案分析器 - MCP服务器,基于 Model Context Protocol 的 AI 协作档案分析服务器,专门用于分析 Bug 修复相关的聊天内容
765 lines (743 loc) • 26.2 kB
JavaScript
import { createRequire } from "module"; const require = createRequire(import.meta.url);
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
// src/index.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema
} from "@modelcontextprotocol/sdk/types.js";
// src/config.ts
var DEFAULT_AI_CONFIG = {
provider: "deepseek",
apiKey: process.env.DEEPSEEK_API_KEY,
baseUrl: "https://api.deepseek.com/v1/chat/completions",
model: "deepseek-chat",
temperature: 0.7,
maxTokens: 2e3
};
var DEFAULT_ANALYSIS_CONFIG = {
enableTechStack: true,
enableBusiness: true,
enableTags: true,
enableAIThoughts: true,
enableProblems: true,
enableSummary: true
};
var loadConfig = /* @__PURE__ */ __name(async () => {
return {
ai: DEFAULT_AI_CONFIG,
analysis: DEFAULT_ANALYSIS_CONFIG
};
}, "loadConfig");
var getAIConfig = /* @__PURE__ */ __name(async () => {
const config = await loadConfig();
return config.ai;
}, "getAIConfig");
// src/ai-service.ts
var AIService = class {
static {
__name(this, "AIService");
}
config;
constructor(config) {
this.config = config || {
provider: "deepseek",
apiKey: "",
baseUrl: "https://api.deepseek.com/v1/chat/completions",
model: "deepseek-chat",
temperature: 0.7,
maxTokens: 2e3
};
}
// 初始化配置
async initialize() {
this.config = await getAIConfig();
}
// 调用AI API
async callAPI(prompt, systemPrompt) {
try {
const messages = [];
if (systemPrompt) {
messages.push({
role: "system",
content: systemPrompt
});
}
messages.push({
role: "user",
content: prompt
});
const requestBody = {
model: this.config.model || "deepseek-chat",
messages,
temperature: this.config.temperature || 0.7,
max_tokens: this.config.maxTokens || 2e3
};
const response = await fetch(this.getApiUrl(), {
method: "POST",
headers: this.getHeaders(),
body: JSON.stringify(requestBody)
});
if (!response.ok) {
throw new Error(`AI API\u8BF7\u6C42\u5931\u8D25: ${response.status} ${response.statusText}`);
}
const data = await response.json();
return data.choices[0]?.message?.content || "";
} catch (error) {
console.error("\u8C03\u7528AI API\u65F6\u51FA\u9519:", error);
throw error;
}
}
// 获取API URL
getApiUrl() {
if (this.config.baseUrl) {
return this.config.baseUrl;
}
switch (this.config.provider) {
case "deepseek":
return "https://api.deepseek.com/v1/chat/completions";
case "openai":
return "https://api.openai.com/v1/chat/completions";
case "claude":
return "https://api.anthropic.com/v1/messages";
default:
return this.config.baseUrl || "https://api.deepseek.com/v1/chat/completions";
}
}
// 获取请求头
getHeaders() {
const headers = {
"Content-Type": "application/json"
};
switch (this.config.provider) {
case "deepseek":
case "openai":
headers["Authorization"] = `Bearer ${this.config.apiKey}`;
break;
case "claude":
headers["x-api-key"] = this.config.apiKey;
headers["anthropic-version"] = "2023-06-01";
break;
default:
headers["Authorization"] = `Bearer ${this.config.apiKey}`;
break;
}
return headers;
}
// 批量调用API(并行处理)
async batchCall(prompts) {
const promises = prompts.map(
({ prompt, systemPrompt }) => this.callAPI(prompt, systemPrompt)
);
const results = await Promise.allSettled(promises);
return results.map(
(result) => result.status === "fulfilled" ? result.value : "\u5206\u6790\u5931\u8D25"
);
}
// 流式调用(如果支持)
async streamCall(prompt, systemPrompt, onChunk) {
return this.callAPI(prompt, systemPrompt);
}
// 获取当前配置
getConfig() {
return { ...this.config };
}
// 更新配置
updateConfig(config) {
this.config = { ...this.config, ...config };
}
// 测试连接
async testConnection() {
try {
const testPrompt = '\u8BF7\u56DE\u590D"\u8FDE\u63A5\u6210\u529F"';
const response = await this.callAPI(testPrompt);
if (response && response.trim().length > 0) {
return {
success: true,
message: `\u8FDE\u63A5\u6210\u529F\uFF0CAI\u54CD\u5E94: ${response.substring(0, 50)}...`
};
} else {
return {
success: false,
message: "AI\u54CD\u5E94\u4E3A\u7A7A"
};
}
} catch (error) {
return {
success: false,
message: `\u8FDE\u63A5\u5931\u8D25: ${error instanceof Error ? error.message : String(error)}`
};
}
}
// 估算token数量(简化实现)
estimateTokens(text) {
return Math.ceil(text.length / 4);
}
// 检查是否超过token限制
checkTokenLimit(text) {
const estimatedTokens = this.estimateTokens(text);
const maxTokens = this.config.maxTokens || 2e3;
return {
withinLimit: estimatedTokens <= maxTokens * 0.8,
// 留20%余量
estimatedTokens,
maxTokens
};
}
};
var createAIService = /* @__PURE__ */ __name(async () => {
const service = new AIService();
await service.initialize();
return service;
}, "createAIService");
var aiServiceInstance = null;
var getAIService = /* @__PURE__ */ __name(async () => {
if (!aiServiceInstance) {
aiServiceInstance = await createAIService();
}
return aiServiceInstance;
}, "getAIService");
// src/analyzers.ts
var BaseAnalyzer = class {
static {
__name(this, "BaseAnalyzer");
}
aiService;
config;
constructor(aiService, config) {
this.aiService = aiService;
this.config = config;
}
// 解析JSON响应
parseJSONResponse(response, fallback) {
try {
const jsonMatch = response.match(/\{[\s\S]*\}|\[[\s\S]*\]/);
if (jsonMatch) {
return JSON.parse(jsonMatch[0]);
}
return fallback;
} catch (error) {
console.error("JSON\u89E3\u6790\u5931\u8D25:", error);
return fallback;
}
}
};
var TechStackAnalyzer = class extends BaseAnalyzer {
static {
__name(this, "TechStackAnalyzer");
}
async analyze(content) {
const prompt = this.config.customPrompts?.techStack || `\u8BF7\u5206\u6790\u4EE5\u4E0B\u5185\u5BB9\u4E2D\u6D89\u53CA\u7684\u4E3B\u8981\u6280\u672F\u6808\uFF0C\u5E76\u6309\u7167\u4EE5\u4E0BJSON\u683C\u5F0F\u8FD4\u56DE\uFF1A
\u5185\u5BB9\uFF1A
${content}
\u8BF7\u8FD4\u56DEJSON\u683C\u5F0F\u7684\u5206\u6790\u7ED3\u679C\uFF1A
{
"primaryStack": "\u4E3B\u8981\u6280\u672F\u6808\u7C7B\u578B(frontend/backend/mobile/devops/database/ai_ml/blockchain/game_dev/embedded/testing/design/other)"
}`;
try {
const response = await this.aiService.callAPI(prompt);
return this.parseJSONResponse(response, {
primaryStack: "other" /* OTHER */
});
} catch (error) {
console.error("\u6280\u672F\u6808\u5206\u6790\u5931\u8D25:", error);
return {
primaryStack: "other" /* OTHER */
};
}
}
};
var BusinessAnalyzer = class extends BaseAnalyzer {
static {
__name(this, "BusinessAnalyzer");
}
async analyze(content) {
const prompt = this.config.customPrompts?.business || `\u8BF7\u5206\u6790\u4EE5\u4E0B\u5185\u5BB9\u4E2D\u6D89\u53CA\u7684\u4E1A\u52A1\u9886\u57DF\uFF0C\u5E76\u6309\u7167\u4EE5\u4E0BJSON\u683C\u5F0F\u8FD4\u56DE\uFF1A
\u5185\u5BB9\uFF1A
${content}
\u8BF7\u8FD4\u56DEJSON\u683C\u5F0F\u7684\u5206\u6790\u7ED3\u679C\uFF1A
{
"business": "\u4E1A\u52A1\u9886\u57DF\u63CF\u8FF0"
}`;
try {
const response = await this.aiService.callAPI(prompt);
return this.parseJSONResponse(response, {
business: ""
});
} catch (error) {
console.error("\u4E1A\u52A1\u5206\u6790\u5931\u8D25:", error);
return {
business: ""
};
}
}
};
var TagAnalyzer = class extends BaseAnalyzer {
static {
__name(this, "TagAnalyzer");
}
async analyze(content) {
const prompt = this.config.customPrompts?.tags || `\u8BF7\u5206\u6790\u4EE5\u4E0B\u5185\u5BB9\u5E76\u751F\u6210\u76F8\u5173\u6807\u7B7E\uFF0C\u6309\u7167\u4EE5\u4E0BJSON\u683C\u5F0F\u8FD4\u56DE\uFF1A
\u5185\u5BB9\uFF1A
${content}
\u8BF7\u8FD4\u56DEJSON\u683C\u5F0F\u7684\u5206\u6790\u7ED3\u679C\uFF1A
{
"tags": ["\u6807\u7B7E\u5217\u8868"]
}`;
try {
const response = await this.aiService.callAPI(prompt);
return this.parseJSONResponse(response, {
tags: []
});
} catch (error) {
console.error("\u6807\u7B7E\u5206\u6790\u5931\u8D25:", error);
return {
tags: []
};
}
}
};
var AIThoughtAnalyzer = class extends BaseAnalyzer {
static {
__name(this, "AIThoughtAnalyzer");
}
async analyze(content) {
const prompt = this.config.customPrompts?.aiThoughts || `\u8BF7\u5206\u6790\u4EE5\u4E0BAI\u5BF9\u8BDD\u5185\u5BB9\u4E2D\u7684\u5173\u952E\u95EE\u9898\uFF0C\u6309\u7167\u4EE5\u4E0BJSON\u683C\u5F0F\u8FD4\u56DE\uFF1A
\u5185\u5BB9\uFF1A
${content}
\u8BF7\u8FD4\u56DEJSON\u683C\u5F0F\u7684\u5206\u6790\u7ED3\u679C\uFF1A
{
"keyQuestions": ["\u5173\u952E\u95EE\u9898\u5217\u8868"]
}`;
try {
const response = await this.aiService.callAPI(prompt);
return this.parseJSONResponse(response, {
keyQuestions: []
});
} catch (error) {
console.error("AI\u601D\u8003\u5206\u6790\u5931\u8D25:", error);
return {
keyQuestions: []
};
}
}
};
var ProblemClassifier = class extends BaseAnalyzer {
static {
__name(this, "ProblemClassifier");
}
async analyze(content) {
const prompt = this.config.customPrompts?.problems || `\u8BF7\u5206\u6790\u4EE5\u4E0B\u5185\u5BB9\u4E2D\u7684\u95EE\u9898\u5E76\u8FDB\u884C\u5206\u7C7B\uFF0C\u8FD4\u56DEJSON\u6570\u7EC4\u683C\u5F0F\uFF1A
\u5185\u5BB9\uFF1A
${content}
\u8BF7\u4E3A\u6BCF\u4E2A\u8BC6\u522B\u5230\u7684\u95EE\u9898\u8FD4\u56DE\u4EE5\u4E0BJSON\u683C\u5F0F\uFF1A
[
{
"category": "\u95EE\u9898\u7C7B\u522B(bug_fix/feature_request/performance/security/architecture/code_review/deployment/learning/troubleshooting/optimization/integration/other)"
}
]`;
try {
const response = await this.aiService.callAPI(prompt);
return this.parseJSONResponse(response, []);
} catch (error) {
console.error("\u95EE\u9898\u5206\u7C7B\u5931\u8D25:", error);
return [];
}
}
};
var SummaryAnalyzer = class extends BaseAnalyzer {
static {
__name(this, "SummaryAnalyzer");
}
async analyze(content) {
const prompt = this.config.customPrompts?.summary || `\u8BF7\u5BF9\u4EE5\u4E0B\u5185\u5BB9\u8FDB\u884C\u603B\u7ED3\uFF0C\u6309\u7167\u4EE5\u4E0BJSON\u683C\u5F0F\u8FD4\u56DE\uFF1A
\u5185\u5BB9\uFF1A
${content}
\u8BF7\u8FD4\u56DEJSON\u683C\u5F0F\u7684\u5206\u6790\u7ED3\u679C\uFF1A
{
"summary": "\u5185\u5BB9\u603B\u7ED3"
}`;
try {
const response = await this.aiService.callAPI(prompt);
return this.parseJSONResponse(response, {
summary: ""
});
} catch (error) {
console.error("\u603B\u7ED3\u5206\u6790\u5931\u8D25:", error);
return {
summary: ""
};
}
}
};
var ComprehensiveAnalyzer = class {
static {
__name(this, "ComprehensiveAnalyzer");
}
aiService;
config;
analyzers;
constructor(aiService, config) {
this.aiService = aiService;
this.config = config || {
enableTechStack: true,
enableBusiness: true,
enableTags: true,
enableAIThoughts: true,
enableProblems: true,
enableSummary: true
};
this.analyzers = {
techStack: new TechStackAnalyzer(aiService, this.config),
business: new BusinessAnalyzer(aiService, this.config),
tags: new TagAnalyzer(aiService, this.config),
aiThoughts: new AIThoughtAnalyzer(aiService, this.config),
problems: new ProblemClassifier(aiService, this.config),
summary: new SummaryAnalyzer(aiService, this.config)
};
}
// 执行综合分析
async analyze(content) {
const analysisPromises = [];
const enabledAnalyses = [];
if (this.config.enableTechStack) {
analysisPromises.push(this.analyzers.techStack.analyze(content));
enabledAnalyses.push("techStack");
}
if (this.config.enableBusiness) {
analysisPromises.push(this.analyzers.business.analyze(content));
enabledAnalyses.push("business");
}
if (this.config.enableTags) {
analysisPromises.push(this.analyzers.tags.analyze(content));
enabledAnalyses.push("tags");
}
if (this.config.enableAIThoughts) {
analysisPromises.push(this.analyzers.aiThoughts.analyze(content));
enabledAnalyses.push("aiThoughts");
}
if (this.config.enableProblems) {
analysisPromises.push(this.analyzers.problems.analyze(content));
enabledAnalyses.push("problems");
}
if (this.config.enableSummary) {
analysisPromises.push(this.analyzers.summary.analyze(content));
enabledAnalyses.push("summary");
}
const results = await Promise.allSettled(analysisPromises);
const analysisResult = {};
results.forEach((result, index) => {
const analysisType = enabledAnalyses[index];
if (result.status === "fulfilled") {
analysisResult[analysisType] = result.value;
}
});
return analysisResult;
}
// 更新配置
updateConfig(config) {
this.config = { ...this.config, ...config };
Object.values(this.analyzers).forEach((analyzer) => {
analyzer.config = this.config;
});
}
};
// src/db.ts
import { PrismaClient } from "@prisma/client";
var globalForPrisma = globalThis;
var prisma = globalForPrisma.prisma ?? new PrismaClient({
log: ["query", "info", "warn", "error"]
});
if (false)
globalForPrisma.prisma = prisma;
var db_default = prisma;
// src/database.ts
var createDoc = /* @__PURE__ */ __name(async (title, content) => {
console.log("\u{1F4C4} \u5F00\u59CB\u521B\u5EFA\u6280\u672F\u6587\u6863...");
console.log("\u{1F4CB} \u6587\u6863\u4FE1\u606F:", {
title,
contentLength: content.length
});
try {
console.log("\u{1F517} \u68C0\u67E5\u6570\u636E\u5E93\u8FDE\u63A5\u72B6\u6001...");
await db_default.$connect();
console.log("\u2705 \u6570\u636E\u5E93\u8FDE\u63A5\u6B63\u5E38");
console.log("\u{1F4BE} \u521B\u5EFA\u6587\u6863\u8BB0\u5F55...");
const doc = await db_default.doc.create({
data: {
title,
content
}
});
console.log(`\u2705 \u6280\u672F\u6587\u6863\u5DF2\u521B\u5EFA`);
console.log("\u{1F4CB} \u6587\u6863\u8BE6\u60C5:", {
id: doc.id,
title: doc.title,
createdAt: doc.createdAt
});
return doc.id;
} catch (error) {
console.error("\u274C \u521B\u5EFA\u6280\u672F\u6587\u6863\u65F6\u51FA\u9519:", error);
console.error("\u{1F50D} \u9519\u8BEF\u8BE6\u7EC6\u4FE1\u606F:", {
name: error instanceof Error ? error.name : "Unknown",
message: error instanceof Error ? error.message : String(error),
code: error?.code,
meta: error?.meta
});
throw error;
}
}, "createDoc");
var saveAnalysisResult = /* @__PURE__ */ __name(async (result, chatContent, title, docTitle, docContent) => {
console.log("\u{1F5C4}\uFE0F \u5F00\u59CB\u4FDD\u5B58\u5206\u6790\u7ED3\u679C\u5230\u6570\u636E\u5E93...");
console.log("\u{1F4CA} \u6570\u636E\u6982\u89C8:", {
title,
chatContentLength: chatContent.length,
techStack: result.techStack?.primaryStack,
business: result.business?.business,
problemsCount: result.problems?.length || 0,
hasDoc: !!(docTitle && docContent)
});
try {
console.log("\u{1F517} \u68C0\u67E5\u6570\u636E\u5E93\u8FDE\u63A5\u72B6\u6001...");
await db_default.$connect();
console.log("\u2705 \u6570\u636E\u5E93\u8FDE\u63A5\u6B63\u5E38");
let docId;
if (docTitle && docContent) {
console.log("\u{1F4C4} \u521B\u5EFA\u5173\u8054\u7684\u6280\u672F\u6587\u6863...");
docId = await createDoc(docTitle, docContent);
console.log(`\u2705 \u6280\u672F\u6587\u6863\u521B\u5EFA\u6210\u529F\uFF0CID: ${docId}`);
}
console.log("\u{1F4BE} \u521B\u5EFA\u5206\u6790\u7ED3\u679C\u8BB0\u5F55...");
const analysisResult = await db_default.analysisResult.create({
data: {
title,
chatContent,
// 关联的技术文档ID
docId,
// 技术栈分析
primaryStack: result.techStack?.primaryStack,
// 业务分析
business: result.business?.business,
// 标签分析
tags: result.tags?.tags || [],
// AI思考分析
keyQuestions: result.aiThoughts?.keyQuestions || [],
// 总结
summary: result.summary?.summary,
// 创建关联的问题分类
problems: {
create: (result.problems || []).map((problem) => ({
category: problem.category
}))
}
},
include: {
problems: true,
doc: true
}
});
console.log(`\u2705 \u5206\u6790\u7ED3\u679C\u5DF2\u4FDD\u5B58\u5230\u6570\u636E\u5E93`);
console.log("\u{1F4CB} \u4FDD\u5B58\u8BE6\u60C5:", {
id: analysisResult.id,
createdAt: analysisResult.createdAt,
problemsCreated: analysisResult.problems.length,
title: analysisResult.title,
docId: analysisResult.docId,
docTitle: analysisResult.doc?.title
});
return analysisResult.id;
} catch (error) {
console.error("\u274C \u4FDD\u5B58\u5206\u6790\u7ED3\u679C\u5230\u6570\u636E\u5E93\u65F6\u51FA\u9519:", error);
console.error("\u{1F50D} \u9519\u8BEF\u8BE6\u7EC6\u4FE1\u606F:", {
name: error instanceof Error ? error.name : "Unknown",
message: error instanceof Error ? error.message : String(error),
code: error?.code,
meta: error?.meta
});
try {
await db_default.$queryRaw`SELECT 1`;
console.log("\u2705 \u6570\u636E\u5E93\u8FDE\u63A5\u6D4B\u8BD5\u6210\u529F");
} catch (connectionError) {
console.error("\u274C \u6570\u636E\u5E93\u8FDE\u63A5\u6D4B\u8BD5\u5931\u8D25:", connectionError);
}
throw error;
}
}, "saveAnalysisResult");
var closeDatabaseConnection = /* @__PURE__ */ __name(async () => {
await db_default.$disconnect();
}, "closeDatabaseConnection");
// src/index.ts
var server = new Server(
{
name: "daily-thoughts-analyzer",
version: "3.0.0"
},
{
capabilities: {
tools: {}
}
}
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "bug_summary",
description: "\u5206\u6790Bug\u4FEE\u590D\u76F8\u5173\u7684\u804A\u5929\u5185\u5BB9\uFF0C\u751F\u6210\u5305\u542B\u6280\u672F\u6808\u3001\u4E1A\u52A1\u3001\u6807\u7B7E\u3001AI\u601D\u8003\u3001\u95EE\u9898\u5206\u7C7B\u548C\u603B\u7ED3\u7684\u7EFC\u5408\u5206\u6790\u62A5\u544A\uFF0C\u5E76\u751F\u6210\u6280\u672F\u6587\u6863",
inputSchema: {
type: "object",
properties: {
chatContent: {
type: "string",
description: "\u9700\u8981\u5206\u6790\u7684Bug\u4FEE\u590D\u804A\u5929\u5185\u5BB9"
},
title: {
type: "string",
description: "\u5206\u6790\u62A5\u544A\u7684\u6807\u9898"
},
docTitle: {
type: "string",
description: "\u6280\u672F\u6587\u6863\u7684\u6807\u9898"
},
docContent: {
type: "string",
description: "\u6280\u672F\u6587\u6863\u7684Markdown\u5185\u5BB9"
},
analysisConfig: {
type: "object",
description: "\u5206\u6790\u914D\u7F6E\u9009\u9879",
properties: {
enableTechStack: { type: "boolean", default: true },
enableBusiness: { type: "boolean", default: true },
enableTags: { type: "boolean", default: true },
enableAIThoughts: { type: "boolean", default: true },
enableProblems: { type: "boolean", default: true },
enableSummary: { type: "boolean", default: true }
}
}
},
required: ["chatContent"]
}
}
]
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
switch (name) {
case "bug_summary": {
console.log("\u{1F50D} \u5F00\u59CB\u6267\u884CBug\u4FEE\u590D\u5185\u5BB9\u5206\u6790...");
const {
chatContent,
title,
docTitle,
docContent,
analysisConfig = {}
} = args;
console.log(`\u{1F4DD} Bug\u4FEE\u590D\u5185\u5BB9\u957F\u5EA6: ${chatContent?.length || 0} \u5B57\u7B26`);
console.log(`\u{1F4C1} \u6307\u5B9A\u6807\u9898: ${title || "\u672A\u6307\u5B9A"}`);
console.log(`\u{1F4C4} \u6587\u6863\u6807\u9898: ${docTitle || "\u672A\u6307\u5B9A"}`);
console.log(`\u{1F4DD} \u6587\u6863\u5185\u5BB9\u957F\u5EA6: ${docContent?.length || 0} \u5B57\u7B26`);
console.log(`\u2699\uFE0F \u5206\u6790\u914D\u7F6E:`, analysisConfig);
if (!chatContent) {
console.error("\u274C \u804A\u5929\u5185\u5BB9\u4E3A\u7A7A");
throw new Error("\u804A\u5929\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A");
}
console.log("\u{1F4CB} \u52A0\u8F7D\u914D\u7F6E\u6587\u4EF6...");
const config = await loadConfig();
console.log("\u2705 \u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210");
console.log("\u{1F916} \u521D\u59CB\u5316AI\u670D\u52A1...");
const aiService = await getAIService();
await aiService.initialize();
console.log("\u2705 AI\u670D\u52A1\u521D\u59CB\u5316\u5B8C\u6210");
console.log("\u2699\uFE0F \u5408\u5E76\u5206\u6790\u914D\u7F6E...");
const mergedConfig = {
...config.analysis,
enableTechStack: analysisConfig.enableTechStack ?? config.analysis.enableTechStack,
enableBusiness: analysisConfig.enableBusiness ?? config.analysis.enableBusiness,
enableTags: analysisConfig.enableTags ?? config.analysis.enableTags,
enableAIThoughts: analysisConfig.enableAIThoughts ?? config.analysis.enableAIThoughts,
enableProblems: analysisConfig.enableProblems ?? config.analysis.enableProblems,
enableSummary: analysisConfig.enableSummary ?? config.analysis.enableSummary
};
console.log("\u{1F4CA} \u6700\u7EC8\u5206\u6790\u914D\u7F6E:", mergedConfig);
console.log("\u{1F52C} \u521B\u5EFA\u7EFC\u5408\u5206\u6790\u5668\u5B9E\u4F8B...");
const analyzer = new ComprehensiveAnalyzer(aiService, mergedConfig);
console.log("\u{1F50D} \u5F00\u59CB\u6267\u884C\u7EFC\u5408\u5206\u6790...");
const result = await analyzer.analyze(chatContent);
console.log("\u2705 \u7EFC\u5408\u5206\u6790\u5B8C\u6210");
console.log("\u{1F4CA} \u5206\u6790\u7ED3\u679C\u6982\u89C8:", {
techStack: result.techStack?.primaryStack,
business: result.business?.business,
problemsCount: result.problems?.length || 0
});
console.log("\u2705 \u5206\u6790\u5B8C\u6210");
console.log("\u{1F5C4}\uFE0F \u5F00\u59CB\u4FDD\u5B58\u5230\u6570\u636E\u5E93...");
saveAnalysisResult(result, chatContent, title, docTitle, docContent);
return {
content: [
{
type: "text",
text: `\u2705 Bug\u4FEE\u590D\u5206\u6790\u5B8C\u6210\uFF01
\u{1F4CA} **\u5206\u6790\u7ED3\u679C\u6982\u89C8**:
\u6280\u672F\u6808: ${result.techStack?.primaryStack || "\u672A\u8BC6\u522B"}
\u4E1A\u52A1\u9886\u57DF: ${result.business?.business || "\u672A\u8BC6\u522B"}
\u95EE\u9898\u6570\u91CF: ${result.problems?.length || 0}${docTitle ? `
\u{1F4C4} \u6280\u672F\u6587\u6863: ${docTitle}` : ""}
\u6570\u636E\u5DF2\u4FDD\u5B58\u5230\u6570\u636E\u5E93\u4E2D\u3002`
}
]
};
}
default:
throw new Error(`\u672A\u77E5\u7684\u5DE5\u5177: ${name}`);
}
} catch (error) {
console.error(`\u5DE5\u5177 ${name} \u6267\u884C\u5931\u8D25:`, error);
return {
content: [
{
type: "text",
text: `\u274C \u6267\u884C\u5931\u8D25: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`
}
],
isError: true
};
}
});
var main = /* @__PURE__ */ __name(async () => {
try {
console.error("\u2699\uFE0F \u68C0\u67E5\u914D\u7F6E\u6587\u4EF6...");
const config = await loadConfig();
console.error("\u2705 \u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u6210\u529F");
console.error("\u{1F4CB} \u5F53\u524D\u914D\u7F6E:", {
aiProvider: config.ai.provider,
hasApiKey: !!config.ai.apiKey,
analysisModules: Object.entries(config.analysis).filter(([_, enabled]) => enabled).map(([key]) => key)
});
} catch (configError) {
console.error("\u26A0\uFE0F \u914D\u7F6E\u6587\u4EF6\u52A0\u8F7D\u5931\u8D25:", configError);
}
console.error("\u{1F310} \u542F\u52A8 MCP \u670D\u52A1\u5668...");
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("\u{1F680} AI\u534F\u4F5C\u6863\u6848\u5206\u6790\u5668 v3.0 MCP\u670D\u52A1\u5668\u5DF2\u542F\u52A8");
}, "main");
process.on("SIGINT", async () => {
console.error("\n\u{1F6D1} \u6B63\u5728\u5173\u95ED\u670D\u52A1\u5668...");
try {
await closeDatabaseConnection();
console.error("\u{1F4CA} \u6570\u636E\u5E93\u8FDE\u63A5\u5DF2\u5173\u95ED");
} catch (error) {
console.error("\u274C \u5173\u95ED\u6570\u636E\u5E93\u8FDE\u63A5\u65F6\u51FA\u9519:", error);
}
process.exit(0);
});
main().catch((error) => {
console.error("\u274C \u670D\u52A1\u5668\u542F\u52A8\u5931\u8D25:", error);
process.exit(1);
});