import { DatabaseInterface } from '@happyvertical/sql'; export type ContentContributionChannel = 'web' | 'email'; export type ContentContributionStatus = 'submitted' | 'quarantined' | 'needs_changes' | 'approved' | 'promoted' | 'rejected' | 'withdrawn'; export type ContentContributionIntakeDecision = 'accepted' | 'quarantined' | 'rejected'; export type ContentContributorTrustLevel = 'standard' | 'trusted' | 'blocked'; export interface ContentContributionIntakeRules { maxFiles?: number | null; maxTotalBytes?: number | null; allowedMimePatterns?: string[]; blockedMimePatterns?: string[]; quarantineMimePatterns?: string[]; blockedTextPatterns?: string[]; quarantineTextPatterns?: string[]; trustedOnly?: boolean; } export interface ContentContributionPromotionMapping { targetContentType?: string | null; targetContentVariant?: string | null; targetContentStatus?: 'draft' | 'review'; autoPromoteTrusted?: boolean; createAssets?: boolean; assetRelationship?: string; } export interface ContentContributionTypeDefinition { key: string; label: string; enabled?: boolean; allowedChannels?: ContentContributionChannel[]; allowText?: boolean; allowFiles?: boolean; allowEmptyText?: boolean; intakeRules?: ContentContributionIntakeRules; promotion?: ContentContributionPromotionMapping; metadata?: Record; } export interface PersistedContentContributionTypeRecord extends ContentContributionTypeDefinition { id?: string; tenantId?: string | null; createdAt?: string | null; updatedAt?: string | null; } export interface ContentContributionConfig { types: ContentContributionTypeDefinition[]; } export interface ResolvedContentContributionType extends ContentContributionTypeDefinition { } export interface ContentContributionTypeConfigState { effective: ContentContributionTypeDefinition[]; persisted: PersistedContentContributionTypeRecord[]; } export interface ContentContributionConfigReadOptions { db?: DatabaseInterface | null; tenantId?: string | null; } export interface EvaluateContributionIntakeOptions { contributionType: ContentContributionTypeDefinition; trustLevel?: ContentContributorTrustLevel; channel: ContentContributionChannel; title?: string | null; description?: string | null; body?: string | null; attachments?: Array<{ mimeType?: string | null; size?: number | null; }>; } export interface EvaluateContributionIntakeResult { decision: ContentContributionIntakeDecision; reasons: string[]; } export declare function getContentContributionConfig(): ContentContributionConfig; export declare function configureContentContributions(config: Partial): ContentContributionConfig; export declare function resetContentContributionConfig(): ContentContributionConfig; export declare function hasStaticContentContributionType(key: string): boolean; export declare function loadPersistedContentContributionTypes(options?: ContentContributionConfigReadOptions): Promise; export declare function getEffectiveContentContributionConfig(options?: ContentContributionConfigReadOptions): Promise; export declare function getContentContributionTypeConfigState(options?: ContentContributionConfigReadOptions): Promise; export declare function resolveEffectiveContentContributionType(key: string, options?: ContentContributionConfigReadOptions): Promise; export declare function evaluateContributionIntake(options: EvaluateContributionIntakeOptions): EvaluateContributionIntakeResult; //# sourceMappingURL=content-contribution-config.d.ts.map