import type { BotConfig } from '../bot-registry.js'; import { type FeedbackPolicy } from './feedback-policy.js'; export interface FeedbackPolicyLayer { enabled?: boolean; audience?: 'requester'; visibleSemantics?: unknown[]; buttons?: unknown[]; negativeFollowup?: { reasons?: unknown[]; comment?: { enabled?: boolean; required?: boolean; placeholder?: string; maxLength?: number; }; }; allowReselect?: boolean; } /** Validate and defensively copy a persisted policy layer without filling defaults. */ export declare function normalizeFeedbackPolicyLayer(raw: unknown): FeedbackPolicyLayer; export declare function resolveEffectiveFeedbackPolicy(input: { team?: FeedbackPolicyLayer; bot?: FeedbackPolicyLayer; chat?: FeedbackPolicyLayer; apiOnly?: boolean; }): FeedbackPolicy | undefined; /** Resolve local hosted-team, bot, and bot-scoped chat layers at delivery time. */ export declare function resolveFeedbackTeamId(input: { dataDir: string; chatId?: string; }): string | undefined; export declare function resolveFeedbackPolicyForDelivery(input: { dataDir: string; larkAppId: string; chatId?: string; bot: Pick; }): FeedbackPolicy | undefined; export interface FeedbackPolicyTrace { teamId: string | null; layers: { team?: FeedbackPolicyLayer; bot?: FeedbackPolicyLayer; chat?: FeedbackPolicyLayer; }; effective: FeedbackPolicy | null; sources: Record; reason: 'enabled' | 'disabled' | 'api_only' | 'ambiguous_team'; } /** Dashboard-safe explanation of the same delivery-time resolution contract. */ export declare function traceFeedbackPolicyForDelivery(input: { dataDir: string; larkAppId: string; chatId?: string; bot: Pick; }): FeedbackPolicyTrace; //# sourceMappingURL=feedback-policy-resolver.d.ts.map