UNPKG

bug-report-mcp-server

Version:

AI协作档案分析器 - MCP服务器,基于 Model Context Protocol 的 AI 协作档案分析服务器,专门用于分析 Bug 修复相关的聊天内容

765 lines (743 loc) 26.2 kB
#!/usr/bin/env node 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); });