/**
 * 审计池 — 记录已完成任务的审计条目，供后续治理流程消费。
 * P2-1 范围: 持久化入池（append）和查询（list），不做随机抽检，不生成逃逸报告，不改能力状态。
 * 存储: JSON 数组文件，原子写入。
 * 路径: 由调用方（TaskContextManager）传入 stateDir 绑定，不使用 process.cwd 猜测。
 */
import fs from "node:fs";
import path from "node:path";
import { debug } from "../core/logger.js";
import { safeJsonParse } from "../core/helpers.js";
/** 所有可能的风险等级 */
const ALL_RISK_LEVELS = ["low", "medium", "high", "critical"];
/** 创建按风险等级统计的空记录 */
function emptyByRisk() {
    return Object.fromEntries(ALL_RISK_LEVELS.map((r) => [r, 0]));
}
/** 深拷贝审计条目，防止外部修改影响内部数据 */
function deepCopyItem(item) {
    return {
        task_id: item.task_id,
        risk: item.risk,
        changed_files: [...item.changed_files],
        evidence: item.evidence,
        capability_refs: [...item.capability_refs],
        created_at: item.created_at,
    };
}
/** 审计池 — 持久化管理已完成任务的审计条目 */
export class AuditPool {
    filePath;
    items = [];
    loaded = false;
    /**
     * 创建审计池实例。
     * @param stateDir - 状态目录路径，审计池数据将存储在此目录下
     */
    constructor(stateDir) {
        this.filePath = path.join(stateDir, "audit-pool.json");
        if (!fs.existsSync(stateDir)) {
            fs.mkdirSync(stateDir, { recursive: true });
        }
        debug("审计池", "初始化完成，数据路径: " + this.filePath);
    }
    /** 确保数据已从磁盘加载 */
    ensureLoaded() {
        if (this.loaded)
            return;
        this.loaded = true;
        try {
            const data = fs.readFileSync(this.filePath, "utf-8");
            this.items = safeJsonParse(data) ?? [];
        }
        catch (e) {
            debug("审计池", "加载数据文件失败(预期行为: 文件不存在) —", e);
            this.items = [];
        }
    }
    /** 持久化当前数据到磁盘（原子写入） */
    persist() {
        const tmpPath = `${this.filePath}.tmp`;
        fs.writeFileSync(tmpPath, JSON.stringify(this.items, null, 2));
        fs.renameSync(tmpPath, this.filePath);
    }
    /**
     * 追加审计条目到池中并持久化。
     * @param item - 要追加的审计条目
     */
    append(item) {
        this.ensureLoaded();
        this.items.push(deepCopyItem(item));
        this.persist();
        debug("审计池", `追加条目 task_id=${item.task_id}, 风险等级=${item.risk}`);
    }
    /**
     * 查询审计条目列表，支持按风险等级和能力策略引用过滤。
     * @param filter - 可选过滤条件
     * @param filter.risk - 按风险等级过滤
     * @param filter.capability_ref - 按能力策略引用过滤
     * @returns 匹配的审计条目列表（深拷贝）
     */
    list(filter) {
        this.ensureLoaded();
        let result = this.items;
        if (filter?.risk) {
            result = result.filter((i) => i.risk === filter.risk);
        }
        if (filter?.capability_ref) {
            result = result.filter((i) => i.capability_refs.includes(filter.capability_ref));
        }
        return result.map(deepCopyItem);
    }
    /**
     * 获取审计池统计信息。
     * @returns 包含总数和按风险等级分布的统计信息
     */
    stats() {
        this.ensureLoaded();
        const by_risk = emptyByRisk();
        for (const item of this.items) {
            by_risk[item.risk]++;
        }
        return { total: this.items.length, by_risk };
    }
    /**
     * 清空审计池并持久化。
     */
    clear() {
        this.items = [];
        this.loaded = true;
        this.persist();
        debug("审计池", "已清空所有条目");
    }
    /**
     * 获取审计池数据文件路径。
     * @returns 数据文件的绝对路径
     */
    getFilePath() {
        return this.filePath;
    }
}
//# sourceMappingURL=audit_pool.js.map