SYMBOL INDEX (1475 symbols across 308 files) FILE: landing/src/App.tsx function App (line 12) | function App() { FILE: landing/src/components/CtaFooter.tsx function CtaFooter (line 4) | function CtaFooter() { FILE: landing/src/components/Features.tsx constant FEATURES (line 8) | const FEATURES = [ function Features (line 90) | function Features() { FILE: landing/src/components/Hero.tsx function Hero (line 5) | function Hero() { FILE: landing/src/components/Navbar.tsx constant NAV_LINKS (line 5) | const NAV_LINKS = [ function Navbar (line 11) | function Navbar() { FILE: landing/src/components/OpenSource.tsx constant TRUST_SIGNALS (line 4) | const TRUST_SIGNALS = [ function OpenSource (line 11) | function OpenSource() { FILE: landing/src/components/ProductShowcase.tsx constant FEATURES (line 7) | const FEATURES: { title: string; description: string; mockup: ReactNode ... function ProductShowcase (line 28) | function ProductShowcase() { FILE: landing/src/components/WhyVelo.tsx constant DIFFERENTIATORS (line 4) | const DIFFERENTIATORS = [ function WhyVelo (line 34) | function WhyVelo() { FILE: landing/src/components/mockups/AiMockup.tsx function AiMockup (line 4) | function AiMockup() { FILE: landing/src/components/mockups/AppMockup.tsx constant SIDEBAR_ITEMS (line 8) | const SIDEBAR_ITEMS = [ constant LABELS (line 18) | const LABELS = [ constant THREADS (line 24) | const THREADS = [ constant MESSAGE_BODY (line 34) | const MESSAGE_BODY = `Hi team, function AppMockup (line 47) | function AppMockup() { FILE: landing/src/components/mockups/MultiProviderMockup.tsx constant ACCOUNTS (line 4) | const ACCOUNTS = [ constant PROVIDERS (line 10) | const PROVIDERS = [ function MultiProviderMockup (line 19) | function MultiProviderMockup() { FILE: landing/src/components/mockups/SplitInboxMockup.tsx constant TABS (line 4) | const TABS = [ constant THREADS (line 12) | const THREADS = [ function SplitInboxMockup (line 21) | function SplitInboxMockup() { FILE: src-tauri/build.rs function main (line 1) | fn main() { FILE: src-tauri/src/commands.rs function imap_test_connection (line 12) | pub async fn imap_test_connection(config: ImapConfig) -> Result Result Result, String> { function imap_search_folder (line 245) | pub async fn imap_search_folder( function imap_sync_folder (line 257) | pub async fn imap_sync_folder( function imap_raw_fetch_diagnostic (line 270) | pub async fn imap_raw_fetch_diagnostic( function imap_delta_check (line 279) | pub async fn imap_delta_check( function smtp_send_email (line 292) | pub async fn smtp_send_email( function smtp_test_connection (line 300) | pub async fn smtp_test_connection(config: SmtpConfig) -> Result Self { type Response (line 56) | type Response = Vec; method process (line 57) | fn process(&mut self, _challenge: &[u8]) -> Self::Response { type ImapStream (line 68) | pub(crate) enum ImapStream { method poll_read (line 74) | fn poll_read( method poll_write (line 87) | fn poll_write( method poll_flush (line 98) | fn poll_flush( method poll_shutdown (line 108) | fn poll_shutdown( method fmt (line 120) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { function build_tls_connector (line 132) | fn build_tls_connector(accept_invalid_certs: bool) -> Result; function connect (line 151) | pub async fn connect(config: &ImapConfig) -> Result { function connect_inner (line 160) | async fn connect_inner(config: &ImapConfig) -> Result Result Result Result Option { function extract_bracket_number (line 1203) | fn extract_bracket_number(line: &str, keyword: &str) -> Option { function raw_parse_fetch_responses (line 1223) | async fn raw_parse_fetch_responses( function extract_fetch_uid (line 1305) | fn extract_fetch_uid(line: &str) -> Option { function extract_flags_from_fetch (line 1314) | fn extract_flags_from_fetch(line: &str) -> String { function extract_internal_date (line 1327) | fn extract_internal_date(line: &str) -> Option { function parse_imap_date (line 1337) | fn parse_imap_date(s: &str) -> Option { function is_leap_year (line 1388) | fn is_leap_year(y: i64) -> bool { function extract_literal_size (line 1393) | fn extract_literal_size(line: &str) -> Option { function connect_stream (line 1405) | async fn connect_stream(config: &ImapConfig) -> Result Result Option { function parse_message (line 1578) | fn parse_message( function build_imap_section_map (line 1742) | fn build_imap_section_map(message: &mail_parser::Message) -> std::collec... function extract_header_text (line 1785) | fn extract_header_text(hv: Option<&mail_parser::HeaderValue>) -> Option<... function extract_first_address (line 1796) | fn extract_first_address( function format_address_list (line 1814) | fn format_address_list(addr: Option<&mail_parser::Address>) -> Option Result<()... function open_devtools (line 44) | fn open_devtools(app: tauri::AppHandle) { function run (line 51) | pub fn run() { FILE: src-tauri/src/main.rs function main (line 4) | fn main() { FILE: src-tauri/src/oauth.rs type OAuthResult (line 8) | pub struct OAuthResult { function start_oauth_server (line 16) | pub async fn start_oauth_server(port: u16, state: String) -> Result Result<(String, String), ... function parse_query_string (line 114) | fn parse_query_string(path: &str) -> HashMap { function urlencoding_decode (line 127) | fn urlencoding_decode(s: &str) -> String { type TokenExchangeResult (line 153) | pub struct TokenExchangeResult { function oauth_exchange_token (line 164) | pub async fn oauth_exchange_token( function oauth_refresh_token (line 215) | pub async fn oauth_refresh_token( FILE: src-tauri/src/smtp/client.rs function decode_base64url (line 13) | fn decode_base64url(input: &str) -> Result, String> { function build_transport (line 20) | fn build_transport( function extract_envelope (line 88) | fn extract_envelope(raw: &[u8]) -> Result Result = {}): DbCalendar { FILE: src/components/calendar/CalendarList.tsx type CalendarListProps (line 3) | interface CalendarListProps { function CalendarList (line 8) | function CalendarList({ calendars, onVisibilityChange }: CalendarListPro... FILE: src/components/calendar/CalendarPage.tsx function CalendarPage (line 16) | function CalendarPage() { function upsertCalendarEventFromProvider (line 375) | async function upsertCalendarEventFromProvider( FILE: src/components/calendar/CalendarReauthBanner.tsx type CalendarReauthBannerProps (line 5) | interface CalendarReauthBannerProps { function CalendarReauthBanner (line 11) | function CalendarReauthBanner({ accountId, email, onReauthSuccess }: Cal... FILE: src/components/calendar/CalendarToolbar.tsx type CalendarView (line 3) | type CalendarView = "day" | "week" | "month"; type CalendarToolbarProps (line 5) | interface CalendarToolbarProps { function CalendarToolbar (line 17) | function CalendarToolbar({ function formatTitle (line 93) | function formatTitle(date: Date, view: CalendarView): string { FILE: src/components/calendar/DayView.tsx type DayViewProps (line 4) | interface DayViewProps { constant HOURS (line 10) | const HOURS = Array.from({ length: 24 }, (_, i) => i); function DayView (line 12) | function DayView({ currentDate, events, onEventClick }: DayViewProps) { FILE: src/components/calendar/EventCard.tsx type EventCardProps (line 3) | interface EventCardProps { function EventCard (line 9) | function EventCard({ event, compact, onClick }: EventCardProps) { FILE: src/components/calendar/EventCreateModal.tsx type EventCreateModalProps (line 7) | interface EventCreateModalProps { function EventCreateModal (line 20) | function EventCreateModal({ calendars, onClose, onCreate }: EventCreateM... function getDefaultStart (line 130) | function getDefaultStart(): string { function getDefaultEnd (line 137) | function getDefaultEnd(): string { function toLocalISOString (line 144) | function toLocalISOString(date: Date): string { FILE: src/components/calendar/EventDetailModal.tsx type EventDetailModalProps (line 11) | interface EventDetailModalProps { function EventDetailModal (line 19) | function EventDetailModal({ event, calendars, accountId, onClose, onUpda... function toLocalISOString (line 229) | function toLocalISOString(date: Date): string { FILE: src/components/calendar/MonthView.tsx type MonthViewProps (line 5) | interface MonthViewProps { constant DAY_NAMES (line 11) | const DAY_NAMES = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; function MonthView (line 13) | function MonthView({ currentDate, events, onEventClick }: MonthViewProps) { FILE: src/components/calendar/WeekView.tsx type WeekViewProps (line 4) | interface WeekViewProps { constant HOURS (line 10) | const HOURS = Array.from({ length: 24 }, (_, i) => i); constant DAY_NAMES (line 11) | const DAY_NAMES = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; function WeekView (line 13) | function WeekView({ currentDate, events, onEventClick }: WeekViewProps) { FILE: src/components/composer/AddressInput.tsx type AddressInputProps (line 4) | interface AddressInputProps { function AddressInput (line 11) | function AddressInput({ FILE: src/components/composer/AiAssistPanel.tsx type AiAssistPanelProps (line 13) | interface AiAssistPanelProps { function AiAssistPanel (line 19) | function AiAssistPanel({ editor, isReplyMode, threadMessages }: AiAssist... function QuickAction (line 159) | function QuickAction({ FILE: src/components/composer/AttachmentPicker.tsx constant MAX_TOTAL_SIZE (line 7) | const MAX_TOTAL_SIZE = 24 * 1024 * 1024; function AttachmentPicker (line 9) | function AttachmentPicker() { FILE: src/components/composer/Composer.tsx function Composer (line 35) | function Composer() { FILE: src/components/composer/EditorToolbar.tsx type EditorToolbarProps (line 6) | interface EditorToolbarProps { function EditorToolbar (line 12) | function EditorToolbar({ editor, onToggleAiAssist, aiAssistOpen }: Edito... FILE: src/components/composer/FromSelector.tsx type FromSelectorProps (line 3) | interface FromSelectorProps { function FromSelector (line 13) | function FromSelector({ aliases, selectedEmail, onChange }: FromSelector... FILE: src/components/composer/ScheduleSendDialog.tsx type ScheduleSendDialogProps (line 3) | interface ScheduleSendDialogProps { function getSchedulePresets (line 8) | function getSchedulePresets(): { label: string; detail: string; timestam... function ScheduleSendDialog (line 48) | function ScheduleSendDialog({ onSchedule, onClose }: ScheduleSendDialogP... FILE: src/components/composer/SignatureSelector.tsx function SignatureSelector (line 9) | function SignatureSelector() { FILE: src/components/composer/TemplatePicker.tsx type TemplatePickerProps (line 8) | interface TemplatePickerProps { function TemplatePicker (line 12) | function TemplatePicker({ editor }: TemplatePickerProps) { FILE: src/components/composer/UndoSendToast.tsx constant UNDO_DELAY_SECONDS (line 5) | const UNDO_DELAY_SECONDS = 5; function UndoSendToast (line 7) | function UndoSendToast() { FILE: src/components/dnd/DndProvider.tsx constant LABEL_MAP (line 16) | const LABEL_MAP: Record = { type DragData (line 27) | interface DragData { function resolveLabelChange (line 36) | function resolveLabelChange( type DndProviderProps (line 63) | interface DndProviderProps { function DndProvider (line 67) | function DndProvider({ children }: DndProviderProps) { FILE: src/components/email/ActionBar.tsx type ActionBarProps (line 18) | interface ActionBarProps { function Separator (line 35) | function Separator() { function ActionBar (line 39) | function ActionBar({ thread, messages, noReply, defaultReplyMode = "repl... FILE: src/components/email/AttachmentList.tsx function dedup (line 11) | function dedup(attachments: DbAttachment[]): DbAttachment[] { type AttachmentListProps (line 21) | interface AttachmentListProps { function AttachmentList (line 28) | function AttachmentList({ accountId, messageId, attachments, referencedC... function AttachmentPreview (line 81) | function AttachmentPreview({ function TextPreview (line 250) | function TextPreview({ url }: { url: string }) { FILE: src/components/email/AuthBadge.test.tsx function makeAuthResults (line 6) | function makeAuthResults(aggregate: AuthResult["aggregate"]): string { FILE: src/components/email/AuthBadge.tsx type AuthBadgeProps (line 5) | interface AuthBadgeProps { function AuthBadge (line 9) | function AuthBadge({ authResults }: AuthBadgeProps) { FILE: src/components/email/AuthWarningBanner.test.tsx function makeAuthResults (line 6) | function makeAuthResults(aggregate: AuthResult["aggregate"]): string { FILE: src/components/email/AuthWarningBanner.tsx type AuthWarningBannerProps (line 4) | interface AuthWarningBannerProps { function AuthWarningBanner (line 10) | function AuthWarningBanner({ authResults, senderAddress, onDismiss }: Au... FILE: src/components/email/CategoryTabs.test.tsx method observe (line 12) | observe() {} method unobserve (line 13) | unobserve() {} method disconnect (line 14) | disconnect() {} FILE: src/components/email/CategoryTabs.tsx type CategoryTabsProps (line 5) | interface CategoryTabsProps { constant CATEGORY_ICONS (line 11) | const CATEGORY_ICONS: Record = { function CategoryTabs (line 19) | function CategoryTabs({ activeCategory, onCategoryChange, unreadCounts }... FILE: src/components/email/ContactSidebar.tsx type ContactSidebarProps (line 22) | interface ContactSidebarProps { function ContactSidebar (line 29) | function ContactSidebar({ email, name, accountId, onClose }: ContactSide... FILE: src/components/email/EmailRenderer.test.tsx class MockResizeObserver (line 33) | class MockResizeObserver { method observe (line 34) | observe() {} method unobserve (line 35) | unobserve() {} method disconnect (line 36) | disconnect() {} function makeAttachment (line 40) | function makeAttachment(overrides: Partial = {}): DbAttach... FILE: src/components/email/EmailRenderer.tsx type EmailRendererProps (line 10) | interface EmailRendererProps { function EmailRenderer (line 21) | function EmailRenderer({ FILE: src/components/email/FollowUpDialog.tsx type FollowUpDialogProps (line 3) | interface FollowUpDialogProps { function getFollowUpPresets (line 9) | function getFollowUpPresets(): { label: string; timestamp: number }[] { function FollowUpDialog (line 40) | function FollowUpDialog({ isOpen = true, onSetReminder, onClose }: Follo... FILE: src/components/email/InlineAttachmentPreview.test.tsx class MockIntersectionObserver (line 13) | class MockIntersectionObserver { method constructor (line 14) | constructor(callback: IntersectionObserverCallback) { FILE: src/components/email/InlineAttachmentPreview.tsx function dedup (line 8) | function dedup(attachments: DbAttachment[]): DbAttachment[] { type InlineAttachmentPreviewProps (line 18) | interface InlineAttachmentPreviewProps { function InlineAttachmentPreview (line 26) | function InlineAttachmentPreview({ function ImageThumbnail (line 91) | function ImageThumbnail({ FILE: src/components/email/InlineReply.tsx type ReplyMode (line 23) | type ReplyMode = "reply" | "replyAll" | "forward"; type InlineReplyProps (line 25) | interface InlineReplyProps { function InlineReply (line 33) | function InlineReply({ thread, messages, accountId, noReply, onSent }: I... FILE: src/components/email/LinkConfirmDialog.tsx type LinkConfirmDialogProps (line 5) | interface LinkConfirmDialogProps { function LinkConfirmDialog (line 11) | function LinkConfirmDialog({ linkAnalysis, onCancel, onConfirm }: LinkCo... FILE: src/components/email/MessageItem.test.tsx function makeMessage (line 28) | function makeMessage(overrides: Partial = {}): DbMessage { FILE: src/components/email/MessageItem.tsx type MessageItemProps (line 12) | interface MessageItemProps { function parseUnsubscribeUrl (line 172) | function parseUnsubscribeUrl(header: string): string | null { function UnsubscribeLink (line 181) | function UnsubscribeLink({ FILE: src/components/email/MoveToFolderDialog.tsx type MoveToFolderDialogProps (line 24) | interface MoveToFolderDialogProps { type Destination (line 30) | interface Destination { constant SYSTEM_DESTINATIONS (line 39) | const SYSTEM_DESTINATIONS: Destination[] = [ function MoveToFolderDialog (line 46) | function MoveToFolderDialog({ FILE: src/components/email/PhishingBanner.tsx type PhishingBannerProps (line 4) | interface PhishingBannerProps { function PhishingBanner (line 9) | function PhishingBanner({ scanResult, onTrustSender }: PhishingBannerPro... FILE: src/components/email/RawMessageModal.tsx type RawMessageModalProps (line 6) | interface RawMessageModalProps { function RawMessageModal (line 13) | function RawMessageModal({ FILE: src/components/email/SmartReplySuggestions.tsx type SmartReplySuggestionsProps (line 9) | interface SmartReplySuggestionsProps { function SmartReplySuggestions (line 16) | function SmartReplySuggestions({ threadId, accountId, messages, noReply ... FILE: src/components/email/SnoozeDialog.tsx type SnoozeDialogProps (line 3) | interface SnoozeDialogProps { function getSnoozePresets (line 9) | function getSnoozePresets(): { label: string; timestamp: number }[] { function SnoozeDialog (line 47) | function SnoozeDialog({ isOpen = true, onSnooze, onClose }: SnoozeDialog... FILE: src/components/email/ThreadCard.test.tsx function makeThread (line 36) | function makeThread(overrides: Partial = {}): Thread { FILE: src/components/email/ThreadCard.tsx constant CATEGORY_COLORS (line 11) | const CATEGORY_COLORS: Record = { type ThreadCardProps (line 18) | interface ThreadCardProps { FILE: src/components/email/ThreadSummary.tsx type ThreadSummaryProps (line 8) | interface ThreadSummaryProps { function ThreadSummary (line 14) | function ThreadSummary({ threadId, accountId, messages }: ThreadSummaryP... FILE: src/components/email/ThreadView.tsx type ThreadViewProps (line 26) | interface ThreadViewProps { function handlePopOut (line 30) | async function handlePopOut(thread: Thread) { function ThreadView (line 60) | function ThreadView({ thread }: ThreadViewProps) { function buildQuote (line 518) | function buildQuote(msg: DbMessage): string { function buildForwardQuote (line 527) | function buildForwardQuote(msg: DbMessage): string { FILE: src/components/help/HelpCard.tsx type HelpCardProps (line 5) | interface HelpCardProps { function HelpCard (line 11) | function HelpCard({ card, isExpanded, onToggle }: HelpCardProps) { FILE: src/components/help/HelpCardGrid.tsx type HelpCardGridProps (line 4) | interface HelpCardGridProps { function HelpCardGrid (line 10) | function HelpCardGrid({ cards, expandedCardId, onToggleCard }: HelpCardG... FILE: src/components/help/HelpPage.tsx function HelpPage (line 10) | function HelpPage() { FILE: src/components/help/HelpSearchBar.tsx type HelpSearchBarProps (line 3) | interface HelpSearchBarProps { function HelpSearchBar (line 8) | function HelpSearchBar({ query, onChange }: HelpSearchBarProps) { FILE: src/components/help/HelpSidebar.tsx type HelpSidebarProps (line 4) | interface HelpSidebarProps { function HelpSidebar (line 8) | function HelpSidebar({ activeTopic }: HelpSidebarProps) { FILE: src/components/help/HelpTooltip.tsx type HelpTooltipProps (line 7) | interface HelpTooltipProps { function HelpTooltip (line 12) | function HelpTooltip({ contextId, size = 14 }: HelpTooltipProps) { FILE: src/components/help/helpContentSearch.test.ts function filterCards (line 10) | function filterCards(query: string) { FILE: src/components/labels/LabelForm.tsx constant GMAIL_LABEL_COLORS (line 6) | const GMAIL_LABEL_COLORS: { bg: string; fg: string }[] = [ type LabelFormProps (line 33) | interface LabelFormProps { function LabelForm (line 40) | function LabelForm({ accountId, label, onDone, variant = "settings" }: L... FILE: src/components/layout/EmailList.tsx constant PAGE_SIZE (line 33) | const PAGE_SIZE = 50; constant LABEL_MAP (line 36) | const LABEL_MAP: Record = { function EmailList (line 47) | function EmailList({ width, listRef }: { width?: number; listRef?: React... function EmptyStateForContext (line 703) | function EmptyStateForContext({ FILE: src/components/layout/MailLayout.tsx function ResizableEmailLayout (line 7) | function ResizableEmailLayout() { function MailLayout (line 52) | function MailLayout() { FILE: src/components/layout/ReadingPane.tsx function ReadingPane (line 7) | function ReadingPane() { FILE: src/components/layout/Sidebar.tsx type SidebarProps (line 47) | interface SidebarProps { constant ALL_NAV_ITEMS (line 52) | const ALL_NAV_ITEMS: { id: string; label: string; icon: LucideIcon }[] = [ constant CATEGORY_ITEMS (line 68) | const CATEGORY_ITEMS: { id: string; label: string; icon: LucideIcon }[] = [ function DroppableNavItem (line 76) | function DroppableNavItem({ function DroppableLabelItem (line 116) | function DroppableLabelItem({ constant SMART_FOLDER_ICON_MAP (line 191) | const SMART_FOLDER_ICON_MAP: Record = { function getSmartFolderIcon (line 202) | function getSmartFolderIcon(iconName: string): LucideIcon { constant LABELS_COLLAPSED_COUNT (line 206) | const LABELS_COLLAPSED_COUNT = 3; function Sidebar (line 208) | function Sidebar({ collapsed, onAddAccount }: SidebarProps) { function PendingOpsIndicator (line 665) | function PendingOpsIndicator({ collapsed }: { collapsed: boolean }) { FILE: src/components/layout/TitleBar.tsx function TitleBar (line 7) | function TitleBar() { FILE: src/components/search/AskInbox.tsx type AskInboxProps (line 8) | interface AskInboxProps { function AskInbox (line 13) | function AskInbox({ isOpen, onClose }: AskInboxProps) { FILE: src/components/search/CommandPalette.tsx type Command (line 12) | interface Command { type CommandPaletteProps (line 20) | interface CommandPaletteProps { function CommandPalette (line 25) | function CommandPalette({ isOpen, onClose }: CommandPaletteProps) { FILE: src/components/search/SearchBar.tsx function SearchBar (line 9) | function SearchBar() { FILE: src/components/search/ShortcutsHelp.tsx type ShortcutsHelpProps (line 5) | interface ShortcutsHelpProps { function ShortcutsHelp (line 10) | function ShortcutsHelp({ isOpen, onClose }: ShortcutsHelpProps) { FILE: src/components/settings/CalDavSettings.tsx type CalDavSettingsProps (line 9) | interface CalDavSettingsProps { function CalDavSettings (line 14) | function CalDavSettings({ account, onSaved }: CalDavSettingsProps) { FILE: src/components/settings/ContactEditor.tsx function ContactEditor (line 10) | function ContactEditor() { FILE: src/components/settings/FilterEditor.tsx function FilterEditor (line 16) | function FilterEditor() { FILE: src/components/settings/LabelEditor.test.tsx function setStoreWithLabels (line 14) | function setStoreWithLabels(labels: { id: string; accountId: string; nam... FILE: src/components/settings/LabelEditor.tsx function LabelEditor (line 7) | function LabelEditor() { FILE: src/components/settings/QuickStepEditor.tsx function describeActions (line 20) | function describeActions(actionsJson: string): string { function QuickStepEditor (line 37) | function QuickStepEditor() { FILE: src/components/settings/SettingsPage.tsx type SettingsTab (line 64) | type SettingsTab = "general" | "notifications" | "composing" | "mail-rul... function SettingsPage (line 78) | function SettingsPage() { function SendAsAliasesSection (line 1408) | function SendAsAliasesSection() { function SyncOfflineSection (line 1493) | function SyncOfflineSection() { function DeveloperTab (line 1577) | function DeveloperTab() { function AboutTab (line 1728) | function AboutTab() { function InfoRow (line 1824) | function InfoRow({ label, value }: { label: string; value: string }) { function ShortcutsTab (line 1833) | function ShortcutsTab() { function ImapCalDavSection (line 1990) | function ImapCalDavSection() { function CalDavSettingsInline (line 2019) | function CalDavSettingsInline({ account, onSaved }: { account: import("@... function SidebarNavEditor (line 2031) | function SidebarNavEditor() { function Section (line 2142) | function Section({ function SettingRow (line 2159) | function SettingRow({ constant DAY_NAMES (line 2174) | const DAY_NAMES = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; function BundleSettings (line 2176) | function BundleSettings() { function ToggleRow (line 2290) | function ToggleRow({ FILE: src/components/settings/SignatureEditor.tsx function SignatureEditor (line 18) | function SignatureEditor() { FILE: src/components/settings/SmartFolderEditor.tsx function SmartFolderEditor (line 13) | function SmartFolderEditor() { FILE: src/components/settings/SmartLabelEditor.tsx function SmartLabelEditor (line 16) | function SmartLabelEditor() { FILE: src/components/settings/SubscriptionManager.tsx function SubscriptionManager (line 12) | function SubscriptionManager() { FILE: src/components/settings/TemplateEditor.tsx function TemplateEditor (line 18) | function TemplateEditor() { function InsertVariableDropdown (line 199) | function InsertVariableDropdown({ onInsert }: { onInsert: (variable: str... FILE: src/components/tasks/AiTaskExtractDialog.tsx constant PRIORITY_OPTIONS (line 9) | const PRIORITY_OPTIONS: { value: TaskPriority; label: string; color: str... type AiTaskExtractDialogProps (line 17) | interface AiTaskExtractDialogProps { function AiTaskExtractDialog (line 25) | function AiTaskExtractDialog({ FILE: src/components/tasks/TaskItem.test.tsx function makeTask (line 5) | function makeTask(overrides: Partial = {}): DbTask { FILE: src/components/tasks/TaskItem.tsx constant PRIORITY_COLORS (line 14) | const PRIORITY_COLORS: Record = { constant PRIORITY_DOT_COLORS (line 22) | const PRIORITY_DOT_COLORS: Record = { function formatDueDate (line 30) | function formatDueDate(timestamp: number): string { function getDueDateColor (line 44) | function getDueDateColor(timestamp: number): string { type TaskItemProps (line 52) | interface TaskItemProps { function TaskItem (line 62) | function TaskItem({ FILE: src/components/tasks/TaskQuickAdd.tsx type TaskQuickAddProps (line 4) | interface TaskQuickAddProps { function TaskQuickAdd (line 9) | function TaskQuickAdd({ onAdd, placeholder = "Add a task..." }: TaskQuic... FILE: src/components/tasks/TaskSidebar.tsx type TaskSidebarProps (line 19) | interface TaskSidebarProps { function TaskSidebar (line 24) | function TaskSidebar({ accountId, threadId }: TaskSidebarProps) { FILE: src/components/tasks/TasksPage.tsx constant PRIORITY_ORDER (line 25) | const PRIORITY_ORDER: Record = { function TasksPage (line 33) | function TasksPage() { FILE: src/components/ui/Button.tsx type ButtonProps (line 3) | interface ButtonProps extends ButtonHTMLAttributes { function Button (line 12) | function Button({ FILE: src/components/ui/ConfirmDialog.tsx type ConfirmDialogProps (line 5) | interface ConfirmDialogProps { function ConfirmDialog (line 17) | function ConfirmDialog({ FILE: src/components/ui/ContextMenu.tsx type ContextMenuItem (line 6) | interface ContextMenuItem { type ContextMenuProps (line 19) | interface ContextMenuProps { function ContextMenu (line 25) | function ContextMenu({ items, position, onClose }: ContextMenuProps) { function Submenu (line 269) | function Submenu({ FILE: src/components/ui/ContextMenuPortal.tsx function buildQuote (line 46) | function buildQuote(msg: { from_name: string | null; from_address: strin... function buildForwardQuote (line 54) | function buildForwardQuote(msg: { from_name: string | null; from_address... function ContextMenuPortal (line 59) | function ContextMenuPortal() { function SidebarLabelMenu (line 119) | function SidebarLabelMenu({ function SidebarNavMenu (line 165) | function SidebarNavMenu({ function ThreadMenu (line 195) | function ThreadMenu({ function MessageMenu (line 599) | function MessageMenu({ FILE: src/components/ui/DateTimePickerDialog.tsx type Preset (line 5) | interface Preset { type DateTimePickerDialogProps (line 13) | interface DateTimePickerDialogProps { function DateTimePickerDialog (line 24) | function DateTimePickerDialog({ FILE: src/components/ui/EmptyState.tsx type EmptyStateProps (line 4) | type EmptyStateProps = { function EmptyState (line 12) | function EmptyState({ title, subtitle, ...rest }: EmptyStateProps) { FILE: src/components/ui/ErrorBoundary.test.tsx function ThrowingComponent (line 5) | function ThrowingComponent({ message }: { message: string }) { function GoodComponent (line 10) | function GoodComponent() { function MaybeThrow (line 83) | function MaybeThrow() { FILE: src/components/ui/ErrorBoundary.tsx type ErrorBoundaryProps (line 3) | interface ErrorBoundaryProps { type ErrorBoundaryState (line 9) | interface ErrorBoundaryState { class ErrorBoundary (line 14) | class ErrorBoundary extends Component = { function getAllCards (line 1328) | function getAllCards(): (HelpCard & { categoryId: string; categoryLabel:... function getCategoryById (line 1339) | function getCategoryById(id: string): HelpCategory | undefined { FILE: src/constants/shortcuts.ts type ShortcutItem (line 1) | interface ShortcutItem { type ShortcutCategory (line 7) | interface ShortcutCategory { constant SHORTCUTS (line 12) | const SHORTCUTS: ShortcutCategory[] = [ function getDefaultKeyMap (line 62) | function getDefaultKeyMap(): Record { FILE: src/constants/themes.ts type ColorThemeId (line 1) | type ColorThemeId = type ThemeColors (line 11) | interface ThemeColors { type ColorTheme (line 19) | interface ColorTheme { constant COLOR_THEMES (line 27) | const COLOR_THEMES: ColorTheme[] = [ constant DEFAULT_COLOR_THEME (line 182) | const DEFAULT_COLOR_THEME: ColorThemeId = "indigo"; function getThemeById (line 184) | function getThemeById(id: string): ColorTheme { FILE: src/hooks/useClickOutside.ts function useClickOutside (line 3) | function useClickOutside( FILE: src/hooks/useContextMenu.ts function useContextMenu (line 8) | function useContextMenu( FILE: src/hooks/useKeyboardShortcuts.ts function matchesKey (line 22) | function matchesKey(binding: string, e: KeyboardEvent): boolean { function buildReverseMap (line 45) | function buildReverseMap(keyMap: Record): { function getCachedReverseMap (line 73) | function getCachedReverseMap(keyMap: Record): ReturnType... function useKeyboardShortcuts (line 84) | function useKeyboardShortcuts() { function executeAction (line 201) | async function executeAction(actionId: string): Promise { FILE: src/hooks/useRouteNavigation.test.ts function setMatches (line 21) | function setMatches( FILE: src/hooks/useRouteNavigation.ts function useMatchesSafe (line 7) | function useMatchesSafe() { function useActiveLabel (line 19) | function useActiveLabel(): string { function useSelectedThreadId (line 47) | function useSelectedThreadId(): string | null { function useActiveCategory (line 61) | function useActiveCategory(): string { function useSearchQuery (line 75) | function useSearchQuery(): string { FILE: src/main.tsx function Root (line 13) | function Root() { FILE: src/router/index.ts type Register (line 14) | interface Register { FILE: src/router/navigate.test.ts method state (line 13) | get state() { FILE: src/router/navigate.ts constant SYSTEM_LABELS (line 4) | const SYSTEM_LABELS = new Set([ function navigateToLabel (line 12) | function navigateToLabel( function navigateToThread (line 94) | function navigateToThread(threadId: string): void { function navigateToSettings (line 141) | function navigateToSettings(tab = "general"): void { function navigateToHelp (line 148) | function navigateToHelp(topic = "getting-started"): void { function navigateBack (line 155) | function navigateBack(): void { function getActiveLabel (line 197) | function getActiveLabel(): string { function getSelectedThreadId (line 231) | function getSelectedThreadId(): string | null { FILE: src/router/routeTree.tsx constant VALID_CATEGORIES (line 19) | const VALID_CATEGORIES = ["Primary", "Updates", "Promotions", "Social", ... type MailSearch (line 21) | type MailSearch = { function validateMailSearch (line 26) | function validateMailSearch(search: Record): MailSearch { function MailPage (line 53) | function MailPage() { function SettingsTabPage (line 61) | function SettingsTabPage() { function CalendarPageWrapper (line 71) | function CalendarPageWrapper() { function HelpPageWrapper (line 81) | function HelpPageWrapper() { function AttachmentLibraryWrapper (line 150) | function AttachmentLibraryWrapper() { function TasksPageWrapper (line 167) | function TasksPageWrapper() { FILE: src/services/ai/aiService.ts function callAi (line 19) | async function callAi(systemPrompt: string, userContent: string): Promis... function formatMessageForSummary (line 36) | function formatMessageForSummary(msg: DbMessage): string { function summarizeThread (line 49) | async function summarizeThread( function composeFromPrompt (line 68) | async function composeFromPrompt(instructions: string): Promise { function generateReply (line 72) | async function generateReply( type TransformType (line 83) | type TransformType = "improve" | "shorten" | "formalize"; function transformText (line 85) | async function transformText( function generateSmartReplies (line 97) | async function generateSmartReplies( function askInbox (line 146) | async function askInbox( constant VALID_CATEGORIES (line 155) | const VALID_CATEGORIES = new Set(["Primary", "Updates", "Promotions", "S... function categorizeThreads (line 157) | async function categorizeThreads( function classifyThreadsBySmartLabels (line 185) | async function classifyThreadsBySmartLabels( function extractTaskFromThread (line 227) | async function extractTaskFromThread( function testConnection (line 238) | async function testConnection(): Promise { FILE: src/services/ai/askInbox.ts function extractSearchTerms (line 8) | function extractSearchTerms(question: string): string { type AskInboxResult (line 32) | interface AskInboxResult { function askMyInbox (line 41) | async function askMyInbox( FILE: src/services/ai/categorizationManager.ts function categorizeNewThreads (line 9) | async function categorizeNewThreads(accountId: string): Promise { FILE: src/services/ai/errors.ts type AiErrorCode (line 1) | type AiErrorCode = class AiError (line 7) | class AiError extends Error { method constructor (line 10) | constructor(code: AiErrorCode, message: string) { FILE: src/services/ai/prompts.ts constant SUMMARIZE_PROMPT (line 1) | const SUMMARIZE_PROMPT = `You are summarizing an email thread. Each mess... constant COMPOSE_PROMPT (line 12) | const COMPOSE_PROMPT = `Write an email based on the following instructio... constant REPLY_PROMPT (line 14) | const REPLY_PROMPT = `Write a reply to this email thread. Consider the f... constant IMPROVE_PROMPT (line 18) | const IMPROVE_PROMPT = `Improve the following email text. Make it cleare... constant SHORTEN_PROMPT (line 20) | const SHORTEN_PROMPT = `Make the following email text more concise while... constant FORMALIZE_PROMPT (line 22) | const FORMALIZE_PROMPT = `Rewrite the following email text in a more for... constant SMART_REPLY_PROMPT (line 24) | const SMART_REPLY_PROMPT = `Generate exactly 3 short email reply options... constant ASK_INBOX_PROMPT (line 35) | const ASK_INBOX_PROMPT = `You are an AI assistant that answers questions... constant CATEGORIZE_PROMPT (line 46) | const CATEGORIZE_PROMPT = `Categorize each email thread into exactly ONE... constant WRITING_STYLE_ANALYSIS_PROMPT (line 60) | const WRITING_STYLE_ANALYSIS_PROMPT = `Analyze the writing style of the ... constant AUTO_DRAFT_REPLY_PROMPT (line 71) | const AUTO_DRAFT_REPLY_PROMPT = `Generate a complete email reply draft f... constant SMART_LABEL_PROMPT (line 84) | const SMART_LABEL_PROMPT = `Classify each email thread against a set of ... constant EXTRACT_TASK_PROMPT (line 100) | const EXTRACT_TASK_PROMPT = `Extract an actionable task from the followi... FILE: src/services/ai/providerFactory.ts function createProviderFactory (line 5) | function createProviderFactory( FILE: src/services/ai/providerManager.ts constant API_KEY_SETTINGS (line 11) | const API_KEY_SETTINGS: Record, string> = { function getActiveProviderName (line 20) | async function getActiveProviderName(): Promise { function getActiveProvider (line 26) | async function getActiveProvider(): Promise { function isAiAvailable (line 77) | async function isAiAvailable(): Promise { function clearProviderClients (line 96) | function clearProviderClients(): void { FILE: src/services/ai/providers/claudeProvider.ts function createClaudeProvider (line 9) | function createClaudeProvider(apiKey: string, model: string): AiProvider... function clearClaudeProvider (line 40) | function clearClaudeProvider(): void { FILE: src/services/ai/providers/copilotProvider.ts function createCopilotProvider (line 15) | function createCopilotProvider(apiKey: string, model: string): AiProvide... function clearCopilotProvider (line 47) | function clearCopilotProvider(): void { FILE: src/services/ai/providers/geminiProvider.ts function createGeminiProvider (line 9) | function createGeminiProvider(apiKey: string, modelId: string): AiProvid... function clearGeminiProvider (line 37) | function clearGeminiProvider(): void { FILE: src/services/ai/providers/ollamaProvider.ts function getClient (line 8) | function getClient(serverUrl: string, model: string): OpenAI { function createOllamaProvider (line 22) | function createOllamaProvider(serverUrl: string, model: string): AiProvi... function clearOllamaProvider (line 54) | function clearOllamaProvider(): void { FILE: src/services/ai/providers/openaiProvider.ts function createOpenAIProvider (line 9) | function createOpenAIProvider(apiKey: string, model: string): AiProvider... function clearOpenAIProvider (line 41) | function clearOpenAIProvider(): void { FILE: src/services/ai/taskExtraction.test.ts function makeMessage (line 10) | function makeMessage(overrides: Partial = {}): DbMessage { FILE: src/services/ai/taskExtraction.ts type ExtractedTask (line 5) | interface ExtractedTask { constant VALID_PRIORITIES (line 12) | const VALID_PRIORITIES = new Set(["none", "low", "medium",... function extractTask (line 17) | async function extractTask( FILE: src/services/ai/types.ts type AiProvider (line 1) | type AiProvider = "claude" | "openai" | "gemini" | "ollama" | "copilot"; type AiCompletionRequest (line 3) | interface AiCompletionRequest { type AiProviderClient (line 9) | interface AiProviderClient { constant DEFAULT_MODELS (line 14) | const DEFAULT_MODELS: Record = { type ModelOption (line 22) | interface ModelOption { constant PROVIDER_MODELS (line 27) | const PROVIDER_MODELS: Record, ModelOption... constant MODEL_SETTINGS (line 53) | const MODEL_SETTINGS: Record, string> = { FILE: src/services/ai/writingStyleService.test.ts function makeSentMessage (line 50) | function makeSentMessage(overrides: Partial = {}): DbMessage { FILE: src/services/ai/writingStyleService.ts function callAi (line 14) | async function callAi(systemPrompt: string, userContent: string): Promis... function analyzeWritingStyle (line 34) | async function analyzeWritingStyle(samples: DbMessage[]): Promise { function getOrCreateStyleProfile (line 48) | async function getOrCreateStyleProfile(accountId: string): Promise { FILE: src/services/attachments/cacheManager.ts constant CACHE_DIR (line 4) | const CACHE_DIR = "attachment_cache"; function hashFileName (line 6) | function hashFileName(id: string): string { function cacheAttachment (line 20) | async function cacheAttachment( function loadCachedAttachment (line 53) | async function loadCachedAttachment( function getCacheSize (line 64) | async function getCacheSize(): Promise { function evictOldestCached (line 72) | async function evictOldestCached(): Promise { function clearAllCache (line 107) | async function clearAllCache(): Promise { FILE: src/services/attachments/preCacheManager.test.ts function runPreCache (line 42) | async function runPreCache() { FILE: src/services/attachments/preCacheManager.ts constant MAX_ATTACHMENT_SIZE (line 8) | const MAX_ATTACHMENT_SIZE = 5 * 1024 * 1024; constant RECENT_DAYS (line 9) | const RECENT_DAYS = 7; constant BATCH_LIMIT (line 10) | const BATCH_LIMIT = 20; function preCacheRecent (line 14) | async function preCacheRecent(): Promise { function startPreCacheManager (line 73) | function startPreCacheManager(): void { function stopPreCacheManager (line 79) | function stopPreCacheManager(): void { FILE: src/services/backgroundCheckers.ts type BackgroundChecker (line 5) | interface BackgroundChecker { function createBackgroundChecker (line 10) | function createBackgroundChecker( FILE: src/services/badgeManager.ts function updateBadgeCount (line 7) | async function updateBadgeCount(): Promise { FILE: src/services/bundles/bundleManager.ts function isDeliveryTime (line 15) | function isDeliveryTime(schedule: DeliverySchedule): boolean { function checkBundleDelivery (line 30) | async function checkBundleDelivery(): Promise { FILE: src/services/calendar/autoDiscovery.ts type CalDavPreset (line 1) | interface CalDavPreset { constant PRESETS (line 8) | const PRESETS: CalDavPreset[] = [ type CalDavDiscoveryResult (line 41) | interface CalDavDiscoveryResult { function discoverCalDavSettings (line 52) | async function discoverCalDavSettings(email: string): Promise { method listCalendars (line 45) | async listCalendars(): Promise { method fetchEvents (line 57) | async fetchEvents(calendarRemoteId: string, timeMin: string, timeMax: ... method createEvent (line 77) | async createEvent(calendarRemoteId: string, event: CreateEventInput): ... method updateEvent (line 93) | async updateEvent( method deleteEvent (line 139) | async deleteEvent(_calendarRemoteId: string, remoteEventId: string, et... method syncEvents (line 154) | async syncEvents(calendarRemoteId: string, _syncToken?: string): Promi... method testConnection (line 185) | async testConnection(): Promise<{ success: boolean; message: string }> { function extractCalendarColor (line 201) | function extractCalendarColor(cal: DAVCalendar): string | null { FILE: src/services/calendar/googleCalendarProvider.test.ts constant CALENDAR_API_BASE (line 8) | const CALENDAR_API_BASE = "https://www.googleapis.com/calendar/v3"; function createMockClient (line 10) | function createMockClient() { FILE: src/services/calendar/googleCalendarProvider.ts constant CALENDAR_API_BASE (line 13) | const CALENDAR_API_BASE = "https://www.googleapis.com/calendar/v3"; type GoogleCalendarListItem (line 15) | interface GoogleCalendarListItem { type GoogleCalendarListResponse (line 23) | interface GoogleCalendarListResponse { type GoogleCalendarEvent (line 27) | interface GoogleCalendarEvent { type GoogleEventListResponse (line 42) | interface GoogleEventListResponse { class GoogleCalendarProvider (line 48) | class GoogleCalendarProvider implements CalendarProvider { method constructor (line 51) | constructor(readonly accountId: string) {} method getClient (line 53) | private async getClient(): Promise { method listCalendars (line 57) | async listCalendars(): Promise { method fetchEvents (line 70) | async fetchEvents(calendarRemoteId: string, timeMin: string, timeMax: ... method createEvent (line 86) | async createEvent(calendarRemoteId: string, event: CreateEventInput): ... method updateEvent (line 117) | async updateEvent(calendarRemoteId: string, remoteEventId: string, eve... method deleteEvent (line 146) | async deleteEvent(calendarRemoteId: string, remoteEventId: string): Pr... method syncEvents (line 154) | async syncEvents(calendarRemoteId: string, syncToken?: string): Promis... method testConnection (line 213) | async testConnection(): Promise<{ success: boolean; message: string }> { function mapGoogleEvent (line 223) | function mapGoogleEvent(event: GoogleCalendarEvent): CalendarEventData { FILE: src/services/calendar/icalHelper.ts function generateVEvent (line 6) | function generateVEvent(event: CreateEventInput | UpdateEventInput, uid?... function parseVEvent (line 56) | function parseVEvent(icalData: string, href?: string): CalendarEventData { function unfoldLines (line 146) | function unfoldLines(icalData: string): string[] { function formatDateTimeUTC (line 151) | function formatDateTimeUTC(date: Date): string { function formatDateOnly (line 155) | function formatDateOnly(date: Date): string { function escapeICalText (line 162) | function escapeICalText(text: string): string { function unescapeICalText (line 170) | function unescapeICalText(text: string): string { function parseICalDateTime (line 178) | function parseICalDateTime(value: string, isAllDay: boolean): number { FILE: src/services/calendar/providerFactory.test.ts class GoogleCalendarProvider (line 14) | class GoogleCalendarProvider { method constructor (line 17) | constructor(accountId: string) { class CalDAVProvider (line 25) | class CalDAVProvider { method constructor (line 28) | constructor(accountId: string) { FILE: src/services/calendar/providerFactory.ts function getCalendarProvider (line 12) | async function getCalendarProvider(accountId: string): Promise { function removeCalendarProvider (line 57) | function removeCalendarProvider(accountId: string): void { function clearAllCalendarProviders (line 61) | function clearAllCalendarProviders(): void { FILE: src/services/calendar/types.ts type CalendarProviderType (line 1) | type CalendarProviderType = "google_api" | "caldav"; type CalendarInfo (line 3) | interface CalendarInfo { type CalendarEventData (line 10) | interface CalendarEventData { type CreateEventInput (line 27) | interface CreateEventInput { type UpdateEventInput (line 37) | interface UpdateEventInput { type CalendarSyncResult (line 46) | interface CalendarSyncResult { type CalendarProvider (line 54) | interface CalendarProvider { FILE: src/services/categorization/backfillService.ts function backfillUncategorizedThreads (line 14) | async function backfillUncategorizedThreads( FILE: src/services/categorization/ruleEngine.test.ts function input (line 3) | function input(overrides: Partial = {}): Categoriza... FILE: src/services/categorization/ruleEngine.ts type CategorizationInput (line 3) | interface CategorizationInput { constant SOCIAL_DOMAINS (line 9) | const SOCIAL_DOMAINS = new Set([ constant NEWSLETTER_DOMAINS (line 27) | const NEWSLETTER_DOMAINS = new Set([ constant PROMO_PREFIXES (line 44) | const PROMO_PREFIXES = new Set([ constant UPDATE_PREFIXES (line 58) | const UPDATE_PREFIXES = new Set([ function getDomain (line 78) | function getDomain(email: string): string | null { function getLocalPart (line 84) | function getLocalPart(email: string): string | null { function categorizeByRules (line 99) | function categorizeByRules(input: CategorizationInput): ThreadCategory { FILE: src/services/composer/draftAutoSave.ts constant DEBOUNCE_MS (line 10) | const DEBOUNCE_MS = 3000; function saveDraft (line 12) | async function saveDraft(): Promise { function scheduleSave (line 60) | function scheduleSave(): void { function startAutoSave (line 68) | function startAutoSave(accountId: string): void { function stopAutoSave (line 94) | function stopAutoSave(): void { FILE: src/services/contacts/gravatar.ts function md5 (line 8) | function md5(input: string): string { function getGravatarUrl (line 94) | function getGravatarUrl(email: string): string { function fetchAndCacheGravatarUrl (line 99) | async function fetchAndCacheGravatarUrl(email: string): Promise { function getAccount (line 86) | async function getAccount(id: string): Promise { function getAccountByEmail (line 94) | async function getAccountByEmail( function insertAccount (line 104) | async function insertAccount(account: { function updateAccountTokens (line 131) | async function updateAccountTokens( function updateAccountSyncState (line 144) | async function updateAccountSyncState( function clearAccountHistoryId (line 155) | async function clearAccountHistoryId(id: string): Promise { function updateAccountAllTokens (line 163) | async function updateAccountAllTokens( function deleteAccount (line 178) | async function deleteAccount(id: string): Promise { function insertImapAccount (line 183) | async function insertImapAccount(account: { function insertCalDavAccount (line 223) | async function insertCalDavAccount(account: { function updateAccountCalDav (line 251) | async function updateAccountCalDav( function insertOAuthImapAccount (line 280) | async function insertOAuthImapAccount(account: { FILE: src/services/db/aiCache.ts type AiCacheEntry (line 3) | interface AiCacheEntry { function getAiCache (line 12) | async function getAiCache( function setAiCache (line 25) | async function setAiCache( function deleteAiCache (line 42) | async function deleteAiCache( FILE: src/services/db/attachments.ts type DbAttachment (line 3) | interface DbAttachment { function upsertAttachment (line 16) | async function upsertAttachment(att: { type AttachmentWithContext (line 48) | interface AttachmentWithContext { function getAttachmentsForAccount (line 66) | async function getAttachmentsForAccount( type AttachmentSender (line 83) | interface AttachmentSender { function getAttachmentSenders (line 89) | async function getAttachmentSenders( function getAttachmentsForMessage (line 105) | async function getAttachmentsForMessage( FILE: src/services/db/bundleRules.ts type DeliverySchedule (line 4) | interface DeliverySchedule { type DbBundleRule (line 10) | interface DbBundleRule { type DbBundledThread (line 21) | interface DbBundledThread { function getBundleRules (line 28) | async function getBundleRules(accountId: string): Promise { function getBundleRule (line 36) | async function getBundleRule( function setBundleRule (line 46) | async function setBundleRule( function holdThread (line 64) | async function holdThread( function isThreadHeld (line 80) | async function isThreadHeld( function getHeldThreadIds (line 91) | async function getHeldThreadIds( function releaseHeldThreads (line 103) | async function releaseHeldThreads( function updateLastDelivered (line 115) | async function updateLastDelivered( function getBundleSummary (line 127) | async function getBundleSummary( function getBundleSummaries (line 162) | async function getBundleSummaries( function getNextDeliveryTime (line 209) | function getNextDeliveryTime(schedule: DeliverySchedule): number { FILE: src/services/db/calendarEvents.ts type DbCalendarEvent (line 3) | interface DbCalendarEvent { function upsertCalendarEvent (line 26) | async function upsertCalendarEvent(event: { function getCalendarEventsInRange (line 65) | async function getCalendarEventsInRange( function getCalendarEventsInRangeMulti (line 79) | async function getCalendarEventsInRangeMulti( function deleteEventsForCalendar (line 99) | async function deleteEventsForCalendar(calendarId: string): Promise { function getEventByRemoteId (line 104) | async function getEventByRemoteId( function deleteEventByRemoteId (line 114) | async function deleteEventByRemoteId( function deleteCalendarEvent (line 125) | async function deleteCalendarEvent(eventId: string): Promise { FILE: src/services/db/calendars.test.ts constant MOCK_UUID (line 35) | const MOCK_UUID = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"; function makeCal (line 232) | function makeCal(overrides: Partial = {}): DbCalendar { FILE: src/services/db/calendars.ts type DbCalendar (line 3) | interface DbCalendar { function upsertCalendar (line 18) | async function upsertCalendar(calendar: { function getCalendarsForAccount (line 43) | async function getCalendarsForAccount(accountId: string): Promise { function buildDynamicUpdate (line 16) | function buildDynamicUpdate( function withTransaction (line 48) | async function withTransaction(fn: (db: Database) => Promise): Pro... function selectFirstBy (line 87) | async function selectFirstBy( function existsBy (line 99) | async function existsBy( function boolToInt (line 111) | function boolToInt(value: boolean | undefined | null): number { FILE: src/services/db/contacts.ts type DbContact (line 4) | interface DbContact { type ContactAttachment (line 14) | interface ContactAttachment { type SameDomainContact (line 21) | interface SameDomainContact { function searchContacts (line 30) | async function searchContacts( function getAllContacts (line 48) | async function getAllContacts( function updateContact (line 64) | async function updateContact( function deleteContact (line 78) | async function deleteContact(id: string): Promise { function upsertContact (line 86) | async function upsertContact( function getContactByEmail (line 104) | async function getContactByEmail( type ContactStats (line 113) | interface ContactStats { function getContactStats (line 119) | async function getContactStats( function getRecentThreadsWithContact (line 136) | async function getRecentThreadsWithContact( function updateContactAvatar (line 152) | async function updateContactAvatar( function updateContactNotes (line 166) | async function updateContactNotes( function getAttachmentsFromContact (line 180) | async function getAttachmentsFromContact( constant PUBLIC_DOMAINS (line 196) | const PUBLIC_DOMAINS = new Set([ function getContactsFromSameDomain (line 207) | async function getContactsFromSameDomain( function getLatestAuthResult (line 231) | async function getLatestAuthResult( FILE: src/services/db/filters.ts type FilterCriteria (line 3) | interface FilterCriteria { type FilterActions (line 11) | interface FilterActions { type DbFilterRule (line 19) | interface DbFilterRule { function getFiltersForAccount (line 30) | async function getFiltersForAccount( function getEnabledFiltersForAccount (line 40) | async function getEnabledFiltersForAccount( function insertFilter (line 50) | async function insertFilter(filter: { function updateFilter (line 73) | async function updateFilter( function deleteFilter (line 95) | async function deleteFilter(id: string): Promise { FILE: src/services/db/folderSyncState.ts type FolderSyncState (line 3) | interface FolderSyncState { function getFolderSyncState (line 12) | async function getFolderSyncState( function upsertFolderSyncState (line 22) | async function upsertFolderSyncState( function deleteFolderSyncState (line 42) | async function deleteFolderSyncState( function clearAllFolderSyncStates (line 53) | async function clearAllFolderSyncStates( function getAllFolderSyncStates (line 63) | async function getAllFolderSyncStates( FILE: src/services/db/followUpReminders.ts type DbFollowUpReminder (line 4) | interface DbFollowUpReminder { function insertFollowUpReminder (line 14) | async function insertFollowUpReminder( function getPendingFollowUpReminders (line 31) | async function getPendingFollowUpReminders(): Promise { FILE: src/services/db/localDrafts.ts type LocalDraft (line 3) | interface LocalDraft { function upsertLocalDraft (line 22) | async function upsertLocalDraft(draft: { function getLocalDraft (line 65) | async function getLocalDraft(id: string): Promise { function getUnsyncedDrafts (line 74) | async function getUnsyncedDrafts( function markDraftSynced (line 84) | async function markDraftSynced( function deleteLocalDraft (line 95) | async function deleteLocalDraft(id: string): Promise { FILE: src/services/db/messages.ts type DbMessage (line 3) | interface DbMessage { function getMessagesForThread (line 33) | async function getMessagesForThread( function upsertMessage (line 44) | async function upsertMessage(msg: { function deleteMessage (line 119) | async function deleteMessage( function updateMessageThreadIds (line 130) | async function updateMessageThreadIds( function deleteAllMessagesForAccount (line 147) | async function deleteAllMessagesForAccount( function getRecentSentMessages (line 161) | async function getRecentSentMessages( FILE: src/services/db/migrations.test.ts function splitStatements (line 4) | function splitStatements(sql: string): string[] { FILE: src/services/db/migrations.ts constant MIGRATIONS (line 3) | const MIGRATIONS = [ function splitStatements (line 784) | function splitStatements(sql: string): string[] { function runMigrations (line 825) | async function runMigrations(): Promise { FILE: src/services/db/notificationVips.ts type NotificationVip (line 4) | interface NotificationVip { function getVipSenders (line 12) | async function getVipSenders(accountId: string): Promise> { function getAllVipSenders (line 21) | async function getAllVipSenders(accountId: string): Promise { constant BACKOFF_SCHEDULE (line 74) | const BACKOFF_SCHEDULE = [60, 300, 900, 3600]; function incrementRetry (line 76) | async function incrementRetry(id: string): Promise { function getPendingOpsCount (line 104) | async function getPendingOpsCount(accountId?: string): Promise { function getFailedOpsCount (line 119) | async function getFailedOpsCount(accountId?: string): Promise { function getPendingOpsForResource (line 134) | async function getPendingOpsForResource( function compactQueue (line 147) | async function compactQueue(accountId?: string): Promise { function clearFailedOperations (line 231) | async function clearFailedOperations(accountId?: string): Promise { function retryFailedOperations (line 243) | async function retryFailedOperations(accountId?: string): Promise { FILE: src/services/db/phishingAllowlist.ts function isPhishingAllowlisted (line 4) | async function isPhishingAllowlisted( function addToPhishingAllowlist (line 16) | async function addToPhishingAllowlist( function removeFromPhishingAllowlist (line 28) | async function removeFromPhishingAllowlist( function getPhishingAllowlist (line 39) | async function getPhishingAllowlist( FILE: src/services/db/quickSteps.ts type DbQuickStep (line 4) | interface DbQuickStep { function getQuickStepsForAccount (line 18) | async function getQuickStepsForAccount( function getEnabledQuickStepsForAccount (line 28) | async function getEnabledQuickStepsForAccount( function insertQuickStep (line 38) | async function insertQuickStep(step: { function updateQuickStep (line 67) | async function updateQuickStep( function deleteQuickStep (line 95) | async function deleteQuickStep(id: string): Promise { function reorderQuickSteps (line 100) | async function reorderQuickSteps( FILE: src/services/db/scheduledEmails.ts type DbScheduledEmail (line 4) | interface DbScheduledEmail { function getPendingScheduledEmails (line 21) | async function getPendingScheduledEmails(): Promise { function getScheduledEmailsForAccount (line 30) | async function getScheduledEmailsForAccount( function insertScheduledEmail (line 40) | async function insertScheduledEmail(email: { function updateScheduledEmailStatus (line 74) | async function updateScheduledEmailStatus( function deleteScheduledEmail (line 85) | async function deleteScheduledEmail(id: string): Promise { FILE: src/services/db/search.ts type SearchResult (line 5) | interface SearchResult { function searchMessages (line 21) | async function searchMessages( FILE: src/services/db/sendAsAliases.ts type DbSendAsAlias (line 3) | interface DbSendAsAlias { type SendAsAlias (line 17) | interface SendAsAlias { function mapDbAlias (line 30) | function mapDbAlias(db: DbSendAsAlias): SendAsAlias { function getAliasesForAccount (line 45) | async function getAliasesForAccount( function upsertAlias (line 55) | async function upsertAlias(alias: { function getDefaultAlias (line 96) | async function getDefaultAlias( function setDefaultAlias (line 113) | async function setDefaultAlias( function deleteAlias (line 130) | async function deleteAlias(id: string): Promise { FILE: src/services/db/settings.ts function getSetting (line 4) | async function getSetting(key: string): Promise { function setSetting (line 13) | async function setSetting(key: string, value: string): Promise { function getAllSettings (line 21) | async function getAllSettings(): Promise> { function getSecureSetting (line 33) | async function getSecureSetting(key: string): Promise { function setSecureSetting (line 51) | async function setSecureSetting(key: string, value: string): Promise { FILE: src/services/db/smartFolders.ts type DbSmartFolder (line 3) | interface DbSmartFolder { function getSmartFolders (line 18) | async function getSmartFolders( function getSmartFolderById (line 33) | async function getSmartFolderById( function insertSmartFolder (line 42) | async function insertSmartFolder(folder: { function updateSmartFolder (line 65) | async function updateSmartFolder( function deleteSmartFolder (line 82) | async function deleteSmartFolder(id: string): Promise { function updateSmartFolderSortOrder (line 87) | async function updateSmartFolderSortOrder( FILE: src/services/db/smartLabelRules.ts type DbSmartLabelRule (line 4) | interface DbSmartLabelRule { function getSmartLabelRulesForAccount (line 15) | async function getSmartLabelRulesForAccount( function getEnabledSmartLabelRules (line 25) | async function getEnabledSmartLabelRules( function insertSmartLabelRule (line 35) | async function insertSmartLabelRule(rule: { function updateSmartLabelRule (line 58) | async function updateSmartLabelRule( function deleteSmartLabelRule (line 81) | async function deleteSmartLabelRule(id: string): Promise { FILE: src/services/db/tasks.ts type TaskPriority (line 3) | type TaskPriority = "none" | "low" | "medium" | "high" | "urgent"; type DbTask (line 5) | interface DbTask { type DbTaskTag (line 25) | interface DbTaskTag { function getTasksForAccount (line 33) | async function getTasksForAccount( function getTaskById (line 52) | async function getTaskById(id: string): Promise { function getTasksForThread (line 61) | async function getTasksForThread( function getSubtasks (line 73) | async function getSubtasks(parentId: string): Promise { function insertTask (line 81) | async function insertTask(task: { function updateTask (line 118) | async function updateTask( function deleteTask (line 176) | async function deleteTask(id: string): Promise { function completeTask (line 181) | async function completeTask(id: string): Promise { function uncompleteTask (line 189) | async function uncompleteTask(id: string): Promise { function reorderTasks (line 197) | async function reorderTasks( function getIncompleteTaskCount (line 209) | async function getIncompleteTaskCount( function getTaskTags (line 220) | async function getTaskTags( function upsertTaskTag (line 230) | async function upsertTaskTag( function deleteTaskTag (line 244) | async function deleteTaskTag( FILE: src/services/db/templates.ts type DbTemplate (line 3) | interface DbTemplate { function getTemplatesForAccount (line 17) | async function getTemplatesForAccount( function insertTemplate (line 27) | async function insertTemplate(tmpl: { function updateTemplate (line 43) | async function updateTemplate( function deleteTemplate (line 60) | async function deleteTemplate(id: string): Promise { FILE: src/services/db/threadCategories.ts type ThreadCategory (line 3) | type ThreadCategory = "Primary" | "Updates" | "Promotions" | "Social" | ... constant ALL_CATEGORIES (line 5) | const ALL_CATEGORIES: ThreadCategory[] = [ type DbThreadCategory (line 13) | interface DbThreadCategory { function getThreadCategory (line 20) | async function getThreadCategory( function getThreadCategoryWithManual (line 32) | async function getThreadCategoryWithManual( function getRecentRuleCategorizedThreadIds (line 45) | async function getRecentRuleCategorizedThreadIds( function getCategoriesForThreads (line 64) | async function getCategoriesForThreads( function setThreadCategory (line 87) | async function setThreadCategory( function setThreadCategoriesBatch (line 103) | async function setThreadCategoriesBatch( function getCategoryUnreadCounts (line 121) | async function getCategoryUnreadCounts( function getUncategorizedInboxThreadIds (line 142) | async function getUncategorizedInboxThreadIds( FILE: src/services/db/threads.ts type DbThread (line 3) | interface DbThread { function getThreadsForAccount (line 22) | async function getThreadsForAccount( function getThreadsForCategory (line 52) | async function getThreadsForCategory( function upsertThread (line 88) | async function upsertThread(thread: { function setThreadLabels (line 122) | async function setThreadLabels( function getThreadLabelIds (line 142) | async function getThreadLabelIds( function getThreadById (line 154) | async function getThreadById( function getThreadCountForAccount (line 170) | async function getThreadCountForAccount(accountId: string): Promise { function deleteThread (line 189) | async function deleteThread( function deleteAllThreadsForAccount (line 200) | async function deleteAllThreadsForAccount( function pinThread (line 210) | async function pinThread( function unpinThread (line 221) | async function unpinThread( function muteThread (line 232) | async function muteThread( function unmuteThread (line 243) | async function unmuteThread( function getMutedThreadIds (line 254) | async function getMutedThreadIds( FILE: src/services/db/writingStyleProfiles.ts type DbWritingStyleProfile (line 3) | interface DbWritingStyleProfile { function getWritingStyleProfile (line 12) | async function getWritingStyleProfile( function upsertWritingStyleProfile (line 23) | async function upsertWritingStyleProfile( function deleteWritingStyleProfile (line 39) | async function deleteWritingStyleProfile( FILE: src/services/deepLinkHandler.ts function handleUrl (line 8) | async function handleUrl(url: string): Promise { function initDeepLinkHandler (line 31) | async function initDeepLinkHandler(): Promise<() => void> { FILE: src/services/email/gmailProvider.ts constant GMAIL_SPECIAL_USE (line 6) | const GMAIL_SPECIAL_USE: Record = { class GmailApiProvider (line 27) | class GmailApiProvider implements EmailProvider { method constructor (line 32) | constructor(accountId: string, client: GmailClient) { method listFolders (line 37) | async listFolders(): Promise { method createFolder (line 54) | async createFolder(name: string, _parentPath?: string): Promise { method renameFolder (line 74) | async renameFolder(path: string, newName: string): Promise { method initialSync (line 78) | async initialSync( method deltaSync (line 92) | async deltaSync(syncToken: string): Promise { method fetchMessage (line 127) | async fetchMessage(messageId: string): Promise { method fetchAttachment (line 132) | async fetchAttachment( method fetchRawMessage (line 140) | async fetchRawMessage(messageId: string): Promise { method archive (line 147) | async archive(threadId: string, _messageIds: string[]): Promise { method trash (line 151) | async trash(threadId: string, _messageIds: string[]): Promise { method permanentDelete (line 155) | async permanentDelete( method markRead (line 162) | async markRead( method star (line 174) | async star( method spam (line 186) | async spam( method moveToFolder (line 198) | async moveToFolder( method addLabel (line 206) | async addLabel(threadId: string, labelId: string): Promise { method removeLabel (line 210) | async removeLabel(threadId: string, labelId: string): Promise { method sendMessage (line 214) | async sendMessage( method createDraft (line 222) | async createDraft( method updateDraft (line 230) | async updateDraft( method deleteDraft (line 243) | async deleteDraft(draftId: string): Promise { method testConnection (line 247) | async testConnection(): Promise<{ success: boolean; message: string }> { method getProfile (line 263) | async getProfile(): Promise<{ email: string; name?: string }> { FILE: src/services/email/imapSmtpProvider.ts function base64UrlDecode (line 30) | function base64UrlDecode(input: string): string { function parseBasicHeaders (line 46) | function parseBasicHeaders(raw: string): Map { function extractSnippet (line 69) | function extractSnippet(raw: string, maxLen = 200): string { class ImapSmtpProvider (line 105) | class ImapSmtpProvider implements EmailProvider { method constructor (line 112) | constructor(accountId: string) { method getAccount (line 116) | private async getAccount(): Promise { method getImapConfig (line 124) | private async getImapConfig(): Promise { method getSmtpConfig (line 137) | private async getSmtpConfig(): Promise { method clearConfigCache (line 152) | clearConfigCache(): void { method listFolders (line 159) | async listFolders(): Promise { method createFolder (line 179) | async createFolder( method deleteFolder (line 189) | async deleteFolder(_path: string): Promise { method renameFolder (line 196) | async renameFolder(_path: string, _newName: string): Promise { method initialSync (line 205) | async initialSync( method deltaSync (line 214) | async deltaSync(_syncToken: string): Promise { method fetchMessage (line 220) | async fetchMessage(messageId: string): Promise { method fetchAttachment (line 240) | async fetchAttachment( method fetchRawMessage (line 255) | async fetchRawMessage(messageId: string): Promise { method archive (line 268) | async archive( method trash (line 283) | async trash( method permanentDelete (line 298) | async permanentDelete( method markRead (line 310) | async markRead( method star (line 323) | async star( method spam (line 336) | async spam( method moveToFolder (line 353) | async moveToFolder( method addLabel (line 367) | async addLabel( method removeLabel (line 380) | async removeLabel( method sendMessage (line 393) | async sendMessage( method saveSentMessageLocally (line 434) | private async saveSentMessageLocally( method createDraft (line 513) | async createDraft( method updateDraft (line 528) | async updateDraft( method deleteDraft (line 543) | async deleteDraft(draftId: string): Promise { method testConnection (line 562) | async testConnection(): Promise<{ success: boolean; message: string }> { method getProfile (line 593) | async getProfile(): Promise<{ email: string; name?: string }> { method groupByFolder (line 609) | private groupByFolder(messageIds: string[]): Map { method parseImapMessageId (line 636) | private parseImapMessageId( FILE: src/services/email/providerFactory.ts function getEmailProvider (line 13) | async function getEmailProvider( function removeProvider (line 39) | function removeProvider(accountId: string): void { function invalidateProviderConfig (line 48) | function invalidateProviderConfig(accountId: string): void { function clearAllProviders (line 58) | function clearAllProviders(): void { FILE: src/services/email/types.ts type AccountProvider (line 3) | type AccountProvider = "gmail_api" | "imap" | "caldav"; type EmailFolder (line 5) | interface EmailFolder { type SyncResult (line 16) | interface SyncResult { type EmailProvider (line 26) | interface EmailProvider { FILE: src/services/emailActions.ts type EmailAction (line 13) | type EmailAction = type ActionResult (line 65) | interface ActionResult { function getNextThreadId (line 76) | function getNextThreadId(currentId: string): string | null { function applyOptimisticUpdate (line 91) | function applyOptimisticUpdate(action: EmailAction): void { function revertOptimisticUpdate (line 123) | function revertOptimisticUpdate(action: EmailAction): void { function applyLocalDbUpdate (line 143) | async function applyLocalDbUpdate( function getResourceId (line 236) | function getResourceId(action: EmailAction): string { function actionToParams (line 242) | function actionToParams(action: EmailAction): Record { function executeViaProvider (line 248) | async function executeViaProvider( function executeEmailAction (line 303) | async function executeEmailAction( function executeQueuedAction (line 357) | async function executeQueuedAction( function archiveThread (line 370) | function archiveThread( function trashThread (line 382) | function trashThread( function permanentDeleteThread (line 394) | function permanentDeleteThread( function markThreadRead (line 406) | function markThreadRead( function starThread (line 420) | function starThread( function spamThread (line 434) | function spamThread( function moveThread (line 448) | function moveThread( function addThreadLabel (line 462) | function addThreadLabel( function removeThreadLabel (line 474) | function removeThreadLabel( function sendEmail (line 486) | async function sendEmail( function createDraft (line 505) | function createDraft( function updateDraft (line 517) | function updateDraft( function deleteDraft (line 531) | function deleteDraft( FILE: src/services/filters/filterEngine.ts function messageMatchesFilter (line 10) | function messageMatchesFilter( type FilterResult (line 41) | interface FilterResult { function computeFilterActions (line 51) | function computeFilterActions(actions: FilterActions): FilterResult { function applyFiltersToMessages (line 84) | async function applyFiltersToMessages( FILE: src/services/followup/followupManager.ts function checkFollowUpReminders (line 14) | async function checkFollowUpReminders(): Promise { FILE: src/services/globalShortcut.ts constant DEFAULT_SHORTCUT (line 6) | const DEFAULT_SHORTCUT = "CmdOrCtrl+Shift+M"; function handleComposeShortcut (line 9) | async function handleComposeShortcut(): Promise { function initGlobalShortcut (line 18) | async function initGlobalShortcut(): Promise { function registerComposeShortcut (line 33) | async function registerComposeShortcut(shortcut: string): Promise { function unregisterComposeShortcut (line 47) | async function unregisterComposeShortcut(): Promise { function getCurrentShortcut (line 58) | function getCurrentShortcut(): string | null { FILE: src/services/gmail/auth.ts constant GOOGLE_AUTH_URL (line 4) | const GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth"; constant GOOGLE_TOKEN_URL (line 5) | const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token"; constant OAUTH_CALLBACK_PORT (line 6) | const OAUTH_CALLBACK_PORT = 17248; constant SCOPES (line 8) | const SCOPES = [ type OAuthServerResult (line 19) | interface OAuthServerResult { type TokenResponse (line 24) | interface TokenResponse { type UserInfo (line 32) | interface UserInfo { function generateCodeVerifier (line 38) | function generateCodeVerifier(): string { function generateCodeChallenge (line 44) | async function generateCodeChallenge(verifier: string): Promise { function base64UrlEncode (line 51) | function base64UrlEncode(bytes: Uint8Array): string { function startOAuthFlow (line 70) | async function startOAuthFlow( function exchangeCodeForTokens (line 137) | async function exchangeCodeForTokens( function refreshAccessToken (line 170) | async function refreshAccessToken( function fetchUserInfo (line 196) | async function fetchUserInfo(accessToken: string): Promise { FILE: src/services/gmail/authParser.test.ts function makeHeaders (line 4) | function makeHeaders( FILE: src/services/gmail/authParser.ts type AuthVerdict (line 1) | interface AuthVerdict { type AuthResult (line 6) | interface AuthResult { function parseVerdict (line 17) | function parseVerdict(headerValue: string, mechanism: string): AuthVerdi... function parseReceivedSpf (line 37) | function parseReceivedSpf(headerValue: string): AuthVerdict | null { function unknownVerdict (line 47) | function unknownVerdict(): AuthVerdict { function computeAggregate (line 59) | function computeAggregate( function parseAuthenticationResults (line 109) | function parseAuthenticationResults( FILE: src/services/gmail/client.ts constant GMAIL_API_BASE (line 6) | const GMAIL_API_BASE = "https://www.googleapis.com/gmail/v1"; constant MAX_RETRY_ATTEMPTS (line 7) | const MAX_RETRY_ATTEMPTS = 3; constant INITIAL_BACKOFF_MS (line 8) | const INITIAL_BACKOFF_MS = 1000; type TokenInfo (line 10) | interface TokenInfo { class GmailClient (line 19) | class GmailClient { method constructor (line 26) | constructor(accountId: string, clientId: string, tokenInfo: TokenInfo,... method getValidToken (line 33) | private async getValidToken(): Promise { method refreshToken (line 48) | private async refreshToken(): Promise { method fetchWithRetry (line 76) | private async fetchWithRetry( method request (line 97) | async request( method getProfile (line 149) | async getProfile(): Promise<{ emailAddress: string; messagesTotal: num... method listLabels (line 153) | async listLabels(): Promise<{ labels: GmailLabel[] }> { method listThreads (line 157) | async listThreads(params: { method getThread (line 172) | async getThread(threadId: string, format: "full" | "metadata" | "minim... method getMessage (line 176) | async getMessage(messageId: string, format: "full" | "metadata" | "min... method modifyThread (line 180) | async modifyThread(threadId: string, addLabelIds?: string[], removeLab... method getHistory (line 187) | async getHistory( method createLabel (line 209) | async createLabel(name: string, color?: { textColor: string; backgroun... method updateLabel (line 225) | async updateLabel(labelId: string, updates: { name?: string; color?: {... method deleteLabel (line 238) | async deleteLabel(labelId: string): Promise { method deleteThread (line 254) | async deleteThread(threadId: string): Promise { method sendMessage (line 270) | async sendMessage(raw: string, threadId?: string): Promise { method listDrafts (line 321) | async listDrafts(): Promise<{ id: string; message: { id: string; threa... type GmailLabel (line 328) | interface GmailLabel { type GmailThreadStub (line 341) | interface GmailThreadStub { type GmailThread (line 347) | interface GmailThread { type GmailMessage (line 353) | interface GmailMessage { type GmailMessagePart (line 364) | interface GmailMessagePart { type GmailHeader (line 373) | interface GmailHeader { type GmailHistoryItem (line 378) | interface GmailHistoryItem { FILE: src/services/gmail/draftDeletion.test.ts function createMockClient (line 10) | function createMockClient(drafts: { id: string; message: { id: string; t... FILE: src/services/gmail/draftDeletion.ts function deleteDraftsForThread (line 9) | async function deleteDraftsForThread( FILE: src/services/gmail/messageParser.ts type ParsedAttachment (line 4) | interface ParsedAttachment { type ParsedMessage (line 13) | interface ParsedMessage { function parseGmailMessage (line 39) | function parseGmailMessage(msg: GmailMessage): ParsedMessage { function getHeader (line 76) | function getHeader(headers: GmailHeader[], name: string): string | null { function parseEmailAddress (line 83) | function parseEmailAddress(raw: string | null): { function extractBody (line 101) | function extractBody( function extractAttachments (line 119) | function extractAttachments(part: GmailMessagePart): ParsedAttachment[] { function collectAttachments (line 125) | function collectAttachments(part: GmailMessagePart, results: ParsedAttac... function decodeBase64Url (line 157) | function decodeBase64Url(data: string): string { FILE: src/services/gmail/sendAs.ts type GmailSendAsEntry (line 4) | interface GmailSendAsEntry { type GmailSendAsResponse (line 14) | interface GmailSendAsResponse { function fetchSendAsAliases (line 21) | async function fetchSendAsAliases( FILE: src/services/gmail/sync.test.ts function createMockClient (line 82) | function createMockClient(historyItems: unknown[]): GmailClient { FILE: src/services/gmail/sync.ts function loadAutoArchiveCategories (line 16) | async function loadAutoArchiveCategories(): Promise> { type SyncProgress (line 22) | interface SyncProgress { type SyncProgressCallback (line 28) | type SyncProgressCallback = (progress: SyncProgress) => void; function processAndStoreThread (line 34) | async function processAndStoreThread( function syncLabels (line 157) | async function syncLabels( function initialSync (line 177) | async function initialSync( function parallelLimit (line 266) | async function parallelLimit( function deltaSync (line 288) | async function deltaSync( FILE: src/services/gmail/syncManager.test.ts function makeGmailAccount (line 68) | function makeGmailAccount(id: string, historyId: string | null = null) { FILE: src/services/gmail/syncManager.ts constant SYNC_INTERVAL_MS (line 14) | const SYNC_INTERVAL_MS = 60_000; function mapImapPhase (line 17) | function mapImapPhase(phase: string): "labels" | "threads" | "messages" ... type SyncStatusCallback (line 29) | type SyncStatusCallback = ( function onSyncStatus (line 38) | function onSyncStatus(cb: SyncStatusCallback): () => void { function syncGmailAccount (line 48) | async function syncGmailAccount(accountId: string): Promise { function syncImapAccount (line 85) | async function syncImapAccount(accountId: string): Promise { function syncCalendarForAccount (line 138) | async function syncCalendarForAccount(accountId: string): Promise { function syncAccountInternal (line 212) | async function syncAccountInternal(accountId: string): Promise { function runSync (line 253) | async function runSync(accountIds: string[]): Promise { function syncAccount (line 285) | async function syncAccount(accountId: string): Promise { function startBackgroundSync (line 295) | function startBackgroundSync(accountIds: string[], skipImmediateSync = f... function stopBackgroundSync (line 312) | function stopBackgroundSync(): void { function triggerSync (line 323) | async function triggerSync(accountIds: string[]): Promise { function forceFullSync (line 331) | async function forceFullSync(accountIds: string[]): Promise { function resyncAccount (line 343) | async function resyncAccount(accountId: string): Promise { FILE: src/services/gmail/tokenManager.ts function getGmailClient (line 14) | async function getGmailClient( function removeClient (line 43) | function removeClient(accountId: string): void { function getClientId (line 50) | async function getClientId(): Promise { function getClientSecret (line 61) | async function getClientSecret(): Promise { function initializeClients (line 69) | async function initializeClients(): Promise { function reauthorizeAccount (line 91) | async function reauthorizeAccount( FILE: src/services/google/calendar.ts constant CALENDAR_API_BASE (line 3) | const CALENDAR_API_BASE = "https://www.googleapis.com/calendar/v3"; type CalendarEvent (line 5) | interface CalendarEvent { type EventListResponse (line 19) | interface EventListResponse { function listCalendarEvents (line 24) | async function listCalendarEvents( function createCalendarEvent (line 42) | async function createCalendarEvent( function deleteCalendarEvent (line 60) | async function deleteCalendarEvent( FILE: src/services/imap/autoDiscovery.ts type SecurityType (line 1) | type SecurityType = "ssl" | "starttls" | "none"; type AuthMethod (line 2) | type AuthMethod = "password" | "oauth2"; type ServerSettings (line 4) | interface ServerSettings { type WellKnownProvider (line 13) | interface WellKnownProvider { function extractDomain (line 161) | function extractDomain(email: string): string | null { type WellKnownProviderResult (line 168) | interface WellKnownProviderResult { function findWellKnownProvider (line 179) | function findWellKnownProvider( function guessServerSettings (line 199) | function guessServerSettings(domain: string): ServerSettings { function discoverSettings (line 215) | function discoverSettings(email: string): WellKnownProviderResult | null { function getDefaultSmtpPort (line 231) | function getDefaultSmtpPort(security: SecurityType): number { function getDefaultImapPort (line 245) | function getDefaultImapPort(security: SecurityType): number { FILE: src/services/imap/folderMapper.ts constant SPECIAL_USE_MAP (line 7) | const SPECIAL_USE_MAP: Record = { type FolderLabelMapping (line 55) | interface FolderLabelMapping { function mapFolderToLabel (line 66) | function mapFolderToLabel(folder: ImapFolder): FolderLabelMapping { function getLabelsForMessage (line 100) | function getLabelsForMessage( function syncFoldersToLabels (line 127) | async function syncFoldersToLabels( function getSyncableFolders (line 156) | function getSyncableFolders(folders: ImapFolder[]): ImapFolder[] { FILE: src/services/imap/imapConfigBuilder.ts function mapSecurity (line 8) | function mapSecurity(security: string | null): "tls" | "starttls" | "non... function mapAuthMethod (line 20) | function mapAuthMethod(method: string | null): "password" | "oauth2" { function buildImapConfig (line 32) | function buildImapConfig( function buildSmtpConfig (line 64) | function buildSmtpConfig( FILE: src/services/imap/imapSync.test.ts function setupFolderWithMessages (line 274) | function setupFolderWithMessages(folder: string, messages: ReturnType { constant IMAP_MONTH_NAMES (line 80) | const IMAP_MONTH_NAMES = [ function formatImapDate (line 88) | function formatImapDate(date: Date): string { function computeSinceDate (line 100) | function computeSinceDate(daysBack: number): string { type ImapSyncProgress (line 110) | interface ImapSyncProgress { type ImapSyncProgressCallback (line 117) | type ImapSyncProgressCallback = (progress: ImapSyncProgress) => void; function syntheticMessageId (line 126) | function syntheticMessageId(accountId: string, folder: string, uid: numb... function imapMessageToParsedMessage (line 134) | function imapMessageToParsedMessage( function storeThreadsAndMessages (line 207) | async function storeThreadsAndMessages( function fetchMessagesInBatches (line 355) | async function fetchMessagesInBatches( function imapInitialSync (line 390) | async function imapInitialSync( function imapDeltaSync (line 827) | async function imapDeltaSync(accountId: string, daysBack = 365): Promise... FILE: src/services/imap/messageHelper.ts type ImapMessageInfo (line 4) | interface ImapMessageInfo { function getImapUidsForMessages (line 13) | async function getImapUidsForMessages( function groupMessagesByFolder (line 42) | function groupMessagesByFolder( constant SPECIAL_USE_TO_LABEL_ID (line 60) | const SPECIAL_USE_TO_LABEL_ID: Record = { function findSpecialFolder (line 72) | async function findSpecialFolder( function securityToConfigType (line 108) | function securityToConfigType( function updateMessageImapFolder (line 126) | async function updateMessageImapFolder( FILE: src/services/imap/tauriCommands.ts type ImapConfig (line 5) | interface ImapConfig { type ImapFolder (line 15) | interface ImapFolder { type ImapMessage (line 25) | interface ImapMessage { type ImapAttachment (line 52) | interface ImapAttachment { type ImapFolderStatus (line 61) | interface ImapFolderStatus { type ImapFetchResult (line 69) | interface ImapFetchResult { type ImapFolderSearchResult (line 76) | interface ImapFolderSearchResult { type ImapFolderSyncResult (line 83) | interface ImapFolderSyncResult { type DeltaCheckRequest (line 91) | interface DeltaCheckRequest { type DeltaCheckResult (line 97) | interface DeltaCheckResult { type SmtpConfig (line 106) | interface SmtpConfig { type SmtpSendResult (line 116) | interface SmtpSendResult { function imapTestConnection (line 127) | async function imapTestConnection(config: ImapConfig): Promise { function imapListFolders (line 134) | async function imapListFolders(config: ImapConfig): Promise { function imapFetchMessages (line 142) | async function imapFetchMessages( function imapFetchNewUids (line 153) | async function imapFetchNewUids( function imapSearchAllUids (line 165) | async function imapSearchAllUids( function imapFetchMessageBody (line 175) | async function imapFetchMessageBody( function imapSetFlags (line 188) | async function imapSetFlags( function imapMoveMessages (line 202) | async function imapMoveMessages( function imapDeleteMessages (line 214) | async function imapDeleteMessages( function imapAppendMessage (line 227) | async function imapAppendMessage( function imapGetFolderStatus (line 239) | async function imapGetFolderStatus( function imapFetchAttachment (line 250) | async function imapFetchAttachment( function imapFetchRawMessage (line 263) | async function imapFetchRawMessage( function imapDeltaCheck (line 275) | async function imapDeltaCheck( function imapSyncFolder (line 287) | async function imapSyncFolder( function imapSearchFolder (line 301) | async function imapSearchFolder( function imapRawFetchDiagnostic (line 312) | async function imapRawFetchDiagnostic( function smtpSendEmail (line 326) | async function smtpSendEmail( function smtpTestConnection (line 336) | async function smtpTestConnection(config: SmtpConfig): Promise { function initNotifications (line 38) | async function initNotifications(): Promise { function queueNewEmailNotification (line 112) | function queueNewEmailNotification( function shouldNotifyForMessage (line 153) | function shouldNotifyForMessage( function notifyFollowUpDue (line 169) | function notifyFollowUpDue( function notifySnoozeReturn (line 188) | function notifySnoozeReturn(subject: string): void { FILE: src/services/oauth/oauthFlow.test.ts function makeIdToken (line 128) | function makeIdToken(payload: Record): string { FILE: src/services/oauth/oauthFlow.ts constant OAUTH_CALLBACK_PORT (line 5) | const OAUTH_CALLBACK_PORT = 17248; type OAuthServerResult (line 7) | interface OAuthServerResult { type TokenResponse (line 12) | interface TokenResponse { type ProviderUserInfo (line 21) | interface ProviderUserInfo { function generateCodeVerifier (line 27) | function generateCodeVerifier(): string { function generateCodeChallenge (line 33) | async function generateCodeChallenge(verifier: string): Promise { function base64UrlEncode (line 40) | function base64UrlEncode(bytes: Uint8Array): string { function startProviderOAuthFlow (line 59) | async function startProviderOAuthFlow( function exchangeCode (line 122) | async function exchangeCode( function refreshProviderToken (line 145) | async function refreshProviderToken( function parseIdToken (line 161) | function parseIdToken(idToken: string): Record { function fetchUserInfo (line 168) | async function fetchUserInfo( FILE: src/services/oauth/oauthTokenManager.ts constant REFRESH_BUFFER_MS (line 7) | const REFRESH_BUFFER_MS = 5 * 60 * 1000; function ensureFreshToken (line 17) | async function ensureFreshToken(account: DbAccount): Promise { FILE: src/services/oauth/providers.ts type OAuthProviderConfig (line 1) | interface OAuthProviderConfig { function getOAuthProvider (line 42) | function getOAuthProvider(id: string): OAuthProviderConfig | null { function getAllOAuthProviders (line 46) | function getAllOAuthProviders(): OAuthProviderConfig[] { FILE: src/services/phishing/phishingScanner.ts function scanMessageLinks (line 17) | async function scanMessageLinks( FILE: src/services/queue/queueProcessor.ts constant BATCH_SIZE (line 14) | const BATCH_SIZE = 50; function processQueue (line 18) | async function processQueue(): Promise { function updatePendingCount (line 60) | async function updatePendingCount(): Promise { function startQueueProcessor (line 65) | function startQueueProcessor(): void { function stopQueueProcessor (line 71) | function stopQueueProcessor(): void { function triggerQueueFlush (line 80) | async function triggerQueueFlush(): Promise { FILE: src/services/quickSteps/defaults.ts constant DEFAULT_QUICK_STEPS (line 4) | const DEFAULT_QUICK_STEPS: { function seedDefaultQuickSteps (line 29) | async function seedDefaultQuickSteps( FILE: src/services/quickSteps/executor.ts function executeSingleAction (line 16) | async function executeSingleAction( function executeQuickStep (line 151) | async function executeQuickStep( FILE: src/services/quickSteps/types.ts type QuickStepActionType (line 1) | type QuickStepActionType = type QuickStepAction (line 20) | interface QuickStepAction { type QuickStep (line 30) | interface QuickStep { type QuickStepExecutionResult (line 44) | interface QuickStepExecutionResult { constant ACTION_TYPE_METADATA (line 52) | const ACTION_TYPE_METADATA: { FILE: src/services/search/searchParser.ts type ParsedSearchQuery (line 7) | interface ParsedSearchQuery { constant OPERATOR_REGEX (line 21) | const OPERATOR_REGEX = /(?:^|\s)(from|to|subject|has|is|before|after|lab... function parseDateToTimestamp (line 27) | function parseDateToTimestamp(dateStr: string): number | undefined { function parseSearchQuery (line 40) | function parseSearchQuery(input: string): ParsedSearchQuery { function hasSearchOperators (line 117) | function hasSearchOperators(query: string): boolean { FILE: src/services/search/searchQueryBuilder.ts type BuiltQuery (line 3) | interface BuiltQuery { function buildSearchQuery (line 12) | function buildSearchQuery( FILE: src/services/search/smartFolderQuery.ts function resolveQueryTokens (line 12) | function resolveQueryTokens(query: string): string { function getSmartFolderSearchQuery (line 47) | function getSmartFolderSearchQuery( function getSmartFolderUnreadCount (line 61) | function getSmartFolderUnreadCount( type SmartFolderRow (line 84) | interface SmartFolderRow { function mapSmartFolderRows (line 99) | async function mapSmartFolderRows(rows: SmartFolderRow[]): Promise = {}): ParsedMess... FILE: src/services/smartLabels/smartLabelService.ts type SmartLabelMatch (line 7) | interface SmartLabelMatch { function matchSmartLabels (line 17) | async function matchSmartLabels( FILE: src/services/snooze/scheduledSendManager.ts function checkScheduledEmails (line 13) | async function checkScheduledEmails(): Promise { FILE: src/services/snooze/snoozeManager.ts function checkSnoozedThreads (line 10) | async function checkSnoozedThreads(): Promise { function snoozeThread (line 47) | async function snoozeThread( FILE: src/services/tasks/taskManager.ts type RecurrenceRule (line 3) | interface RecurrenceRule { function parseRecurrenceRule (line 12) | function parseRecurrenceRule(json: string | null): RecurrenceRule | null { function calculateNextOccurrence (line 24) | function calculateNextOccurrence( function handleRecurringTaskCompletion (line 53) | async function handleRecurringTaskCompletion( FILE: src/services/threading/threadBuilder.ts type ThreadableMessage (line 9) | interface ThreadableMessage { type ThreadGroup (line 18) | interface ThreadGroup { type Container (line 28) | interface Container { function normalizeSubject (line 43) | function normalizeSubject(subject: string | null): string { function parseReferences (line 74) | function parseReferences(references: string | null): string[] { function djb2Hash (line 108) | function djb2Hash(str: string): string { function generateThreadId (line 121) | function generateThreadId(rootMessageId: string): string { function createContainer (line 129) | function createContainer(messageId: string): Container { function isAncestor (line 142) | function isAncestor(container: Container, ancestor: Container): boolean { function unlinkFromParent (line 154) | function unlinkFromParent(child: Container): void { function linkParentChild (line 164) | function linkParentChild(parent: Container, child: Container): void { function buildThreads (line 183) | function buildThreads(messages: ThreadableMessage[]): ThreadGroup[] { function collectMessages (line 318) | function collectMessages( function getSubjectForContainer (line 338) | function getSubjectForContainer(container: Container): string | null { function updateThreads (line 352) | function updateThreads( FILE: src/services/unsubscribe/unsubscribeManager.ts type ParsedUnsubscribe (line 7) | interface ParsedUnsubscribe { type SubscriptionEntry (line 13) | interface SubscriptionEntry { function parseUnsubscribeHeaders (line 26) | function parseUnsubscribeHeaders( function executeUnsubscribe (line 47) | async function executeUnsubscribe( function recordUnsubscribeAction (line 129) | async function recordUnsubscribeAction( function getSubscriptions (line 153) | async function getSubscriptions(accountId: string): Promise void; function performCheck (line 15) | async function performCheck(): Promise { constant FOUR_HOURS (line 27) | const FOUR_HOURS = 4 * 60 * 60 * 1000; function startUpdateChecker (line 29) | function startUpdateChecker(): void { function stopUpdateChecker (line 35) | function stopUpdateChecker(): void { function checkForUpdateNow (line 40) | async function checkForUpdateNow(): Promise { function installUpdate (line 45) | async function installUpdate(): Promise { function getAvailableUpdate (line 55) | function getAvailableUpdate(): UpdateInfo | null { function setUpdateCallback (line 59) | function setUpdateCallback(cb: UpdateCallback | null): void { function _resetForTesting (line 64) | function _resetForTesting(): void { FILE: src/stores/accountStore.ts type Account (line 4) | interface Account { type AccountState (line 13) | interface AccountState { FILE: src/stores/composerStore.ts type ComposerMode (line 3) | type ComposerMode = "new" | "reply" | "replyAll" | "forward"; type ComposerViewMode (line 4) | type ComposerViewMode = "modal" | "fullpage"; type ComposerAttachment (line 6) | interface ComposerAttachment { type ComposerState (line 15) | interface ComposerState { FILE: src/stores/contextMenuStore.ts type ContextMenuType (line 3) | type ContextMenuType = "sidebarLabel" | "sidebarNav" | "thread" | "messa... type ContextMenuState (line 5) | interface ContextMenuState { FILE: src/stores/labelStore.ts type Label (line 6) | interface Label { constant SYSTEM_LABEL_IDS (line 17) | const SYSTEM_LABEL_IDS = new Set([ constant CATEGORY_PREFIX (line 30) | const CATEGORY_PREFIX = "CATEGORY_"; function isSystemLabel (line 32) | function isSystemLabel(id: string): boolean { type LabelState (line 36) | interface LabelState { FILE: src/stores/shortcutStore.ts type ShortcutState (line 5) | interface ShortcutState { constant SETTINGS_KEY (line 18) | const SETTINGS_KEY = "custom_shortcuts"; function persistKeyMap (line 20) | function persistKeyMap(customKeys: Record) { FILE: src/stores/smartFolderStore.ts type SmartFolder (line 12) | interface SmartFolder { function mapDbFolder (line 23) | function mapDbFolder(db: DbSmartFolder): SmartFolder { type SmartFolderState (line 36) | interface SmartFolderState { FILE: src/stores/taskStore.test.ts function makeTask (line 4) | function makeTask(overrides: Partial = {}): DbTask { FILE: src/stores/taskStore.ts type TaskGroupBy (line 4) | type TaskGroupBy = "none" | "priority" | "dueDate" | "tag"; type TaskFilterStatus (line 5) | type TaskFilterStatus = "all" | "incomplete" | "completed"; type TaskState (line 7) | interface TaskState { FILE: src/stores/threadStore.ts type Thread (line 3) | interface Thread { type ThreadState (line 20) | interface ThreadState { FILE: src/stores/uiStore.ts type Theme (line 5) | type Theme = "light" | "dark" | "system"; type ReadingPanePosition (line 6) | type ReadingPanePosition = "right" | "bottom" | "hidden"; type ReadFilter (line 7) | type ReadFilter = "all" | "read" | "unread"; type EmailDensity (line 8) | type EmailDensity = "compact" | "default" | "spacious"; type DefaultReplyMode (line 9) | type DefaultReplyMode = "reply" | "replyAll"; type MarkAsReadBehavior (line 10) | type MarkAsReadBehavior = "instant" | "2s" | "manual"; type FontScale (line 11) | type FontScale = "small" | "default" | "large" | "xlarge"; type InboxViewMode (line 12) | type InboxViewMode = "unified" | "split"; type SidebarNavItem (line 14) | interface SidebarNavItem { type UIState (line 19) | interface UIState { FILE: src/test/mocks/db.mock.ts function createMockDb (line 3) | function createMockDb() { FILE: src/test/mocks/entities.mock.ts function createMockParsedMessage (line 15) | function createMockParsedMessage( function createMockGmailMessage (line 46) | function createMockGmailMessage( function createMockGmailAccount (line 92) | function createMockGmailAccount( function createMockImapAccount (line 132) | function createMockImapAccount( function createMockDbAccount (line 172) | function createMockDbAccount( function createMockImapMessage (line 212) | function createMockImapMessage( function createMockImapFolder (line 244) | function createMockImapFolder( function createMockImapConfig (line 260) | function createMockImapConfig( function createMockImapFolderStatus (line 274) | function createMockImapFolderStatus( function createMockImapFetchResult (line 287) | function createMockImapFetchResult( function createMockImapFolderSyncResult (line 300) | function createMockImapFolderSyncResult( function createMockQuickStep (line 314) | function createMockQuickStep( function createMockSendAsAlias (line 333) | function createMockSendAsAlias( FILE: src/test/mocks/services.mock.ts function createMockGmailClient (line 4) | function createMockGmailClient( function createMockEmailProvider (line 30) | function createMockEmailProvider( function createMockAiProvider (line 52) | function createMockAiProvider(response = "ai response") { function createMockFetchResponse (line 62) | function createMockFetchResponse( FILE: src/test/mocks/stores.mock.ts function createMockUIStoreState (line 3) | function createMockUIStoreState(overrides: Record = {}) { function createMockThreadStoreState (line 11) | function createMockThreadStoreState( function createMockAccountStoreState (line 23) | function createMockAccountStoreState( FILE: src/test/mocks/tauri.mock.ts function createMockTauriFs (line 7) | function createMockTauriFs() { function createMockTauriPath (line 30) | function createMockTauriPath() { FILE: src/utils/crypto.ts constant KEY_FILE_NAME (line 9) | const KEY_FILE_NAME = "velo.key"; constant ALGORITHM (line 10) | const ALGORITHM = "AES-GCM"; constant KEY_LENGTH (line 11) | const KEY_LENGTH = 256; constant IV_LENGTH (line 12) | const IV_LENGTH = 12; constant FS_OPTIONS (line 13) | const FS_OPTIONS = { baseDir: BaseDirectory.AppData }; function base64Encode (line 17) | function base64Encode(bytes: Uint8Array): string { function base64Decode (line 25) | function base64Decode(str: string): Uint8Array { function ensureAppDataDir (line 34) | async function ensureAppDataDir(): Promise { function asBufferSource (line 45) | function asBufferSource(arr: Uint8Array): BufferSource { function getOrCreateKey (line 49) | async function getOrCreateKey(): Promise { function encryptValue (line 81) | async function encryptValue(plaintext: string): Promise { function decryptValue (line 103) | async function decryptValue(encrypted: string): Promise { function isEncrypted (line 131) | function isEncrypted(value: string): boolean { FILE: src/utils/date.ts function formatRelativeDate (line 4) | function formatRelativeDate(timestamp: number): string { function formatFullDate (line 49) | function formatFullDate(timestamp: number): string { function isSameDay (line 61) | function isSameDay(a: Date, b: Date): boolean { FILE: src/utils/emailBuilder.test.ts function decodeBase64Url (line 155) | function decodeBase64Url(encoded: string): string { FILE: src/utils/emailBuilder.ts type EmailAttachment (line 4) | interface EmailAttachment { type EmailDraft (line 10) | interface EmailDraft { function base64UrlEncode (line 23) | function base64UrlEncode(str: string): string { function htmlToPlainText (line 35) | function htmlToPlainText(html: string): string { function buildAlternativePart (line 47) | function buildAlternativePart(boundary: string, htmlBody: string): strin... type InlineImage (line 67) | interface InlineImage { function extractInlineImages (line 77) | function extractInlineImages(html: string): { html: string; images: Inli... function generateMessageId (line 93) | function generateMessageId(from: string): string { function buildRawEmail (line 100) | function buildRawEmail(draft: EmailDraft): string { FILE: src/utils/emailUtils.ts function normalizeEmail (line 5) | function normalizeEmail(email: string): string { FILE: src/utils/fileTypeHelpers.ts function formatFileSize (line 1) | function formatFileSize(bytes: number): string { function isImage (line 7) | function isImage(mimeType: string | null): boolean { function isPdf (line 11) | function isPdf(mimeType: string | null, filename?: string | null): boole... function isText (line 17) | function isText(mimeType: string | null): boolean { function canPreview (line 22) | function canPreview(mimeType: string | null, filename: string | null): b... function isDocument (line 26) | function isDocument(mimeType: string | null, filename?: string | null): ... function isSpreadsheet (line 34) | function isSpreadsheet(mimeType: string | null, filename?: string | null... function isArchive (line 42) | function isArchive(mimeType: string | null): boolean { function getFileIcon (line 47) | function getFileIcon(mimeType: string | null): string { FILE: src/utils/fileUtils.test.ts class FailingFileReader (line 40) | class FailingFileReader { method readAsDataURL (line 46) | readAsDataURL() { FILE: src/utils/fileUtils.ts function readFileAsBase64 (line 4) | function readFileAsBase64(file: File): Promise { FILE: src/utils/imageBlocker.ts function stripRemoteImages (line 10) | function stripRemoteImages(html: string): string { function restoreRemoteImages (line 29) | function restoreRemoteImages(html: string): string { function hasBlockedImages (line 39) | function hasBlockedImages(html: string): boolean { FILE: src/utils/imageResize.ts function resizeImageBlob (line 1) | async function resizeImageBlob( FILE: src/utils/mailtoParser.ts type MailtoFields (line 1) | interface MailtoFields { function parseMailtoUrl (line 9) | function parseMailtoUrl(url: string): MailtoFields { FILE: src/utils/networkErrors.ts type ErrorType (line 1) | type ErrorType = "network" | "auth" | "quota" | "server" | "permanent"; type ClassifiedError (line 3) | interface ClassifiedError { constant NETWORK_PATTERNS (line 9) | const NETWORK_PATTERNS = [ constant AUTH_PATTERNS (line 28) | const AUTH_PATTERNS = [ function classifyError (line 36) | function classifyError(error: unknown): ClassifiedError { function formatSyncError (line 87) | function formatSyncError(rawError: string): string { FILE: src/utils/noReply.ts constant NO_REPLY_PATTERNS (line 1) | const NO_REPLY_PATTERNS = [ function isNoReplyAddress (line 12) | function isNoReplyAddress(address: string | null | undefined): boolean { FILE: src/utils/phishingDetector.ts type TriggeredRule (line 10) | interface TriggeredRule { type LinkAnalysis (line 17) | interface LinkAnalysis { type MessageScanResult (line 25) | interface MessageScanResult { constant SUSPICIOUS_TLDS_TIER1 (line 36) | const SUSPICIOUS_TLDS_TIER1 = new Set([ constant SUSPICIOUS_TLDS_TIER2 (line 39) | const SUSPICIOUS_TLDS_TIER2 = new Set([ constant SUSPICIOUS_TLDS_TIER3 (line 42) | const SUSPICIOUS_TLDS_TIER3 = new Set([ constant URL_SHORTENERS (line 46) | const URL_SHORTENERS = new Set([ constant SUSPICIOUS_PATH_KEYWORDS (line 50) | const SUSPICIOUS_PATH_KEYWORDS = [ constant DANGEROUS_PROTOCOLS (line 55) | const DANGEROUS_PROTOCOLS = new Set(["data:", "javascript:", "vbscript:"... constant IMPERSONATED_BRANDS (line 57) | const IMPERSONATED_BRANDS = [ constant MAX_LINKS (line 62) | const MAX_LINKS = 200; function getRiskLevel (line 66) | function getRiskLevel(score: number): "safe" | "low" | "medium" | "high" { function checkIpAddress (line 75) | function checkIpAddress(hostname: string): TriggeredRule | null { function checkHomograph (line 88) | function checkHomograph(hostname: string): TriggeredRule | null { function checkSuspiciousTld (line 102) | function checkSuspiciousTld(hostname: string): TriggeredRule | null { function getRegistrableDomain (line 138) | function getRegistrableDomain(hostname: string): string { function checkDisplayHrefMismatch (line 147) | function checkDisplayHrefMismatch(url: string, displayText: string): Tri... function checkExcessiveSubdomains (line 190) | function checkExcessiveSubdomains(hostname: string): TriggeredRule | null { function checkUrlShortener (line 203) | function checkUrlShortener(hostname: string): TriggeredRule | null { function checkSuspiciousPathKeywords (line 216) | function checkSuspiciousPathKeywords(pathname: string, search: string): ... function checkDangerousProtocol (line 230) | function checkDangerousProtocol(url: string): TriggeredRule | null { function checkUrlObfuscation (line 245) | function checkUrlObfuscation(url: string, _hostname: string): TriggeredR... function checkBrandImpersonation (line 295) | function checkBrandImpersonation(hostname: string, pathname: string): Tr... function analyzeLink (line 326) | function analyzeLink(url: string, displayText: string): LinkAnalysis { function scanLinksInHtml (line 411) | function scanLinksInHtml(html: string): LinkAnalysis[] { type PhishingSensitivity (line 451) | type PhishingSensitivity = "low" | "default" | "high"; constant SENSITIVITY_THRESHOLDS (line 454) | const SENSITIVITY_THRESHOLDS: Record