diff --git a/src/types/index.js b/src/types/index.js deleted file mode 100644 index 39ff060..0000000 --- a/src/types/index.js +++ /dev/null @@ -1,43 +0,0 @@ -// 任務狀態枚舉:定義任務在工作流程中的當前階段 -export var TaskStatus; -(function (TaskStatus) { - TaskStatus["PENDING"] = "\u5F85\u8655\u7406"; - TaskStatus["IN_PROGRESS"] = "\u9032\u884C\u4E2D"; - TaskStatus["COMPLETED"] = "\u5DF2\u5B8C\u6210"; - TaskStatus["BLOCKED"] = "\u88AB\u963B\u64CB"; -})(TaskStatus || (TaskStatus = {})); -// 相關文件類型:定義文件與任務的關係類型 -export var RelatedFileType; -(function (RelatedFileType) { - RelatedFileType["TO_MODIFY"] = "\u5F85\u4FEE\u6539"; - RelatedFileType["REFERENCE"] = "\u53C3\u8003\u8CC7\u6599"; - RelatedFileType["OUTPUT"] = "\u8F38\u51FA\u7D50\u679C"; - RelatedFileType["DEPENDENCY"] = "\u4F9D\u8CF4\u6587\u4EF6"; - RelatedFileType["OTHER"] = "\u5176\u4ED6"; -})(RelatedFileType || (RelatedFileType = {})); -// 任務複雜度級別:定義任務的複雜程度分類 -export var TaskComplexityLevel; -(function (TaskComplexityLevel) { - TaskComplexityLevel["LOW"] = "\u4F4E\u8907\u96DC\u5EA6"; - TaskComplexityLevel["MEDIUM"] = "\u4E2D\u7B49\u8907\u96DC\u5EA6"; - TaskComplexityLevel["HIGH"] = "\u9AD8\u8907\u96DC\u5EA6"; - TaskComplexityLevel["VERY_HIGH"] = "\u6975\u9AD8\u8907\u96DC\u5EA6"; -})(TaskComplexityLevel || (TaskComplexityLevel = {})); -// 任務複雜度閾值:定義任務複雜度評估的參考標準 -export const TaskComplexityThresholds = { - DESCRIPTION_LENGTH: { - MEDIUM: 500, // 超過此字數判定為中等複雜度 - HIGH: 1000, // 超過此字數判定為高複雜度 - VERY_HIGH: 2000, // 超過此字數判定為極高複雜度 - }, - DEPENDENCIES_COUNT: { - MEDIUM: 2, // 超過此依賴數量判定為中等複雜度 - HIGH: 5, // 超過此依賴數量判定為高複雜度 - VERY_HIGH: 10, // 超過此依賴數量判定為極高複雜度 - }, - NOTES_LENGTH: { - MEDIUM: 200, // 超過此字數判定為中等複雜度 - HIGH: 500, // 超過此字數判定為高複雜度 - VERY_HIGH: 1000, // 超過此字數判定為極高複雜度 - }, -}; diff --git a/src/types/index.ts b/src/types/index.ts index 07cbde9..961bfe5 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -92,6 +92,3 @@ export interface TaskComplexityAssessment { }; recommendations: string[]; // 處理建議列表 } - -// 思維鏈資料結構 -export * from "./thoughtChain.js"; diff --git a/src/types/thoughtChain.ts b/src/types/thoughtChain.ts deleted file mode 100644 index 4deb60d..0000000 --- a/src/types/thoughtChain.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * 思維鏈資料結構定義 - * - * 此文件定義了思維鏈工具所需的核心資料結構,僅包含處理單一思維所需的介面, - * 不包含儲存歷史記錄的功能。設計符合現有專案架構風格。 - */ - -/** - * 思維階段枚舉:定義思考過程中的不同階段 - */ -export enum ThoughtStage { - PROBLEM_DEFINITION = "問題定義", // 定義問題和目標的階段 - COLLECT_INFORMATION = "收集資訊", // 收集和分析資訊的階段 - RESEARCH = "研究", // 研究資訊的階段 - ANALYSIS = "分析", // 深入解析問題和可能解決方案的階段 - SYNTHESIS = "綜合", // 整合分析結果形成方案的階段 - CONCLUSION = "結論", // 總結思考過程並提出最終解決方案的階段 - QUESTIONING = "質疑", // 質疑和批判的階段 - PLANNING = "規劃", // 規劃和計劃的階段 -} - -/** - * 思維資料介面:定義思維的完整資料結構 - */ -export interface ThoughtData { - thought: string; // 思維內容(字串) - thoughtNumber: number; // 當前思維編號(數字) - totalThoughts: number; // 預估總思維數量(數字) - nextThoughtNeeded: boolean; // 是否需要更多思維(布林值) - stage: string; // 思維階段(字串,如「問題定義」、「研究」、「分析」、「綜合」、「結論」、「質疑」) - tags?: string[]; // 可選的思維關鍵詞或分類(字串陣列) - axioms_used?: string[]; // 可選的此思維中使用的原則或公理(字串陣列) - assumptions_challenged?: string[]; // 可選的此思維挑戰的假設(字串陣列) -} diff --git a/src/utils/fileLoader.js b/src/utils/fileLoader.js deleted file mode 100644 index 2ca7130..0000000 --- a/src/utils/fileLoader.js +++ /dev/null @@ -1,84 +0,0 @@ -import { RelatedFileType } from "../types/index.js"; -/** - * 生成任務相關文件的內容摘要 - * - * 此函數根據提供的 RelatedFile 物件列表,生成文件的摘要信息,而不實際讀取檔案內容。 - * 這是一個輕量級的實現,僅基於檔案元數據(如路徑、類型、描述等)生成格式化的摘要, - * 適用於需要提供文件上下文信息但不需要訪問實際檔案內容的情境。 - * - * @param relatedFiles 相關文件列表 - RelatedFile 物件數組,包含文件的路徑、類型、描述等資訊 - * @param maxTotalLength 摘要內容的最大總長度 - 控制生成摘要的總字符數,避免過大的返回內容 - * @returns 格式化的文件摘要資訊 - */ -export async function loadTaskRelatedFiles( - relatedFiles, - maxTotalLength = 15000 // 控制生成內容的總長度 -) { - if (!relatedFiles || relatedFiles.length === 0) { - return "## 相關文件\n\n無相關文件"; - } - - let filesSummary = `## 相關文件內容摘要 (共 ${relatedFiles.length} 個文件)\n\n`; - let totalLength = 0; - - // 按文件類型優先級排序(首先處理待修改的文件) - const priorityOrder = { - [RelatedFileType.TO_MODIFY]: 1, - [RelatedFileType.REFERENCE]: 2, - [RelatedFileType.DEPENDENCY]: 3, - [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}` : "" - }${ - file.lineStart && file.lineEnd - ? ` (行 ${file.lineStart}-${file.lineEnd})` - : "" - }\n\n`; - - filesSummary += fileHeader + "```\n" + fileInfo + "\n```\n\n"; - totalLength += fileInfo.length + fileHeader.length + 8; // 8 for "```\n" and "\n```" - } - - return filesSummary; -} - -/** - * 生成文件基本資訊摘要 - * - * 根據檔案的元數據生成格式化的資訊摘要,包含檔案路徑、類型和相關提示。 - * 不讀取實際檔案內容,僅基於提供的 RelatedFile 物件生成信息。 - * - * @param file 相關文件物件 - 包含檔案路徑、類型、描述等基本資訊 - * @returns 格式化的檔案資訊摘要文字 - */ -function generateFileInfo(file) { - let fileInfo = `檔案: ${file.path}\n`; - fileInfo += `類型: ${file.type}\n`; - if (file.description) { - fileInfo += `描述: ${file.description}\n`; - } - if (file.lineStart && file.lineEnd) { - fileInfo += `行範圍: ${file.lineStart}-${file.lineEnd}\n`; - } - fileInfo += `若需查看實際內容,請直接查看檔案: ${file.path}\n`; - - return fileInfo; -} diff --git a/src/utils/summaryExtractor.ts b/src/utils/summaryExtractor.ts deleted file mode 100644 index 2fdb664..0000000 --- a/src/utils/summaryExtractor.ts +++ /dev/null @@ -1,266 +0,0 @@ -/** - * 摘要提取工具:從對話內容中提取關鍵信息 - * - * 本模塊提供從完整對話中提取關鍵信息的功能,使用多種策略來識別重要內容: - * 1. 關鍵詞匹配:識別含有特定關鍵詞的句子 - * 2. 句子重要性評分:基於位置、長度等因素評估句子重要性 - * 3. 上下文關聯:考慮句子間的邏輯關聯 - */ - -// 定義關鍵詞與其權重 -const KEYWORDS = { - // 任務相關 - 任務: 1.5, - 功能: 1.3, - 實現: 1.3, - 開發: 1.3, - 完成: 1.2, - 執行: 1.2, - 驗證: 1.2, - 錯誤: 1.5, - 問題: 1.5, - 修復: 1.5, - 失敗: 1.8, - 成功: 1.5, - 依賴: 1.2, - 阻擋: 1.4, - 風險: 1.4, - 優化: 1.3, - 改進: 1.3, - - // 決策相關 - 決定: 1.6, - 選擇: 1.5, - 決策: 1.6, - 方案: 1.5, - 架構: 1.5, - 設計: 1.4, - 結構: 1.4, - - // 技術相關 - 代碼: 1.3, - 測試: 1.3, - 函數: 1.2, - 接口: 1.2, - 類型: 1.2, - 模塊: 1.2, - 組件: 1.2, - 數據: 1.3, - 文件: 1.2, - 路徑: 1.1, - - // 系統狀態 - 狀態: 1.3, - 啟動: 1.3, - 停止: 1.3, - 創建: 1.3, - 刪除: 1.4, - 更新: 1.3, - 查詢: 1.2, - - // 負面信息(需要重點關注) - 警告: 1.8, - 異常: 1.8, - 崩潰: 2.0, - 嚴重: 1.8, - 危險: 1.8, - 緊急: 1.9, -}; - -/** - * 從文本中提取簡短摘要 - * @param text 要提取摘要的文本 - * @param maxLength 摘要的最大長度 - * @returns 提取的摘要文本 - */ -export function extractSummary(text: string, maxLength: number = 100): string { - if (!text) return ""; - - // 移除 Markdown 格式 - const plainText = text - .replace(/```[\s\S]*?```/g, "") // 移除代碼塊 - .replace(/#+\s/g, "") // 移除標題標記 - .replace(/\*\*/g, "") // 移除粗體標記 - .replace(/\*/g, "") // 移除斜體標記 - .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // 將連結替換為文本 - .replace(/\n/g, " ") // 將換行符替換為空格 - .replace(/\s+/g, " ") // 將多個空格替換為單個空格 - .trim(); - - // 如果文本長度在允許範圍內,直接返回 - if (plainText.length <= maxLength) { - return plainText; - } - - // 取前段並添加省略號 - return plainText.substring(0, maxLength - 3) + "..."; -} - -/** - * 生成任務完成摘要 - * @param taskName 任務名稱 - * @param taskDescription 任務描述 - * @param completionDetails 完成細節(可選) - * @returns 生成的任務摘要 - */ -export function generateTaskSummary( - taskName: string, - taskDescription: string, - completionDetails?: string -): string { - // 如果提供了完成細節,優先使用 - if (completionDetails) { - return extractSummary(completionDetails, 250); - } - - // 否則從任務名稱和描述生成摘要 - const baseText = `${taskName}已成功完成。該任務涉及${extractSummary( - taskDescription, - 200 - )}`; - return extractSummary(baseText, 250); -} - -/** - * 將文本分割為句子 - * - * @param text 要分割的文本 - * @returns 句子數組 - */ -function splitIntoSentences(text: string): string[] { - // 使用正則表達式分割句子 - // 匹配中文和英文的句號、問號、驚嘆號,以及換行符 - const sentenceSplitters = /(?<=[。.!!??\n])\s*/g; - const sentences = text - .split(sentenceSplitters) - .filter((s) => s.trim().length > 0); - - return sentences; -} - -/** - * 為句子評分,決定其在摘要中的重要性 - * - * @param sentence 要評分的句子 - * @param index 句子在原文中的位置索引 - * @param totalSentences 原文中的總句子數 - * @returns 句子的重要性評分 - */ -function scoreSentence( - sentence: string, - index: number, - totalSentences: number -): number { - let score = 1.0; - - // 位置因素:文檔開頭和結尾的句子通常更重要 - if (index === 0 || index === totalSentences - 1) { - score *= 1.5; - } else if ( - index < Math.ceil(totalSentences * 0.2) || - index >= Math.floor(totalSentences * 0.8) - ) { - score *= 1.25; - } - - // 句子長度因素:過短的句子可能信息量較少,過長的句子可能包含太多信息 - const wordCount = sentence.split(/\s+/).length; - if (wordCount < 3) { - score *= 0.8; - } else if (wordCount > 25) { - score *= 0.9; - } else if (wordCount >= 5 && wordCount <= 15) { - score *= 1.2; - } - - // 關鍵詞因素:包含關鍵詞的句子更重要 - for (const [keyword, weight] of Object.entries(KEYWORDS)) { - if (sentence.includes(keyword)) { - score *= weight; - } - } - - // 句子結構因素:特殊句式可能更重要 - if ( - sentence.includes("總結") || - sentence.includes("結論") || - sentence.includes("因此") || - sentence.includes("所以") - ) { - score *= 1.5; - } - - // 數字和專有名詞因素:包含數字和專有名詞的句子通常更重要 - if (/\d+/.test(sentence)) { - score *= 1.3; - } - - return score; -} - -/** - * 從指定內容中提取一個簡短標題 - * - * @param content 要提取標題的內容 - * @param maxLength 標題的最大長度 - * @returns 提取的標題 - */ -export function extractTitle(content: string, maxLength: number = 50): string { - // 防禦性檢查 - if (!content || content.trim().length === 0) { - return ""; - } - - // 分割為句子 - const sentences = splitIntoSentences(content); - if (sentences.length === 0) { - return ""; - } - - // 先考慮第一個句子 - let title = sentences[0]; - - // 如果第一個句子太長,找到第一個逗號或其他分隔符截斷 - if (title.length > maxLength) { - const firstPart = title.split(/[,,::]/)[0]; - if (firstPart && firstPart.length < maxLength) { - title = firstPart; - } else { - title = title.substring(0, maxLength - 3) + "..."; - } - } - - return title; -} - -/** - * 基於對話上下文智能提取摘要 - * - * @param messages 對話消息列表,每條消息包含角色和內容 - * @param maxLength 摘要的最大長度 - * @returns 提取的摘要 - */ -export function extractSummaryFromConversation( - messages: Array<{ role: string; content: string }>, - maxLength: number = 200 -): string { - // 防禦性檢查 - if (!messages || messages.length === 0) { - return ""; - } - - // 如果只有一條消息,直接提取其摘要 - if (messages.length === 1) { - return extractSummary(messages[0].content, maxLength); - } - - // 連接所有消息,但保留角色信息 - const combinedText = messages - .map((msg) => `${msg.role}: ${msg.content}`) - .join("\n"); - - // 從組合文本提取摘要 - const summary = extractSummary(combinedText, maxLength); - - return summary; -}