/**
 * 知识漂移分类器 — 从 knowledge_evolution.ts 提取，消除循环依赖。
 *
 * 分类知识漂移类型：
 * - knowledge_outdated: 知识描述与当前代码行为不一致
 * - code_debt: 代码未按已有知识规范执行
 * - ambiguous: 无法确定是知识过时还是代码偏差
 */
// ── 核心函数 ──
/**
 * 分类知识漂移。
 * 对比知识内容和代码内容，判断漂移类型。
 *
 * - knowledge_outdated: 知识中的大部分模式在代码中找不到 — 知识过时
 * - code_debt: 代码中大部分模式在知识中存在，但仍有漂移 — 代码偏差
 * - ambiguous: 覆盖率在中间 — 无法确定，需人工裁决
 */
export function classifyDrift(entry_id, knowledgeContent, codeContent) {
    // 计算知识中引用的路径/模式在代码中的覆盖率
    const knowledgePatterns = extractPatterns(knowledgeContent);
    const codePatterns = extractPatterns(codeContent);
    const matchedPatterns = knowledgePatterns.filter((p) => codePatterns.some((cp) => cp.includes(p) || p.includes(cp)));
    const coverageRatio = knowledgePatterns.length > 0
        ? matchedPatterns.length / knowledgePatterns.length
        : 0;
    let classification;
    let description_zh;
    let requires_human;
    if (coverageRatio < 0.3) {
        // 知识中的大部分模式在代码中找不到 — 知识过时
        classification = "knowledge_outdated";
        description_zh = `知识条目 ${entry_id} 与当前代码严重不一致（覆盖率 ${Math.round(coverageRatio * 100)}%），知识内容可能已过时`;
        requires_human = true;
    }
    else if (coverageRatio > 0.7) {
        // 代码中大部分模式在知识中存在 — 但仍有漂移，可能是代码偏差
        classification = "code_debt";
        description_zh = `知识条目 ${entry_id} 与代码基本一致（覆盖率 ${Math.round(coverageRatio * 100)}%），但存在代码未遵循知识规范的偏差`;
        requires_human = false;
    }
    else {
        // 覆盖率在中间 — 无法确定
        classification = "ambiguous";
        description_zh = `知识条目 ${entry_id} 与代码部分一致（覆盖率 ${Math.round(coverageRatio * 100)}%），无法确定是知识过时还是代码偏差，需人工裁决`;
        requires_human = true;
    }
    return {
        id: `drift-${entry_id}-${Date.now()}`,
        entry_id,
        classification,
        description_zh,
        requires_human,
    };
}
// ── 内部辅助函数 ──
/**
 * 从文本中提取关键模式（路径引用、函数名、类型名）。
 * 简单启发式提取，用于漂移检测的内容对比。
 */
function extractPatterns(content) {
    const patterns = new Set();
    // 提取路径引用 (xxx/yyy 形式)
    const pathMatches = content.match(/[\w./-]+\/[\w./-]+/g);
    if (pathMatches) {
        for (const p of pathMatches) {
            if (p.length >= 4) {
                patterns.add(p);
            }
        }
    }
    // 提取驼峰/蛇形标识符 (至少 4 个字符的单词级标识符)
    const identMatches = content.match(/\b[a-zA-Z_][\w]{3,}\b/g);
    if (identMatches) {
        for (const id of identMatches) {
            if (id.length >= 5) {
                patterns.add(id);
            }
        }
    }
    return [...patterns];
}
//# sourceMappingURL=drift_classifier.js.map