import type { PlatformAdapter, Conversation } from "../index.js"; /** * Key tables in ~/Library/Messages/chat.db: * * chat * - ROWID: integer primary key * - chat_identifier: string (phone number or email, e.g. "+1234567890") * - display_name: string (group chat name, often empty for DMs) * - style: integer (43 = DM, 45 = group) * - last_read_message_timestamp: integer (epoch nanoseconds / 1e9) * * message * - ROWID: integer primary key * - text: string (message body) * - handle_id: integer → handle.ROWID * - is_from_me: integer (0 or 1) * - date: integer (Core Data timestamp: seconds since 2001-01-01 + nanoseconds) * - date_read: integer * - cache_has_attachments: integer * - associated_message_type: integer (reactions, tapbacks) * * handle * - ROWID: integer primary key * - id: string (phone number or email) * - service: string ("iMessage" or "SMS") * * chat_message_join * - chat_id: integer → chat.ROWID * - message_id: integer → message.ROWID * * chat_handle_join * - chat_id: integer → chat.ROWID * - handle_id: integer → handle.ROWID * * attachment * - ROWID: integer * - filename: string (path to file, often ~/Library/Messages/Attachments/...) * - mime_type: string * * message_attachment_join * - message_id: integer → message.ROWID * - attachment_id: integer → attachment.ROWID */ /** SQL query for fetching recent conversations */ export declare const CONVERSATIONS_QUERY = "\n SELECT\n c.ROWID as chat_id,\n c.chat_identifier,\n c.display_name,\n c.style,\n MAX(m.date) as last_message_date,\n COUNT(DISTINCT m.ROWID) as message_count\n FROM chat c\n JOIN chat_message_join cmj ON cmj.chat_id = c.ROWID\n JOIN message m ON m.ROWID = cmj.message_id\n WHERE m.date > :since_date\n GROUP BY c.ROWID\n ORDER BY last_message_date DESC\n LIMIT :limit\n"; /** SQL query for fetching messages in a chat */ export declare const MESSAGES_QUERY = "\n SELECT\n m.ROWID as message_id,\n m.text,\n m.is_from_me,\n m.date,\n m.date_read,\n m.associated_message_type,\n h.id as handle_id,\n h.service\n FROM message m\n JOIN chat_message_join cmj ON cmj.message_id = m.ROWID\n LEFT JOIN handle h ON h.ROWID = m.handle_id\n WHERE cmj.chat_id = :chat_id\n AND m.text IS NOT NULL\n AND m.associated_message_type = 0\n ORDER BY m.date DESC\n LIMIT :limit\n"; /** SQL query for getting participants of a chat */ export declare const PARTICIPANTS_QUERY = "\n SELECT h.id, h.service\n FROM chat_handle_join chj\n JOIN handle h ON h.ROWID = chj.handle_id\n WHERE chj.chat_id = :chat_id\n"; /** * Convert a Core Data timestamp to a JS Date. * Core Data: seconds since 2001-01-01 00:00:00 UTC * With nanosecond component in the decimal part. */ export declare function coreDataTimestampToDate(timestamp: number): Date; /** * Normalize an iMessage chat row into a Conversation. * Contact name resolution happens in Rust (macOS Contacts framework). */ export declare function normalizeConversation(row: { chat_id: number; chat_identifier: string; display_name: string | null; style: number; last_message_date: number; }): Conversation; export declare const imessageAdapter: PlatformAdapter; //# sourceMappingURL=imessage.d.ts.map