From 35740be22047ba92c6300c24e9f78082c45649de Mon Sep 17 00:00:00 2001 From: siage Date: Sat, 12 Apr 2025 02:53:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=A7=8BexecuteTask=E5=87=BD=E6=95=B8?= =?UTF-8?q?=E4=BB=A5=E7=B0=A1=E5=8C=96=E7=9B=B8=E9=97=9C=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=91=98=E8=A6=81=E7=9A=84=E7=94=9F=E6=88=90=EF=BC=8C=E5=B0=87?= =?UTF-8?q?loadTaskRelatedFiles=E5=87=BD=E6=95=B8=E7=9A=84=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC=E8=AA=BF=E6=95=B4=E7=82=BA=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=A0=BC=E5=BC=8F=E5=8C=96=E7=9A=84=E6=91=98?= =?UTF-8?q?=E8=A6=81=E6=96=87=E6=9C=AC=EF=BC=8C=E4=B8=A6=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=E7=9A=84=E5=85=A7=E5=AE=B9?= =?UTF-8?q?=E8=AE=8A=E6=95=B8=EF=BC=8C=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A2=BC?= =?UTF-8?q?=E5=8F=AF=E8=AE=80=E6=80=A7=E8=88=87=E7=B6=AD=E8=AD=B7=E6=80=A7?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/taskTools.ts | 53 +++++------------------------------------ src/utils/fileLoader.js | 29 ++++++++++------------ 2 files changed, 19 insertions(+), 63 deletions(-) diff --git a/src/tools/taskTools.ts b/src/tools/taskTools.ts index eb6b204..88b5ee6 100644 --- a/src/tools/taskTools.ts +++ b/src/tools/taskTools.ts @@ -594,7 +594,6 @@ export async function executeTask({ }\n`; // ===== 增強:處理相關文件內容 ===== - let relatedFilesContent = ""; let relatedFilesSummary = ""; let contextInfo = ""; @@ -680,9 +679,9 @@ export async function executeTask({ ); // 生成任務相關文件的摘要資訊 - const loadResult = await loadTaskRelatedFiles(task.relatedFiles); - relatedFilesContent = loadResult.content; - relatedFilesSummary = loadResult.summary; + // 使用loadTaskRelatedFiles生成文件摘要,現在函數直接返回格式化的文本 + // 而不是包含content和summary的物件 + const relatedFilesSummary = await loadTaskRelatedFiles(task.relatedFiles); // 記錄摘要生成完成 await addConversationEntry( @@ -801,45 +800,9 @@ export async function executeTask({ prompt += `\n`; } - // ===== 增強:添加相關文件部分,更詳細的信息 ===== - if (task.relatedFiles && task.relatedFiles.length > 0) { - prompt += `\n## 任務相關文件\n\n共關聯 ${task.relatedFiles.length} 個文件,類型分布:\n`; - - // 按類型分組統計 - const fileTypeCount: Record = {}; - task.relatedFiles.forEach((file) => { - fileTypeCount[file.type] = (fileTypeCount[file.type] || 0) + 1; - }); - - Object.entries(fileTypeCount).forEach(([type, count]) => { - prompt += `- ${type}: ${count} 個\n`; - }); - - // 新增:展示文件詳細列表 - prompt += `\n### 文件詳細列表\n`; - - // 按類型分組 - const filesByType = task.relatedFiles.reduce((acc, file) => { - acc[file.type] = acc[file.type] || []; - acc[file.type].push(file); - return acc; - }, {} as Record); - - // 展示每種類型的文件 - Object.entries(filesByType).forEach(([type, files]) => { - prompt += `\n#### ${type} (${files.length} 個)\n`; - files.forEach((file, index) => { - prompt += `${index + 1}. \`${file.path}\`${ - file.description ? ` - ${file.description}` : "" - }${ - file.lineStart && file.lineEnd - ? ` (行 ${file.lineStart}-${file.lineEnd})` - : "" - }\n`; - }); - }); - - prompt += `\n使用這些相關文件作為上下文,幫助您理解任務需求和實現細節。系統已為文件生成摘要資訊,無需讀取實際檔案內容。\n`; + // 直接添加相關文件摘要到prompt中 + if (relatedFilesSummary) { + prompt += relatedFilesSummary; } // 添加上下文信息 @@ -871,10 +834,6 @@ export async function executeTask({ type: "text" as const, text: prompt, }, - { - type: "text" as const, - text: relatedFilesContent, - }, ], }; } diff --git a/src/utils/fileLoader.js b/src/utils/fileLoader.js index 9b12815..2ca7130 100644 --- a/src/utils/fileLoader.js +++ b/src/utils/fileLoader.js @@ -8,23 +8,19 @@ import { RelatedFileType } from "../types/index.js"; * * @param relatedFiles 相關文件列表 - RelatedFile 物件數組,包含文件的路徑、類型、描述等資訊 * @param maxTotalLength 摘要內容的最大總長度 - 控制生成摘要的總字符數,避免過大的返回內容 - * @returns 包含兩個字段的物件: - * - content: 詳細的文件資訊,包含每個檔案的基本資訊和提示訊息 - * - summary: 簡潔的檔案列表概覽,適合快速瀏覽 + * @returns 格式化的文件摘要資訊 */ export async function loadTaskRelatedFiles( relatedFiles, maxTotalLength = 15000 // 控制生成內容的總長度 ) { if (!relatedFiles || relatedFiles.length === 0) { - return { - content: "", - summary: "無相關文件", - }; + return "## 相關文件\n\n無相關文件"; } - let totalContent = ""; + let filesSummary = `## 相關文件內容摘要 (共 ${relatedFiles.length} 個文件)\n\n`; let totalLength = 0; + // 按文件類型優先級排序(首先處理待修改的文件) const priorityOrder = { [RelatedFileType.TO_MODIFY]: 1, @@ -33,17 +29,21 @@ export async function loadTaskRelatedFiles( [RelatedFileType.OUTPUT]: 4, [RelatedFileType.OTHER]: 5, }; + const sortedFiles = [...relatedFiles].sort( (a, b) => priorityOrder[a.type] - priorityOrder[b.type] ); + // 處理每個文件 for (const file of sortedFiles) { if (totalLength >= maxTotalLength) { filesSummary += `\n### 已達到上下文長度限制,部分文件未載入\n`; break; } + // 生成文件基本資訊 const fileInfo = generateFileInfo(file); + // 添加到總內容 const fileHeader = `\n### ${file.type}: ${file.path}${ file.description ? ` - ${file.description}` : "" @@ -52,17 +52,14 @@ export async function loadTaskRelatedFiles( ? ` (行 ${file.lineStart}-${file.lineEnd})` : "" }\n\n`; - totalContent += fileHeader + "```\n" + fileInfo + "\n```\n\n"; - filesSummary += `- **${file.path}**${ - file.description ? ` - ${file.description}` : "" - } (${fileInfo.length} 字符)\n`; + + filesSummary += fileHeader + "```\n" + fileInfo + "\n```\n\n"; totalLength += fileInfo.length + fileHeader.length + 8; // 8 for "```\n" and "\n```" } - return { - content: totalContent, - summary: filesSummary, - }; + + return filesSummary; } + /** * 生成文件基本資訊摘要 *