UNPKG

synthia-ai-system

Version:

Synthia Engine AI - 集成LLM的智能构建优化建议

131 lines (103 loc) 24.3 kB
'use strict'; var P = require('openai'); var z = require('chalk'); var k = require('ora'); var fsExtra = require('fs-extra'); var path = require('path'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var P__default = /*#__PURE__*/_interopDefault(P); var z__default = /*#__PURE__*/_interopDefault(z); var k__default = /*#__PURE__*/_interopDefault(k); var x=(p=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(p,{get:(e,i)=>(typeof require<"u"?require:e)[i]}):p)(function(p){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+p+'" is not supported')});var u=class{constructor(e){this.spinner=k__default.default();this.config=e,this.client=new P__default.default({apiKey:e.openai.apiKey,baseURL:e.openai.baseURL});}async sendPrompt(e){this.spinner.start(`\u53D1\u9001${e.type}\u63D0\u793A\u5230LLM...`);let i=Date.now();try{let t=this.buildMessages(e),s=await this.client.chat.completions.create({model:this.config.openai.model||"gpt-4",messages:t,max_tokens:this.config.openai.maxTokens||4e3,temperature:this.config.openai.temperature||.1}),o=Date.now()-i,r={content:s.choices[0]?.message?.content||"",model:s.model,tokens:{prompt:s.usage?.prompt_tokens||0,completion:s.usage?.completion_tokens||0,total:s.usage?.total_tokens||0},responseTime:o,success:!0};return this.spinner.succeed(`LLM\u54CD\u5E94\u63A5\u6536\u5B8C\u6210 (${o}ms)`),r}catch(t){let n=Date.now()-i;return this.spinner.fail(`LLM\u8BF7\u6C42\u5931\u8D25 (${n}ms)`),console.error(z__default.default.red("LLM\u9519\u8BEF:"),t),{content:"",model:this.config.openai.model||"gpt-4",tokens:{prompt:0,completion:0,total:0},responseTime:n,success:false,error:t instanceof Error?t.message:"Unknown error"}}}async analyzeCode(e,i,t){let s={type:"analysis",content:this.buildCodeAnalysisPrompt(e,i),context:t,input:{code:e},expectedFormat:"json"};return this.sendPrompt(s)}async generateOptimizationSuggestions(e,i){let t={type:"optimization",content:this.buildOptimizationPrompt(e),context:i,input:{stats:e},expectedFormat:"json"};return this.sendPrompt(t)}async explainOptimization(e,i){let t={type:"explanation",content:this.buildExplanationPrompt(e),context:i,input:{config:e},expectedFormat:"markdown"};return this.sendPrompt(t)}async reviewCode(e,i,t){let s={type:"code-review",content:this.buildCodeReviewPrompt(e,i),context:t,input:{code:e},expectedFormat:"json"};return this.sendPrompt(s)}buildMessages(e){let i=this.getSystemMessage(e.type),t=this.buildUserMessage(e);return [{role:"system",content:i},{role:"user",content:t}]}getSystemMessage(e){let i=`\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u524D\u7AEF\u5DE5\u7A0B\u5316\u4E13\u5BB6\uFF0C\u4E13\u95E8\u5E2E\u52A9\u4F18\u5316\u524D\u7AEF\u9879\u76EE\u7684\u6784\u5EFA\u6027\u80FD\u3001\u4EE3\u7801\u8D28\u91CF\u548C\u5F00\u53D1\u4F53\u9A8C\u3002 \u4F60\u7684\u4EFB\u52A1\u662F\u6839\u636E\u7528\u6237\u63D0\u4F9B\u7684\u4EE3\u7801\u3001\u914D\u7F6E\u548C\u9879\u76EE\u4FE1\u606F\uFF0C\u63D0\u4F9B\u4E13\u4E1A\u7684\u5206\u6790\u548C\u4F18\u5316\u5EFA\u8BAE\u3002 \u8BF7\u786E\u4FDD\u4F60\u7684\u5EFA\u8BAE\uFF1A 1. \u57FA\u4E8E\u6700\u4F73\u5B9E\u8DF5\u548C\u884C\u4E1A\u6807\u51C6 2. \u8003\u8651\u9879\u76EE\u7684\u5177\u4F53\u6280\u672F\u6808\u548C\u7EA6\u675F 3. \u63D0\u4F9B\u53EF\u64CD\u4F5C\u7684\u5177\u4F53\u6B65\u9AA4 4. \u8BC4\u4F30\u98CE\u9669\u548C\u6536\u76CA 5. \u63D0\u4F9B\u66FF\u4EE3\u65B9\u6848 \u8BF7\u7528\u4E2D\u6587\u56DE\u590D\uFF0C\u5E76\u4F7F\u7528JSON\u683C\u5F0F\u8F93\u51FA\u7ED3\u6784\u5316\u7684\u7ED3\u679C\u3002`;switch(e){case "analysis":return i+` \u8BF7\u5206\u6790\u4EE3\u7801\u7684\u6027\u80FD\u3001\u53EF\u7EF4\u62A4\u6027\u548C\u6700\u4F73\u5B9E\u8DF5\u95EE\u9898\u3002`;case "optimization":return i+` \u8BF7\u63D0\u4F9B\u5177\u4F53\u7684\u4F18\u5316\u5EFA\u8BAE\u548C\u5B9E\u65BD\u6B65\u9AA4\u3002`;case "explanation":return i+` \u8BF7\u8BE6\u7EC6\u89E3\u91CA\u4F18\u5316\u5EFA\u8BAE\u7684\u539F\u7406\u548C\u5B9E\u65BD\u65B9\u6CD5\u3002`;case "code-review":return i+` \u8BF7\u8FDB\u884C\u4EE3\u7801\u5BA1\u67E5\uFF0C\u6307\u51FA\u95EE\u9898\u548C\u6539\u8FDB\u5EFA\u8BAE\u3002`;default:return i}}buildUserMessage(e){let i=e.content;return e.input.code&&(i+=` \u4EE3\u7801\u5185\u5BB9: \`\`\` ${e.input.code} \`\`\``),e.input.config&&(i+=` \u914D\u7F6E\u4FE1\u606F: \`\`\`json ${JSON.stringify(e.input.config,null,2)} \`\`\``),e.input.stats&&(i+=` \u7EDF\u8BA1\u4FE1\u606F: \`\`\`json ${JSON.stringify(e.input.stats,null,2)} \`\`\``),e.context&&(i+=` \u9879\u76EE\u4E0A\u4E0B\u6587: \`\`\`json ${JSON.stringify(e.context,null,2)} \`\`\``),i}buildCodeAnalysisPrompt(e,i){return `\u8BF7\u5206\u6790\u4EE5\u4E0B\u4EE3\u7801\u6587\u4EF6\uFF0C\u8BC6\u522B\u6027\u80FD\u95EE\u9898\u3001\u53EF\u7EF4\u62A4\u6027\u95EE\u9898\u548C\u6700\u4F73\u5B9E\u8DF5\u8FDD\u89C4\uFF1A \u6587\u4EF6\u8DEF\u5F84: ${i} \u6587\u4EF6\u7C7B\u578B: ${this.getFileType(i)} \u8BF7\u91CD\u70B9\u5173\u6CE8\uFF1A 1. \u6027\u80FD\u4F18\u5316\u673A\u4F1A 2. \u4EE3\u7801\u8D28\u91CF\u95EE\u9898 3. \u6700\u4F73\u5B9E\u8DF5\u8FDD\u89C4 4. \u6F5C\u5728\u7684\u5B89\u5168\u95EE\u9898 5. \u53EF\u7EF4\u62A4\u6027\u6539\u8FDB \u8BF7\u4EE5JSON\u683C\u5F0F\u8FD4\u56DE\u5206\u6790\u7ED3\u679C\uFF0C\u5305\u542B\u95EE\u9898\u5217\u8868\u548C\u4F18\u5316\u5EFA\u8BAE\u3002`}buildOptimizationPrompt(e){return `\u57FA\u4E8E\u4EE5\u4E0B\u5206\u6790\u7ED3\u679C\uFF0C\u8BF7\u63D0\u4F9B\u5177\u4F53\u7684\u4F18\u5316\u5EFA\u8BAE\uFF1A ${JSON.stringify(e,null,2)} \u8BF7\u4E3A\u6BCF\u4E2A\u95EE\u9898\u63D0\u4F9B\uFF1A 1. \u5177\u4F53\u7684\u89E3\u51B3\u65B9\u6848 2. \u5B9E\u65BD\u6B65\u9AA4 3. \u9884\u671F\u6536\u76CA 4. \u98CE\u9669\u8BC4\u4F30 5. \u66FF\u4EE3\u65B9\u6848 \u8BF7\u4EE5JSON\u683C\u5F0F\u8FD4\u56DE\u4F18\u5316\u5EFA\u8BAE\u3002`}buildExplanationPrompt(e){return `\u8BF7\u8BE6\u7EC6\u89E3\u91CA\u4EE5\u4E0B\u4F18\u5316\u5EFA\u8BAE\uFF1A ${JSON.stringify(e,null,2)} \u8BF7\u5305\u62EC\uFF1A 1. \u4E3A\u4EC0\u4E48\u8FD9\u4E2A\u4F18\u5316\u662F\u6709\u6548\u7684 2. \u5982\u4F55\u5B9E\u65BD\u8FD9\u4E2A\u4F18\u5316 3. \u53EF\u80FD\u9047\u5230\u7684\u95EE\u9898\u548C\u89E3\u51B3\u65B9\u6848 4. \u76F8\u5173\u7684\u6280\u672F\u80CC\u666F\u77E5\u8BC6 5. \u8FDB\u4E00\u6B65\u7684\u4F18\u5316\u5EFA\u8BAE \u8BF7\u7528Markdown\u683C\u5F0F\u8FD4\u56DE\u8BE6\u7EC6\u89E3\u91CA\u3002`}buildCodeReviewPrompt(e,i){return `\u8BF7\u5BF9\u4EE5\u4E0B\u4EE3\u7801\u8FDB\u884C\u5168\u9762\u7684\u4EE3\u7801\u5BA1\u67E5\uFF1A \u6587\u4EF6\u8DEF\u5F84: ${i} \u8BF7\u68C0\u67E5\uFF1A 1. \u4EE3\u7801\u98CE\u683C\u548C\u89C4\u8303 2. \u6027\u80FD\u95EE\u9898 3. \u5B89\u5168\u6027\u95EE\u9898 4. \u53EF\u7EF4\u62A4\u6027\u95EE\u9898 5. \u6700\u4F73\u5B9E\u8DF5\u9075\u5FAA\u60C5\u51B5 6. \u6F5C\u5728\u7684bug 7. \u4EE3\u7801\u91CD\u590D 8. \u6CE8\u91CA\u548C\u6587\u6863 \u8BF7\u4EE5JSON\u683C\u5F0F\u8FD4\u56DE\u5BA1\u67E5\u7ED3\u679C\u3002`}getFileType(e){switch(e.split(".").pop()?.toLowerCase()){case "ts":case "tsx":return "TypeScript";case "js":case "jsx":return "JavaScript";case "vue":return "Vue";case "css":return "CSS";case "scss":case "sass":return "SCSS";case "html":return "HTML";case "json":return "JSON";default:return "Unknown"}}};var d=class{constructor(e){this.spinner=k__default.default();this.config=e,this.llmClient=new u(e);}async analyzeProject(e,i){this.spinner.start("\u5206\u6790\u9879\u76EE\u4EE3\u7801...");try{let t=this.getProjectFiles(e),s=[];for(let n of t)try{let o=await this.analyzeFile(n,i);s.push(o);}catch(o){console.warn(z__default.default.yellow(`\u8DF3\u8FC7\u6587\u4EF6 ${n}: ${o}`));}return this.spinner.succeed(`\u4EE3\u7801\u5206\u6790\u5B8C\u6210: ${s.length} \u4E2A\u6587\u4EF6`),s}catch(t){throw this.spinner.fail("\u4EE3\u7801\u5206\u6790\u5931\u8D25"),t}}async analyzeFile(e,i){let t=fsExtra.readFileSync(e,"utf-8"),s=fsExtra.statSync(e),n=this.performBasicAnalysis(t,e),o={};if(this.config.analysis.enableCodeAnalysis)try{let r=await this.llmClient.analyzeCode(t,e,i);r.success&&(o=this.parseAIResponse(r.content));}catch(r){console.warn(z__default.default.yellow(`AI\u5206\u6790\u5931\u8D25 ${e}: ${r}`));}return {filePath:e,fileSize:s.size,linesOfCode:t.split(` `).length,complexity:n.complexity,dependencies:n.dependencies,issues:[...n.issues,...o.issues||[]],suggestions:[...n.suggestions,...o.suggestions||[]]}}getProjectFiles(e){let i=[],t=[".ts",".tsx",".js",".jsx",".vue",".css",".scss"],s=n=>{try{let o=fsExtra.readdirSync(n);for(let r of o){let a=path.join(n,r),c=fsExtra.statSync(a);if(c.isDirectory())["node_modules",".git","dist","build",".next"].includes(r)||s(a);else if(c.isFile()){let g=path.extname(r);t.includes(g)&&i.push(a);}}}catch{}};return s(e),i}performBasicAnalysis(e,i){let t=this.calculateComplexity(e),s=this.extractDependencies(e),n=this.detectBasicIssues(e,i),o=this.generateBasicSuggestions(e,i,n);return {complexity:t,dependencies:s,issues:n,suggestions:o}}calculateComplexity(e){let i=1,t=["if","else","for","while","do","switch","case","catch","try","&&","||","?",":","return","throw"];for(let s of t){let n=new RegExp(`\\b${s}\\b`,"g"),o=e.match(n);o&&(i+=o.length);}return i}extractDependencies(e){let i=[],t=/import\s+.*?\s+from\s+['"]([^'"]+)['"]/g,s;for(;(s=t.exec(e))!==null;)i.push(s[1]);let n=/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(s=n.exec(e))!==null;)i.push(s[1]);return [...new Set(i)]}detectBasicIssues(e,i){let t=[],s=/function\s+\w+\s*\([^)]*\)\s*{/g,n;for(;(n=s.exec(e))!==null;){let c=e.substring(0,n.index).split(` `).length;this.extractFunctionContent(e,n.index).split(` `).length>50&&t.push({type:"maintainability",severity:"medium",message:"\u51FD\u6570\u8FC7\u957F\uFF0C\u5EFA\u8BAE\u62C6\u5206\u4E3A\u66F4\u5C0F\u7684\u51FD\u6570",line:c,fix:"\u5C06\u51FD\u6570\u62C6\u5206\u4E3A\u591A\u4E2A\u66F4\u5C0F\u7684\u51FD\u6570"});}let o=/(?:let|const|var)\s+(\w+)/g,r=new Set;for(;(n=o.exec(e))!==null;)r.add(n[1]);for(let c of r){let g=new RegExp(`\\b${c}\\b`,"g"),w=e.match(g);if(w&&w.length===1){let A=e.indexOf(`let ${c}`)||e.indexOf(`const ${c}`)||e.indexOf(`var ${c}`);A!==-1&&t.push({type:"maintainability",severity:"low",message:`\u53D8\u91CF '${c}' \u58F0\u660E\u4F46\u672A\u4F7F\u7528`,line:e.substring(0,A).split(` `).length,fix:`\u5220\u9664\u672A\u4F7F\u7528\u7684\u53D8\u91CF '${c}'`});}}let a=/console\.(log|warn|error|info)/g;for(;(n=a.exec(e))!==null;){let c=e.substring(0,n.index).split(` `).length;t.push({type:"best-practice",severity:"low",message:"\u751F\u4EA7\u4EE3\u7801\u4E2D\u4E0D\u5E94\u5305\u542Bconsole\u8BED\u53E5",line:c,fix:"\u79FB\u9664console\u8BED\u53E5\u6216\u4F7F\u7528\u9002\u5F53\u7684\u65E5\u5FD7\u5E93"});}return t}generateBasicSuggestions(e,i,t){let s=[],n=new Set(t.map(o=>o.type));return n.has("maintainability")&&s.push({id:`maintainability-${Date.now()}`,title:"\u63D0\u9AD8\u4EE3\u7801\u53EF\u7EF4\u62A4\u6027",description:"\u91CD\u6784\u4EE3\u7801\u4EE5\u63D0\u9AD8\u53EF\u8BFB\u6027\u548C\u53EF\u7EF4\u62A4\u6027",impact:"medium",difficulty:"medium",estimatedSavings:{buildTime:5},steps:["\u62C6\u5206\u957F\u51FD\u6570","\u63D0\u53D6\u91CD\u590D\u4EE3\u7801","\u6DFB\u52A0\u7C7B\u578B\u6CE8\u89E3","\u6539\u8FDB\u53D8\u91CF\u547D\u540D"],affectedFiles:[i],risk:"low",autoApplicable:false}),n.has("performance")&&s.push({id:`performance-${Date.now()}`,title:"\u4F18\u5316\u6027\u80FD",description:"\u4F18\u5316\u4EE3\u7801\u4EE5\u63D0\u9AD8\u8FD0\u884C\u65F6\u6027\u80FD",impact:"high",difficulty:"medium",estimatedSavings:{runtimePerformance:10},steps:["\u4F18\u5316\u5FAA\u73AF\u548C\u6761\u4EF6\u5224\u65AD","\u51CF\u5C11\u4E0D\u5FC5\u8981\u7684\u8BA1\u7B97","\u4F7F\u7528\u66F4\u9AD8\u6548\u7684\u6570\u636E\u7ED3\u6784","\u5B9E\u73B0\u7F13\u5B58\u673A\u5236"],affectedFiles:[i],risk:"medium",autoApplicable:false}),s}extractFunctionContent(e,i){let t=0,s=false,n=i;for(let o=i;o<e.length;o++){let r=e[o];if(r==="{")t++,s=true;else if(r==="}"&&(t--,s&&t===0)){n=o;break}}return e.substring(i,n+1)}parseAIResponse(e){try{return JSON.parse(e)}catch{return console.warn(z__default.default.yellow("AI\u54CD\u5E94\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C")),{issues:[],suggestions:[]}}}};var f=class{constructor(e){this.spinner=k__default.default();this.config=e,this.llmClient=new u(e);}async generateSuggestions(e,i){this.spinner.start("\u751F\u6210AI\u4F18\u5316\u5EFA\u8BAE...");try{let t=[],s=this.generateBasicSuggestions(e,i);if(t.push(...s),this.config.analysis.enableCodeAnalysis){let r=await this.generateAISuggestions(e,i);t.push(...r);}let n=this.deduplicateSuggestions(t),o=this.prioritizeSuggestions(n,e);return this.spinner.succeed(`\u4F18\u5316\u5EFA\u8BAE\u751F\u6210\u5B8C\u6210: ${o.length} \u4E2A`),o.slice(0,this.config.optimization.maxSuggestions)}catch(t){throw this.spinner.fail("\u4F18\u5316\u5EFA\u8BAE\u751F\u6210\u5931\u8D25"),t}}generateBasicSuggestions(e,i){let t=[];e.stats.bundleSize>1024*1024&&t.push({id:"bundle-size-optimization",title:"\u4F18\u5316\u5305\u5927\u5C0F",description:"\u5F53\u524D\u5305\u5927\u5C0F\u8D85\u8FC71MB\uFF0C\u5EFA\u8BAE\u8FDB\u884C\u4EE3\u7801\u5206\u5272\u548C\u61D2\u52A0\u8F7D\u4F18\u5316",impact:"high",difficulty:"medium",estimatedSavings:{bundleSize:30},steps:["\u542F\u7528\u4EE3\u7801\u5206\u5272","\u5B9E\u73B0\u8DEF\u7531\u7EA7\u522B\u7684\u61D2\u52A0\u8F7D","\u79FB\u9664\u672A\u4F7F\u7528\u7684\u4F9D\u8D56","\u4F18\u5316\u56FE\u7247\u548C\u9759\u6001\u8D44\u6E90"],affectedFiles:this.getAffectedFiles(e,["config","router","components"]),risk:"low",autoApplicable:true}),e.stats.buildTime>3e4&&t.push({id:"build-time-optimization",title:"\u4F18\u5316\u6784\u5EFA\u65F6\u95F4",description:"\u5F53\u524D\u6784\u5EFA\u65F6\u95F4\u8D85\u8FC730\u79D2\uFF0C\u5EFA\u8BAE\u542F\u7528\u7F13\u5B58\u548C\u5E76\u884C\u6784\u5EFA",impact:"high",difficulty:"easy",estimatedSavings:{buildTime:50},steps:["\u542F\u7528\u6784\u5EFA\u7F13\u5B58","\u914D\u7F6E\u5E76\u884C\u6784\u5EFA","\u4F18\u5316\u4F9D\u8D56\u89E3\u6790","\u4F7F\u7528\u66F4\u5FEB\u7684\u6784\u5EFA\u5DE5\u5177"],affectedFiles:this.getAffectedFiles(e,["config"]),risk:"low",autoApplicable:true}),e.stats.dependencies>100&&t.push({id:"dependency-optimization",title:"\u4F18\u5316\u4F9D\u8D56\u7BA1\u7406",description:"\u4F9D\u8D56\u6570\u91CF\u8FC7\u591A\uFF0C\u5EFA\u8BAE\u6E05\u7406\u672A\u4F7F\u7528\u7684\u4F9D\u8D56",impact:"medium",difficulty:"easy",estimatedSavings:{bundleSize:20,buildTime:15},steps:["\u5206\u6790\u4F9D\u8D56\u4F7F\u7528\u60C5\u51B5","\u79FB\u9664\u672A\u4F7F\u7528\u7684\u4F9D\u8D56","\u5408\u5E76\u76F8\u4F3C\u529F\u80FD\u7684\u4F9D\u8D56","\u4F7F\u7528\u66F4\u8F7B\u91CF\u7684\u66FF\u4EE3\u65B9\u6848"],affectedFiles:["package.json"],risk:"medium",autoApplicable:false});let s=this.analyzeCodeQuality(e.codeAnalysis);return s.length>0&&t.push({id:"code-quality-improvement",title:"\u63D0\u5347\u4EE3\u7801\u8D28\u91CF",description:"\u53D1\u73B0\u4EE3\u7801\u8D28\u91CF\u95EE\u9898\uFF0C\u5EFA\u8BAE\u8FDB\u884C\u91CD\u6784\u548C\u4F18\u5316",impact:"medium",difficulty:"medium",estimatedSavings:{buildTime:10,runtimePerformance:15},steps:["\u91CD\u6784\u590D\u6742\u51FD\u6570","\u6DFB\u52A0\u7C7B\u578B\u6CE8\u89E3","\u6539\u8FDB\u9519\u8BEF\u5904\u7406","\u589E\u52A0\u5355\u5143\u6D4B\u8BD5"],affectedFiles:s.map(n=>n.filePath),risk:"medium",autoApplicable:false}),t}async generateAISuggestions(e,i){try{let t=await this.llmClient.generateOptimizationSuggestions(e,i);return t.success?this.parseAISuggestions(t.content):(console.warn(z__default.default.yellow("AI\u5EFA\u8BAE\u751F\u6210\u5931\u8D25\uFF0C\u4F7F\u7528\u57FA\u7840\u5EFA\u8BAE")),[])}catch(t){return console.warn(z__default.default.yellow(`AI\u5EFA\u8BAE\u751F\u6210\u5931\u8D25: ${t}`)),[]}}parseAISuggestions(e){try{let i=JSON.parse(e);return Array.isArray(i.suggestions)?i.suggestions.map((t,s)=>({id:t.id||`ai-suggestion-${s}`,title:t.title||"AI\u4F18\u5316\u5EFA\u8BAE",description:t.description||"",impact:t.impact||"medium",difficulty:t.difficulty||"medium",estimatedSavings:t.estimatedSavings||{},steps:t.steps||[],affectedFiles:t.affectedFiles||[],risk:t.risk||"medium",autoApplicable:t.autoApplicable||!1})):[]}catch{return console.warn(z__default.default.yellow("AI\u5EFA\u8BAE\u89E3\u6790\u5931\u8D25")),[]}}deduplicateSuggestions(e){let i=new Set,t=[];for(let s of e){let n=`${s.title}-${s.description}`;i.has(n)||(i.add(n),t.push(s));}return t}prioritizeSuggestions(e,i){return e.sort((t,s)=>{let n=this.calculatePriorityScore(t,i);return this.calculatePriorityScore(s,i)-n})}calculatePriorityScore(e,i){let t=0;t+={low:1,medium:2,high:3}[e.impact]*10,t+={easy:3,medium:2,hard:1}[e.difficulty]*5,t+={low:3,medium:2,high:1}[e.risk]*3,e.autoApplicable&&(t+=5);let r=e.estimatedSavings;return r.bundleSize&&(t+=Math.min(r.bundleSize/10,10)),r.buildTime&&(t+=Math.min(r.buildTime/5,10)),r.runtimePerformance&&(t+=Math.min(r.runtimePerformance/5,10)),t}analyzeCodeQuality(e){return e.filter(i=>{let t=i.issues.length>0,s=i.complexity>10,n=i.dependencies.length>20;return t||s||n})}getAffectedFiles(e,i){return e.codeAnalysis.map(t=>t.filePath).filter(t=>i.some(s=>t.includes(s)))}};var h=class{constructor(e){this.spinner=k__default.default();this.appliedOptimizations=new Map;this.config=e;}async applyOptimization(e,i){this.spinner.start(`\u5E94\u7528\u4F18\u5316\u5EFA\u8BAE: ${e.title}`);try{this.config.optimization.createBackup&&await this.createBackup(e.affectedFiles,i);let t=await this.executeOptimization(e,i);return this.appliedOptimizations.set(e.id,t),this.spinner.succeed(`\u4F18\u5316\u5EFA\u8BAE\u5E94\u7528\u5B8C\u6210: ${e.title}`),t}catch(t){throw this.spinner.fail(`\u4F18\u5316\u5EFA\u8BAE\u5E94\u7528\u5931\u8D25: ${e.title}`),console.error(z__default.default.red("\u5E94\u7528\u9519\u8BEF:"),t),this.config.optimization.createBackup&&await this.rollbackOptimization(e.id),t}}async applyOptimizations(e,i){this.spinner.start(`\u6279\u91CF\u5E94\u7528 ${e.length} \u4E2A\u4F18\u5316\u5EFA\u8BAE...`);let t=[];for(let s of e)try{let n=await this.applyOptimization(s,i);t.push(n);}catch(n){console.warn(z__default.default.yellow(`\u8DF3\u8FC7\u4F18\u5316\u5EFA\u8BAE ${s.title}: ${n}`)),t.push({id:s.id,type:"code",before:{value:null,metrics:{}},after:{value:null,metrics:{}},improvement:{percentage:0,absolute:0,unit:""},status:"failed",error:n instanceof Error?n.message:"Unknown error"});}return this.spinner.succeed(`\u6279\u91CF\u5E94\u7528\u5B8C\u6210: ${t.length} \u4E2A`),t}async executeOptimization(e,i){let t=await this.captureState(e.affectedFiles,i),s;switch(e.id){case "bundle-size-optimization":s=await this.applyBundleSizeOptimization(e,i);break;case "build-time-optimization":s=await this.applyBuildTimeOptimization(e,i);break;case "dependency-optimization":s=await this.applyDependencyOptimization(e,i);break;case "code-quality-improvement":s=await this.applyCodeQualityOptimization(e,i);break;default:s=await this.applyGenericOptimization(e,i);}let n=Date.now(),o=this.calculateImprovement(t,s);return {id:e.id,type:this.getOptimizationType(e),before:t,after:s,improvement:o,status:"applied",appliedAt:n}}async applyBundleSizeOptimization(e,i){let t=[],s=["vite.config.ts","vite.config.js","webpack.config.js","rollup.config.js"];for(let n of s){let o=path.join(i,n);if(fsExtra.existsSync(o)){let r=fsExtra.readFileSync(o,"utf-8"),a=this.optimizeBundleConfig(r);a!==r&&(fsExtra.writeFileSync(o,a),t.push(`\u66F4\u65B0 ${n}`));}}return {value:"bundle-optimization-applied",metrics:{changes:t.length,filesModified:t.length}}}async applyBuildTimeOptimization(e,i){let t=[],s=["vite.config.ts","vite.config.js","webpack.config.js"];for(let n of s){let o=path.join(i,n);if(fsExtra.existsSync(o)){let r=fsExtra.readFileSync(o,"utf-8"),a=this.optimizeBuildTimeConfig(r);a!==r&&(fsExtra.writeFileSync(o,a),t.push(`\u66F4\u65B0 ${n}`));}}return {value:"build-time-optimization-applied",metrics:{changes:t.length,filesModified:t.length}}}async applyDependencyOptimization(e,i){let t=path.join(i,"package.json");if(!fsExtra.existsSync(t))throw new Error("package.json not found");return {value:"dependency-optimization-applied",metrics:{dependenciesRemoved:0,dependenciesAdded:0}}}async applyCodeQualityOptimization(e,i){let t=[];for(let s of e.affectedFiles)if(fsExtra.existsSync(s)){let n=fsExtra.readFileSync(s,"utf-8"),o=this.optimizeCodeQuality(n);o!==n&&(fsExtra.writeFileSync(s,o),t.push(`\u4F18\u5316 ${s}`));}return {value:"code-quality-optimization-applied",metrics:{filesModified:t.length,changes:t.length}}}async applyGenericOptimization(e,i){return {value:"generic-optimization-applied",metrics:{filesModified:e.affectedFiles.length}}}optimizeBundleConfig(e){return e.includes("rollupOptions")?e.replace(/rollupOptions:\s*{([^}]*)}/,`rollupOptions: { output: { manualChunks: { vendor: ['vue', 'react'], utils: ['lodash', 'dayjs'] } }, $1 }`):e}optimizeBuildTimeConfig(e){return e.includes("defineConfig")?e.replace(/defineConfig\s*\(\s*{/,`defineConfig({ build: { rollupOptions: { cache: true } }, `):e}optimizeCodeQuality(e){let i=e.replace(/console\.(log|warn|error|info)\s*\([^)]*\);?\s*/g,"");return i=i.replace(/import\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g,'import { $1 } from "$2"'),i}async captureState(e,i){let t={};for(let s of e)if(fsExtra.existsSync(s)){let n=fsExtra.readFileSync(s,"utf-8");t[s]={content:n,size:n.length,lastModified:Date.now()};}return {value:t,metrics:{filesCount:Object.keys(t).length,totalSize:Object.values(t).reduce((s,n)=>s+n.size,0)}}}calculateImprovement(e,i){let t=e.metrics.totalSize||0,s=i.metrics.totalSize||0,n=t-s,o=t>0?n/t*100:0;return {percentage:Math.round(o*100)/100,absolute:n,unit:"bytes"}}getOptimizationType(e){return e.id.includes("bundle")||e.id.includes("build")?"build":e.id.includes("dependency")?"dependency":e.id.includes("config")?"config":"code"}async createBackup(e,i){let t=path.join(i,".synthia-backup",Date.now().toString());for(let s of e)if(fsExtra.existsSync(s)){let n=path.join(t,s.replace(i,"")),o=path.dirname(n);fsExtra.existsSync(o)||x("fs-extra").mkdirSync(o,{recursive:true}),fsExtra.copyFileSync(s,n);}}async rollbackOptimization(e){console.log(z__default.default.yellow(`\u56DE\u6EDA\u4F18\u5316: ${e}`));}};var b=class{constructor(e){this.config=e,this.codeAnalyzer=new d(e),this.suggestionGenerator=new f(e),this.optimizationApplier=new h(e);}async analyzeProject(e,i){let t=await this.codeAnalyzer.analyzeProject(e,i),s=await this.suggestionGenerator.generateSuggestions({projectPath:e,timestamp:Date.now(),stats:this.calculateProjectStats(t),codeAnalysis:t,suggestions:[],healthScore:this.calculateHealthScore(t),prioritySuggestions:[]},i);return {projectPath:e,timestamp:Date.now(),stats:this.calculateProjectStats(t),codeAnalysis:t,suggestions:s,healthScore:this.calculateHealthScore(t),prioritySuggestions:s.slice(0,5)}}async applyOptimizations(e,i){return this.optimizationApplier.applyOptimizations(e,i)}async generateSuggestions(e,i){return this.suggestionGenerator.generateSuggestions(e,i)}calculateProjectStats(e){let i=e.length,t=e.reduce((o,r)=>o+r.linesOfCode,0),s=e.reduce((o,r)=>o+r.fileSize,0),n=new Set(e.flatMap(o=>o.dependencies)).size;return {totalFiles:i,totalLines:t,totalSize:s,dependencies:n,buildTime:0,bundleSize:0}}calculateHealthScore(e){let i=100,t=this.config.analysis.depth==="deep"?1.5:this.config.analysis.depth==="shallow"?.5:1,s=e.reduce((r,a)=>r+a.complexity,0)/e.length;s>10?i-=20*t:s>5&&(i-=10*t);let n=e.reduce((r,a)=>r+a.issues.length,0);i-=Math.min(n*2*t,30);let o=e.reduce((r,a)=>r+a.fileSize,0)/e.length;return o>1e4?i-=15*t:o>5e3&&(i-=5*t),Math.max(0,Math.min(100,i))}};function ce(p){return new b(p)}var pe={openai:{apiKey:process.env.OPENAI_API_KEY||"",model:"gpt-4",maxTokens:4e3,temperature:.1},analysis:{enableCodeAnalysis:true,enableDependencyAnalysis:true,enablePerformanceAnalysis:true,depth:"medium"},optimization:{autoApply:false,level:"moderate",createBackup:true,maxSuggestions:10},cache:{enabled:true,directory:".synthia-ai-cache",ttl:24*60*60*1e3}}; exports.AIOptimizer = b; exports.CodeAnalyzer = d; exports.DEFAULT_AI_OPTIMIZER_CONFIG = pe; exports.LLMClient = u; exports.OptimizationApplier = h; exports.SuggestionGenerator = f; exports.createAIOptimizer = ce; //# sourceMappingURL=out.js.map //# sourceMappingURL=index.js.map