/**
 * 适配器 Prompt 契约 — 问题三十一实现。
 *
 * 负责验证适配器 Prompt 的合规性、检查清单一致性、以及同步逻辑。
 */
// ── 常量 ──
/** 所有必须包含的章节 */
export const REQUIRED_ADAPTER_SECTIONS = [
    "when_to_use_soloforge",
    "when_not_to_use_soloforge",
    "tool_invocation_policy",
    "strict_controlled_tools",
    "language_policy",
    "status_feedback_policy",
    "dangerous_action_policy",
    "trace_policy",
    "fallback_policy",
];
/** 禁止出现的声明 */
export const FORBIDDEN_ADAPTER_CLAIMS = [
    "可以自由选择任意 sf_* 工具",
    "验证通过后自动 deliver",
    "sf_deliver 默认会 push/PR",
    "跳过 SoloForge 直接修改即可",
    "advisory warning 必须 hard block",
    "experimental 能力已稳定可用",
    "输出英文更专业",
    "缺少知识时按通用经验补全",
    "delivery readiness 就是已交付",
];
// ── 验证函数 ──
/**
 * 验证适配器 Prompt 合规性。
 *
 * 检查项：
 * - 必须章节是否齐全（缺失为 warning）
 * - 是否包含禁止声明（为 critical）
 * - next_allowed_tools 是否非空（空为 critical）
 */
export function validateAdapterPrompt(contract) {
    const findings = [];
    const missing_sections = [];
    const detected_forbidden_claims = [];
    // 检查必须章节
    for (const section of REQUIRED_ADAPTER_SECTIONS) {
        if (!contract.required_sections.includes(section)) {
            missing_sections.push(section);
            findings.push({
                severity: "warning",
                rule: "required_section_missing",
                message_zh: `缺少必须章节: ${section}`,
                section,
            });
        }
    }
    // 检查禁止声明
    for (const claim of FORBIDDEN_ADAPTER_CLAIMS) {
        if (contract.forbidden_claims.includes(claim)) {
            detected_forbidden_claims.push(claim);
            findings.push({
                severity: "critical",
                rule: "forbidden_claim_detected",
                message_zh: `检测到禁止声明: "${claim}"`,
            });
        }
    }
    // 检查 next_allowed_tools
    const has_next_allowed_tools = contract.next_allowed_tools.length > 0;
    if (!has_next_allowed_tools) {
        findings.push({
            severity: "critical",
            rule: "next_allowed_tools_empty",
            message_zh: "next_allowed_tools 为空，适配器无法获知允许调用的工具集",
        });
    }
    // 汇总合规状态
    let compliance_status = "compliant";
    if (detected_forbidden_claims.length > 0) {
        compliance_status = "forbidden_claims";
    }
    else if (missing_sections.length > 0) {
        compliance_status = "missing_sections";
    }
    const compliant = detected_forbidden_claims.length === 0 &&
        missing_sections.length === 0 &&
        has_next_allowed_tools;
    return {
        adapter_id: contract.adapter_id,
        compliant,
        compliance_status,
        missing_sections,
        detected_forbidden_claims,
        has_next_allowed_tools,
        findings,
    };
}
/**
 * 验证适配器 Prompt 清单与契约的一致性。
 *
 * 检查 contract_ids 是否匹配、host_type 是否一致。
 */
export function validateAdapterPromptManifest(manifest, contract) {
    const findings = [];
    // 检查 adapter_id 是否匹配
    if (manifest.adapter_id !== contract.adapter_id) {
        findings.push(`清单 adapter_id "${manifest.adapter_id}" 与契约 adapter_id "${contract.adapter_id}" 不一致`);
    }
    // 检查 host_type 是否匹配
    if (manifest.host_type !== contract.host_type) {
        findings.push(`清单 host_type "${manifest.host_type}" 与契约 host_type "${contract.host_type}" 不一致`);
    }
    return {
        consistent: findings.length === 0,
        findings,
    };
}
/**
 * 同步适配器 Prompt 集合。
 *
 * - dry_run: 仅验证，不写入
 * - apply: 仅当合规时才执行同步（无禁止声明且所有必须章节齐全）
 * - 永不覆盖用户修改过的 Prompt
 */
export function syncAdapterPrompts(contracts, options) {
    return contracts.map((contract) => {
        const validation = validateAdapterPrompt(contract);
        // apply 模式下，不合规的契约不执行同步
        if (options.apply && !validation.compliant) {
            validation.findings.push({
                severity: "warning",
                rule: "sync_skipped_non_compliant",
                message_zh: `适配器 "${contract.adapter_id}" 不合规，跳过同步`,
            });
        }
        // dry_run 模式只验证
        if (options.dry_run) {
            validation.findings.push({
                severity: "info",
                rule: "dry_run_only",
                message_zh: `适配器 "${contract.adapter_id}" 仅执行 dry-run 验证`,
            });
        }
        // 安全约束：永不覆盖用户修改过的 Prompt
        // sync_required 标记为 false 表示用户已手动修改，跳过同步
        if (options.apply && !contract.sync_required) {
            validation.findings.push({
                severity: "info",
                rule: "user_modified_skip",
                message_zh: `适配器 "${contract.adapter_id}" 已被用户修改，跳过自动同步以尊重用户主权`,
            });
        }
        // apply 模式且未确认时，提示需要确认
        if (options.apply && validation.compliant && !options.confirm) {
            validation.findings.push({
                severity: "info",
                rule: "confirm_required",
                message_zh: `适配器 "${contract.adapter_id}" 合规但未获用户确认，暂不执行写入`,
            });
        }
        return validation;
    });
}
//# sourceMappingURL=adapter_prompt_contract.js.map