#!/usr/bin/env node /** * P1-B 补丁 — 将 rerankTopK 接入 route-interceptor.js 的 runRouteEngine() * * 用法: node scripts/patch-interceptor-p1b.js * node scripts/patch-interceptor-p1b.js --dry-run */ const fs = require('fs'); const path = require('path'); const dryRun = process.argv.includes('--dry-run'); const HOOK_FILE = path.join(__dirname, '..', 'hooks', 'route-interceptor.js'); if (!fs.existsSync(HOOK_FILE)) { console.error('错误: 找不到 route-interceptor.js'); process.exit(1); } let code = fs.readFileSync(HOOK_FILE, 'utf8'); let patchCount = 0; // === 补丁: 归一化之前插入 reranking === // 匹配兼容 \r\n const ANCHOR_RE = /( +\/\/ 归一化\r?\n const normalized = routeAnalyzer\.normalizeScores\(disambiguated\)\.slice\(0, 5\);)/; const REPLACEMENT = ` // v5.8 P1-B: top-k reranking 精排 let reranked = disambiguated; if (routeAnalyzer.rerankTopK) { try { reranked = routeAnalyzer.rerankTopK(disambiguated, queryTokens, index, 10); } catch {} } // 归一化 const normalized = routeAnalyzer.normalizeScores(reranked).slice(0, 5);`; if (ANCHOR_RE.test(code)) { code = code.replace(ANCHOR_RE, REPLACEMENT); patchCount++; console.log('✓ reranking 已插入 runRouteEngine() (归一化之前)'); } else if (code.includes('P1-B: top-k reranking')) { console.log('⊘ 已存在,跳过'); } else { console.error('✗ 找不到锚点 (归一化行)'); } if (patchCount === 0) { console.log('\n无需变更。'); process.exit(0); } if (dryRun) { console.log(`\n[dry-run] 将应用 ${patchCount} 个补丁,但未写入。`); process.exit(0); } fs.writeFileSync(HOOK_FILE, code); console.log(`已写入 ${patchCount} 个补丁到 route-interceptor.js`); console.log('完成 ✓');