/**
 * 切片执行器 — 管理开发切片的调度、隔离和单切片审查。
 *
 * 核心职责:
 * - 切片调度：按优先级串行或并行执行
 * - 切片隔离：后续切片不能影响已通过校验的切片
 * - 单切片审查：支持对任一切片单独进行代码审查
 */
import { debug } from "../core/logger.js";
/**
 * 创建切片执行器上下文。
 */
export function createSliceContext(slices) {
    return {
        slices: slices.sort((a, b) => a.priority - b.priority),
        results: new Map(),
        protected_files: new Set(),
    };
}
/**
 * 获取下一个待执行的切片。
 * 考虑依赖关系：依赖切片必须已通过。
 */
export function getNextSlice(ctx) {
    for (const slice of ctx.slices) {
        const result = ctx.results.get(slice.id);
        if (result && result.status !== "pending")
            continue;
        // 检查依赖是否已通过
        const depsMet = slice.depends_on.every((depId) => {
            const dep = ctx.results.get(depId);
            return dep?.status === "passed";
        });
        if (!depsMet)
            continue;
        return slice;
    }
    return null;
}
/**
 * 获取所有可并行执行的切片（无互相依赖且依赖都已通过）。
 */
export function getParallelSlices(ctx) {
    const available = [];
    const runningIds = new Set([...ctx.results.values()]
        .filter((r) => r.status === "in_progress")
        .map((r) => r.slice_id));
    for (const slice of ctx.slices) {
        if (ctx.results.has(slice.id))
            continue;
        if (runningIds.has(slice.id))
            continue;
        const depsMet = slice.depends_on.every((depId) => {
            const dep = ctx.results.get(depId);
            return dep?.status === "passed";
        });
        if (depsMet)
            available.push(slice);
    }
    return available;
}
/**
 * 检查切片隔离：新切片不能触碰已通过切片的受保护文件。
 */
export function checkSliceIsolation(ctx, slice) {
    const conflicts = slice.affected_files.filter((f) => ctx.protected_files.has(f));
    return {
        isolated: conflicts.length === 0,
        conflicts,
    };
}
/**
 * 标记切片执行结果。
 * 通过时将其文件加入受保护集合。
 */
export function markSliceResult(ctx, result) {
    ctx.results.set(result.slice_id, result);
    if (result.status === "passed") {
        const slice = ctx.slices.find((s) => s.id === result.slice_id);
        if (slice) {
            for (const f of slice.affected_files) {
                ctx.protected_files.add(f);
            }
        }
        debug("切片执行器", "切片通过, id=%s, 受保护文件数=%d", result.slice_id, ctx.protected_files.size);
    }
}
/**
 * 审查指定切片。
 */
export function reviewSlice(sliceId, findings) {
    const result = {
        slice_id: sliceId,
        passed: !findings.some((f) => f.severity === "critical"),
        findings,
    };
    debug("切片执行器", "切片审查, id=%s, 通过=%s, 发现数=%d", sliceId, result.passed, findings.length);
    return result;
}
//# sourceMappingURL=slice_executor.js.map