import { debug } from "./core/logger.js";
// ── 可行性预判 (⑨) ──
// 三级判定: infeasible → risky → feasible
// 纯规则引擎，永不阻断流程，仅提供建议
/**
 * 可行性预判 — 对任务分类结果进行三级判定（不可行/有风险/可行）。
 * 纯规则引擎，永不阻断流程，仅提供建议。
 * @param classification - 任务分类结果
 * @param config - 项目配置
 * @param options - 可选参数，包含知识匹配结果和置信度
 * @returns 可行性判定结果，包含级别、原因和建议
 */
export function checkFeasibility(classification, config, options) {
    debug("可行性预判", `开始分析任务可行性，类型: ${classification.task_type}`);
    const reasons = [];
    const recommendations = [];
    const { task_type, affected_repos, complexity } = classification;
    const { build_commands, scope, scaffold } = config;
    const knowledgeMatched = options?.knowledgeMatched ?? true;
    const confidence = options?.confidence ?? 0.8;
    // ── 第一层: 不可行判定 (infeasible) ──
    const isInfeasible = checkInfeasible(task_type, affected_repos, scope, build_commands, scaffold, reasons, recommendations);
    if (isInfeasible) {
        debug("可行性预判", `任务不可行 — ${reasons[0]}`);
        return buildResult("infeasible", reasons, recommendations);
    }
    // ── 第二层: 有风险判定 (risky) ──
    const isRisky = checkRisky(task_type, affected_repos, complexity, knowledgeMatched, confidence, reasons, recommendations);
    if (isRisky) {
        debug("可行性预判", `任务存在风险 — ${reasons[0]}`);
        return buildResult("risky", reasons, recommendations);
    }
    // ── 第三层: 可行 (feasible) ──
    debug("可行性预判", `任务可行`);
    return buildResult("feasible", reasons, recommendations);
}
// ── 不可行条件检查 ──
function checkInfeasible(task_type, affected_repos, scope, build_commands, scaffold, reasons, recommendations) {
    let infeasible = false;
    // hotfix 但既无仓库信息也无范围路径
    if (task_type === "hotfix" &&
        affected_repos.length === 0 &&
        scope.backend.length === 0 &&
        scope.frontend.length === 0) {
        reasons.push("紧急修复任务未指定受影响仓库，也未限定变更范围，无法定位修复目标");
        recommendations.push("请在意图中明确受影响的服务或模块路径，例如指定仓库名或文件范围");
        infeasible = true;
    }
    // 构建命令完全缺失
    const hasBackendBuild = build_commands.backend.build.trim() !== "";
    const hasFrontendBuild = build_commands.frontend.build.trim() !== "";
    if (!hasBackendBuild && !hasFrontendBuild) {
        reasons.push("项目未配置构建命令，无法执行验证");
        recommendations.push("请在 .soloforge/config.yaml 中配置 build_commands.backend.build 或 build_commands.frontend.build");
        infeasible = true;
    }
    // scaffold 但无脚手架配置
    if (task_type === "scaffold" &&
        !scaffold?.custom_templates_dir) {
        reasons.push("脚手架任务缺少 scaffold 配置段，无模板可用");
        recommendations.push("请在项目配置中添加 scaffold 段（含 base_package 和 templates），或指定 custom_templates_dir");
        infeasible = true;
    }
    return infeasible;
}
// ── 有风险条件检查 ──
function checkRisky(task_type, affected_repos, complexity, knowledgeMatched, confidence, reasons, recommendations) {
    let risky = false;
    // 涉及 2+ 仓库
    if (affected_repos.length >= 2) {
        reasons.push(`任务涉及 ${affected_repos.length} 个仓库，变更协调复杂度高`);
        recommendations.push("建议先确认各仓库的接口契约一致性");
        recommendations.push("建议分仓库拆分子任务，降低联调风险");
        risky = true;
    }
    // 重构 + 高复杂度
    if (task_type === "refactor" && complexity === "high") {
        reasons.push("重构任务复杂度为高，回归影响范围难以精确预估");
        recommendations.push("建议先运行现有测试套件确认基线通过率");
        recommendations.push("建议使用影响分析工具（impact_analyzer）评估变更波及范围");
        risky = true;
    }
    // 无知识匹配且置信度低
    if (!knowledgeMatched && confidence < 0.5) {
        reasons.push("未匹配到相关知识，且执行置信度较低，经验不足可能导致效率下降");
        recommendations.push("建议先在 supervised 模式下执行，由人工确认关键步骤");
        recommendations.push("执行完成后建议触发知识沉淀，补充对应模式");
        risky = true;
    }
    return risky;
}
// ── 结果构建 ──
function buildResult(level, reasons, recommendations) {
    return {
        level,
        reasons,
        recommendations,
        blocked: false,
    };
}
//# sourceMappingURL=feasibility_checker.js.map