export interface Env { DB: D1Database; AI: Ai; BOT_TOKEN: string; WEBHOOK_SECRET: string; SUMMARY_THRESHOLD?: string; MAX_SUMMARIES_PER_USER?: string; N8N_WEBHOOK_URL?: string; OPENAI_API_KEY?: string; NAMECHEAP_API_KEY?: string; NAMECHEAP_API_KEY_INTERNAL?: string; DOMAIN_OWNER_ID?: string; DEPOSIT_ADMIN_ID?: string; BRAVE_API_KEY?: string; DEPOSIT_API_SECRET?: string; OPENAI_API_BASE?: string; NAMECHEAP_API_URL?: string; WHOIS_API_URL?: string; CONTEXT7_API_BASE?: string; BRAVE_API_BASE?: string; WTTR_IN_URL?: string; HOSTING_SITE_URL?: string; RATE_LIMIT_KV: KVNamespace; } export interface IntentAnalysis { action: 'chat' | 'n8n'; type?: string; confidence: number; } export interface N8nResponse { reply?: string; error?: string; } export interface TelegramUpdate { update_id: number; message?: TelegramMessage; callback_query?: CallbackQuery; } export interface CallbackQuery { id: string; from: TelegramUser; message?: TelegramMessage; chat_instance: string; data?: string; } export interface TelegramMessage { message_id: number; from: TelegramUser; chat: TelegramChat; date: number; text?: string; } export interface TelegramUser { id: number; is_bot: boolean; first_name: string; last_name?: string; username?: string; } export interface TelegramChat { id: number; type: string; } export interface BufferedMessage { id: number; role: 'user' | 'bot'; message: string; created_at: string; } export interface Summary { id: number; generation: number; summary: string; message_count: number; created_at: string; } export interface ConversationContext { previousSummary: Summary | null; // 최신 요약 (호환성 유지) summaries: Summary[]; // 전체 요약 (최대 3개, 최신순) recentMessages: BufferedMessage[]; totalMessages: number; } // Cloudflare Email Workers 타입 export interface EmailMessage { from: string; to: string; headers: Headers; raw: ReadableStream; rawSize: number; setReject(reason: string): void; forward(to: string): Promise; } // 은행 알림 파싱 결과 export interface BankNotification { bankName: string; depositorName: string; amount: number; balanceAfter?: number; transactionTime?: Date; rawMessage: string; }