/**
 * 隐私/机密/数据主权合约 — 授权与权限判定
 *
 * 包含读取禁止/确认判定、授权创建与验证、操作权限检查等功能。
 */
import { debugLog } from "../core/logger.js";
import { DEFAULT_HANDLING, CONTEXT_HANDLING, FORBIDDEN_READ_PATTERNS, CONFIRMATION_READ_PATTERNS, } from "./privacy_patterns.js";
// ── 检查函数 ──
/**
 * 获取指定敏感标签的默认处理方式。
 * @param label - 敏感标签
 * @returns 处理方式
 */
export function getDefaultHandling(label) {
    debugLog(`隐私契约: 获取默认处理方式 — ${label}`);
    return DEFAULT_HANDLING[label];
}
/**
 * 获取指定敏感标签在特定上下文中的处理方式。
 * @param label - 敏感标签
 * @param context - 检查上下文
 * @returns 处理方式
 */
export function getContextHandling(label, context) {
    debugLog(`隐私契约: 获取上下文处理方式 — ${label}/${context}`);
    return CONTEXT_HANDLING[label][context];
}
/**
 * 判断数据是否可以注入 prompt。
 * @param label - 敏感标签
 * @returns 是否允许
 */
export function canInjectInPrompt(label) {
    debugLog(`隐私契约: 检查 prompt 注入许可 — ${label}`);
    const handling = CONTEXT_HANDLING[label].prompt_injection;
    return handling === "allow";
}
/**
 * 判断数据是否可以存入任务上下文。
 * @param label - 敏感标签
 * @returns 是否允许
 */
export function canStoreInTaskContext(label) {
    debugLog(`隐私契约: 检查 TaskContext 存储许可 — ${label}`);
    const handling = CONTEXT_HANDLING[label].task_context_store;
    return handling === "allow" || handling === "redact" || handling === "summarize_only";
}
/**
 * 判断数据是否可以存入产物。
 * @param label - 敏感标签
 * @returns 是否允许
 */
export function canStoreInArtifact(label) {
    debugLog(`隐私契约: 检查 artifact 存储许可 — ${label}`);
    const handling = CONTEXT_HANDLING[label].artifact_store;
    return handling === "allow" || handling === "redact" || handling === "summarize_only";
}
/**
 * 判断数据是否可以外部发送。
 * @param label - 敏感标签
 * @returns 是否允许
 */
export function canSendExternally(label) {
    debugLog(`隐私契约: 检查外发许可 — ${label}`);
    return CONTEXT_HANDLING[label].external_send === "allow";
}
/**
 * 判断来源的内容是否可以读取。
 * @param sourceRef - 来源引用路径
 * @returns 读取许可结果
 */
export function canReadContent(sourceRef) {
    debugLog(`隐私契约: 检查内容读取许可 — ${sourceRef}`);
    for (const { pattern, label, reason } of FORBIDDEN_READ_PATTERNS) {
        if (pattern.test(sourceRef)) {
            return { allowed: false, reason, label, requires_confirmation: false };
        }
    }
    for (const { pattern, label, reason } of CONFIRMATION_READ_PATTERNS) {
        if (pattern.test(sourceRef)) {
            return { allowed: false, reason, label, requires_confirmation: true };
        }
    }
    return { allowed: true, reason: "", label: "public" };
}
/**
 * 判断来源是否禁止读取。
 * @param sourceRef - 来源引用路径
 * @returns 是否禁止
 */
export function isReadForbidden(sourceRef) {
    debugLog(`隐私契约: 检查是否禁止读取 — ${sourceRef}`);
    return FORBIDDEN_READ_PATTERNS.some(({ pattern }) => pattern.test(sourceRef));
}
/**
 * 判断来源是否需要确认后才能读取。
 * @param sourceRef - 来源引用路径
 * @returns 是否需要确认
 */
export function isReadRequiresConfirmation(sourceRef) {
    debugLog(`隐私契约: 检查是否需要确认读取 — ${sourceRef}`);
    return CONFIRMATION_READ_PATTERNS.some(({ pattern }) => pattern.test(sourceRef));
}
// ── 授权管理 ──
/**
 * 创建数据访问授权。
 * @param options.granted_by - 授权人
 * @param options.scope_refs - 授权范围引用
 * @param options.sensitivity_allowed - 允许的敏感标签
 * @param options.allowed_operations - 允许的操作
 * @param options.purpose - 用途
 * @param options.duration_hours - 有效时长（小时）
 * @returns 数据访问授权
 */
export function createDataAccessGrant(options) {
    debugLog(`隐私契约: 创建数据访问授权 — 授权人: ${options.granted_by}, 范围: ${options.scope_refs.length} 个引用`);
    const expiresAt = new Date(Date.now() + options.duration_hours * 3600_000);
    return {
        grant_id: `grant-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
        granted_by: options.granted_by,
        scope_refs: options.scope_refs,
        sensitivity_allowed: options.sensitivity_allowed,
        allowed_operations: options.allowed_operations,
        purpose: options.purpose,
        expires_at: expiresAt.toISOString(),
        revocable: true,
    };
}
/**
 * 判断授权是否有效。
 * @param grant - 数据访问授权
 * @returns 是否有效
 */
export function isGrantValid(grant) {
    debugLog(`隐私契约: 检查授权有效性 — ${grant.grant_id}`);
    return new Date(grant.expires_at) > new Date();
}
/**
 * 判断授权是否已过期。
 * @param grant - 数据访问授权
 * @returns 是否已过期
 */
export function isGrantExpired(grant) {
    debugLog(`隐私契约: 检查授权是否过期 — ${grant.grant_id}`);
    return new Date(grant.expires_at) <= new Date();
}
/**
 * 检查授权是否允许指定操作。
 * @param grant - 数据访问授权
 * @param operation - 请求的操作
 * @param sensitivity - 敏感标签
 * @returns 权限检查结果
 */
export function checkGrantPermission(grant, operation, sensitivity) {
    debugLog(`隐私契约: 检查授权权限 — ${grant.grant_id}, 操作: ${operation}, 等级: ${sensitivity}`);
    if (isGrantExpired(grant)) {
        debugLog(`隐私契约: 授权权限拒绝 — 授权已过期`);
        return { allowed: false, reason: `授权 ${grant.grant_id} 已过期` };
    }
    if (!grant.allowed_operations.includes(operation)) {
        debugLog(`隐私契约: 授权权限拒绝 — 不允许操作 ${operation}`);
        return { allowed: false, reason: `授权 ${grant.grant_id} 不允许操作 ${operation}` };
    }
    if (!grant.sensitivity_allowed.includes(sensitivity)) {
        debugLog(`隐私契约: 授权权限拒绝 — 不允许敏感等级 ${sensitivity}`);
        return { allowed: false, reason: `授权 ${grant.grant_id} 不允许敏感等级 ${sensitivity}` };
    }
    debugLog(`隐私契约: 授权权限通过`);
    return { allowed: true, reason: "" };
}
//# sourceMappingURL=privacy_grants.js.map