perf(config/findings): getOpenCodeHttpsAgent 改模組單例、normalizeText 加 memoization 快取

另含 comments.js bySeverity 改用預建 LEVEL_RANK Map(隨 fix commit 一併提交)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeffery
2026-06-26 15:26:08 +08:00
co-authored by Claude Opus 4.8
parent 402630fa69
commit 998b5ca5ac
2 changed files with 12 additions and 4 deletions
+5 -3
View File
@@ -16,12 +16,14 @@ export const EXCLUSIONS_PATH = '.gitea/ai-review/exclusions.json';
* 建立一個停用 TLS 憑證驗證(`rejectUnauthorized: false`)的 HTTPS Agent
* 供連接使用自簽或無效憑證的 OpenCode 服務時使用。
*
* @remarks 次呼叫都會回傳全新的 Agent 實例(不快取),建議呼叫端重用以共用連線池。
* @remarks 次呼叫時建立,之後快取為模組層級單例(singleton)重複使用,
* 避免每次都新建 Agent 與連線池、浪費 TCP 三次握手。
* 停用憑證驗證有中間人攻擊風險,僅限受信任的內部環境使用。
* @returns {import('https').Agent} 已關閉憑證驗證的 HTTPS Agent 例。
* @returns {import('https').Agent} 已關閉憑證驗證的 HTTPS Agent 例。
*/
let _openCodeHttpsAgent = null;
export function getOpenCodeHttpsAgent() {
return new https.Agent({ rejectUnauthorized: false });
return (_openCodeHttpsAgent ??= new https.Agent({ rejectUnauthorized: false }));
}
/**
+7 -1
View File
@@ -107,14 +107,20 @@ function cleanText(value) {
* @param {*} value - 任意值;非字串會先經 cleanText 轉為空字串。
* @returns {string} 正規化後、以單一空白分隔的字串(可能為空字串)。
* @remarks 用於 finding 與排除條目文字的雙向「包含」比對(applyExclusions、appendExclusions)。
* 因為比對常對同一段文字重複呼叫(findings × exclusions 笛卡爾積),
* 以模組層級 Map 對「字串輸入」做 memoization,避免重複跑 NFKC/正則替換。
*/
const _normalizeTextCache = new Map();
export function normalizeText(value) {
return cleanText(value)
if (typeof value === 'string' && _normalizeTextCache.has(value)) return _normalizeTextCache.get(value);
const result = cleanText(value)
.normalize('NFKC')
.toLowerCase()
.replace(/[\p{P}\p{S}\s]+/gu, ' ')
.replace(/\s+/g, ' ')
.trim();
if (typeof value === 'string') _normalizeTextCache.set(value, result);
return result;
}
/**