重構executeTask函數以簡化相關文件摘要的生成,將loadTaskRelatedFiles函數的返回值調整為直接返回格式化的摘要文本,並移除不再使用的內容變數,提升代碼可讀性與維護性。

This commit is contained in:
siage 2025-04-12 02:53:09 +08:00
parent 8cb3a3228d
commit 35740be220
2 changed files with 19 additions and 63 deletions

View File

@ -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<string, number> = {};
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<string, RelatedFile[]>);
// 展示每種類型的文件
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,
},
],
};
}

View File

@ -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;
}
/**
* 生成文件基本資訊摘要
*