SYMBOL INDEX (5744 symbols across 1537 files) FILE: Formula/inbox-zero.rb class InboxZero (line 3) | class InboxZero < Formula method install (line 14) | def install method install (line 23) | def install method install (line 34) | def install FILE: apps/web/__tests__/ai-assistant-chat-send-disabled-regression.test.ts constant TIMEOUT (line 11) | const TIMEOUT = 15_000; method NEXT_PUBLIC_EMAIL_SEND_ENABLED (line 64) | get NEXT_PUBLIC_EMAIL_SEND_ENABLED() { function loadAssistantChatModule (line 115) | async function loadAssistantChatModule({ emailSend }: { emailSend: boole... function captureInvocation (line 121) | async function captureInvocation({ FILE: apps/web/__tests__/ai-assistant-chat.test.ts method NEXT_PUBLIC_EMAIL_SEND_ENABLED (line 64) | get NEXT_PUBLIC_EMAIL_SEND_ENABLED() { function loadAssistantChatModule (line 79) | async function loadAssistantChatModule({ emailSend }: { emailSend: boole... function captureToolSet (line 85) | async function captureToolSet( function captureStreamArgs (line 1558) | async function captureStreamArgs(emailSend = true) { FILE: apps/web/__tests__/ai-calendar-availability.test.ts constant TIMEOUT (line 16) | const TIMEOUT = 15_000; type CalendarConnectionWithCalendars (line 21) | type CalendarConnectionWithCalendars = Prisma.CalendarConnectionGetPaylo... function getMockEmailForLLM (line 47) | function getMockEmailForLLM(overrides = {}): EmailForLLM { function getSchedulingMessages (line 59) | function getSchedulingMessages() { function getNonSchedulingMessages (line 78) | function getNonSchedulingMessages() { function getMockCalendarConnections (line 90) | function getMockCalendarConnections(): CalendarConnectionWithCalendars[] { function getMockCalendarConnectionsWithTimezone (line 111) | function getMockCalendarConnectionsWithTimezone( function getMockBusyPeriods (line 134) | function getMockBusyPeriods(): BusyPeriod[] { FILE: apps/web/__tests__/ai-categorize-senders.test.ts constant TIMEOUT (line 11) | const TIMEOUT = 15_000; FILE: apps/web/__tests__/ai-choose-args.test.ts constant TIMEOUT (line 14) | const TIMEOUT = 15_000; function getDraftingEmailAccount (line 18) | function getDraftingEmailAccount() { function getParsedMessage (line 223) | function getParsedMessage({ FILE: apps/web/__tests__/ai-detect-recurring-pattern.test.ts constant TIMEOUT (line 13) | const TIMEOUT = 15_000; method insertToDataset (line 19) | insertToDataset() {} function getRealisticRules (line 33) | function getRealisticRules() { function getNewsletterEmails (line 48) | function getNewsletterEmails(): EmailForLLM[] { function getReceiptEmails (line 69) | function getReceiptEmails(): EmailForLLM[] { function getCalendarEmails (line 89) | function getCalendarEmails(): EmailForLLM[] { function getNeedsReplyEmails (line 107) | function getNeedsReplyEmails(): EmailForLLM[] { function getMixedInconsistentEmails (line 134) | function getMixedInconsistentEmails(): EmailForLLM[] { function getDifferentContentEmails (line 188) | function getDifferentContentEmails(): EmailForLLM[] { FILE: apps/web/__tests__/ai-diff-rules.test.ts constant TIMEOUT (line 7) | const TIMEOUT = 15_000; FILE: apps/web/__tests__/ai-extract-from-email-history.test.ts constant TIMEOUT (line 10) | const TIMEOUT = 15_000; function getMockMessage (line 18) | function getMockMessage(overrides = {}): EmailForLLM { function getTestMessages (line 30) | function getTestMessages(count = 2) { FILE: apps/web/__tests__/ai-extract-knowledge.test.ts constant TIMEOUT (line 7) | const TIMEOUT = 30_000; function getKnowledgeBase (line 17) | function getKnowledgeBase(): Knowledge[] { FILE: apps/web/__tests__/ai-mcp-agent.test.ts constant TIMEOUT (line 17) | const TIMEOUT = 30_000; function getTestEmailAccount (line 29) | function getTestEmailAccount(): EmailAccountWithAI { function getMockHubSpotTools (line 41) | function getMockHubSpotTools() { function getMockNotionTools (line 120) | function getMockNotionTools() { FILE: apps/web/__tests__/ai-meeting-briefing.test.ts constant TIMEOUT (line 21) | const TIMEOUT = 60_000; function getCalendarEvent (line 23) | function getCalendarEvent( function getMeetingBriefingData (line 40) | function getMeetingBriefingData( function prettyPrintBriefing (line 482) | function prettyPrintBriefing(result: BriefingContent, meetingTitle: stri... FILE: apps/web/__tests__/ai-persona.test.ts constant TIMEOUT (line 6) | const TIMEOUT = 30_000; function getEmailAccount (line 22) | function getEmailAccount( function getFounderEmails (line 45) | function getFounderEmails(): EmailForLLM[] { function getSoftwareEngineerEmails (line 74) | function getSoftwareEngineerEmails(): EmailForLLM[] { function getPersonalEmails (line 103) | function getPersonalEmails(): EmailForLLM[] { FILE: apps/web/__tests__/ai-prompt-security.test.ts constant TIMEOUT (line 9) | const TIMEOUT = 30_000; FILE: apps/web/__tests__/ai-prompt-to-rules.test.ts constant TIMEOUT (line 11) | const TIMEOUT = 15_000; FILE: apps/web/__tests__/ai-summarize-email-for-digest.test.ts constant TIMEOUT (line 6) | const TIMEOUT = 15_000; type EmailAccountForDigest (line 8) | type EmailAccountForDigest = EmailAccountWithAI & { name: string | null }; function getEmailAccount (line 16) | function getEmailAccount(overrides = {}): EmailAccountForDigest { function getTestEmail (line 38) | function getTestEmail(overrides = {}): EmailForLLM { FILE: apps/web/__tests__/ai-writing-style.test.ts constant TIMEOUT (line 7) | const TIMEOUT = 15_000; function getTestEmails (line 46) | function getTestEmails() { FILE: apps/web/__tests__/ai/reply/draft-follow-up.test.ts constant TIMEOUT (line 6) | const TIMEOUT = 60_000; constant TEST_TIMEOUT (line 13) | const TEST_TIMEOUT = 15_000; type TestMessage (line 69) | type TestMessage = EmailForLLM & { to: string }; function getMessages (line 71) | function getMessages(count = 1): TestMessage[] { FILE: apps/web/__tests__/ai/reply/draft-reply.test.ts constant TIMEOUT (line 6) | const TIMEOUT = 60_000; constant TEST_TIMEOUT (line 13) | const TEST_TIMEOUT = 15_000; type TestMessage (line 75) | type TestMessage = EmailForLLM & { to: string }; function getMessages (line 77) | function getMessages(count = 1): TestMessage[] { FILE: apps/web/__tests__/ai/reply/reply-context-collector.test.ts constant TEST_TIMEOUT (line 12) | const TEST_TIMEOUT = 60_000; function getParsedMessage (line 788) | function getParsedMessage(overrides: { function getSupportHistoricalMessages (line 819) | function getSupportHistoricalMessages(ownerEmail: string): ParsedMessage... function relevantEmailsToLowerText (line 888) | function relevantEmailsToLowerText( FILE: apps/web/__tests__/determine-thread-status.test.ts constant TIMEOUT (line 14) | const TIMEOUT = 15_000; FILE: apps/web/__tests__/e2e/calendar/google-calendar.test.ts constant RUN_E2E_TESTS (line 22) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_GMAIL_EMAIL (line 23) | const TEST_GMAIL_EMAIL = process.env.TEST_GMAIL_EMAIL; FILE: apps/web/__tests__/e2e/calendar/microsoft-calendar.test.ts constant RUN_E2E_TESTS (line 19) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 20) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; FILE: apps/web/__tests__/e2e/cold-email/google-cold-email.test.ts constant RUN_E2E_TESTS (line 24) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_GMAIL_EMAIL (line 25) | const TEST_GMAIL_EMAIL = process.env.TEST_GMAIL_EMAIL; FILE: apps/web/__tests__/e2e/cold-email/microsoft-cold-email.test.ts constant RUN_E2E_TESTS (line 24) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 25) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; constant PUBLIC_DOMAINS (line 29) | const PUBLIC_DOMAINS = [ FILE: apps/web/__tests__/e2e/drafting/microsoft-drafting.test.ts constant RUN_E2E_TESTS (line 28) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 29) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; constant TEST_CONVERSATION_ID (line 30) | const TEST_CONVERSATION_ID = constant TEST_OUTLOOK_MESSAGE_ID (line 33) | const TEST_OUTLOOK_MESSAGE_ID = process.env.TEST_OUTLOOK_MESSAGE_ID; function loadReplySourceMessage (line 303) | async function loadReplySourceMessage(): Promise { function selectReplySourceMessage (line 328) | async function selectReplySourceMessage({ function pickInboundMessage (line 427) | function pickInboundMessage( function normalizeEmail (line 447) | function normalizeEmail(value?: string): string | null { FILE: apps/web/__tests__/e2e/flows/config.ts constant E2E_GMAIL_EMAIL (line 13) | const E2E_GMAIL_EMAIL = process.env.E2E_GMAIL_EMAIL; constant E2E_OUTLOOK_EMAIL (line 14) | const E2E_OUTLOOK_EMAIL = process.env.E2E_OUTLOOK_EMAIL; constant E2E_RUN_ID (line 17) | const E2E_RUN_ID = function getNextMessageSequence (line 23) | function getNextMessageSequence(): string { constant E2E_WEBHOOK_URL (line 30) | const E2E_WEBHOOK_URL = process.env.E2E_WEBHOOK_URL; constant E2E_AI_MODEL (line 33) | const E2E_AI_MODEL = process.env.E2E_AI_MODEL || "gpt-4o-mini"; constant TIMEOUTS (line 36) | const TIMEOUTS = { function getTestSubjectPrefix (line 50) | function getTestSubjectPrefix(): string { function shouldRunFlowTests (line 55) | function shouldRunFlowTests(): boolean { function validateConfig (line 63) | function validateConfig(): { FILE: apps/web/__tests__/e2e/flows/follow-up-reminders.test.ts function ensureAwaitingReplyLabel (line 50) | async function ensureAwaitingReplyLabel( function createTestThreadTracker (line 70) | async function createTestThreadTracker(options: { function getEmailAccountForProcessing (line 93) | async function getEmailAccountForProcessing(emailAccountId: string) { function configureFollowUpSettings (line 120) | async function configureFollowUpSettings( function cleanupThreadTrackers (line 135) | async function cleanupThreadTrackers(emailAccountId: string, threadId: s... FILE: apps/web/__tests__/e2e/flows/helpers/accounts.ts type TestAccount (line 21) | interface TestAccount { function getGmailTestAccount (line 35) | async function getGmailTestAccount(): Promise { function getOutlookTestAccount (line 90) | async function getOutlookTestAccount(): Promise { function getTestAccounts (line 145) | async function getTestAccounts(): Promise<{ function ensureTestPremium (line 162) | async function ensureTestPremium(userId: string): Promise { function ensureTestRules (line 197) | async function ensureTestRules(emailAccountId: string): Promise { function clearAccountCache (line 235) | function clearAccountCache(): void { function ensureConversationRules (line 247) | async function ensureConversationRules( function disableNonConversationRules (line 310) | async function disableNonConversationRules( function enableAllRules (line 333) | async function enableAllRules(emailAccountId: string): Promise { FILE: apps/web/__tests__/e2e/flows/helpers/email.ts type SendTestEmailOptions (line 10) | interface SendTestEmailOptions { type SendTestEmailResult (line 19) | interface SendTestEmailResult { function sendTestEmail (line 28) | async function sendTestEmail( function sendTestReply (line 81) | async function sendTestReply(options: { function assertEmailLabeled (line 161) | async function assertEmailLabeled(options: { function assertDraftExists (line 196) | async function assertDraftExists(options: { function assertDraftDeleted (line 224) | async function assertDraftDeleted(options: { function assertMessageInThread (line 253) | async function assertMessageInThread(options: { constant TEST_EMAIL_SCENARIOS (line 282) | const TEST_EMAIL_SCENARIOS = { function cleanupTestEmails (line 321) | async function cleanupTestEmails(options: { function findVerifiedSentMessage (line 356) | async function findVerifiedSentMessage(options: { FILE: apps/web/__tests__/e2e/flows/helpers/logging.ts function setTestStartTime (line 12) | function setTestStartTime(): void { function getElapsedTime (line 16) | function getElapsedTime(): string { type WebhookPayload (line 22) | interface WebhookPayload { type ApiCall (line 28) | interface ApiCall { function logWebhook (line 44) | function logWebhook( function logApiCall (line 63) | function logApiCall( function getWebhookLog (line 91) | function getWebhookLog(): WebhookPayload[] { function getApiCallLog (line 98) | function getApiCallLog(): ApiCall[] { function clearLogs (line 105) | function clearLogs(): void { function logStep (line 113) | function logStep(step: string, details?: Record): void { function logAssertion (line 123) | function logAssertion( function logTestSummary (line 136) | function logTestSummary( FILE: apps/web/__tests__/e2e/flows/helpers/polling.ts type PollOptions (line 18) | interface PollOptions { function pollUntil (line 27) | async function pollUntil( constant TERMINAL_STATUSES (line 64) | const TERMINAL_STATUSES = ["APPLIED", "SKIPPED", "ERROR"]; function waitForExecutedRule (line 77) | async function waitForExecutedRule(options: { function waitForDraft (line 171) | async function waitForDraft(options: { function waitForLabel (line 226) | async function waitForLabel(options: { function waitForFollowUpLabel (line 264) | async function waitForFollowUpLabel(options: { function waitForSentMessage (line 300) | async function waitForSentMessage(options: { function waitForMessageInInbox (line 347) | async function waitForMessageInInbox(options: { function waitForReplyInInbox (line 395) | async function waitForReplyInInbox(options: { function waitForDraftDeleted (line 445) | async function waitForDraftDeleted(options: { function waitForNoThreadDrafts (line 479) | async function waitForNoThreadDrafts(options: { function waitForDraftSendLog (line 511) | async function waitForDraftSendLog(options: { function waitForThreadTracker (line 584) | async function waitForThreadTracker(options: { function waitForThreadMessageCount (line 685) | async function waitForThreadMessageCount(options: { FILE: apps/web/__tests__/e2e/flows/helpers/webhook.ts function setupTestWebhookSubscription (line 30) | async function setupTestWebhookSubscription( function teardownTestWebhookSubscription (line 143) | async function teardownTestWebhookSubscription( function verifyWebhookSubscription (line 181) | async function verifyWebhookSubscription( function ensureWebhookSubscription (line 219) | async function ensureWebhookSubscription( FILE: apps/web/__tests__/e2e/flows/setup.ts function initializeFlowTests (line 51) | async function initializeFlowTests(): Promise { function setupFlowTest (line 104) | async function setupFlowTest(): Promise<{ FILE: apps/web/__tests__/e2e/flows/teardown.ts function cleanupFlowTest (line 28) | async function cleanupFlowTest(options: { function teardownFlowTests (line 71) | async function teardownFlowTests(): Promise { function generateTestSummary (line 95) | function generateTestSummary( FILE: apps/web/__tests__/e2e/gmail-operations.test.ts constant RUN_E2E_TESTS (line 30) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_GMAIL_EMAIL (line 31) | const TEST_GMAIL_EMAIL = process.env.TEST_GMAIL_EMAIL; constant TEST_GMAIL_MESSAGE_ID (line 32) | let TEST_GMAIL_MESSAGE_ID = FILE: apps/web/__tests__/e2e/helpers.ts function findOldMessage (line 8) | async function findOldMessage( function ensureTestPremiumAccount (line 50) | async function ensureTestPremiumAccount(userId: string): Promise { function ensureCatchAllTestRule (line 91) | async function ensureCatchAllTestRule( FILE: apps/web/__tests__/e2e/labeling/gmail-thread-label-removal.test.ts constant RUN_E2E_TESTS (line 23) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_GMAIL_EMAIL (line 24) | const TEST_GMAIL_EMAIL = process.env.TEST_GMAIL_EMAIL; FILE: apps/web/__tests__/e2e/labeling/google-labeling.test.ts constant RUN_E2E_TESTS (line 32) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_GMAIL_EMAIL (line 33) | const TEST_GMAIL_EMAIL = process.env.TEST_GMAIL_EMAIL; function getTestMessageId (line 40) | function getTestMessageId(): string { function getTestThreadId (line 47) | function getTestThreadId(): string { FILE: apps/web/__tests__/e2e/labeling/helpers.ts function findThreadWithMultipleMessages (line 8) | async function findThreadWithMultipleMessages( FILE: apps/web/__tests__/e2e/labeling/microsoft-labeling.test.ts constant RUN_E2E_TESTS (line 32) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 33) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; constant TEST_CONVERSATION_ID (line 34) | const TEST_CONVERSATION_ID = constant DEFAULT_TEST_OUTLOOK_MESSAGE_ID (line 37) | const DEFAULT_TEST_OUTLOOK_MESSAGE_ID = constant TEST_OUTLOOK_MESSAGE_ID (line 39) | let TEST_OUTLOOK_MESSAGE_ID = process.env.TEST_OUTLOOK_MESSAGE_ID || ""; FILE: apps/web/__tests__/e2e/labeling/microsoft-thread-category-removal.test.ts constant RUN_E2E_TESTS (line 23) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 24) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; FILE: apps/web/__tests__/e2e/outlook-draft-read-status.test.ts constant RUN_E2E_TESTS (line 20) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 21) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; FILE: apps/web/__tests__/e2e/outlook-operations.test.ts constant RUN_E2E_TESTS (line 34) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 35) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; constant TEST_CONVERSATION_ID (line 36) | const TEST_CONVERSATION_ID = constant TEST_CATEGORY_NAME (line 39) | const TEST_CATEGORY_NAME = process.env.TEST_CATEGORY_NAME || "To Reply"; FILE: apps/web/__tests__/e2e/outlook-query-parsing.test.ts constant RUN_E2E_TESTS (line 23) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 24) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; FILE: apps/web/__tests__/e2e/outlook-search.test.ts constant RUN_E2E_TESTS (line 19) | const RUN_E2E_TESTS = process.env.RUN_E2E_TESTS; constant TEST_OUTLOOK_EMAIL (line 20) | const TEST_OUTLOOK_EMAIL = process.env.TEST_OUTLOOK_EMAIL; FILE: apps/web/__tests__/eval/assistant-chat-attachments.test.ts constant TIMEOUT (line 30) | const TIMEOUT = 120_000; function runAssistantChat (line 279) | async function runAssistantChat({ type SearchInboxInput (line 298) | type SearchInboxInput = { type ReadEmailInput (line 302) | type ReadEmailInput = { type ActivateToolsInput (line 306) | type ActivateToolsInput = { type ReadAttachmentInput (line 310) | type ReadAttachmentInput = { type ScenarioExpectation (line 315) | type ScenarioExpectation = type EvalScenario (line 328) | type EvalScenario = { function isSearchInboxInput (line 336) | function isSearchInboxInput(input: unknown): input is SearchInboxInput { function isReadEmailInput (line 344) | function isReadEmailInput(input: unknown): input is ReadEmailInput { function isActivateToolsInput (line 352) | function isActivateToolsInput(input: unknown): input is ActivateToolsInp... function isReadAttachmentInput (line 357) | function isReadAttachmentInput(input: unknown): input is ReadAttachmentI... function hasToolBeforeTool (line 366) | function hasToolBeforeTool( function hasActivateAttachments (line 378) | function hasActivateAttachments(toolCalls: RecordedToolCall[]) { function evaluateScenario (line 386) | async function evaluateScenario( function summarizeToolCall (line 485) | function summarizeToolCall(toolCall: RecordedToolCall) { function getDefaultLabels (line 511) | function getDefaultLabels() { function getDefaultSearchMessages (line 519) | function getDefaultSearchMessages() { function getMessageById (line 532) | function getMessageById(messageId: string) { FILE: apps/web/__tests__/eval/assistant-chat-calendar.test.ts constant TIMEOUT (line 24) | const TIMEOUT = 60_000; function runAssistantChat (line 203) | async function runAssistantChat({ type ActivateToolsInput (line 222) | type ActivateToolsInput = { type GetCalendarEventsInput (line 226) | type GetCalendarEventsInput = { type ScenarioExpectation (line 231) | type ScenarioExpectation = { type EvalScenario (line 238) | type EvalScenario = { function isActivateToolsInput (line 245) | function isActivateToolsInput(input: unknown): input is ActivateToolsInp... function isGetCalendarEventsInput (line 250) | function isGetCalendarEventsInput( function hasActivateCalendar (line 261) | function hasActivateCalendar(toolCalls: RecordedToolCall[]) { function hasActivateBeforeCalendarQuery (line 269) | function hasActivateBeforeCalendarQuery(toolCalls: RecordedToolCall[]) { function evaluateScenario (line 285) | function evaluateScenario( function summarizeToolCall (line 321) | function summarizeToolCall(toolCall: RecordedToolCall) { FILE: apps/web/__tests__/eval/assistant-chat-core-tools.test.ts constant TIMEOUT (line 26) | const TIMEOUT = 60_000; constant MULTI_STEP_TIMEOUT (line 27) | const MULTI_STEP_TIMEOUT = 120_000; function runAssistantChat (line 683) | async function runAssistantChat({ type SearchInboxInput (line 702) | type SearchInboxInput = { type ReadEmailInput (line 706) | type ReadEmailInput = { type UpdateInboxFeaturesInput (line 710) | type UpdateInboxFeaturesInput = { type UpdateAssistantSettingsInput (line 715) | type UpdateAssistantSettingsInput = { type ManageInboxInput (line 722) | type ManageInboxInput = { type CreateOrGetLabelInput (line 728) | type CreateOrGetLabelInput = { function isSearchInboxInput (line 732) | function isSearchInboxInput(input: unknown): input is SearchInboxInput { function isReadEmailInput (line 740) | function isReadEmailInput(input: unknown): input is ReadEmailInput { function isUpdateInboxFeaturesInput (line 748) | function isUpdateInboxFeaturesInput( function isUpdateAssistantSettingsInput (line 754) | function isUpdateAssistantSettingsInput( function isManageInboxInput (line 764) | function isManageInboxInput(input: unknown): input is ManageInboxInput { function isCreateOrGetLabelInput (line 772) | function isCreateOrGetLabelInput( function summarizeToolCall (line 782) | function summarizeToolCall(toolCall: RecordedToolCall) { function getDefaultLabels (line 803) | function getDefaultLabels() { function getDefaultSearchMessages (line 811) | function getDefaultSearchMessages() { function getMessageById (line 824) | function getMessageById(messageId: string) { FILE: apps/web/__tests__/eval/assistant-chat-email-actions.test.ts constant TIMEOUT (line 30) | const TIMEOUT = 60_000; function runAssistantChat (line 242) | async function runAssistantChat({ type SearchInboxInput (line 261) | type SearchInboxInput = { type SendEmailInput (line 265) | type SendEmailInput = { type ReplyEmailInput (line 271) | type ReplyEmailInput = { type ForwardEmailInput (line 276) | type ForwardEmailInput = { type ScenarioExpectation (line 282) | type ScenarioExpectation = type EvalScenario (line 306) | type EvalScenario = { function isSearchInboxInput (line 314) | function isSearchInboxInput(input: unknown): input is SearchInboxInput { function isSendEmailInput (line 322) | function isSendEmailInput(input: unknown): input is SendEmailInput { function isReplyEmailInput (line 338) | function isReplyEmailInput(input: unknown): input is ReplyEmailInput { function isForwardEmailInput (line 351) | function isForwardEmailInput(input: unknown): input is ForwardEmailInput { function getFirstSearchInboxCall (line 367) | function getFirstSearchInboxCall(toolCalls: RecordedToolCall[]) { function evaluateScenario (line 372) | async function evaluateScenario( function hasToolBeforeTool (line 521) | function hasToolBeforeTool( function hasNoToolCalls (line 536) | function hasNoToolCalls(toolCalls: RecordedToolCall[], toolNames: string... function summarizeToolCall (line 540) | function summarizeToolCall(toolCall: RecordedToolCall) { function getDefaultLabels (line 560) | function getDefaultLabels() { function getDefaultSearchMessages (line 568) | function getDefaultSearchMessages() { function getMessageById (line 581) | function getMessageById(messageId: string) { FILE: apps/web/__tests__/eval/assistant-chat-eval-utils.ts type RecordedToolCall (line 6) | type RecordedToolCall = { function captureAssistantChatToolCalls (line 11) | async function captureAssistantChatToolCalls({ function summarizeRecordedToolCalls (line 45) | function summarizeRecordedToolCalls( function getFirstMatchingToolCall (line 54) | function getFirstMatchingToolCall( function getLastMatchingToolCall (line 73) | function getLastMatchingToolCall( FILE: apps/web/__tests__/eval/assistant-chat-inbox-workflows-test-utils.ts constant TIMEOUT (line 20) | const TIMEOUT = 120_000; function setupInboxWorkflowEval (line 136) | function setupInboxWorkflowEval() { function runAssistantChat (line 202) | async function runAssistantChat({ function getFirstSearchInboxCall (line 224) | function getFirstSearchInboxCall(toolCalls: RecordedToolCall[]) { function isReadEmailInput (line 231) | function isReadEmailInput(input: unknown): input is ReadEmailInput { function isManageInboxThreadActionInput (line 239) | function isManageInboxThreadActionInput( function isBulkArchiveSendersInput (line 256) | function isBulkArchiveSendersInput( function hasNoWriteToolCalls (line 271) | function hasNoWriteToolCalls(toolCalls: RecordedToolCall[]) { function hasUnreadTriageSignal (line 275) | function hasUnreadTriageSignal( function hasReplyTriageFocus (line 292) | function hasReplyTriageFocus( function judgeSearchInboxQuery (line 309) | async function judgeSearchInboxQuery({ function hasSearchBeforeFirstWrite (line 330) | function hasSearchBeforeFirstWrite(toolCalls: RecordedToolCall[]) { function hasSearchBeforeTool (line 344) | function hasSearchBeforeTool( function cloneEmailAccountForProvider (line 360) | function cloneEmailAccountForProvider( function containsForbiddenMicrosoftQueryOperator (line 373) | function containsForbiddenMicrosoftQueryOperator(query: string) { type SearchInboxInput (line 379) | type SearchInboxInput = { type ReadEmailInput (line 385) | type ReadEmailInput = { type ManageInboxThreadActionInput (line 389) | type ManageInboxThreadActionInput = { type BulkArchiveSendersInput (line 394) | type BulkArchiveSendersInput = { function isSearchInboxInput (line 399) | function isSearchInboxInput(input: unknown): input is SearchInboxInput { function summarizeToolCall (line 407) | function summarizeToolCall(toolCall: RecordedToolCall) { function isWriteToolName (line 415) | function isWriteToolName(toolName: string) { function getDefaultLabels (line 419) | function getDefaultLabels() { function getDefaultSearchMessages (line 428) | function getDefaultSearchMessages() { function getMessageById (line 441) | function getMessageById(messageId: string) { FILE: apps/web/__tests__/eval/assistant-chat-label-management.test.ts constant TIMEOUT (line 24) | const TIMEOUT = 60_000; function runAssistantChat (line 362) | async function runAssistantChat({ type CreateOrGetLabelInput (line 381) | type CreateOrGetLabelInput = { type ManageInboxLabelThreadsInput (line 385) | type ManageInboxLabelThreadsInput = { function isListLabelsInput (line 391) | function isListLabelsInput(input: unknown): input is Record; type RuleGroupItem (line 13) | type RuleGroupItem = { type RuleRow (line 19) | type RuleRow = ReturnType[number]; function buildDefaultSystemRuleRows (line 21) | function buildDefaultSystemRuleRows(updatedAt: Date) { function buildDefaultRuleLabels (line 52) | function buildDefaultRuleLabels(ruleRows: RuleRow[]) { function configureRuleMutationMocks (line 63) | function configureRuleMutationMocks({ function configureRuleEvalPrisma (line 80) | function configureRuleEvalPrisma({ function configureRuleEvalProvider (line 127) | function configureRuleEvalProvider({ function senderListMatchesExactly (line 160) | function senderListMatchesExactly( function senderListHasValue (line 174) | function senderListHasValue(senderList: string, expectedSender: string) { function normalizeSender (line 180) | function normalizeSender(value: string) { function splitSenderValues (line 184) | function splitSenderValues(value: string) { FILE: apps/web/__tests__/eval/assistant-chat-settings-memory.test.ts constant TIMEOUT (line 30) | const TIMEOUT = 60_000; function runAssistantChat (line 265) | async function runAssistantChat({ type UpdateAssistantSettingsInput (line 284) | type UpdateAssistantSettingsInput = { type SaveMemoryInput (line 292) | type SaveMemoryInput = { type SearchMemoriesInput (line 296) | type SearchMemoriesInput = { type UpdateAboutInput (line 300) | type UpdateAboutInput = { type ScenarioExpectation (line 305) | type ScenarioExpectation = type EvalScenario (line 331) | type EvalScenario = { function isUpdateAssistantSettingsInput (line 339) | function isUpdateAssistantSettingsInput( function isSaveMemoryInput (line 347) | function isSaveMemoryInput(input: unknown): input is SaveMemoryInput { function isSearchMemoriesInput (line 355) | function isSearchMemoriesInput(input: unknown): input is SearchMemoriesI... function isUpdateAboutInput (line 363) | function isUpdateAboutInput(input: unknown): input is UpdateAboutInput { function evaluateScenario (line 377) | async function evaluateScenario( function hasNoToolCalls (line 507) | function hasNoToolCalls(toolCalls: RecordedToolCall[], toolNames: string... function summarizeToolCall (line 511) | function summarizeToolCall(toolCall: RecordedToolCall) { FILE: apps/web/__tests__/eval/assistant-chat-static-sender-rules-learned-patterns.test.ts constant TIMEOUT (line 28) | const TIMEOUT = 150_000; type UpdateLearnedPatternsInput (line 224) | type UpdateLearnedPatternsInput = { type AssistantChatEvalResult (line 238) | type AssistantChatEvalResult = { function runAssistantChat (line 244) | async function runAssistantChat({ function findUpdateLearnedPatternsCall (line 275) | function findUpdateLearnedPatternsCall( function findMatchingLearnedPatternsUpdate (line 291) | function findMatchingLearnedPatternsUpdate( function isUpdateLearnedPatternsInput (line 316) | function isUpdateLearnedPatternsInput( function summarizeToolCalls (line 331) | function summarizeToolCalls(toolCalls: RecordedToolCall[]) { function summarizeUpdateLearnedPatternsCall (line 336) | function summarizeUpdateLearnedPatternsCall( function hasIncludedFrom (line 349) | function hasIncludedFrom( function hasExcludedFrom (line 360) | function hasExcludedFrom( FILE: apps/web/__tests__/eval/assistant-chat-static-sender-rules-semantic.test.ts constant TIMEOUT (line 33) | const TIMEOUT = 150_000; type ScenarioExpectation (line 237) | type ScenarioExpectation = type CreateRuleInput (line 248) | type CreateRuleInput = { type AssistantChatEvalResult (line 266) | type AssistantChatEvalResult = { function runAssistantChat (line 271) | async function runAssistantChat({ function evaluateScenario (line 293) | async function evaluateScenario( function getLastCreateRuleCall (line 310) | function getLastCreateRuleCall(toolCalls: RecordedToolCall[]) { function isCreateRuleInput (line 321) | function isCreateRuleInput(input: unknown): input is CreateRuleInput { function usesAiInstructionsOnly (line 338) | function usesAiInstructionsOnly( function usesStaticFromAndInstructions (line 349) | function usesStaticFromAndInstructions( function summarizeCreateRuleCall (line 364) | function summarizeCreateRuleCall(createCall: CreateRuleInput) { function summarizeToolCalls (line 372) | function summarizeToolCalls(toolCalls: RecordedToolCall[]) { function truncate (line 377) | function truncate(value: string | null | undefined, maxLength = 120) { function judgeAiInstructions (line 382) | async function judgeAiInstructions( FILE: apps/web/__tests__/eval/assistant-chat-static-sender-rules-static-from.test.ts constant TIMEOUT (line 29) | const TIMEOUT = 150_000; type CreateRuleInput (line 192) | type CreateRuleInput = { type AssistantChatEvalResult (line 210) | type AssistantChatEvalResult = { function runAssistantChat (line 215) | async function runAssistantChat({ function getLastCreateRuleCall (line 237) | function getLastCreateRuleCall(toolCalls: RecordedToolCall[]) { function isCreateRuleInput (line 248) | function isCreateRuleInput(input: unknown): input is CreateRuleInput { function usesStaticFromOnlyForSenders (line 265) | function usesStaticFromOnlyForSenders( function usesStaticFromForSenders (line 275) | function usesStaticFromForSenders( function summarizeCreateRuleCall (line 287) | function summarizeCreateRuleCall(createCall: CreateRuleInput) { function summarizeToolCalls (line 295) | function summarizeToolCalls(toolCalls: RecordedToolCall[]) { function truncate (line 300) | function truncate(value: string | null | undefined, maxLength = 120) { function hasEmptyAiInstructions (line 305) | function hasEmptyAiInstructions(text: string | null | undefined) { FILE: apps/web/__tests__/eval/assistant-chat-trash-delete.test.ts constant TIMEOUT (line 29) | const TIMEOUT = 60_000; function runAssistantChat (line 312) | async function runAssistantChat({ type ManageInboxInput (line 331) | type ManageInboxInput = { type ScenarioExpectation (line 340) | type ScenarioExpectation = type EvalScenario (line 353) | type EvalScenario = { function isManageInboxInput (line 362) | function isManageInboxInput(input: unknown): input is ManageInboxInput { function evaluateScenario (line 370) | async function evaluateScenario( function summarizeToolCall (line 462) | function summarizeToolCall(toolCall: RecordedToolCall) { function getDefaultLabels (line 485) | function getDefaultLabels() { function getDefaultSearchMessages (line 493) | function getDefaultSearchMessages() { function getMessageById (line 506) | function getMessageById(messageId: string) { FILE: apps/web/__tests__/eval/categorize-senders.test.ts constant TIMEOUT (line 16) | const TIMEOUT = 60_000; function getCategories (line 400) | function getCategories() { FILE: apps/web/__tests__/eval/choose-rule.test.ts constant TIMEOUT (line 19) | const TIMEOUT = 60_000; FILE: apps/web/__tests__/eval/draft-attachments.test.ts constant TIMEOUT (line 32) | const TIMEOUT = 60_000; type AttachmentSourceRow (line 37) | type AttachmentSourceRow = Prisma.AttachmentSourceGetPayload<{ function getAttachmentSources (line 171) | function getAttachmentSources( function getAttachmentDocument (line 210) | function getAttachmentDocument({ FILE: apps/web/__tests__/eval/draft-reply.test.ts constant TIMEOUT (line 19) | const TIMEOUT = 90_000; function getKnowledgeBaseReplyCriteria (line 466) | function getKnowledgeBaseReplyCriteria() { function formatDraftEvalActual (line 486) | function formatDraftEvalActual( function maybeJudgeGroundedReply (line 507) | async function maybeJudgeGroundedReply({ FILE: apps/web/__tests__/eval/judge.ts type JudgeCriterion (line 6) | interface JudgeCriterion { type JudgeResult (line 11) | interface JudgeResult { function judgeBinary (line 29) | async function judgeBinary(options: { function judgeMultiple (line 80) | async function judgeMultiple(options: { constant CRITERIA (line 93) | const CRITERIA = { function buildJudgePrompt (line 125) | function buildJudgePrompt(options: { FILE: apps/web/__tests__/eval/models.ts type EvalModel (line 6) | interface EvalModel { constant EVAL_MODEL_CATALOG (line 12) | const EVAL_MODEL_CATALOG: Record = { function getEvalModels (line 49) | function getEvalModels(): EvalModel[] { function getEmailAccountForModel (line 78) | function getEmailAccountForModel( function shouldRunEvalTests (line 92) | function shouldRunEvalTests(): boolean { function describeEvalMatrix (line 123) | function describeEvalMatrix( function getApiKeyForProvider (line 145) | function getApiKeyForProvider(provider: string): string | null { function hasConfiguredProvider (line 156) | function hasConfiguredProvider(provider: string): boolean { function hasAnyConfiguredProvider (line 192) | function hasAnyConfiguredProvider(): boolean { FILE: apps/web/__tests__/eval/reply-memory.test.ts constant TIMEOUT (line 23) | const TIMEOUT = 180_000; function summarizeMemories (line 261) | function summarizeMemories( function buildJudgeInput (line 280) | function buildJudgeInput({ function buildDraftComparisonInput (line 301) | function buildDraftComparisonInput({ function formatJudgeActual (line 322) | function formatJudgeActual( function formatDraftComparisonActual (line 329) | function formatDraftComparisonActual({ FILE: apps/web/__tests__/eval/reporter.ts type EvalRecord (line 5) | interface EvalRecord { class EvalReporter (line 20) | class EvalReporter { method record (line 23) | record(result: EvalRecord): void { method printReport (line 27) | printReport(): void { method writeReport (line 36) | private writeReport(filePath: string): void { method generateConsoleReport (line 47) | private generateConsoleReport(): string { method generateSingleModelConsole (line 57) | private generateSingleModelConsole(model: string, tests: string[]): st... method generateComparisonConsole (line 82) | private generateComparisonConsole(models: string[], tests: string[]): ... method generateMarkdown (line 126) | private generateMarkdown(): string { method generateSingleModelMarkdown (line 136) | private generateSingleModelMarkdown(model: string, tests: string[]): s... method generateComparisonMarkdown (line 161) | private generateComparisonMarkdown( function createEvalReporter (line 197) | function createEvalReporter(): EvalReporter { FILE: apps/web/__tests__/eval/semantic-judge.ts function judgeEvalOutput (line 7) | async function judgeEvalOutput({ function formatSemanticJudgeActual (line 27) | function formatSemanticJudgeActual( function getEvalJudgeUserAi (line 37) | function getEvalJudgeUserAi() { FILE: apps/web/__tests__/helpers.ts type EmailAccountSelect (line 8) | type EmailAccountSelect = { type UserSelect (line 16) | type UserSelect = { type AccountWithEmailAccount (line 22) | type AccountWithEmailAccount = { function getEmailAccount (line 28) | function getEmailAccount( function generateSequentialDates (line 57) | function generateSequentialDates( function getEmail (line 69) | function getEmail({ function getMockEmailProvider (line 92) | function getMockEmailProvider({ function getRule (line 110) | function getRule( function getAction (line 139) | function getAction(overrides: Partial = {}): Action { function getMockMessage (line 161) | function getMockMessage({ function getMockExecutedRule (line 207) | function getMockExecutedRule({ function getMockEmailAccountSelect (line 236) | function getMockEmailAccountSelect( function getMockUserSelect (line 248) | function getMockUserSelect( function getMockAccountWithEmailAccount (line 258) | function getMockAccountWithEmailAccount( function getMockEmailAccountWithAccount (line 271) | function getMockEmailAccountWithAccount({ function getCalendarConnection (line 289) | function getCalendarConnection({ FILE: apps/web/__tests__/mocks/email-provider.mock.ts function getMockParsedMessage (line 8) | function getMockParsedMessage( function createMockEmailProvider (line 40) | function createMockEmailProvider( FILE: apps/web/__tests__/playwright/local-bypass-smoke.spec.ts function getEmailAccountId (line 49) | async function getEmailAccountId(page: Page) { function completeOnboardingFlow (line 68) | async function completeOnboardingFlow(page: Page) { function clickIfVisible (line 145) | async function clickIfVisible(page: Page, locator: Locator, timeout: num... function waitForVisible (line 159) | async function waitForVisible(locator: Locator, timeout: number) { function waitForOnboardingUpdate (line 168) | async function waitForOnboardingUpdate( function isOnboardingPage (line 182) | function isOnboardingPage(url: string) { function isOnboardingPath (line 186) | function isOnboardingPath(pathname: string) { function isInterruptedNavigationError (line 190) | function isInterruptedNavigationError(error: unknown) { FILE: apps/web/__tests__/setup.ts function setRequiredTestEnv (line 22) | function setRequiredTestEnv() { function setEnvDefault (line 38) | function setEnvDefault(key: string, value: string) { FILE: apps/web/app/(app)/(redirects)/assistant/page.tsx function AssistantPage (line 3) | async function AssistantPage({ FILE: apps/web/app/(app)/(redirects)/automation/page.tsx function AutomationPage (line 3) | async function AutomationPage({ FILE: apps/web/app/(app)/(redirects)/briefs/page.tsx function BriefsPage (line 3) | async function BriefsPage({ FILE: apps/web/app/(app)/(redirects)/bulk-archive/page.tsx function BulkArchivePage (line 3) | async function BulkArchivePage({ FILE: apps/web/app/(app)/(redirects)/bulk-unsubscribe/page.tsx function BulkUnsubscribePage (line 3) | async function BulkUnsubscribePage({ FILE: apps/web/app/(app)/(redirects)/calendars/page.tsx function CalendarsPage (line 3) | async function CalendarsPage({ FILE: apps/web/app/(app)/(redirects)/clean/page.tsx function CleanPage (line 3) | async function CleanPage({ FILE: apps/web/app/(app)/(redirects)/cold-email-blocker/page.tsx function ColdEmailBlockerPage (line 3) | async function ColdEmailBlockerPage({ FILE: apps/web/app/(app)/(redirects)/debug/page.tsx function DebugPage (line 3) | async function DebugPage({ FILE: apps/web/app/(app)/(redirects)/drive/page.tsx function DrivePage (line 3) | async function DrivePage({ FILE: apps/web/app/(app)/(redirects)/integrations/page.tsx function IntegrationsPage (line 3) | async function IntegrationsPage({ FILE: apps/web/app/(app)/(redirects)/mail/page.tsx function MailPage (line 3) | async function MailPage({ FILE: apps/web/app/(app)/(redirects)/quick-bulk-archive/page.tsx function QuickBulkArchivePage (line 3) | async function QuickBulkArchivePage({ FILE: apps/web/app/(app)/(redirects)/reply-zero/page.tsx function ReplyZeroPage (line 3) | async function ReplyZeroPage({ FILE: apps/web/app/(app)/(redirects)/setup/page.tsx function SetupPage (line 3) | async function SetupPage({ FILE: apps/web/app/(app)/(redirects)/smart-categories/page.tsx function SmartCategoriesPage (line 3) | async function SmartCategoriesPage({ FILE: apps/web/app/(app)/(redirects)/stats/page.tsx function StatsPage (line 3) | async function StatsPage({ FILE: apps/web/app/(app)/ErrorMessages.tsx function ErrorMessages (line 7) | async function ErrorMessages() { FILE: apps/web/app/(app)/ProviderRateLimitBanner.tsx function ProviderRateLimitBanner (line 7) | function ProviderRateLimitBanner() { FILE: apps/web/app/(app)/[emailAccountId]/PermissionsCheck.tsx function PermissionsCheck (line 12) | function PermissionsCheck() { FILE: apps/web/app/(app)/[emailAccountId]/assess.tsx function AssessUser (line 13) | function AssessUser() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/AIChatButton.tsx function AIChatButton (line 7) | function AIChatButton() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/ActionAttachmentsField.tsx function ActionAttachmentsField (line 48) | function ActionAttachmentsField({ function AttachmentPicker (line 261) | function AttachmentPicker({ function AttachmentSourceNode (line 320) | function AttachmentSourceNode({ function SourceList (line 426) | function SourceList({ function toAttachmentSource (line 470) | function toAttachmentSource( function getSourceKey (line 486) | function getSourceKey(source: AttachmentSourceInput) { function getTreeNodeId (line 490) | function getTreeNodeId(item: DriveSourceItem) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/ActionSteps.tsx function ActionSteps (line 51) | function ActionSteps({ function ActionCard (line 120) | function ActionCard({ function VariableExamplesDialog (line 671) | function VariableExamplesDialog() { function VariableProTip (line 714) | function VariableProTip() { function DelayInputControls (line 727) | function DelayInputControls({ function renderFieldRows (line 797) | function renderFieldRows( function getDisplayValueAndUnit (line 839) | function getDisplayValueAndUnit(minutes: number | null | undefined) { function convertToMinutes (line 854) | function convertToMinutes(value: string, unit: string) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/ActionSummaryCard.tsx function ActionSummaryCard (line 14) | function ActionSummaryCard({ function EmailField (line 236) | function EmailField({ function OptionalEmailFields (line 253) | function OptionalEmailFields({ function formatDelay (line 270) | function formatDelay(delayInMinutes: number | null | undefined): string { FILE: apps/web/app/(app)/[emailAccountId]/assistant/AddRuleDialog.tsx function AddRuleDialog (line 6) | function AddRuleDialog() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/AllRulesDisabledBanner.tsx function AllRulesDisabledBanner (line 15) | function AllRulesDisabledBanner() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/AssistantOnboarding.tsx function AssistantOnboarding (line 17) | function AssistantOnboarding({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/AssistantTabs.tsx function AssistantTabs (line 16) | function AssistantTabs() { function CloseArtifactButton (line 64) | function CloseArtifactButton() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/AvailableActionsPanel.tsx function AvailableActionsPanel (line 34) | function AvailableActionsPanel() { function ActionSection (line 50) | function ActionSection({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/BulkProcessActivityLog.tsx type ActivityLogEntry (line 10) | type ActivityLogEntry = { function ActivityLog (line 18) | function ActivityLog({ function ActivityLogRow (line 60) | function ActivityLogRow({ type InternalActivityLogEntry (line 107) | type InternalActivityLogEntry = { function BulkProcessActivityLog (line 117) | function BulkProcessActivityLog({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/BulkRunRules.tsx function BulkRunRules (line 44) | function BulkRunRules() { function onRun (line 283) | async function onRun( FILE: apps/web/app/(app)/[emailAccountId]/assistant/ConditionSteps.tsx type UIConditionType (line 33) | type UIConditionType = "from" | "to" | "subject" | "prompt"; constant CONDITION_TYPE_OPTIONS (line 35) | const CONDITION_TYPE_OPTIONS: { label: string; value: UIConditionType }[... constant MAX_CONDITIONS (line 41) | const MAX_CONDITIONS = CONDITION_TYPE_OPTIONS.length; function getUIConditionType (line 44) | function getUIConditionType( function allowMultipleConditions (line 62) | function allowMultipleConditions(systemType: SystemType | null | undefin... function getConditionFromUIType (line 70) | function getConditionFromUIType( function ConditionSteps (line 128) | function ConditionSteps({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/ConditionSummaryCard.tsx function ConditionSummaryCard (line 6) | function ConditionSummaryCard({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/CreatedRulesModal.tsx function CreatedRulesModal (line 24) | function CreatedRulesModal({ function CreatedRulesContent (line 42) | function CreatedRulesContent({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/DateCell.tsx function DateCell (line 4) | function DateCell({ createdAt }: { createdAt: Date }) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/ExamplesList.tsx function PureExamples (line 13) | function PureExamples({ function PureExamplesGrid (line 68) | function PureExamplesGrid({ function getActionType (line 114) | function getActionType(example: string): ActionType | null { function getIconColorClass (line 142) | function getIconColorClass(color: Color): string { FILE: apps/web/app/(app)/[emailAccountId]/assistant/FixWithChat.tsx function FixWithChat (line 32) | function FixWithChat({ function RuleMismatch (line 216) | function RuleMismatch({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/History.tsx function History (line 37) | function History() { function HistoryTable (line 84) | function HistoryTable({ function EmailCell (line 148) | function EmailCell({ function RuleCell (line 210) | function RuleCell({ function OpenInGmailButton (line 243) | function OpenInGmailButton({ function mapMessagesById (line 269) | function mapMessagesById(messages: ParsedMessage[]) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/PersonaDialog.tsx function PersonaDialog (line 7) | function PersonaDialog({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/Process.tsx function Process (line 8) | function Process() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/ProcessRules.tsx type Message (line 38) | type Message = MessagesResponse["messages"][number]; function ProcessRulesContent (line 40) | function ProcessRulesContent({ testMode }: { testMode: boolean }) { function ProcessRulesRow (line 331) | function ProcessRulesRow({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/ProcessingPromptFileDialog.tsx type StepProps (line 15) | type StepProps = { type StepContentProps (line 20) | type StepContentProps = StepProps & { constant STEPS (line 25) | const STEPS = 5; function ProcessingPromptFileDialog (line 27) | function ProcessingPromptFileDialog({ function StepNavigation (line 79) | function StepNavigation({ back, next }: StepProps) { function Step (line 92) | function Step({ back, next, title, children }: StepContentProps) { function IntroStep (line 108) | function IntroStep({ next }: StepProps) { function Step1 (line 125) | function Step1({ back, next }: StepProps) { function Step2 (line 146) | function Step2({ back, next }: StepProps) { function Step3 (line 161) | function Step3({ back, next }: StepProps) { function Step4 (line 180) | function Step4({ back, next }: StepProps) { function FinalStepWaiting (line 199) | function FinalStepWaiting({ back }: StepProps) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/ResultDisplay.tsx function ResultsDisplay (line 20) | function ResultsDisplay({ function ResultDisplay (line 63) | function ResultDisplay({ function ResultDisplayContent (line 94) | function ResultDisplayContent({ result }: { result: RunRulesResult }) { function Actions (line 170) | function Actions({ function PrettyConditions (line 233) | function PrettyConditions({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleDialog.tsx type RuleDialogProps (line 18) | interface RuleDialogProps { function useRuleDialog (line 28) | function useRuleDialog() { function RuleDialog (line 45) | function RuleDialog({ function transformRuleForDuplication (line 118) | function transformRuleForDuplication( FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleForm.tsx function Rule (line 57) | function Rule({ function RuleForm (line 73) | function RuleForm({ function ThreadsExplanation (line 665) | function ThreadsExplanation({ size }: { size: "sm" | "md" }) { function allowMultipleConditions (line 675) | function allowMultipleConditions(systemType: SystemType | null | undefin... FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleLoader.tsx function RuleLoader (line 9) | function RuleLoader({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleNotFoundState.tsx function RuleNotFoundState (line 10) | function RuleNotFoundState() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleSectionCard.tsx function RuleSectionCard (line 5) | function RuleSectionCard({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleStep.tsx function DeleteButton (line 17) | function DeleteButton({ function OptionsMenu (line 37) | function OptionsMenu({ function ActionButtons (line 122) | function ActionButtons({ function CardLayout (line 165) | function CardLayout({ children }: { children: React.ReactNode }) { function CardLayoutRight (line 169) | function CardLayoutRight({ function RuleStep (line 181) | function RuleStep({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleSteps.tsx function RuleSteps (line 7) | function RuleSteps({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/RuleTab.tsx function RuleTab (line 7) | function RuleTab() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/Rules.tsx function Rules (line 65) | function Rules({ function ActionBadges (line 377) | function ActionBadges({ function NoRules (line 414) | function NoRules() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/RulesPromptNew.tsx function RulesPrompt (line 31) | function RulesPrompt() { function RulesPromptForm (line 65) | function RulesPromptForm({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/RulesSelect.tsx function RulesSelect (line 15) | function RulesSelect() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/RulesTabNew.tsx function RulesTab (line 6) | function RulesTab() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/SetDateDropdown.tsx function SetDateDropdown (line 14) | function SetDateDropdown({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/bulk-run-rules-reducer.test.ts function createMockThread (line 11) | function createMockThread(id: string): ThreadsResponse["threads"][number] { FILE: apps/web/app/(app)/[emailAccountId]/assistant/bulk-run-rules-reducer.ts type Thread (line 3) | type Thread = ThreadsResponse["threads"][number]; type ProcessingStatus (line 5) | type ProcessingStatus = "idle" | "processing" | "paused" | "stopped"; type BulkRunState (line 7) | type BulkRunState = { type BulkRunAction (line 17) | type BulkRunAction = function bulkRunReducer (line 34) | function bulkRunReducer( function getProgressMessage (line 110) | function getProgressMessage( FILE: apps/web/app/(app)/[emailAccountId]/assistant/constants.ts constant ACTION_TYPE_TEXT_COLORS (line 17) | const ACTION_TYPE_TEXT_COLORS = { constant ACTION_TYPE_ICONS (line 32) | const ACTION_TYPE_ICONS = { FILE: apps/web/app/(app)/[emailAccountId]/assistant/consts.ts constant NONE_RULE_ID (line 1) | const NONE_RULE_ID = "__NONE__"; constant NEW_RULE_ID (line 2) | const NEW_RULE_ID = "__NEW__"; FILE: apps/web/app/(app)/[emailAccountId]/assistant/examples.ts type Personas (line 4) | type Personas = ReturnType; function hasExampleParams (line 9) | function hasExampleParams(rule: { function formatPromptArray (line 25) | function formatPromptArray(promptArray: string[]): string { function processPromptsWithTerminology (line 29) | function processPromptsWithTerminology( function getExamplePrompts (line 71) | function getExamplePrompts( function getPersonas (line 92) | function getPersonas(provider: string) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/group/LearnedPatterns.tsx function LearnedPatternsDialog (line 22) | function LearnedPatternsDialog({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/group/ViewLearnedPatterns.tsx function ViewLearnedPatterns (line 49) | function ViewLearnedPatterns({ groupId }: { groupId: string }) { function ViewGroupInner (line 57) | function ViewGroupInner({ groupId }: { groupId: string }) { function GroupItems (line 226) | function GroupItems({ function GroupItemList (line 264) | function GroupItemList({ function GroupItemDisplay (line 352) | function GroupItemDisplay({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/knowledge/KnowledgeBase.tsx function KnowledgeBase (line 39) | function KnowledgeBase() { function KnowledgeTableRow (line 125) | function KnowledgeTableRow({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/knowledge/KnowledgeForm.tsx function KnowledgeForm (line 33) | function KnowledgeForm({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/page.tsx function AssistantPage (line 14) | async function AssistantPage({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/rule-fetch-error.ts constant RULE_NOT_FOUND_ERROR (line 1) | const RULE_NOT_FOUND_ERROR = "Rule not found"; function isMissingRuleError (line 3) | function isMissingRuleError( FILE: apps/web/app/(app)/[emailAccountId]/assistant/rule/[ruleId]/error.tsx function ErrorBoundary (line 7) | function ErrorBoundary({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/rule/[ruleId]/page.tsx function RulePage (line 4) | async function RulePage(props: { FILE: apps/web/app/(app)/[emailAccountId]/assistant/rule/create/page.tsx function CreateRulePage (line 6) | async function CreateRulePage(props: { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/AboutSetting.tsx function AboutSetting (line 16) | function AboutSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/DigestSetting.tsx function DigestSetting (line 23) | function DigestSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/DraftConfidenceSetting.tsx function DraftConfidenceSetting (line 26) | function DraftConfidenceSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/DraftKnowledgeSetting.tsx function DraftKnowledgeSetting (line 17) | function DraftKnowledgeSetting() { function KnowledgeDialog (line 41) | function KnowledgeDialog({ enabled }: { enabled: boolean }) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/DraftReplies.tsx function DraftReplies (line 14) | function DraftReplies() { function useDraftReplies (line 51) | function useDraftReplies() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/FollowUpRemindersSetting.tsx function FollowUpRemindersSetting (line 41) | function FollowUpRemindersSetting() { function FollowUpRemindersSettingContent (line 49) | function FollowUpRemindersSettingContent() { function FollowUpSettingsDialog (line 128) | function FollowUpSettingsDialog({ function showScanCompleteToast (line 300) | function showScanCompleteToast( FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/HiddenAiDraftLinksSetting.tsx function HiddenAiDraftLinksSetting (line 14) | function HiddenAiDraftLinksSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/LearnedPatternsSetting.tsx function LearnedPatternsSetting (line 20) | function LearnedPatternsSetting() { function Content (line 52) | function Content() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/MultiRuleSetting.tsx function MultiRuleSetting (line 13) | function MultiRuleSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/PersonalSignatureSetting.tsx function PersonalSignatureSetting (line 35) | function PersonalSignatureSetting() { function SignatureDialog (line 59) | function SignatureDialog({ function SignaturePreview (line 232) | function SignaturePreview({ signature }: { signature: string }) { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/ProactiveUpdatesSetting.tsx function ProactiveUpdatesSetting (line 46) | function ProactiveUpdatesSetting({ function formatMessagingChannelLabel (line 363) | function formatMessagingChannelLabel(channel: { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/ReferralSignatureSetting.tsx function ReferralSignatureSetting (line 17) | function ReferralSignatureSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/RuleImportExportSetting.tsx function RuleImportExportSetting (line 19) | function RuleImportExportSetting({ FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/SettingsTab.tsx function SettingsTab (line 19) | function SettingsTab() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/SyncToExtensionSetting.tsx type SyncResponse (line 25) | interface SyncResponse { type Window (line 32) | interface Window { function sendMessageToExtension (line 46) | function sendMessageToExtension(message: { constant EXTENSION_ID (line 74) | const EXTENSION_ID = env.NEXT_PUBLIC_TABS_EXTENSION_ID; function SyncToExtensionSetting (line 76) | function SyncToExtensionSetting() { FILE: apps/web/app/(app)/[emailAccountId]/assistant/settings/WritingStyleSetting.tsx function WritingStyleSetting (line 30) | function WritingStyleSetting() { function WritingStyleDialog (line 56) | function WritingStyleDialog({ FILE: apps/web/app/(app)/[emailAccountId]/automation/page.tsx function AutomationPage (line 52) | async function AutomationPage({ FILE: apps/web/app/(app)/[emailAccountId]/briefs/DeliveryChannelsSetting.tsx constant PROVIDER_CONFIG (line 41) | const PROVIDER_CONFIG: Record< function DeliveryChannelsSetting (line 68) | function DeliveryChannelsSetting() { function ChannelRow (line 152) | function ChannelRow({ FILE: apps/web/app/(app)/[emailAccountId]/briefs/IntegrationsSetting.tsx function IntegrationsSetting (line 10) | function IntegrationsSetting() { FILE: apps/web/app/(app)/[emailAccountId]/briefs/Onboarding.tsx function BriefsOnboarding (line 27) | function BriefsOnboarding({ FILE: apps/web/app/(app)/[emailAccountId]/briefs/TimeDurationSetting.tsx type Unit (line 25) | type Unit = "minutes" | "hours"; function minutesToValueAndUnit (line 27) | function minutesToValueAndUnit(totalMinutes: number): { function valueAndUnitToMinutes (line 37) | function valueAndUnitToMinutes(value: number, unit: Unit): number { function TimeDurationSetting (line 41) | function TimeDurationSetting({ FILE: apps/web/app/(app)/[emailAccountId]/briefs/UpcomingMeetings.tsx function UpcomingMeetings (line 38) | function UpcomingMeetings({ function SendHistoryLink (line 141) | function SendHistoryLink() { FILE: apps/web/app/(app)/[emailAccountId]/briefs/page.tsx function MeetingBriefsPage (line 21) | function MeetingBriefsPage() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-archive/AutoCategorizationSetup.tsx function AutoCategorizationSetup (line 32) | function AutoCategorizationSetup({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-archive/BulkArchive.tsx function BulkArchive (line 21) | function BulkArchive() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-archive/BulkArchiveProgress.tsx function BulkArchiveProgress (line 10) | function BulkArchiveProgress({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-archive/BulkArchiveSettingsModal.tsx type BulkActionType (line 20) | type BulkActionType = "archive" | "markRead"; type BulkArchiveSettingsModalProps (line 22) | interface BulkArchiveSettingsModalProps { function BulkArchiveSettingsModal (line 27) | function BulkArchiveSettingsModal({ function getActionLabels (line 81) | function getActionLabels(action: BulkActionType) { FILE: apps/web/app/(app)/[emailAccountId]/bulk-archive/page.tsx function BulkArchivePage (line 4) | function BulkArchivePage() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/BulkActions.tsx type Newsletter (line 40) | type Newsletter = NewsletterStatsResponse["newsletters"][number]; function ActionButton (line 42) | function ActionButton({ function BulkActions (line 79) | function BulkActions({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/BulkUnsubscribeDesktop.tsx function BulkUnsubscribeDesktop (line 21) | function BulkUnsubscribeDesktop({ function BulkUnsubscribeRowDesktop (line 82) | function BulkUnsubscribeRowDesktop({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/BulkUnsubscribeMobile.tsx function BulkUnsubscribeMobile (line 34) | function BulkUnsubscribeMobile({ function BulkUnsubscribeRowMobile (line 42) | function BulkUnsubscribeRowMobile({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/BulkUnsubscribeSection.tsx type Newsletter (line 72) | type Newsletter = NewsletterStatsResponse["newsletters"][number]; function BulkUnsubscribe (line 117) | function BulkUnsubscribe() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/BulkUnsubscribeSkeleton.tsx constant SKELETON_ROW_COUNT (line 14) | const SKELETON_ROW_COUNT = 10; function SkeletonCheckbox (line 16) | function SkeletonCheckbox() { function SkeletonDesktopRow (line 20) | function SkeletonDesktopRow() { function BulkUnsubscribeDesktopSkeleton (line 52) | function BulkUnsubscribeDesktopSkeleton() { function SkeletonMobileCard (line 81) | function SkeletonMobileCard() { function BulkUnsubscribeMobileSkeleton (line 105) | function BulkUnsubscribeMobileSkeleton() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/ResubscribeDialog.tsx type ResubscribeDialogProps (line 17) | interface ResubscribeDialogProps { function ResubscribeDialog (line 26) | function ResubscribeDialog({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/SearchBar.tsx function SearchBar (line 9) | function SearchBar({ FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/ShortcutTooltip.tsx function ShortcutTooltip (line 7) | function ShortcutTooltip() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/common.tsx function ActionCell (line 54) | function ActionCell({ function UnsubscribeButton (line 125) | function UnsubscribeButton({ function ApproveButton (line 211) | function ApproveButton({ function MoreDropdown (line 246) | function MoreDropdown({ function HeaderButton (line 369) | function HeaderButton(props: { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/hooks.ts type NewsletterFilterType (line 31) | type NewsletterFilterType = type MutateFn (line 39) | type MutateFn = ( function pluralize (line 45) | function pluralize(count: number, singular: string): string { function formatSenderNames (line 49) | function formatSenderNames(items: T[]): string { function itemMatchesFilter (line 56) | function itemMatchesFilter( function executeBulkOperation (line 77) | async function executeBulkOperation({ function unsubscribeAndArchive (line 178) | async function unsubscribeAndArchive({ function blockSender (line 209) | async function blockSender({ function useUnsubscribe (line 238) | function useUnsubscribe({ function useBulkUnsubscribe (line 327) | function useBulkUnsubscribe({ function autoArchive (line 406) | async function autoArchive({ function useAutoArchive (line 431) | function useAutoArchive({ function useBulkAutoArchive (line 520) | function useBulkAutoArchive({ function useApproveButton (line 582) | function useApproveButton({ function useBulkApprove (line 691) | function useBulkApprove({ function useBulkArchive (line 733) | function useBulkArchive({ function deleteAllFromSender (line 770) | async function deleteAllFromSender({ function useDeleteAllFromSender (line 816) | function useDeleteAllFromSender({ function useBulkDelete (line 845) | function useBulkDelete({ function useBulkUnsubscribeShortcuts (line 881) | function useBulkUnsubscribeShortcuts({ function useNewsletterFilter (line 1016) | function useNewsletterFilter() { function didAutomaticUnsubscribeSucceed (line 1037) | function didAutomaticUnsubscribeSucceed( function performAutomaticUnsubscribe (line 1047) | async function performAutomaticUnsubscribe({ function getAutomaticUnsubscribeLink (line 1064) | function getAutomaticUnsubscribeLink(unsubscribeLink?: string | null) { function getManualUnsubscribeLink (line 1070) | function getManualUnsubscribeLink(unsubscribeLink?: string | null) { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/page.tsx function BulkUnsubscribePage (line 4) | async function BulkUnsubscribePage() { FILE: apps/web/app/(app)/[emailAccountId]/bulk-unsubscribe/types.ts type Row (line 7) | type Row = { type Newsletter (line 15) | type Newsletter = NewsletterStatsResponse["newsletters"][number]; type RowProps (line 17) | interface RowProps { FILE: apps/web/app/(app)/[emailAccountId]/calendars/CalendarConnectionCard.tsx type CalendarConnection (line 31) | type CalendarConnection = GetCalendarsResponse["connections"][0]; type CalendarConnectionCardProps (line 33) | interface CalendarConnectionCardProps { function CalendarConnectionCard (line 54) | function CalendarConnectionCard({ FILE: apps/web/app/(app)/[emailAccountId]/calendars/CalendarConnections.tsx function CalendarConnections (line 14) | function CalendarConnections() { function useCalendarNotifications (line 71) | function useCalendarNotifications() { FILE: apps/web/app/(app)/[emailAccountId]/calendars/CalendarList.tsx type Calendar (line 9) | type Calendar = GetCalendarsResponse["connections"][0]["calendars"][0]; type CalendarListProps (line 11) | interface CalendarListProps { function CalendarList (line 16) | function CalendarList({ FILE: apps/web/app/(app)/[emailAccountId]/calendars/CalendarSettings.tsx constant BASE_TIMEZONES (line 26) | const BASE_TIMEZONES = [ function CalendarSettings (line 57) | function CalendarSettings() { FILE: apps/web/app/(app)/[emailAccountId]/calendars/ConnectCalendar.tsx function ConnectCalendar (line 13) | function ConnectCalendar({ FILE: apps/web/app/(app)/[emailAccountId]/calendars/TimezoneDetector.tsx type DismissedPrompt (line 20) | type DismissedPrompt = { constant DISMISSAL_EXPIRY_DAYS (line 26) | const DISMISSAL_EXPIRY_DAYS = 30; function TimezoneDetector (line 28) | function TimezoneDetector() { function shouldShowTimezonePrompt (line 127) | function shouldShowTimezonePrompt( function addDismissedPrompt (line 154) | function addDismissedPrompt( FILE: apps/web/app/(app)/[emailAccountId]/calendars/page.tsx function CalendarsPage (line 7) | async function CalendarsPage() { FILE: apps/web/app/(app)/[emailAccountId]/clean/ActionSelectionStep.tsx function ActionSelectionStep (line 10) | function ActionSelectionStep() { FILE: apps/web/app/(app)/[emailAccountId]/clean/CleanHistory.tsx function CleanHistory (line 12) | function CleanHistory() { FILE: apps/web/app/(app)/[emailAccountId]/clean/CleanInstructionsStep.tsx type Inputs (line 17) | type Inputs = z.infer; function CleanInstructionsStep (line 19) | function CleanInstructionsStep() { FILE: apps/web/app/(app)/[emailAccountId]/clean/CleanRun.tsx function CleanRun (line 7) | function CleanRun({ FILE: apps/web/app/(app)/[emailAccountId]/clean/CleanStats.tsx function CleanStats (line 6) | function CleanStats({ function Progress (line 75) | function Progress({ FILE: apps/web/app/(app)/[emailAccountId]/clean/ConfirmationStep.tsx function ConfirmationStep (line 17) | function ConfirmationStep({ FILE: apps/web/app/(app)/[emailAccountId]/clean/EmailFirehose.tsx function EmailFirehose (line 13) | function EmailFirehose({ FILE: apps/web/app/(app)/[emailAccountId]/clean/EmailFirehoseItem.tsx type Status (line 23) | type Status = "markedDone" | "markingDone" | "keep" | "labelled" | "proc... function EmailItem (line 25) | function EmailItem({ function StatusCircle (line 88) | function StatusCircle({ status }: { status: Status }) { function StatusBadge (line 101) | function StatusBadge({ function getStatus (line 228) | function getStatus(email: CleanThread): Status { function isPending (line 248) | function isPending(email: CleanThread) { FILE: apps/web/app/(app)/[emailAccountId]/clean/IntroStep.tsx function IntroStep (line 11) | function IntroStep({ FILE: apps/web/app/(app)/[emailAccountId]/clean/PreviewBatch.tsx function PreviewBatch (line 20) | function PreviewBatch({ job }: { job: CleanupJob }) { FILE: apps/web/app/(app)/[emailAccountId]/clean/TimeRangeStep.tsx function TimeRangeStep (line 10) | function TimeRangeStep() { FILE: apps/web/app/(app)/[emailAccountId]/clean/consts.ts constant PREVIEW_RUN_COUNT (line 1) | const PREVIEW_RUN_COUNT = 50; FILE: apps/web/app/(app)/[emailAccountId]/clean/helpers.ts function getJobById (line 3) | async function getJobById({ function getLastJob (line 15) | async function getLastJob({ FILE: apps/web/app/(app)/[emailAccountId]/clean/history/page.tsx function CleanHistoryPage (line 11) | async function CleanHistoryPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/clean/loading.tsx function LoadingComponent (line 3) | function LoadingComponent() { FILE: apps/web/app/(app)/[emailAccountId]/clean/onboarding/page.tsx function CleanPage (line 17) | async function CleanPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/clean/page.tsx function CleanPage (line 10) | async function CleanPage({ FILE: apps/web/app/(app)/[emailAccountId]/clean/run/page.tsx function CleanRunPage (line 13) | async function CleanRunPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/clean/types.ts type CleanStep (line 2) | enum CleanStep { FILE: apps/web/app/(app)/[emailAccountId]/clean/useEmailStream.ts function useEmailStream (line 8) | function useEmailStream( function createEmailMap (line 160) | function createEmailMap(threads: CleanThread[]): Record void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding-brief/StepReady.tsx constant PRICING_FEATURES (line 30) | const PRICING_FEATURES = [ function StepReady (line 37) | function StepReady() { FILE: apps/web/app/(app)/[emailAccountId]/onboarding-brief/StepSendTestBrief.tsx function StepSendTestBrief (line 19) | function StepSendTestBrief({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding-brief/page.tsx function MeetingBriefsOnboardingPage (line 16) | async function MeetingBriefsOnboardingPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/ContinueButton.tsx function ContinueButton (line 4) | function ContinueButton(props: ButtonProps) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/IconCircle.tsx type IconCircleColor (line 55) | type IconCircleColor = VariantProps["color"]; type IconCircleProps (line 74) | interface IconCircleProps function IconCircle (line 82) | function IconCircle({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/ImagePreview.tsx function OnboardingImagePreview (line 3) | function OnboardingImagePreview({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/OnboardingButton.tsx function OnboardingButton (line 3) | function OnboardingButton({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/OnboardingCategories.tsx function CategoriesSetup (line 50) | function CategoriesSetup({ function CategoryCard (line 199) | function CategoryCard({ function CustomCategoryCard (line 286) | function CustomCategoryCard() { function SectionHeader (line 302) | function SectionHeader({ function getRandomIcons (line 314) | function getRandomIcons() { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/OnboardingContent.tsx type OnboardingContentProps (line 37) | interface OnboardingContentProps { function OnboardingContent (line 41) | function OnboardingContent({ step }: OnboardingContentProps) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/OnboardingWrapper.tsx function OnboardingWrapper (line 3) | function OnboardingWrapper({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepBulkUnsubscribe.tsx function StepBulkUnsubscribe (line 8) | function StepBulkUnsubscribe({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepCompanySize.tsx constant COMPANY_SIZES (line 19) | const COMPANY_SIZES = [ function StepCompanySize (line 47) | function StepCompanySize({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepCustomRules.tsx function StepCustomRules (line 10) | function StepCustomRules({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepDigest.tsx function StepDigest (line 12) | function StepDigest({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepDigestV1.tsx function StepDigest (line 12) | function StepDigest({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepDraft.tsx function StepDraft (line 13) | function StepDraft({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepDraftReplies.tsx function StepDraftReplies (line 8) | function StepDraftReplies({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepEmailsSorted.tsx function StepEmailsSorted (line 8) | function StepEmailsSorted({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepExtension.tsx function StepExtension (line 13) | function StepExtension({ onNext }: { onNext: () => Promise }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepFeatures.tsx function StepFeatures (line 56) | function StepFeatures({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepInboxProcessed.tsx function StepInboxProcessed (line 10) | function StepInboxProcessed({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepIntro.tsx function StepIntro (line 12) | function StepIntro({ onNext }: { onNext: () => void }) { function Benefit (line 61) | function Benefit({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepInviteTeam.tsx function StepInviteTeam (line 19) | function StepInviteTeam({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepLabels.tsx function StepLabels (line 10) | function StepLabels({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepWelcome.tsx function StepWelcome (line 10) | function StepWelcome({ onNext }: { onNext: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/StepWho.tsx function StepWho (line 24) | function StepWho({ FILE: apps/web/app/(app)/[emailAccountId]/onboarding/illustrations/BulkUnsubscribeIllustration.tsx function BulkUnsubscribeIllustration (line 66) | function BulkUnsubscribeIllustration() { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/illustrations/DraftRepliesIllustration.tsx function DraftRepliesIllustration (line 16) | function DraftRepliesIllustration() { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/illustrations/EmailsSortedIllustration.tsx function EmailsSortedIllustration (line 37) | function EmailsSortedIllustration() { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/illustrations/InboxReadyIllustration.tsx constant ANIMATION_DURATION (line 7) | const ANIMATION_DURATION = 1; function InboxReadyIllustration (line 9) | function InboxReadyIllustration() { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/page.tsx function OnboardingPage (line 18) | async function OnboardingPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/onboarding/steps.ts constant STEP_KEYS (line 1) | const STEP_KEYS = { constant STEP_ORDER (line 16) | const STEP_ORDER = [ function getStepNumber (line 31) | function getStepNumber( FILE: apps/web/app/(app)/[emailAccountId]/organization/create/page.tsx function CreateOrganizationPage (line 22) | function CreateOrganizationPage() { FILE: apps/web/app/(app)/[emailAccountId]/organization/page.tsx function OrganizationPage (line 6) | async function OrganizationPage({ FILE: apps/web/app/(app)/[emailAccountId]/permissions/consent/page.tsx function PermissionsConsentPage (line 13) | function PermissionsConsentPage() { FILE: apps/web/app/(app)/[emailAccountId]/quick-bulk-archive/BulkArchiveTab.tsx function BulkArchiveTab (line 76) | function BulkArchiveTab() { function SenderRow (line 465) | function SenderRow({ function ArchiveStatus (line 534) | function ArchiveStatus({ function ExpandedEmails (line 563) | function ExpandedEmails({ FILE: apps/web/app/(app)/[emailAccountId]/quick-bulk-archive/page.tsx function QuickBulkArchivePage (line 8) | function QuickBulkArchivePage() { FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/AwaitingReply.tsx function AwaitingReply (line 6) | async function AwaitingReply({ FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/EnableReplyTracker.tsx function EnableReplyTracker (line 24) | function EnableReplyTracker({ enabled }: { enabled: boolean }) { FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/NeedsAction.tsx function NeedsAction (line 6) | async function NeedsAction({ FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/NeedsReply.tsx function NeedsReply (line 6) | async function NeedsReply({ FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/ReplyTrackerEmails.tsx function ReplyTrackerEmails (line 41) | function ReplyTrackerEmails({ function Row (line 281) | function Row({ function NudgeButton (line 378) | function NudgeButton({ function ResolveButton (line 409) | function ResolveButton({ function UnresolveButton (line 434) | function UnresolveButton({ function EmptyState (line 459) | function EmptyState({ function useReplyTrackerKeyboardNav (line 498) | function useReplyTrackerKeyboardNav( function showReplyNotSupportedToast (line 523) | function showReplyNotSupportedToast() { FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/Resolved.tsx constant PAGE_SIZE (line 6) | const PAGE_SIZE = 20; function Resolved (line 8) | async function Resolved({ FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/TimeRangeFilter.tsx function TimeRangeFilter (line 21) | function TimeRangeFilter() { FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/date-filter.ts type TimeRange (line 4) | type TimeRange = "all" | "3d" | "1w" | "2w" | "1m"; function getDateFilter (line 6) | function getDateFilter(timeRange: TimeRange) { FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/fetch-trackers.ts constant PAGE_SIZE (line 6) | const PAGE_SIZE = 20; function getPaginatedThreadTrackers (line 8) | async function getPaginatedThreadTrackers({ FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/onboarding/page.tsx function OnboardingReplyTracker (line 6) | async function OnboardingReplyTracker(props: { FILE: apps/web/app/(app)/[emailAccountId]/reply-zero/page.tsx function ReplyTrackerPage (line 21) | async function ReplyTrackerPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/settings/AboutSectionForm.tsx function AboutSection (line 20) | function AboutSection({ onSuccess }: { onSuccess: () => void }) { FILE: apps/web/app/(app)/[emailAccountId]/settings/ApiKeysCreateForm.tsx function ApiKeysCreateButtonModal (line 45) | function ApiKeysCreateButtonModal({ mutate }: { mutate: () => void }) { function ApiKeysForm (line 68) | function ApiKeysForm({ mutate }: { mutate: () => void }) { function ApiKeysDeactivateButton (line 236) | function ApiKeysDeactivateButton({ FILE: apps/web/app/(app)/[emailAccountId]/settings/ApiKeysSection.tsx function ApiKeysSection (line 34) | function ApiKeysSection() { FILE: apps/web/app/(app)/[emailAccountId]/settings/BillingSection.tsx function BillingSection (line 23) | function BillingSection() { FILE: apps/web/app/(app)/[emailAccountId]/settings/CleanupDraftsSection.tsx function CleanupDraftsSection (line 19) | function CleanupDraftsSection({ FILE: apps/web/app/(app)/[emailAccountId]/settings/ConnectedAppsSection.tsx type LinkableMessagingProvider (line 62) | type LinkableMessagingProvider = "TEAMS" | "TELEGRAM"; constant PROVIDER_CONFIG (line 64) | const PROVIDER_CONFIG: Partial< function ConnectedAppsSection (line 72) | function ConnectedAppsSection({ function ConnectedChannelRow (line 307) | function ConnectedChannelRow({ function MessagingConnectCodeDialog (line 493) | function MessagingConnectCodeDialog({ function getProviderDisplayName (line 539) | function getProviderDisplayName(provider: LinkableMessagingProvider): st... function useSlackNotifications (line 544) | function useSlackNotifications({ function getSlackConnectionFailedDescription (line 610) | function getSlackConnectionFailedDescription( function resolveSlackErrorReason (line 633) | function resolveSlackErrorReason( FILE: apps/web/app/(app)/[emailAccountId]/settings/CopyRulesDialog.tsx type SourceAccount (line 42) | type SourceAccount = { type CopyRulesDialogProps (line 48) | interface CopyRulesDialogProps { function CopyRulesDialog (line 56) | function CopyRulesDialog({ FILE: apps/web/app/(app)/[emailAccountId]/settings/CopyRulesSection.tsx type Account (line 15) | type Account = { function CopyRulesSection (line 21) | function CopyRulesSection({ FILE: apps/web/app/(app)/[emailAccountId]/settings/DeleteSection.tsx function DeleteSection (line 31) | function DeleteSection() { FILE: apps/web/app/(app)/[emailAccountId]/settings/DigestItemsForm.tsx function DigestItemsForm (line 21) | function DigestItemsForm({ FILE: apps/web/app/(app)/[emailAccountId]/settings/DigestScheduleForm.tsx type DigestScheduleFormValues (line 38) | type DigestScheduleFormValues = z.infer; function DigestScheduleForm (line 70) | function DigestScheduleForm({ function DigestScheduleFormInner (line 94) | function DigestScheduleFormInner({ function getInitialScheduleProps (line 334) | function getInitialScheduleProps( FILE: apps/web/app/(app)/[emailAccountId]/settings/DigestSettingsForm.tsx type DigestSettingsFormValues (line 45) | type DigestSettingsFormValues = z.infer; function DigestSettingsForm (line 62) | function DigestSettingsForm({ onSuccess }: { onSuccess?: () => void }) { function EmailPreview (line 346) | function EmailPreview({ function getInitialScheduleProps (line 391) | function getInitialScheduleProps( FILE: apps/web/app/(app)/[emailAccountId]/settings/EmailUpdatesSection.tsx function EmailUpdatesSection (line 18) | function EmailUpdatesSection({ function SummaryUpdateSectionForm (line 40) | function SummaryUpdateSectionForm({ FILE: apps/web/app/(app)/[emailAccountId]/settings/ModelSection.tsx function ModelSection (line 31) | function ModelSection() { function ModelSectionForm (line 60) | function ModelSectionForm(props: { FILE: apps/web/app/(app)/[emailAccountId]/settings/MultiAccountSection.tsx function MultiAccountSection (line 33) | function MultiAccountSection() { function MultiAccountForm (line 124) | function MultiAccountForm({ function ExtraSeatsAlert (line 231) | function ExtraSeatsAlert({ FILE: apps/web/app/(app)/[emailAccountId]/settings/OrgAnalyticsConsentSection.tsx function OrgAnalyticsConsentSection (line 20) | function OrgAnalyticsConsentSection({ FILE: apps/web/app/(app)/[emailAccountId]/settings/ResetAnalyticsSection.tsx function ResetAnalyticsSection (line 16) | function ResetAnalyticsSection({ FILE: apps/web/app/(app)/[emailAccountId]/settings/ToggleAllRulesSection.tsx function ToggleAllRulesSection (line 28) | function ToggleAllRulesSection({ FILE: apps/web/app/(app)/[emailAccountId]/settings/WebhookGenerate.tsx function RegenerateSecretButton (line 10) | function RegenerateSecretButton({ FILE: apps/web/app/(app)/[emailAccountId]/settings/WebhookSection.tsx function WebhookSection (line 23) | function WebhookSection() { FILE: apps/web/app/(app)/[emailAccountId]/settings/page.tsx function EmailAccountSettingsPage (line 4) | async function EmailAccountSettingsPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/setup/SetupContent.tsx type DismissibleSetupStep (line 41) | type DismissibleSetupStep = function FeatureCard (line 48) | function FeatureCard({ function getFeatures (line 86) | function getFeatures() { function FeatureGrid (line 118) | function FeatureGrid({ function Checklist (line 256) | function Checklist({ function SetupContent (line 431) | function SetupContent() { function SetupPageContent (line 471) | function SetupPageContent({ function getUpdatedSetupProgress (line 536) | function getUpdatedSetupProgress( FILE: apps/web/app/(app)/[emailAccountId]/setup/StatsCardGrid.tsx type StatVariant (line 40) | type StatVariant = keyof typeof variants; type StatItem (line 42) | type StatItem = { function StatsCardGrid (line 52) | function StatsCardGrid() { FILE: apps/web/app/(app)/[emailAccountId]/setup/page.tsx function SetupPage (line 5) | async function SetupPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/CategorizeProgress.tsx function useCategorizeProgress (line 12) | function useCategorizeProgress() { function CategorizeSendersProgress (line 19) | function CategorizeSendersProgress({ FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/CategorizeWithAiButton.tsx function CategorizeWithAiButton (line 15) | function CategorizeWithAiButton({ function CategorizeWithAiButtonTooltip (line 83) | function CategorizeWithAiButtonTooltip({ FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/CreateCategoryButton.tsx type ExampleCategory (line 26) | type ExampleCategory = { constant EXAMPLE_CATEGORIES (line 31) | const EXAMPLE_CATEGORIES: ExampleCategory[] = [ function CreateCategoryButton (line 88) | function CreateCategoryButton({ function CreateCategoryDialog (line 115) | function CreateCategoryDialog({ function CreateCategoryForm (line 139) | function CreateCategoryForm({ FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/Uncategorized.tsx function Uncategorized (line 28) | function Uncategorized({ function AutoCategorizeToggle (line 137) | function AutoCategorizeToggle({ function useSenders (line 158) | function useSenders() { FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/page.tsx function CategoriesPage (line 34) | async function CategoriesPage({ FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/setup/SetUpCategories.tsx type CardCategory (line 31) | type CardCategory = Pick & { function SetUpCategories (line 44) | function SetUpCategories({ function CategoryCard (line 208) | function CategoryCard({ FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/setup/SmartCategoriesOnboarding.tsx function SmartCategoriesOnboarding (line 15) | function SmartCategoriesOnboarding() { FILE: apps/web/app/(app)/[emailAccountId]/smart-categories/setup/page.tsx function SetupCategoriesPage (line 7) | async function SetupCategoriesPage(props: { FILE: apps/web/app/(app)/[emailAccountId]/stats/ActionBar.tsx type ActionBarProps (line 3) | interface ActionBarProps { function ActionBar (line 9) | function ActionBar({ FILE: apps/web/app/(app)/[emailAccountId]/stats/BarChart.tsx type BarChartProps (line 14) | interface BarChartProps { function BarChart (line 27) | function BarChart({ FILE: apps/web/app/(app)/[emailAccountId]/stats/BarListCard.tsx type BarListCardProps (line 17) | interface BarListCardProps { function BarListCard (line 27) | function BarListCard({ tabs, icon, title }: BarListCardProps) { FILE: apps/web/app/(app)/[emailAccountId]/stats/DetailedStatsFilter.tsx type Checked (line 16) | type Checked = DropdownMenuCheckboxItemProps["checked"]; function DetailedStatsFilter (line 18) | function DetailedStatsFilter(props: { FILE: apps/web/app/(app)/[emailAccountId]/stats/EmailActionsAnalytics.tsx function EmailActionsAnalytics (line 18) | function EmailActionsAnalytics() { FILE: apps/web/app/(app)/[emailAccountId]/stats/EmailAnalytics.tsx function EmailAnalytics (line 15) | function EmailAnalytics(props: { FILE: apps/web/app/(app)/[emailAccountId]/stats/EmailsToIncludeFilter.tsx function useEmailsToIncludeFilter (line 5) | function useEmailsToIncludeFilter() { function EmailsToIncludeFilter (line 24) | function EmailsToIncludeFilter(props: { FILE: apps/web/app/(app)/[emailAccountId]/stats/LoadProgress.tsx function LoadProgress (line 4) | function LoadProgress() { FILE: apps/web/app/(app)/[emailAccountId]/stats/LoadStatsButton.tsx function LoadStatsButton (line 8) | function LoadStatsButton() { FILE: apps/web/app/(app)/[emailAccountId]/stats/MainStatChart.tsx function getActiveChart (line 20) | function getActiveChart(activChart: keyof typeof chartConfig): string[] { function MainStatChart (line 28) | function MainStatChart(props: { FILE: apps/web/app/(app)/[emailAccountId]/stats/NewsletterModal.tsx function NewsletterModal (line 36) | function NewsletterModal(props: { function useSenderEmails (line 129) | function useSenderEmails(props: { function toSearchParams (line 149) | function toSearchParams( function EmailsChart (line 162) | function EmailsChart(props: { function Emails (line 185) | function Emails(props: { fromEmail: string; refreshInterval?: number }) { function UnarchivedEmails (line 208) | function UnarchivedEmails({ function AllEmails (line 239) | function AllEmails({ FILE: apps/web/app/(app)/[emailAccountId]/stats/ResponseTimeAnalytics.tsx type ResponseTimeAnalyticsProps (line 21) | interface ResponseTimeAnalyticsProps { function ResponseTimeAnalytics (line 26) | function ResponseTimeAnalytics({ function SummaryCard (line 155) | function SummaryCard({ function formatTime (line 206) | function formatTime(minutes: number): string { function formatTimeShort (line 230) | function formatTimeShort(minutes: number): string { FILE: apps/web/app/(app)/[emailAccountId]/stats/RuleStatsChart.tsx type RuleStatsChartProps (line 29) | interface RuleStatsChartProps { constant CHART_COLORS (line 34) | const CHART_COLORS = [ function RuleStatsChart (line 42) | function RuleStatsChart({ dateRange, title }: RuleStatsChartProps) { FILE: apps/web/app/(app)/[emailAccountId]/stats/Stats.tsx function Stats (line 33) | function Stats() { function SectionError (line 155) | function SectionError({ title }: { title: string }) { FILE: apps/web/app/(app)/[emailAccountId]/stats/StatsOnboarding.tsx function StatsOnboarding (line 15) | function StatsOnboarding() { FILE: apps/web/app/(app)/[emailAccountId]/stats/StatsSummary.tsx function StatsSummary (line 12) | function StatsSummary(props: { FILE: apps/web/app/(app)/[emailAccountId]/stats/page.tsx function StatsPage (line 4) | async function StatsPage() { FILE: apps/web/app/(app)/[emailAccountId]/stats/params.ts function getDateRangeParams (line 3) | function getDateRangeParams(dateRange?: DateRange) { FILE: apps/web/app/(app)/[emailAccountId]/usage/page.tsx function UsagePage (line 14) | async function UsagePage(props: { FILE: apps/web/app/(app)/[emailAccountId]/usage/usage.tsx function Usage (line 12) | function Usage(props: { usage: RedisUsage | null }) { FILE: apps/web/app/(app)/accounts/AddAccount.tsx function AddAccount (line 11) | function AddAccount() { FILE: apps/web/app/(app)/accounts/page.tsx function AccountsPage (line 43) | function AccountsPage() { function AccountItem (line 74) | function AccountItem({ function AccountHeader (line 99) | function AccountHeader({ function AccountOptionsDropdown (line 142) | function AccountOptionsDropdown({ function useAccountNotifications (line 222) | function useAccountNotifications() { type AccountNotification (line 288) | type AccountNotification = { function getAccountErrorMessage (line 294) | function getAccountErrorMessage( function buildMicrosoftPermissionHelp (line 381) | function buildMicrosoftPermissionHelp(summary: string) { function PermissionList (line 416) | function PermissionList({ scopes }: { scopes: readonly string[] }) { FILE: apps/web/app/(app)/admin/AdminTopSpenders.tsx function AdminTopSpenders (line 29) | function AdminTopSpenders() { FILE: apps/web/app/(app)/admin/AdminUpgradeUserForm.tsx type TierKey (line 28) | type TierKey = "STARTER" | "PLUS" | "PROFESSIONAL" | "LIFETIME"; function buildPremiumTier (line 39) | function buildPremiumTier( FILE: apps/web/app/(app)/admin/AdminUserInfo.tsx function AdminUserInfo (line 18) | function AdminUserInfo() { function InfoRow (line 128) | function InfoRow({ label, value }: { label: string; value: string }) { function formatDate (line 137) | function formatDate(date: Date | string) { FILE: apps/web/app/(app)/admin/DebugLabels.tsx function DebugLabels (line 23) | function DebugLabels() { FILE: apps/web/app/(app)/admin/GmailUrlConverter.tsx function GmailUrlConverter (line 24) | function GmailUrlConverter() { FILE: apps/web/app/(app)/admin/RegisterSSOModal.tsx function RegisterSSOModal (line 28) | function RegisterSSOModal() { FILE: apps/web/app/(app)/admin/page.tsx function AdminPage (line 22) | async function AdminPage() { FILE: apps/web/app/(app)/admin/validation.tsx type ChangePremiumStatusOptions (line 12) | type ChangePremiumStatusOptions = z.infer< type AdminProcessHistoryOptions (line 21) | type AdminProcessHistoryOptions = z.infer< FILE: apps/web/app/(app)/config/page.tsx function AdminConfigPage (line 13) | async function AdminConfigPage() { function Section (line 161) | function Section({ function Row (line 178) | function Row({ label, value }: { label: string; value: string | boolean ... function getVersion (line 191) | function getVersion(): string { FILE: apps/web/app/(app)/early-access/EarlyAccessFeatures.tsx function EarlyAccessFeatures (line 22) | function EarlyAccessFeatures() { FILE: apps/web/app/(app)/early-access/page.tsx function RequestAccessPage (line 16) | function RequestAccessPage() { FILE: apps/web/app/(app)/error.tsx function ErrorBoundary (line 5) | function ErrorBoundary({ FILE: apps/web/app/(app)/layout.tsx function AppLayout (line 46) | async function AppLayout({ FILE: apps/web/app/(app)/license/page.tsx function LicensePage (line 16) | function LicensePage(props: { function ActivateLicenseForm (line 44) | function ActivateLicenseForm(props: { licenseKey?: string }) { FILE: apps/web/app/(app)/no-access/page.tsx function NoAccessPage (line 12) | function NoAccessPage() { FILE: apps/web/app/(app)/organization/[organizationId]/Members.tsx type Member (line 50) | type Member = OrganizationMembersResponse["members"][0]; type PendingInvitation (line 51) | type PendingInvitation = OrganizationMembersResponse["pendingInvitations... function Members (line 53) | function Members({ organizationId }: { organizationId: string }) { function CardWrapper (line 207) | function CardWrapper({ function MemberCard (line 227) | function MemberCard({ function PendingInvitationCard (line 367) | function PendingInvitationCard({ function capitalizeRole (line 426) | function capitalizeRole(role: string) { function getInitials (line 430) | function getInitials(name: string | null | undefined, email: string) { FILE: apps/web/app/(app)/organization/[organizationId]/OrgAnalyticsConsentBanner.tsx function OrgAnalyticsConsentBanner (line 15) | function OrgAnalyticsConsentBanner() { FILE: apps/web/app/(app)/organization/[organizationId]/OrganizationTabs.tsx type OrganizationTabsProps (line 12) | interface OrganizationTabsProps { function OrganizationTabs (line 16) | function OrganizationTabs({ organizationId }: OrganizationTabsProps) { FILE: apps/web/app/(app)/organization/[organizationId]/page.tsx function MembersPage (line 6) | async function MembersPage({ FILE: apps/web/app/(app)/organization/[organizationId]/stats/OrgStats.tsx function OrgStats (line 27) | function OrgStats({ organizationId }: { organizationId: string }) { function StatCard (line 177) | function StatCard({ function BucketChart (line 199) | function BucketChart({ FILE: apps/web/app/(app)/organization/[organizationId]/stats/page.tsx function OrgStatsPage (line 6) | async function OrgStatsPage({ FILE: apps/web/app/(app)/premium/ManageSubscription.tsx function ManageSubscription (line 11) | function ManageSubscription({ function ViewInvoicesButton (line 50) | function ViewInvoicesButton({ function useOpenBillingPortal (line 91) | function useOpenBillingPortal() { FILE: apps/web/app/(app)/premium/PremiumModal.tsx function PricingDialogHeader (line 10) | function PricingDialogHeader() { function EnterpriseFooter (line 18) | function EnterpriseFooter() { function usePremiumModal (line 34) | function usePremiumModal() { FILE: apps/web/app/(app)/premium/Pricing.tsx type PricingProps (line 39) | type PricingProps = { function Pricing (line 46) | function Pricing(props: PricingProps) { function PriceTier (line 204) | function PriceTier({ function ThreeColItem (line 418) | function ThreeColItem({ FILE: apps/web/app/(app)/premium/PricingFrequencyToggle.tsx type Frequency (line 19) | type Frequency = (typeof frequencies)[number]; function PricingFrequencyToggle (line 21) | function PricingFrequencyToggle({ function DiscountBadge (line 60) | function DiscountBadge({ children }: { children: React.ReactNode }) { FILE: apps/web/app/(app)/premium/config.ts type Feature (line 4) | type Feature = { text: string; tooltip?: string }; type Tier (line 6) | type Tier = { constant BRIEF_MY_MEETING_PRICE_ID_MONTHLY (line 44) | const BRIEF_MY_MEETING_PRICE_ID_MONTHLY = constant BRIEF_MY_MEETING_PRICE_ID_ANNUALLY (line 46) | const BRIEF_MY_MEETING_PRICE_ID_ANNUALLY = constant STRIPE_PRICE_ID_CONFIG (line 49) | const STRIPE_PRICE_ID_CONFIG: Record< function getStripeSubscriptionTier (line 113) | function getStripeSubscriptionTier({ function getStripePriceId (line 128) | function getStripePriceId({ function hasLegacyStripePriceId (line 136) | function hasLegacyStripePriceId({ function shouldShowLegacyStripePricingNotice (line 154) | function shouldShowLegacyStripePricingNotice( function getPremiumTierName (line 175) | function getPremiumTierName( function discount (line 198) | function discount(monthly: number, annually: number) { function getLemonSubscriptionTier (line 352) | function getLemonSubscriptionTier({ FILE: apps/web/app/(app)/premium/page.tsx function Premium (line 3) | function Premium() { FILE: apps/web/app/(app)/refer/page.tsx function ReferPage (line 3) | function ReferPage() { FILE: apps/web/app/(app)/sentry-identify.tsx function SentryIdentify (line 7) | function SentryIdentify({ email }: { email: string }) { FILE: apps/web/app/(app)/settings/AppearanceSection.tsx function AppearanceSection (line 14) | function AppearanceSection() { FILE: apps/web/app/(app)/settings/page.tsx function SettingsPage (line 62) | function SettingsPage() { function EmailAccountSettingsCard (line 191) | function EmailAccountSettingsCard({ constant PROVIDER_LABELS (line 280) | const PROVIDER_LABELS: Record = { function ProviderIcon (line 286) | function ProviderIcon({ function AdvancedSettingsSection (line 305) | function AdvancedSettingsSection({ function SettingsGroup (line 352) | function SettingsGroup({ FILE: apps/web/app/(landing)/components/TestAction.tsx function TestActionButton (line 6) | function TestActionButton() { FILE: apps/web/app/(landing)/components/TestError.tsx function TestErrorButton (line 5) | function TestErrorButton() { FILE: apps/web/app/(landing)/components/chat/page.tsx function ChatPage (line 41) | function ChatPage() { function Section (line 654) | function Section({ function ChatFrame (line 669) | function ChatFrame({ children }: { children: React.ReactNode }) { FILE: apps/web/app/(landing)/components/page.tsx function Components (line 64) | function Components() { function getRule (line 900) | function getRule(): Rule { function getRuleWithName (line 923) | function getRuleWithName(name: string): Rule { function getActivityLogEntries (line 931) | function getActivityLogEntries(): ActivityLogEntry[] { function EmailRowExample (line 969) | function EmailRowExample() { FILE: apps/web/app/(landing)/components/test-action.ts function testAction (line 8) | async function testAction() { FILE: apps/web/app/(landing)/components/tools/page.tsx function ToolsPage (line 25) | function ToolsPage() { function AssistantEmailActionStates (line 404) | function AssistantEmailActionStates() { type EmailActionState (line 480) | type EmailActionState = "pending" | "processing" | "confirmed"; function getAssistantToolThreadLookup (line 482) | function getAssistantToolThreadLookup(): ThreadLookup { function getAssistantSearchInboxOutput (line 520) | function getAssistantSearchInboxOutput() { function getAssistantReadEmailOutput (line 565) | function getAssistantReadEmailOutput() { function getAssistantSendEmailOutput (line 579) | function getAssistantSendEmailOutput(state: EmailActionState) { function getAssistantReplyEmailOutput (line 608) | function getAssistantReplyEmailOutput(state: EmailActionState) { function getAssistantForwardEmailOutput (line 638) | function getAssistantForwardEmailOutput(state: EmailActionState) { type RuleActionFields (line 672) | type RuleActionFields = { function ruleAction (line 692) | function ruleAction(type: ActionType, fields?: Partial) { FILE: apps/web/app/(landing)/error.tsx function ErrorBoundary (line 5) | function ErrorBoundary({ FILE: apps/web/app/(landing)/home/CTAButtons.tsx function CTAButtons (line 7) | function CTAButtons() { FILE: apps/web/app/(landing)/home/FAQs.tsx function FAQs (line 66) | function FAQs() { FILE: apps/web/app/(landing)/home/Features.tsx type Side (line 19) | type Side = "left" | "right"; function FeaturesHome (line 21) | function FeaturesHome() { function FeaturesWithImage (line 33) | function FeaturesWithImage({ function FeaturesAiAssistant (line 116) | function FeaturesAiAssistant({ imageSide }: { imageSide?: Side }) { function FeaturesColdEmailBlocker (line 169) | function FeaturesColdEmailBlocker({ imageSide }: { imageSide?: Side }) { function FeaturesStats (line 207) | function FeaturesStats({ imageSide }: { imageSide?: Side }) { function FeaturesUnsubscribe (line 241) | function FeaturesUnsubscribe({ imageSide }: { imageSide?: Side }) { function FeaturesReplyZero (line 281) | function FeaturesReplyZero({ imageSide }: { imageSide?: Side }) { FILE: apps/web/app/(landing)/home/FinalCTA.tsx function FinalCTA (line 5) | function FinalCTA() { FILE: apps/web/app/(landing)/home/Footer.tsx function Footer (line 162) | function Footer() { function FooterList (line 268) | function FooterList(props: { FILE: apps/web/app/(landing)/home/Hero.tsx type HeroProps (line 34) | interface HeroProps { function Hero (line 43) | function Hero({ function HeroVideoPlayer (line 87) | function HeroVideoPlayer() { function HeroContent (line 132) | function HeroContent() { FILE: apps/web/app/(landing)/home/HeroAB.tsx function HeroAB (line 31) | function HeroAB() { FILE: apps/web/app/(landing)/home/LogoCloud.tsx function LogoCloud (line 3) | function LogoCloud() { FILE: apps/web/app/(landing)/home/Privacy.tsx function Privacy (line 3) | function Privacy() { FILE: apps/web/app/(landing)/home/SquaresPattern.tsx function SquaresPattern (line 1) | function SquaresPattern() { FILE: apps/web/app/(landing)/home/Testimonials.tsx type Testimonial (line 9) | type Testimonial = { function Testimonials (line 151) | function Testimonials() { function TestimonialsContent (line 176) | function TestimonialsContent() { function SenjaWidgetContent (line 298) | function SenjaWidgetContent() { FILE: apps/web/app/(landing)/layout.tsx function LandingLayout (line 3) | async function LandingLayout({ FILE: apps/web/app/(landing)/login/LoginForm.tsx function LoginForm (line 23) | function LoginForm({ showLocalBypass }: { showLocalBypass: boolean }) { function getAuthCallbackUrls (line 166) | function getAuthCallbackUrls(next: string | null) { function isOrganizationInvitationPath (line 175) | function isOrganizationInvitationPath(path: string) { function handleSocialSignIn (line 180) | async function handleSocialSignIn({ FILE: apps/web/app/(landing)/login/error/AutoLogOut.tsx function AutoLogOut (line 6) | function AutoLogOut(props: { loggedIn: boolean }) { FILE: apps/web/app/(landing)/login/error/page.tsx function LoginErrorContent (line 44) | function LoginErrorContent() { function LogInErrorPage (line 96) | function LogInErrorPage() { function resolveErrorCode (line 110) | function resolveErrorCode({ FILE: apps/web/app/(landing)/login/messages.ts function getRequiresReconsentDescription (line 3) | function getRequiresReconsentDescription(options?: { FILE: apps/web/app/(landing)/login/page.tsx function AuthenticationPage (line 28) | async function AuthenticationPage(props: { function ErrorAlert (line 92) | function ErrorAlert({ error }: { error: string }) { FILE: apps/web/app/(landing)/login/sso/page.tsx type SsoLoginBody (line 27) | type SsoLoginBody = z.infer; function SSOLoginPage (line 29) | function SSOLoginPage() { FILE: apps/web/app/(landing)/logout/page.tsx function LogoutPage (line 8) | function LogoutPage() { FILE: apps/web/app/(landing)/old-landing/page.tsx function Home (line 14) | function Home() { function HeroHome (line 30) | function HeroHome() { FILE: apps/web/app/(landing)/onboarding-brief/page.tsx function OnboardingBriefPage (line 3) | async function OnboardingBriefPage() { FILE: apps/web/app/(landing)/onboarding/page.tsx function OnboardingPage (line 3) | async function OnboardingPage() { FILE: apps/web/app/(landing)/oss-friends/page.tsx type OSSFriend (line 21) | type OSSFriend = { function OSSFriendsPage (line 27) | async function OSSFriendsPage() { FILE: apps/web/app/(landing)/page.tsx function NewLanding (line 20) | function NewLanding() { FILE: apps/web/app/(landing)/pricing/PricingComparisonTable.tsx type FeatureValue (line 10) | type FeatureValue = boolean | string; function FeatureCell (line 103) | function FeatureCell({ value }: { value: FeatureValue }) { function PricingComparisonTable (line 113) | function PricingComparisonTable() { FILE: apps/web/app/(landing)/pricing/PricingFAQs.tsx function PricingFAQs (line 72) | function PricingFAQs() { FILE: apps/web/app/(landing)/pricing/page.tsx function PricingPage (line 15) | function PricingPage() { FILE: apps/web/app/(landing)/privacy/content.tsx function PrivacyContent (line 6) | function PrivacyContent() { FILE: apps/web/app/(landing)/privacy/page.tsx function Page (line 11) | function Page() { FILE: apps/web/app/(landing)/terms/content.tsx function TermsContent (line 6) | function TermsContent() { FILE: apps/web/app/(landing)/terms/page.tsx function Page (line 11) | function Page() { FILE: apps/web/app/(landing)/thank-you/page.tsx function ThankYouPage (line 7) | function ThankYouPage() { FILE: apps/web/app/(landing)/welcome-redirect/page.tsx function WelcomeRedirectPage (line 5) | async function WelcomeRedirectPage(props: { FILE: apps/web/app/(landing)/welcome-upgrade/Testimonial.tsx function Testimonial (line 3) | function Testimonial() { FILE: apps/web/app/(landing)/welcome-upgrade/WelcomeUpgradeHeader.tsx function WelcomeUpgradeHeader (line 7) | function WelcomeUpgradeHeader() { FILE: apps/web/app/(landing)/welcome-upgrade/WelcomeUpgradeNav.tsx function WelcomeUpgradeNav (line 6) | function WelcomeUpgradeNav() { FILE: apps/web/app/(landing)/welcome-upgrade/WelcomeUpgradePricing.tsx function WelcomeUpgradePricing (line 10) | function WelcomeUpgradePricing() { FILE: apps/web/app/(landing)/welcome-upgrade/page.tsx function WelcomeUpgradePage (line 6) | function WelcomeUpgradePage() { FILE: apps/web/app/(landing)/welcome/form.tsx type Inputs (line 22) | type Inputs = Record<"$survey_response" | `$survey_response_${number}`, ... function getResponses (line 277) | function getResponses(seachParams: URLSearchParams): Record>; constant GET (line 9) | const GET = withAdmin("admin/top-spenders", async () => { function getData (line 14) | async function getData() { FILE: apps/web/app/api/ai/analyze-sender-pattern/call-analyze-pattern-api.ts function analyzeSenderPattern (line 9) | async function analyzeSenderPattern( FILE: apps/web/app/api/ai/analyze-sender-pattern/route.ts constant THRESHOLD_THREADS (line 20) | const THRESHOLD_THREADS = 3; constant MAX_RESULTS (line 21) | const MAX_RESULTS = 10; type AnalyzeSenderPatternBody (line 27) | type AnalyzeSenderPatternBody = z.infer; constant POST (line 29) | const POST = withError( function process (line 63) | async function process({ function savePatternCheck (line 223) | async function savePatternCheck({ function getThreadsFromSender (line 256) | async function getThreadsFromSender( function getEmailAccountWithRules (line 326) | async function getEmailAccountWithRules({ FILE: apps/web/app/api/ai/compose-autocomplete/route.ts constant POST (line 7) | const POST = withEmailAccount(async (request) => { FILE: apps/web/app/api/ai/compose-autocomplete/validation.ts type ComposeAutocompleteBody (line 7) | type ComposeAutocompleteBody = z.infer; FILE: apps/web/app/api/ai/digest/queue/route.ts constant POST (line 6) | const POST = createForwardingQueueHandler({ FILE: apps/web/app/api/ai/digest/route.ts constant POST (line 17) | const POST = withError( function findOrCreateDigest (line 116) | async function findOrCreateDigest( function updateDigestItem (line 155) | async function updateDigestItem( function createDigestItem (line 169) | async function createDigestItem({ function upsertDigest (line 204) | async function upsertDigest({ function getRuleNameByExecutedAction (line 247) | async function getRuleNameByExecutedAction( FILE: apps/web/app/api/ai/digest/validation.ts type DigestBody (line 16) | type DigestBody = z.infer; FILE: apps/web/app/api/ai/models/route.ts type OpenAiModelsResponse (line 7) | type OpenAiModelsResponse = Awaited>; function getOpenAiModels (line 9) | async function getOpenAiModels({ apiKey }: { apiKey: string }) { constant GET (line 17) | const GET = withEmailAccount("api/ai/models", async (req) => { FILE: apps/web/app/api/ai/summarise/controller.ts function summarise (line 6) | async function summarise({ FILE: apps/web/app/api/ai/summarise/route.ts constant POST (line 9) | const POST = withEmailAccount(async (request) => { FILE: apps/web/app/api/ai/summarise/validation.ts type SummariseBody (line 7) | type SummariseBody = z.infer; FILE: apps/web/app/api/automation-jobs/execute/queue/route.ts constant POST (line 15) | const POST = handleCallback>( FILE: apps/web/app/api/automation-jobs/execute/route.ts constant POST (line 10) | const POST = withError( FILE: apps/web/app/api/chat/chat-message-persistence.ts function mapUiMessagesToChatMessageRows (line 5) | function mapUiMessagesToChatMessageRows( FILE: apps/web/app/api/chat/confirm-email-action/route.ts constant POST (line 10) | const POST = withEmailAccount( FILE: apps/web/app/api/chat/route.ts constant POST (line 28) | const POST = withEmailAccount("chat", async (request) => { function createNewChat (line 221) | async function createNewChat({ function getChatWithCompactions (line 246) | async function getChatWithCompactions(chatId: string) { function saveChatMessage (line 256) | async function saveChatMessage(message: Prisma.ChatMessageCreateInput) { function saveChatMessages (line 260) | async function saveChatMessages( function buildHiddenInlineActionMessage (line 277) | function buildHiddenInlineActionMessage( FILE: apps/web/app/api/chat/validation.ts type MessageContext (line 45) | type MessageContext = z.infer; FILE: apps/web/app/api/chats/[chatId]/route.ts type GetChatResponse (line 5) | type GetChatResponse = Awaited>; constant GET (line 7) | const GET = withEmailAccount( function getChat (line 26) | async function getChat({ FILE: apps/web/app/api/chats/route.ts type GetChatsResponse (line 5) | type GetChatsResponse = Awaited>; constant GET (line 7) | const GET = withEmailAccount("chats", async (request) => { function getChats (line 13) | async function getChats({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/clean/gmail/route.ts type CleanGmailBody (line 24) | type CleanGmailBody = z.infer; function performGmailAction (line 26) | async function performGmailAction({ function saveCleanResult (line 92) | async function saveCleanResult({ function saveToDatabase (line 119) | async function saveToDatabase({ constant POST (line 140) | const POST = withError( FILE: apps/web/app/api/clean/history/route.ts type CleanHistoryResponse (line 5) | type CleanHistoryResponse = Awaited>; function getCleanHistory (line 7) | async function getCleanHistory({ emailAccountId }: { emailAccountId: str... constant GET (line 16) | const GET = withEmailAccount("clean/history", async (request) => { FILE: apps/web/app/api/clean/route.test.ts function getDefaultParams (line 69) | function getDefaultParams() { FILE: apps/web/app/api/clean/route.ts type CleanThreadBody (line 46) | type CleanThreadBody = z.infer; function cleanThread (line 48) | async function cleanThread({ function getPublish (line 230) | function getPublish({ constant POST (line 296) | const POST = withError( FILE: apps/web/app/api/cron/automation-jobs/route.ts constant BATCH_SIZE (line 19) | const BATCH_SIZE = 100; constant AUTOMATION_JOBS_TOPIC (line 20) | const AUTOMATION_JOBS_TOPIC = "automation-jobs-execute"; constant GET (line 22) | const GET = withError("cron/automation-jobs", async (request) => { constant POST (line 34) | const POST = withError("cron/automation-jobs", async (request) => { function enqueueDueAutomationJobs (line 46) | async function enqueueDueAutomationJobs(logger: Logger) { function claimDueJobRun (line 181) | async function claimDueJobRun({ function deferAutomationJobUntilNextRun (line 229) | async function deferAutomationJobUntilNextRun({ FILE: apps/web/app/api/cron/scheduled-actions/route.ts constant BATCH_SIZE (line 15) | const BATCH_SIZE = 100; constant GET (line 17) | const GET = withError("cron/scheduled-actions", async (request) => { constant POST (line 35) | const POST = withError("cron/scheduled-actions", async (request) => { function processScheduledActions (line 53) | async function processScheduledActions(logger: Logger) { FILE: apps/web/app/api/digest-preview/route.ts function GET (line 9) | async function GET(request: NextRequest) { function createMockDigestData (line 44) | function createMockDigestData(categories: string[]): DigestEmailProps { function mapRuleNameToCategory (line 161) | function mapRuleNameToCategory(ruleName: string): string { FILE: apps/web/app/api/digest-preview/validation.ts type DigestPreviewBody (line 7) | type DigestPreviewBody = z.infer; FILE: apps/web/app/api/email-stream/route.ts constant INACTIVITY_TIMEOUT (line 9) | const INACTIVITY_TIMEOUT = 5 * 60 * 1000; constant GET (line 11) | const GET = withAuth("email-stream", async (request) => { method start (line 60) | async start(controller) { FILE: apps/web/app/api/follow-up-reminders/account/queue/route.ts constant POST (line 16) | const POST = handleCallback>( FILE: apps/web/app/api/follow-up-reminders/account/route.ts constant POST (line 15) | const POST = withError( FILE: apps/web/app/api/follow-up-reminders/process.test.ts constant OLD_DATE (line 92) | const OLD_DATE = "1700000000000"; constant RECENT_DATE (line 93) | const RECENT_DATE = String(Date.now()); constant MINUTE_MS (line 94) | const MINUTE_MS = 60_000; function createMockAccount (line 96) | function createMockAccount( function createMockProvider (line 122) | function createMockProvider( function mockMessage (line 148) | function mockMessage(id: string, internalDate: string) { function mockAwaitingMessage (line 175) | function mockAwaitingMessage(id: string, internalDate: string) { FILE: apps/web/app/api/follow-up-reminders/process.ts constant FOLLOW_UP_ELIGIBILITY_WINDOW_MINUTES (line 34) | const FOLLOW_UP_ELIGIBILITY_WINDOW_MINUTES = 15; constant FOLLOW_UP_THREAD_SCAN_LIMIT (line 35) | const FOLLOW_UP_THREAD_SCAN_LIMIT = 50; type FollowUpReminderAccount (line 62) | type FollowUpReminderAccount = EmailAccountWithAI & { type FollowUpReminderAccountResult (line 68) | type FollowUpReminderAccountResult = function getEligibleFollowUpReminderEmailAccountIds (line 74) | async function getEligibleFollowUpReminderEmailAccountIds() { function processAllFollowUpReminders (line 83) | async function processAllFollowUpReminders(logger: Logger) { function processFollowUpRemindersForEmailAccountId (line 138) | async function processFollowUpRemindersForEmailAccountId({ function processAccountFollowUps (line 165) | async function processAccountFollowUps({ function getRetryAtFromRateLimitError (line 241) | function getRetryAtFromRateLimitError( function processFollowUpsForType (line 262) | async function processFollowUpsForType({ function getThresholdWithWindow (line 522) | function getThresholdWithWindow(threshold: Date, windowMinutes: number):... function getProcessedFollowUpLedger (line 526) | async function getProcessedFollowUpLedger({ function hasFollowUpBeenProcessed (line 559) | function hasFollowUpBeenProcessed({ function processLoadedFollowUpReminderAccount (line 571) | async function processLoadedFollowUpReminderAccount({ function getFollowUpReminderEligibilityWhere (line 621) | function getFollowUpReminderEligibilityWhere() { function isMessageFromUser (line 631) | function isMessageFromUser( FILE: apps/web/app/api/follow-up-reminders/route.ts constant FOLLOW_UP_REMINDER_ACCOUNT_PATH (line 15) | const FOLLOW_UP_REMINDER_ACCOUNT_PATH = "/api/follow-up-reminders/account"; constant FOLLOW_UP_REMINDER_ACCOUNT_TOPIC (line 16) | const FOLLOW_UP_REMINDER_ACCOUNT_TOPIC = "follow-up-reminders-account"; constant INTERNAL_DISPATCH_CONCURRENCY (line 17) | const INTERNAL_DISPATCH_CONCURRENCY = 10; constant QUEUE_ENQUEUE_CONCURRENCY (line 18) | const QUEUE_ENQUEUE_CONCURRENCY = 10; constant GET (line 20) | const GET = withError("follow-up-reminders", async (request) => { constant POST (line 36) | const POST = withError("follow-up-reminders", async (request) => { function triggerFollowUpReminderFanOut (line 52) | async function triggerFollowUpReminderFanOut(logger: Logger) { function dispatchFollowUpReminderAccounts (line 72) | async function dispatchFollowUpReminderAccounts( function dispatchFollowUpReminderAccountsToQueue (line 104) | async function dispatchFollowUpReminderAccountsToQueue({ function dispatchFollowUpReminderAccountsInternally (line 147) | async function dispatchFollowUpReminderAccountsInternally({ function dispatchFollowUpReminderAccount (line 184) | async function dispatchFollowUpReminderAccount({ FILE: apps/web/app/api/google/calendar/auth-url/route.ts type GetCalendarAuthUrlResponse (line 11) | type GetCalendarAuthUrlResponse = { url: string }; constant GET (line 31) | const GET = withEmailAccount( FILE: apps/web/app/api/google/calendar/callback/route.ts constant GET (line 5) | const GET = withError("google/calendar/callback", async (request) => { FILE: apps/web/app/api/google/contacts/route.ts type ContactsQuery (line 11) | type ContactsQuery = z.infer; type ContactsResponse (line 12) | type ContactsResponse = Awaited>; function getContacts (line 14) | async function getContacts(client: people_v1.People, query: string) { constant GET (line 19) | const GET = withEmailAccount("google/contacts", async (request) => { FILE: apps/web/app/api/google/drive/auth-url/route.ts type GetDriveAuthUrlResponse (line 13) | type GetDriveAuthUrlResponse = { url: string }; constant GET (line 15) | const GET = withEmailAccount( function getAccessLevel (line 53) | function getAccessLevel(params: URLSearchParams): GoogleDriveAccessLevel { FILE: apps/web/app/api/google/drive/callback/route.ts constant GET (line 5) | const GET = withError("google/drive/callback", async (request) => { FILE: apps/web/app/api/google/linking/auth-url/route.ts type GetAuthLinkUrlResponse (line 11) | type GetAuthLinkUrlResponse = { url: string }; constant GET (line 28) | const GET = withAuth("google/linking/auth-url", async (request) => { FILE: apps/web/app/api/google/linking/callback/route.ts constant GET (line 20) | const GET = withError("google/linking/callback", async (request) => { type GoogleTokens (line 291) | interface GoogleTokens { function updateGoogleAccountTokens (line 300) | async function updateGoogleAccountTokens( FILE: apps/web/app/api/google/webhook/process-history-item.test.ts function getDefaultEmailAccount (line 147) | function getDefaultEmailAccount() { FILE: apps/web/app/api/google/webhook/process-history-item.ts function processHistoryItem (line 11) | async function processHistoryItem( FILE: apps/web/app/api/google/webhook/process-history.ts function processHistoryForUser (line 26) | async function processHistoryForUser( function processHistory (line 199) | async function processHistory(options: ProcessHistoryOptions, logger: Lo... function updateLastSyncedHistoryId (line 273) | async function updateLastSyncedHistoryId({ function isHistoryIdExpiredError (line 311) | function isHistoryIdExpiredError(error: unknown): boolean { function fetchGmailHistoryResilient (line 328) | async function fetchGmailHistoryResilient({ FILE: apps/web/app/api/google/webhook/process-label-added-event.ts function handleLabelAddedEvent (line 25) | async function handleLabelAddedEvent( FILE: apps/web/app/api/google/webhook/process-label-removed-event.ts constant SYSTEM_LABELS (line 21) | const SYSTEM_LABELS = [ function handleLabelRemovedEvent (line 32) | async function handleLabelRemovedEvent( function learnFromRemovedLabel (line 156) | async function learnFromRemovedLabel({ function undoSpamLearning (line 204) | async function undoSpamLearning({ FILE: apps/web/app/api/google/webhook/route.ts constant POST (line 13) | const POST = withError("google/webhook", async (request) => { function processWebhookAsync (line 52) | async function processWebhookAsync( function decodeHistoryId (line 79) | function decodeHistoryId(body: { message?: { data?: string } }) { FILE: apps/web/app/api/google/webhook/types.ts type HistoryEventType (line 12) | type HistoryEventType = type ProcessHistoryOptions (line 15) | type ProcessHistoryOptions = { FILE: apps/web/app/api/health/route.ts constant HEALTH_CHECK_WINDOW_MINUTES (line 7) | const HEALTH_CHECK_WINDOW_MINUTES = 5; constant GET (line 9) | const GET = withError("health", async (request) => { FILE: apps/web/app/api/knowledge/route.ts type GetKnowledgeResponse (line 6) | type GetKnowledgeResponse = { constant GET (line 10) | const GET = withEmailAccount("knowledge", async (request) => { FILE: apps/web/app/api/labels/create/route.ts constant POST (line 12) | const POST = withEmailProvider(async (request) => { FILE: apps/web/app/api/labels/route.ts type UnifiedLabel (line 4) | type UnifiedLabel = { type LabelsResponse (line 16) | type LabelsResponse = { constant GET (line 22) | const GET = withEmailProvider( FILE: apps/web/app/api/lemon-squeezy/webhook/route.ts constant POST (line 25) | const POST = withError("lemon-squeezy/webhook", async (request) => { function getPayload (line 112) | async function getPayload(request: Request): Promise { function subscriptionCreated (line 132) | async function subscriptionCreated({ function subscriptionPlanChanged (line 175) | async function subscriptionPlanChanged({ function handleSubscriptionCreated (line 220) | async function handleSubscriptionCreated( function subscriptionUpdated (line 262) | async function subscriptionUpdated({ function subscriptionCancelled (line 301) | async function subscriptionCancelled({ function subscriptionPaymentSuccess (line 343) | async function subscriptionPaymentSuccess({ function getEmailFromPremium (line 383) | function getEmailFromPremium(premium: { FILE: apps/web/app/api/lemon-squeezy/webhook/types.ts type Payload (line 1) | interface Payload { type EventName (line 6) | type EventName = type Meta (line 21) | interface Meta { type Data (line 27) | interface Data { type Attributes (line 35) | interface Attributes { type FirstSubscriptionItem (line 66) | interface FirstSubscriptionItem { type Urls (line 76) | interface Urls { type Relationships (line 80) | interface Relationships { type Store (line 91) | interface Store { type Links (line 95) | interface Links { type Customer (line 100) | interface Customer { type Links2 (line 104) | interface Links2 { type Order (line 109) | interface Order { type Links3 (line 113) | interface Links3 { type OrderItem (line 118) | interface OrderItem { type Links4 (line 122) | interface Links4 { type Product (line 127) | interface Product { type Links5 (line 131) | interface Links5 { type Variant (line 136) | interface Variant { type Links6 (line 140) | interface Links6 { type SubscriptionItems (line 145) | interface SubscriptionItems { type Links7 (line 149) | interface Links7 { type SubscriptionInvoices (line 154) | interface SubscriptionInvoices { type Links8 (line 158) | interface Links8 { type Links9 (line 163) | interface Links9 { type FirstOrderItem (line 167) | interface FirstOrderItem { FILE: apps/web/app/api/mcp/[integration]/auth-url/route.ts type GetMcpAuthUrlResponse (line 17) | type GetMcpAuthUrlResponse = { url: string }; constant GET (line 19) | const GET = withEmailAccount( FILE: apps/web/app/api/mcp/[integration]/callback/route.ts constant GET (line 17) | const GET = withError("mcp/callback", async (request, { params }) => { FILE: apps/web/app/api/mcp/integrations/route.ts type GetIntegrationsResponse (line 6) | type GetIntegrationsResponse = Awaited>; constant GET (line 8) | const GET = withEmailAccount("mcp/integrations", async (request) => { function getData (line 13) | async function getData(emailAccountId: string) { FILE: apps/web/app/api/meeting-briefs/route.ts constant GET (line 12) | const GET = withError("meeting-briefs", async (request) => { constant POST (line 23) | const POST = withError("meeting-briefs", async (request) => { function processAllMeetingBriefings (line 36) | async function processAllMeetingBriefings(logger: Logger) { FILE: apps/web/app/api/messages/attachment/route.ts constant GET (line 5) | const GET = withEmailProvider("messages/attachment", async (request) => { FILE: apps/web/app/api/messages/batch/route.ts type MessagesBatchResponse (line 7) | type MessagesBatchResponse = { function getMessagesBatch (line 11) | async function getMessagesBatch({ constant GET (line 33) | const GET = withEmailProvider("messages/batch", async (request) => { FILE: apps/web/app/api/messages/route.ts type MessagesResponse (line 9) | type MessagesResponse = Awaited>; constant GET (line 11) | const GET = withEmailProvider("messages", async (request) => { function getMessages (line 32) | async function getMessages({ FILE: apps/web/app/api/messages/validation.ts type MessageQuery (line 7) | type MessageQuery = z.infer; type MessagesBatchQuery (line 16) | type MessagesBatchQuery = z.infer; type AttachmentQuery (line 24) | type AttachmentQuery = z.infer; FILE: apps/web/app/api/organizations/[organizationId]/executed-rules-count/route.ts type GetExecutedRulesCountResponse (line 6) | type GetExecutedRulesCountResponse = Awaited< constant GET (line 10) | const GET = withAuth( function getExecutedRulesCount (line 24) | async function getExecutedRulesCount({ FILE: apps/web/app/api/organizations/[organizationId]/members/route.ts type OrganizationMembersResponse (line 6) | type OrganizationMembersResponse = Awaited< constant GET (line 10) | const GET = withAuth( function getOrganizationMembers (line 31) | async function getOrganizationMembers({ FILE: apps/web/app/api/organizations/[organizationId]/route.ts type OrganizationResponse (line 6) | type OrganizationResponse = Awaited>; constant GET (line 8) | const GET = withAuth( function getOrganization (line 22) | async function getOrganization({ organizationId }: { organizationId: str... FILE: apps/web/app/api/organizations/[organizationId]/stats/email-buckets/route.ts constant EMAIL_BUCKETS (line 8) | const EMAIL_BUCKETS = [ type OrgEmailBucketsResponse (line 16) | type OrgEmailBucketsResponse = Awaited< constant GET (line 20) | const GET = withAuth( function getEmailVolumeBuckets (line 44) | async function getEmailVolumeBuckets({ FILE: apps/web/app/api/organizations/[organizationId]/stats/rules-buckets/route.ts constant RULES_BUCKETS (line 8) | const RULES_BUCKETS = [ type OrgRulesBucketsResponse (line 16) | type OrgRulesBucketsResponse = Awaited< constant GET (line 20) | const GET = withAuth( function getExecutedRulesBuckets (line 44) | async function getExecutedRulesBuckets({ FILE: apps/web/app/api/organizations/[organizationId]/stats/totals/route.ts type OrgTotalsResponse (line 8) | type OrgTotalsResponse = Awaited>; constant GET (line 10) | const GET = withAuth( function getTotals (line 34) | async function getTotals({ FILE: apps/web/app/api/organizations/[organizationId]/stats/types.ts type OrgStatsParams (line 7) | type OrgStatsParams = z.infer; FILE: apps/web/app/api/outlook/calendar/auth-url/route.ts type GetCalendarAuthUrlResponse (line 10) | type GetCalendarAuthUrlResponse = { url: string }; constant GET (line 23) | const GET = withEmailAccount(async (request) => { FILE: apps/web/app/api/outlook/calendar/callback/route.ts constant GET (line 5) | const GET = withError("outlook/calendar/callback", async (request) => { FILE: apps/web/app/api/outlook/drive/auth-url/route.ts type GetDriveAuthUrlResponse (line 10) | type GetDriveAuthUrlResponse = { url: string }; constant GET (line 12) | const GET = withEmailAccount(async (request) => { FILE: apps/web/app/api/outlook/drive/callback/route.ts constant GET (line 5) | const GET = withError("outlook/drive/callback", async (request) => { FILE: apps/web/app/api/outlook/linking/auth-url/route.ts type GetOutlookAuthLinkUrlResponse (line 11) | type GetOutlookAuthLinkUrlResponse = { url: string }; constant GET (line 22) | const GET = withAuth("outlook/linking/auth-url", async (request) => { FILE: apps/web/app/api/outlook/linking/callback/route.ts constant GET (line 28) | const GET = withError("outlook/linking/callback", async (request) => { type MicrosoftTokens (line 389) | interface MicrosoftTokens { constant MICROSOFT_LINKING_SCOPES_TO_VALIDATE (line 398) | const MICROSOFT_LINKING_SCOPES_TO_VALIDATE = OUTLOOK_SCOPES.filter( function assertMicrosoftLinkingConsent (line 405) | function assertMicrosoftLinkingConsent(params: { function parseMicrosoftExpiresAt (line 447) | function parseMicrosoftExpiresAt(tokens: MicrosoftTokens): Date | null { function updateMicrosoftAccountTokens (line 461) | async function updateMicrosoftAccountTokens( function handleMicrosoftOAuthAuthorizeError (line 490) | function handleMicrosoftOAuthAuthorizeError(params: { function validateMicrosoftOAuthErrorState (line 532) | function validateMicrosoftOAuthErrorState(params: { FILE: apps/web/app/api/outlook/watch/all/route.ts constant GET (line 12) | const GET = withError("outlook/watch/all", async (request) => { constant POST (line 23) | const POST = withError("outlook/watch/all", async (request) => { function watchAllEmails (line 34) | async function watchAllEmails(logger: Logger) { FILE: apps/web/app/api/outlook/watch/route.ts constant GET (line 6) | const GET = withAuth("outlook/watch", async (request) => { FILE: apps/web/app/api/outlook/webhook/learn-label-removal.ts function learnFromOutlookLabelRemoval (line 8) | async function learnFromOutlookLabelRemoval({ function getResolvedLabelIdsByRuleAndName (line 140) | async function getResolvedLabelIdsByRuleAndName( function resolveActionLabelIds (line 206) | function resolveActionLabelIds({ FILE: apps/web/app/api/outlook/webhook/process-history.ts function processHistoryForUser (line 19) | async function processHistoryForUser({ FILE: apps/web/app/api/outlook/webhook/route.ts constant POST (line 14) | const POST = withError("outlook/webhook", async (request) => { function processNotificationsAsync (line 90) | async function processNotificationsAsync( FILE: apps/web/app/api/outlook/webhook/types.ts type OutlookResourceData (line 27) | type OutlookResourceData = z.infer; FILE: apps/web/app/api/referrals/code/route.ts type GetReferralCodeResponse (line 5) | type GetReferralCodeResponse = Awaited< constant GET (line 9) | const GET = withAuth("referrals/code", async (request) => { FILE: apps/web/app/api/referrals/stats/route.ts type GetReferralStatsResponse (line 7) | type GetReferralStatsResponse = Awaited< function getReferralStats (line 11) | async function getReferralStats(userId: string) { constant GET (line 31) | const GET = withAuth("referrals/stats", async (request) => { FILE: apps/web/app/api/reply-tracker/disable-unused-auto-draft/disable-unused-auto-drafts.ts constant MAX_DRAFTS_TO_CHECK (line 7) | const MAX_DRAFTS_TO_CHECK = 10; function disableUnusedAutoDrafts (line 13) | async function disableUnusedAutoDrafts(logger: Logger) { function findAutoDraftActions (line 87) | async function findAutoDraftActions() { function findExecutedDraftActions (line 105) | async function findExecutedDraftActions(ruleIds: string[]) { function deleteAutoDraftActions (line 125) | async function deleteAutoDraftActions(actionIds: string[]) { FILE: apps/web/app/api/reply-tracker/disable-unused-auto-draft/route.ts constant POST (line 9) | const POST = withError( FILE: apps/web/app/api/resend/digest/all/route.ts constant RESEND_DIGEST_TOPIC (line 12) | const RESEND_DIGEST_TOPIC = "resend-digest"; constant GET (line 14) | const GET = withError("cron/resend/digest/all", async (request) => { constant POST (line 25) | const POST = withError("cron/resend/digest/all", async (request) => { function sendDigestAllUpdate (line 38) | async function sendDigestAllUpdate(logger: Logger) { FILE: apps/web/app/api/resend/digest/queue/route.ts constant POST (line 6) | const POST = createForwardingQueueHandler({ FILE: apps/web/app/api/resend/digest/route.ts type SendEmailResult (line 29) | type SendEmailResult = { constant GET (line 34) | const GET = withEmailAccount("resend/digest", async (request) => { constant POST (line 49) | const POST = withError( function getDigestSchedule (line 84) | async function getDigestSchedule({ function sendEmail (line 103) | async function sendEmail({ FILE: apps/web/app/api/resend/digest/validation.ts type StoredDigestContent (line 4) | type StoredDigestContent = z.infer; type Digest (line 16) | type Digest = z.infer; FILE: apps/web/app/api/resend/summary/all/route.ts constant RESEND_SUMMARY_TOPIC (line 18) | const RESEND_SUMMARY_TOPIC = "resend-summary"; constant GET (line 20) | const GET = withError("cron/resend/summary/all", async (request) => { constant POST (line 31) | const POST = withError("cron/resend/summary/all", async (request) => { function sendSummaryAllUpdate (line 44) | async function sendSummaryAllUpdate(logger: Logger) { FILE: apps/web/app/api/resend/summary/queue/route.ts constant POST (line 6) | const POST = createForwardingQueueHandler({ FILE: apps/web/app/api/resend/summary/route.ts constant GET (line 19) | const GET = withEmailAccount("resend/summary", async (request) => { constant POST (line 34) | const POST = withError("resend/summary", async (request) => { function sendEmail (line 72) | async function sendEmail({ FILE: apps/web/app/api/resend/summary/validation.ts type SendSummaryEmailBody (line 7) | type SendSummaryEmailBody = z.infer; FILE: apps/web/app/api/scheduled-actions/execute/route.ts constant POST (line 16) | const POST = withError( FILE: apps/web/app/api/slack/auth-url/route.ts type GetSlackAuthUrlResponse (line 16) | type GetSlackAuthUrlResponse = { constant GET (line 21) | const GET = withEmailAccount("slack/auth-url", async (request) => { function getAuthUrl (line 53) | function getAuthUrl({ emailAccountId }: { emailAccountId: string }) { function findOrgMateWorkspace (line 73) | async function findOrgMateWorkspace( FILE: apps/web/app/api/slack/callback/route.ts constant GET (line 4) | const GET = withError("slack/callback", async (request) => { FILE: apps/web/app/api/slack/commands/route.ts constant POST (line 10) | const POST = withError("slack/commands", async (request) => { FILE: apps/web/app/api/slack/events/route.test.ts function createRequest (line 65) | function createRequest({ FILE: apps/web/app/api/slack/events/route.ts constant POST (line 14) | const POST = withError("slack/events", async (request) => { FILE: apps/web/app/api/sso/signin/route.ts type GetSsoSignInParams (line 12) | type GetSsoSignInParams = z.infer; type GetSsoSignInResponse (line 13) | type GetSsoSignInResponse = { constant GET (line 18) | const GET = withError("sso/signin", async (request) => { FILE: apps/web/app/api/stripe/success/route.ts constant GET (line 8) | const GET = withAuth("stripe/success", async (request) => { FILE: apps/web/app/api/stripe/webhook/route.ts constant POST (line 21) | const POST = withError("stripe/webhook", async (request) => { function processEvent (line 86) | async function processEvent(event: Stripe.Event, logger: Logger) { function handleReferralCompletion (line 128) | async function handleReferralCompletion( function trackEvent (line 174) | async function trackEvent(email: string | undefined, event: Stripe.Event) { function trackBillingMilestones (line 183) | async function trackBillingMilestones( function getCustomerEmail (line 208) | async function getCustomerEmail(customerId: string) { FILE: apps/web/app/api/teams/events/route.ts constant POST (line 7) | const POST = withError("teams/events", async (request) => { FILE: apps/web/app/api/telegram/events/route.ts constant POST (line 7) | const POST = withError("telegram/events", async (request) => { FILE: apps/web/app/api/threads/[id]/route.ts type ThreadQuery (line 7) | type ThreadQuery = z.infer; type ThreadResponse (line 8) | type ThreadResponse = Awaited>; function getThread (line 10) | async function getThread( constant GET (line 26) | const GET = withEmailProvider( FILE: apps/web/app/api/threads/basic/route.ts type GetThreadsResponse (line 5) | type GetThreadsResponse = { constant GET (line 11) | const GET = withEmailProvider("threads/basic", async (request) => { FILE: apps/web/app/api/threads/batch/route.ts type ThreadsBatchResponse (line 7) | type ThreadsBatchResponse = { constant THREAD_FETCH_CONCURRENCY (line 12) | const THREAD_FETCH_CONCURRENCY = 5; constant GET (line 14) | const GET = withEmailProvider("threads/batch", async (request) => { FILE: apps/web/app/api/threads/route.ts constant GET (line 11) | const GET = withEmailProvider( type ThreadsResponse (line 61) | type ThreadsResponse = Awaited>; function getThreads (line 63) | async function getThreads({ FILE: apps/web/app/api/threads/validation.ts type ThreadsQuery (line 15) | type ThreadsQuery = z.infer; FILE: apps/web/app/api/unsubscribe/route.ts constant GET (line 7) | const GET = withError("unsubscribe", async (request) => { constant POST (line 38) | const POST = withError("unsubscribe", async (request) => { function getTokenFromRequest (line 113) | async function getTokenFromRequest(request: Request) { function getTokenFromSearchParams (line 118) | function getTokenFromSearchParams(request: Request) { function getTokenFromFormBody (line 123) | async function getTokenFromFormBody(request: Request) { function getValidEmailToken (line 131) | async function getValidEmailToken(token: string) { function createUnsubscribeResponse (line 143) | function createUnsubscribeResponse( function wantsHtml (line 162) | function wantsHtml(request: Request) { function getHtmlHeaders (line 167) | function getHtmlHeaders() { function renderConfirmationPage (line 176) | function renderConfirmationPage(token: string) { function renderStatusPage (line 239) | function renderStatusPage(title: string, message: string) { FILE: apps/web/app/api/user/api-keys/route.ts type ApiKeyResponse (line 5) | type ApiKeyResponse = Awaited>; function getApiKeys (line 7) | async function getApiKeys({ constant GET (line 30) | const GET = withEmailAccount("user/api-keys", async (request) => { FILE: apps/web/app/api/user/automation-jobs/route.ts type GetAutomationJobResponse (line 5) | type GetAutomationJobResponse = Awaited>; constant GET (line 7) | const GET = withEmailAccount("user/automation-jobs", async (request) => { function getData (line 13) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/calendar/upcoming-events/route.ts type GetCalendarUpcomingEventsResponse (line 6) | type GetCalendarUpcomingEventsResponse = Awaited< constant GET (line 10) | const GET = withEmailAccount( function getData (line 23) | async function getData({ FILE: apps/web/app/api/user/calendars/route.ts type GetCalendarsResponse (line 5) | type GetCalendarsResponse = Awaited>; constant GET (line 7) | const GET = withEmailAccount("user/calendars", async (request) => { function getData (line 14) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/categories/route.ts type UserCategoriesResponse (line 5) | type UserCategoriesResponse = Awaited>; function getCategories (line 7) | async function getCategories({ emailAccountId }: { emailAccountId: strin... constant GET (line 12) | const GET = withEmailAccount("user/categories", async (request) => { FILE: apps/web/app/api/user/categorize/senders/batch/handle-batch-validation.ts type AiCategorizeSenders (line 12) | type AiCategorizeSenders = z.infer; type Sender (line 13) | type Sender = z.infer; FILE: apps/web/app/api/user/categorize/senders/batch/handle-batch.ts function handleBatchRequest (line 16) | async function handleBatchRequest( function handleBatchInternal (line 31) | async function handleBatchInternal(request: RequestWithLogger) { FILE: apps/web/app/api/user/categorize/senders/batch/route.ts constant POST (line 7) | const POST = withError( FILE: apps/web/app/api/user/categorize/senders/batch/simple/route.ts constant POST (line 11) | const POST = withError( FILE: apps/web/app/api/user/categorize/senders/categorized/route.ts type CategorizedSendersResponse (line 6) | type CategorizedSendersResponse = Awaited< function getCategorizedSenders (line 10) | async function getCategorizedSenders({ constant GET (line 39) | const GET = withEmailAccount( FILE: apps/web/app/api/user/categorize/senders/progress/route.ts type CategorizeProgress (line 5) | type CategorizeProgress = Awaited< function getCategorizeProgress (line 9) | async function getCategorizeProgress({ constant GET (line 18) | const GET = withEmailAccount( FILE: apps/web/app/api/user/categorize/senders/types.ts type SenderMap (line 3) | type SenderMap = Map; FILE: apps/web/app/api/user/categorize/senders/uncategorized/get-senders.ts function getSenders (line 3) | async function getSenders({ FILE: apps/web/app/api/user/categorize/senders/uncategorized/get-uncategorized-senders.ts constant MAX_ITERATIONS (line 6) | const MAX_ITERATIONS = 200; function getUncategorizedSenders (line 8) | async function getUncategorizedSenders({ FILE: apps/web/app/api/user/categorize/senders/uncategorized/route.ts type UncategorizedSendersResponse (line 6) | type UncategorizedSendersResponse = { constant GET (line 11) | const GET = withEmailAccount( FILE: apps/web/app/api/user/cold-email/route.ts constant LIMIT (line 10) | const LIMIT = 50; type ColdEmailsResponse (line 12) | type ColdEmailsResponse = Awaited>; function getColdEmails (line 14) | async function getColdEmails( constant GET (line 72) | const GET = withEmailAccount("user/cold-email", async (request) => { FILE: apps/web/app/api/user/complete-registration/route.ts constant POST (line 12) | const POST = withError("complete-registration", async (request) => { function getIp (line 65) | function getIp(headersList: ReadonlyHeaders) { function storePosthogSignupEvent (line 76) | async function storePosthogSignupEvent( FILE: apps/web/app/api/user/debug/follow-up/route.ts type DebugFollowUpResponse (line 6) | type DebugFollowUpResponse = Awaited< constant GET (line 10) | const GET = withEmailAccount("user/debug/follow-up", async (request) => { function getFollowUpDebugData (line 16) | async function getFollowUpDebugData({ FILE: apps/web/app/api/user/debug/memories/route.ts type DebugMemoriesResponse (line 5) | type DebugMemoriesResponse = Awaited< constant GET (line 9) | const GET = withEmailAccount("user/debug/memories", async (request) => { function getMemoriesDebugData (line 15) | async function getMemoriesDebugData({ FILE: apps/web/app/api/user/debug/rules/route.ts type DebugRulesResponse (line 5) | type DebugRulesResponse = Awaited>; constant GET (line 7) | const GET = withEmailAccount("user/debug/rules", async (request) => { function getDebugRules (line 13) | async function getDebugRules({ emailAccountId }: { emailAccountId: strin... FILE: apps/web/app/api/user/digest-schedule/route.ts type GetDigestScheduleResponse (line 5) | type GetDigestScheduleResponse = Awaited< constant GET (line 9) | const GET = withEmailAccount("user/digest-schedule", async (request) => { function getDigestSchedule (line 16) | async function getDigestSchedule({ FILE: apps/web/app/api/user/digest-settings/route.ts constant SUPPORTED_SYSTEM_TYPES (line 8) | const SUPPORTED_SYSTEM_TYPES = [ type GetDigestSettingsResponse (line 21) | type GetDigestSettingsResponse = Awaited< constant GET (line 25) | const GET = withEmailAccount("user/digest-settings", async (request) => { function getDigestSettings (line 32) | async function getDigestSettings({ FILE: apps/web/app/api/user/draft-actions/route.ts type DraftActionsResponse (line 6) | type DraftActionsResponse = Awaited>; constant GET (line 8) | const GET = withEmailAccount("user/draft-actions", async (request) => { function getData (line 16) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/drive/connections/route.ts type GetDriveConnectionsResponse (line 5) | type GetDriveConnectionsResponse = Awaited>; constant GET (line 7) | const GET = withEmailAccount( function getData (line 17) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/drive/filings/route.ts type GetFilingsQuery (line 16) | type GetFilingsQuery = z.infer; type GetFilingsResponse (line 18) | type GetFilingsResponse = Awaited>; constant GET (line 20) | const GET = withEmailAccount(async (request) => { function getFilings (line 33) | async function getFilings({ FILE: apps/web/app/api/user/drive/folders/[folderId]/route.ts type GetSubfoldersQuery (line 10) | type GetSubfoldersQuery = z.infer; type GetSubfoldersResponse (line 12) | type GetSubfoldersResponse = Awaited>; constant GET (line 14) | const GET = withEmailAccount(async (request, context) => { function getData (line 34) | async function getData({ FILE: apps/web/app/api/user/drive/folders/route.ts type GetDriveFoldersResponse (line 9) | type GetDriveFoldersResponse = Awaited>; type FolderItem (line 10) | type FolderItem = GetDriveFoldersResponse["availableFolders"][number] & { type SavedFolder (line 13) | type SavedFolder = GetDriveFoldersResponse["savedFolders"][number]; constant GET (line 15) | const GET = withEmailAccount(async (request) => { function getData (line 23) | async function getData({ FILE: apps/web/app/api/user/drive/preview/attachments/route.ts type AttachmentPreviewItem (line 11) | type AttachmentPreviewItem = { type GetAttachmentsPreviewResponse (line 23) | type GetAttachmentsPreviewResponse = Awaited< constant MAX_MESSAGES_TO_FETCH (line 27) | const MAX_MESSAGES_TO_FETCH = 20; constant MAX_ATTACHMENTS (line 28) | const MAX_ATTACHMENTS = 3; constant GET (line 30) | const GET = withEmailProvider(async (request) => { function getAttachmentsData (line 42) | async function getAttachmentsData({ function extractAttachmentPreviews (line 97) | function extractAttachmentPreviews( FILE: apps/web/app/api/user/drive/preview/route.ts type FilingPreviewResult (line 14) | type FilingPreviewResult = { type GetFilingPreviewResponse (line 23) | type GetFilingPreviewResponse = Awaited< constant MAX_MESSAGES_TO_FETCH (line 27) | const MAX_MESSAGES_TO_FETCH = 20; constant MAX_FILINGS (line 28) | const MAX_FILINGS = 3; constant GET (line 30) | const GET = withEmailProvider(async (request) => { function getPreviewData (line 42) | async function getPreviewData({ function findMessagesWithFilableAttachments (line 150) | function findMessagesWithFilableAttachments( function fileAttachments (line 168) | async function fileAttachments({ FILE: apps/web/app/api/user/drive/source-items/[folderId]/route.ts type GetDriveSourceChildrenQuery (line 11) | type GetDriveSourceChildrenQuery = z.infer< type GetDriveSourceChildrenResponse (line 15) | type GetDriveSourceChildrenResponse = Awaited< constant GET (line 19) | const GET = withEmailAccount(async (request, context) => { function getData (line 38) | async function getData({ FILE: apps/web/app/api/user/drive/source-items/route.ts type GetDriveSourceItemsResponse (line 12) | type GetDriveSourceItemsResponse = Awaited>; constant GET (line 15) | const GET = withEmailAccount(async (request) => { function getData (line 26) | async function getData({ FILE: apps/web/app/api/user/email-account/route.ts type EmailAccountFullResponse (line 8) | type EmailAccountFullResponse = Awaited< function getEmailAccount (line 12) | async function getEmailAccount({ constant GET (line 64) | const GET = withEmailAccount( FILE: apps/web/app/api/user/email-accounts/route.ts type GetEmailAccountsResponse (line 10) | type GetEmailAccountsResponse = Awaited< function getEmailAccounts (line 14) | async function getEmailAccounts({ userId }: { userId: string }) { constant GET (line 64) | const GET = withAuth("user/email-accounts", async (request) => { FILE: apps/web/app/api/user/executed-rules/batch/route.ts type BatchExecutedRulesResponse (line 8) | type BatchExecutedRulesResponse = Awaited>; function getData (line 10) | async function getData({ constant GET (line 48) | const GET = withEmailAccount( FILE: apps/web/app/api/user/executed-rules/history/route.ts constant LIMIT (line 8) | const LIMIT = 50; type GetExecutedRulesResponse (line 10) | type GetExecutedRulesResponse = Awaited< constant GET (line 14) | const GET = withEmailAccount( function getExecutedRules (line 33) | async function getExecutedRules({ FILE: apps/web/app/api/user/folders/route.ts type GetFoldersResponse (line 6) | type GetFoldersResponse = Awaited>; constant GET (line 8) | const GET = withEmailProvider("user/folders", async (request) => { function getFolders (line 22) | async function getFolders({ emailProvider }: { emailProvider: EmailProvi... FILE: apps/web/app/api/user/group/[groupId]/items/route.ts type GroupItemsResponse (line 5) | type GroupItemsResponse = Awaited>; function getGroupItems (line 7) | async function getGroupItems({ constant GET (line 26) | const GET = withEmailAccount( FILE: apps/web/app/api/user/group/[groupId]/rules/route.ts type GroupRulesResponse (line 6) | type GroupRulesResponse = Awaited>; function getGroupRules (line 8) | async function getGroupRules({ constant GET (line 31) | const GET = withEmailAccount( FILE: apps/web/app/api/user/group/route.ts type GroupsResponse (line 5) | type GroupsResponse = Awaited>; function getGroups (line 7) | async function getGroups({ emailAccountId }: { emailAccountId: string }) { constant GET (line 20) | const GET = withEmailAccount("user/group", async (request) => { FILE: apps/web/app/api/user/labels/route.ts type UserLabelsResponse (line 5) | type UserLabelsResponse = Awaited>; function getLabels (line 7) | async function getLabels(options: { emailAccountId: string }) { constant GET (line 15) | const GET = withEmailAccount("user/labels", async (request) => { FILE: apps/web/app/api/user/me/route.ts type UserResponse (line 7) | type UserResponse = Awaited> | null; function getUser (line 9) | async function getUser({ constant GET (line 82) | const GET = withError("user/me", async (request) => { FILE: apps/web/app/api/user/meeting-briefs/history/route.ts type GetMeetingBriefsHistoryResponse (line 5) | type GetMeetingBriefsHistoryResponse = Awaited< constant GET (line 9) | const GET = withEmailAccount( function getData (line 18) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/meeting-briefs/route.ts type GetMeetingBriefsSettingsResponse (line 5) | type GetMeetingBriefsSettingsResponse = Awaited< constant GET (line 9) | const GET = withEmailAccount("user/meeting-briefs", async (request) => { function getData (line 15) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/messaging-channels/[channelId]/targets/route.ts type GetChannelTargetsResponse (line 8) | type GetChannelTargetsResponse = Awaited>; constant GET (line 10) | const GET = withEmailAccount( function getData (line 24) | async function getData({ FILE: apps/web/app/api/user/messaging-channels/route.ts type GetMessagingChannelsResponse (line 8) | type GetMessagingChannelsResponse = Awaited>; constant GET (line 10) | const GET = withEmailAccount( function getData (line 19) | async function getData({ emailAccountId }: { emailAccountId: string }) { function getAvailableProviders (line 52) | function getAvailableProviders(): MessagingProvider[] { FILE: apps/web/app/api/user/no-reply/route.ts type NoReplyResponse (line 7) | type NoReplyResponse = Awaited>; function getNoReply (line 9) | async function getNoReply({ constant GET (line 52) | const GET = withEmailProvider("user/no-reply", async (request) => { FILE: apps/web/app/api/user/organization-membership/route.ts type GetOrganizationMembershipResponse (line 5) | type GetOrganizationMembershipResponse = Awaited< constant GET (line 9) | const GET = withEmailAccount( function getData (line 19) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/persona/route.ts type GetPersonaResponse (line 6) | type GetPersonaResponse = Awaited>; constant GET (line 8) | const GET = withEmailAccount("user/persona", async (request) => { function getData (line 15) | async function getData({ emailAccountId }: { emailAccountId: string }) { FILE: apps/web/app/api/user/rules/[id]/route.ts type RuleResponse (line 9) | type RuleResponse = Awaited>; function getRule (line 11) | async function getRule({ constant GET (line 56) | const GET = withEmailAccount( FILE: apps/web/app/api/user/rules/route.ts type RulesResponse (line 5) | type RulesResponse = Awaited>; function getRules (line 7) | async function getRules({ emailAccountId }: { emailAccountId: string }) { constant GET (line 18) | const GET = withEmailAccount( FILE: apps/web/app/api/user/schedule/[id]/route.ts constant GET (line 5) | const GET = withEmailAccount( FILE: apps/web/app/api/user/settings/multi-account/route.ts type MultiAccountEmailsResponse (line 5) | type MultiAccountEmailsResponse = Awaited< function getMultiAccountEmails (line 9) | async function getMultiAccountEmails({ userId }: { userId: string }) { constant GET (line 45) | const GET = withAuth("user/settings/multi-account", async (request) => { FILE: apps/web/app/api/user/settings/multi-account/validation.ts type SaveMultiAccountPremiumBody (line 12) | type SaveMultiAccountPremiumBody = z.infer< FILE: apps/web/app/api/user/setup-progress/route.ts type GetSetupProgressResponse (line 6) | type GetSetupProgressResponse = Awaited< constant GET (line 10) | const GET = withEmailAccount("user/setup-progress", async (request) => { function getSetupProgress (line 27) | async function getSetupProgress({ FILE: apps/web/app/api/user/stats/by-period/controller.ts type StatsByPeriodResponse (line 7) | type StatsByPeriodResponse = Awaited< function getEmailStatsByPeriod (line 11) | async function getEmailStatsByPeriod( function getStatsByPeriod (line 60) | async function getStatsByPeriod( FILE: apps/web/app/api/user/stats/by-period/route.ts constant GET (line 6) | const GET = withEmailAccount( FILE: apps/web/app/api/user/stats/by-period/validation.ts type StatsByPeriodQuery (line 9) | type StatsByPeriodQuery = z.infer; FILE: apps/web/app/api/user/stats/email-actions/route.ts type EmailActionStatsResponse (line 5) | type EmailActionStatsResponse = Awaited< function getEmailActionStats (line 9) | async function getEmailActionStats({ userEmail }: { userEmail: string }) { constant GET (line 25) | const GET = withEmailAccount( FILE: apps/web/app/api/user/stats/helpers.ts type EmailField (line 3) | type EmailField = "to" | "from" | "fromDomain"; type EmailFieldStatsResult (line 5) | interface EmailFieldStatsResult { function getEmailFieldStats (line 16) | async function getEmailFieldStats({ FILE: apps/web/app/api/user/stats/newsletters/helpers.ts function getAutoArchiveFilters (line 8) | async function getAutoArchiveFilters( function findAutoArchiveFilter (line 27) | function findAutoArchiveFilter( function findNewsletterStatus (line 41) | async function findNewsletterStatus({ function filterNewsletters (line 53) | function filterNewsletters< function isAutoArchiveFilter (line 82) | function isAutoArchiveFilter(filter: EmailFilter, provider: EmailProvide... function isGmailAutoArchiveFilter (line 93) | function isGmailAutoArchiveFilter(filter: EmailFilter): boolean { function isOutlookAutoArchiveFilter (line 101) | function isOutlookAutoArchiveFilter(filter: EmailFilter): boolean { FILE: apps/web/app/api/user/stats/newsletters/route.ts type NewsletterStatsQuery (line 35) | type NewsletterStatsQuery = z.infer; type NewsletterStatsResponse (line 36) | type NewsletterStatsResponse = Awaited< function getTypeFilters (line 40) | function getTypeFilters(types: NewsletterStatsQuery["types"]) { function getEmailMessages (line 70) | async function getEmailMessages( type NewsletterCountResult (line 115) | type NewsletterCountResult = { type NewsletterCountRawResult (line 124) | type NewsletterCountRawResult = { function getNewsletterCounts (line 133) | async function getNewsletterCounts( function getOrderByClause (line 245) | function getOrderByClause( constant GET (line 265) | const GET = withEmailProvider( FILE: apps/web/app/api/user/stats/newsletters/summary/route.ts type NewsletterSummaryResponse (line 5) | type NewsletterSummaryResponse = Awaited< function getNewsletterSummary (line 9) | async function getNewsletterSummary({ constant GET (line 27) | const GET = withEmailAccount( FILE: apps/web/app/api/user/stats/recipients/route.ts type RecipientStatsQuery (line 10) | type RecipientStatsQuery = z.infer; type RecipientsResponse (line 12) | interface RecipientsResponse { function getRecipientStatistics (line 16) | async function getRecipientStatistics( function getMostSentTo (line 34) | async function getMostSentTo({ constant GET (line 50) | const GET = withEmailAccount( FILE: apps/web/app/api/user/stats/response-time/calculate.ts type ResponseTimeEntry (line 5) | type ResponseTimeEntry = Pick< type SummaryStats (line 15) | interface SummaryStats { type DistributionStats (line 25) | interface DistributionStats { function calculateMedian (line 34) | function calculateMedian(values: number[]): number { function calculateAverage (line 44) | function calculateAverage(values: number[]): number { function calculateWithin1Hour (line 49) | function calculateWithin1Hour(values: number[]): number { function calculateResponseTimes (line 55) | async function calculateResponseTimes( function calculateSummaryStats (line 126) | function calculateSummaryStats( function calculateDistribution (line 146) | function calculateDistribution( FILE: apps/web/app/api/user/stats/response-time/controller.ts constant MAX_SENT_MESSAGES (line 17) | const MAX_SENT_MESSAGES = 50; type TrendEntry (line 19) | interface TrendEntry { type ResponseTimeResponse (line 26) | type ResponseTimeResponse = { function getResponseTimeStats (line 34) | async function getResponseTimeStats({ function calculateTrend (line 143) | function calculateTrend(responseTimes: ResponseTimeEntry[]): TrendEntry[] { function getEmptyStats (line 170) | function getEmptyStats(): ResponseTimeResponse { FILE: apps/web/app/api/user/stats/response-time/route.ts constant GET (line 6) | const GET = withEmailProvider("response-time-stats", async (request) => { FILE: apps/web/app/api/user/stats/response-time/validation.ts type ResponseTimeQuery (line 7) | type ResponseTimeQuery = z.infer; FILE: apps/web/app/api/user/stats/rule-stats/route.ts type RuleStatsResponse (line 13) | type RuleStatsResponse = Awaited>; function getRuleStats (line 15) | async function getRuleStats({ constant GET (line 64) | const GET = withEmailAccount( FILE: apps/web/app/api/user/stats/sender-emails/route.ts type SenderEmailsQuery (line 15) | type SenderEmailsQuery = z.infer; type SenderEmailsResponse (line 16) | type SenderEmailsResponse = Awaited>; function getSenderEmails (line 18) | async function getSenderEmails( constant GET (line 72) | const GET = withEmailAccount( FILE: apps/web/app/api/user/stats/senders/route.ts type SenderStatsQuery (line 10) | type SenderStatsQuery = z.infer; type SendersResponse (line 12) | interface SendersResponse { function getSenderStatistics (line 20) | async function getSenderStatistics( function getMostReceivedFrom (line 47) | async function getMostReceivedFrom({ function getDomainsMostReceivedFrom (line 66) | async function getDomainsMostReceivedFrom({ constant GET (line 82) | const GET = withEmailAccount("user/stats/senders", async (request) => { FILE: apps/web/app/api/v1/openapi/route.ts constant GET (line 30) | const GET = withError("v1/openapi", async (request) => { function createRegistry (line 64) | function createRegistry() { FILE: apps/web/app/api/v1/rules/[id]/route.ts constant GET (line 12) | const GET = withAccountApiKey( constant PUT (line 32) | const PUT = withAccountApiKey( constant DELETE (line 72) | const DELETE = withAccountApiKey( FILE: apps/web/app/api/v1/rules/request.ts function toRuleWriteInput (line 3) | function toRuleWriteInput(body: RuleRequestBody) { FILE: apps/web/app/api/v1/rules/route.ts constant GET (line 9) | const GET = withAccountApiKey( constant POST (line 27) | const POST = withAccountApiKey( FILE: apps/web/app/api/v1/rules/serializers.ts type ApiRuleRecord (line 31) | type ApiRuleRecord = Prisma.RuleGetPayload<{ select: typeof apiRuleSelec... function serializeRule (line 33) | function serializeRule(rule: ApiRuleRecord) { FILE: apps/web/app/api/v1/rules/validation.ts type RuleRequestBody (line 156) | type RuleRequestBody = z.infer; function addMissingActionFieldIssue (line 158) | function addMissingActionFieldIssue({ FILE: apps/web/app/api/v1/stats/by-period/route.ts constant GET (line 6) | const GET = withStatsApiKey("v1/stats/by-period", async (request) => { FILE: apps/web/app/api/v1/stats/by-period/validation.ts type StatsByPeriodResult (line 28) | type StatsByPeriodResult = z.infer; FILE: apps/web/app/api/v1/stats/response-time/route.ts constant GET (line 6) | const GET = withStatsApiKey( FILE: apps/web/app/api/v1/stats/response-time/validation.ts type ResponseTimeResult (line 40) | type ResponseTimeResult = z.infer; FILE: apps/web/app/api/watch/all/route.ts constant GET (line 10) | const GET = withError("watch/all", async (request) => { constant POST (line 19) | const POST = withError("watch/all", async (request) => { function watchAllEmails (line 28) | async function watchAllEmails(logger: Logger) { FILE: apps/web/app/api/watch/route.ts constant GET (line 6) | const GET = withAuth("watch", async (request) => { FILE: apps/web/app/api/watch/unwatch/route.ts constant POST (line 6) | const POST = withEmailProvider(async (request) => { FILE: apps/web/app/global-error.tsx function GlobalError (line 8) | function GlobalError({ error }: any) { FILE: apps/web/app/layout.tsx function RootLayout (line 127) | async function RootLayout({ FILE: apps/web/app/manifest.ts type ManifestIcon (line 4) | type ManifestIcon = NonNullable[number]; function manifest (line 20) | function manifest(): MetadataRoute.Manifest { FILE: apps/web/app/not-found.tsx function NotFound (line 11) | function NotFound() { FILE: apps/web/app/organizations/invitations/[invitationId]/accept/page.tsx function AcceptInvitationPage (line 19) | function AcceptInvitationPage() { FILE: apps/web/app/robots.ts function robots (line 4) | function robots(): MetadataRoute.Robots { FILE: apps/web/app/sw.ts type WorkerGlobalScope (line 8) | interface WorkerGlobalScope extends SerwistGlobalConfig { FILE: apps/web/app/utm.tsx function setUtmCookies (line 5) | function setUtmCookies() { function UTM (line 31) | function UTM() { FILE: apps/web/components/AccessDenied.tsx function AccessDenied (line 4) | function AccessDenied({ FILE: apps/web/components/AccountSwitcher.tsx function AccountSwitcher (line 26) | function AccountSwitcher() { function AccountSwitcherInternal (line 34) | function AccountSwitcherInternal({ FILE: apps/web/components/ActionButtons.tsx function ActionButtons (line 15) | function ActionButtons({ FILE: apps/web/components/ActionButtonsBulk.tsx function ActionButtonsBulk (line 6) | function ActionButtonsBulk(props: { FILE: apps/web/components/Alert.tsx function AlertBasic (line 6) | function AlertBasic({ function AlertWithButton (line 28) | function AlertWithButton({ function AlertError (line 60) | function AlertError({ FILE: apps/web/components/AppErrorBoundary.tsx function AppErrorBoundary (line 17) | function AppErrorBoundary({ FILE: apps/web/components/Badge.tsx type Color (line 5) | type Color = VariantProps["color"]; FILE: apps/web/components/Banner.tsx type BannerProps (line 3) | interface BannerProps { function Banner (line 8) | function Banner({ title, children }: BannerProps) { FILE: apps/web/components/BulkArchiveCards.tsx function BulkArchiveCards (line 51) | function BulkArchiveCards({ function SenderRow (line 414) | function SenderRow({ function EditCategoryDialog (line 509) | function EditCategoryDialog({ function SenderStatus (line 597) | function SenderStatus({ function ExpandedEmails (line 657) | function ExpandedEmails({ FILE: apps/web/components/Button.tsx type ButtonProps (line 6) | interface ButtonProps FILE: apps/web/components/ButtonCheckbox.tsx function ButtonCheckbox (line 4) | function ButtonCheckbox({ FILE: apps/web/components/ButtonGroup.tsx function ButtonGroup (line 5) | function ButtonGroup(props: { FILE: apps/web/components/ButtonList.tsx type ButtonListItem (line 6) | type ButtonListItem = { type ButtonListProps (line 11) | interface ButtonListProps { function ButtonList (line 20) | function ButtonList({ FILE: apps/web/components/ButtonListSurvey.tsx function ButtonListSurvey (line 5) | function ButtonListSurvey({ FILE: apps/web/components/CategorySelect.tsx function CategorySelect (line 16) | function CategorySelect({ FILE: apps/web/components/Celebration.tsx function Celebration (line 9) | function Celebration(props: { message: string }) { FILE: apps/web/components/Combobox.tsx function Combobox (line 22) | function Combobox(props: { FILE: apps/web/components/CommandK.tsx constant SECTION_ORDER (line 25) | const SECTION_ORDER: CommandSection[] = [ constant SECTION_LABELS (line 33) | const SECTION_LABELS: Record = { function CommandK (line 41) | function CommandK() { FILE: apps/web/components/ConfirmDialog.tsx type ConfirmDialogProps (line 16) | interface ConfirmDialogProps { function ConfirmDialog (line 25) | function ConfirmDialog({ FILE: apps/web/components/Container.tsx type ContainerProps (line 5) | interface ContainerProps { FILE: apps/web/components/CopyInput.tsx function CopyInput (line 7) | function CopyInput({ FILE: apps/web/components/DatePickerWithRange.tsx function getRelativeDateLabel (line 19) | function getRelativeDateLabel(days: number) { type DatePickerWithRangeProps (line 28) | interface DatePickerWithRangeProps function DatePickerWithRange (line 37) | function DatePickerWithRange({ FILE: apps/web/components/EmailMessageCell.tsx function EmailMessageCell (line 21) | function EmailMessageCell({ function EmailMessageCellWithData (line 134) | function EmailMessageCellWithData({ FILE: apps/web/components/EmailViewer.tsx function EmailViewer (line 14) | function EmailViewer() { function ThreadContent (line 48) | function ThreadContent({ FILE: apps/web/components/EnableFeatureCard.tsx type EnableFeatureCardProps (line 11) | interface EnableFeatureCardProps { function EnableFeatureCard (line 23) | function EnableFeatureCard({ FILE: apps/web/components/ErrorBoundary.tsx class ErrorBoundary (line 6) | class ErrorBoundary extends Component< method constructor (line 10) | constructor(props: { children: React.ReactNode }) { method getDerivedStateFromError (line 14) | static getDerivedStateFromError(_error: any) { method componentDidCatch (line 18) | componentDidCatch(error: any, errorInfo: any) { method render (line 22) | render() { FILE: apps/web/components/ErrorDisplay.tsx function ErrorDisplay (line 17) | function ErrorDisplay(props: { FILE: apps/web/components/ErrorPage.tsx function ErrorPage (line 11) | function ErrorPage(props: { FILE: apps/web/components/ExpandableText.tsx function ExpandableText (line 8) | function ExpandableText({ function TextWrapper (line 69) | function TextWrapper({ FILE: apps/web/components/FolderSelector.tsx type FolderItemProps (line 28) | interface FolderItemProps { function FolderItem (line 36) | function FolderItem({ type FolderSelectorProps (line 81) | interface FolderSelectorProps { function FolderSelector (line 90) | function FolderSelector({ FILE: apps/web/components/Form.tsx function FormWrapper (line 4) | function FormWrapper(props: { children: React.ReactNode }) { function FormSection (line 8) | function FormSection(props: { function FormSectionLeft (line 26) | function FormSectionLeft(props: { title: string; description: string }) { function FormSectionRight (line 35) | function FormSectionRight(props: { children: React.ReactNode }) { function SubmitButtonWrapper (line 43) | function SubmitButtonWrapper(props: { children: React.ReactNode }) { FILE: apps/web/components/GroupHeading.tsx function GroupHeading (line 5) | function GroupHeading(props: { FILE: apps/web/components/GroupedTable.tsx constant COLUMNS (line 59) | const COLUMNS = 4; type EmailGroup (line 61) | type EmailGroup = { function GroupedTable (line 68) | function GroupedTable({ function SendersTable (line 290) | function SendersTable({ function GroupRow (line 370) | function GroupRow({ function SenderRows (line 434) | function SenderRows({ function ExpandedRows (line 481) | function ExpandedRows({ function ArchiveStatusCell (line 556) | function ArchiveStatusCell({ sender }: { sender: string }) { FILE: apps/web/components/HeroVideoDialog.tsx type HeroVideoProps (line 15) | interface HeroVideoProps { function HeroVideoDialog (line 22) | function HeroVideoDialog({ FILE: apps/web/components/HoverCard.tsx function HoverCard (line 8) | function HoverCard(props: { FILE: apps/web/components/Input.tsx type InputProps (line 9) | interface InputProps { type LabelProps (line 114) | type LabelProps = Pick; function LabelWithRightButton (line 218) | function LabelWithRightButton( function getErrorMessage (line 235) | function getErrorMessage( FILE: apps/web/components/InviteMemberModal.tsx function InviteMemberModal (line 41) | function InviteMemberModal({ function InviteForm (line 100) | function InviteForm({ function CreateOrgAndInviteForm (line 194) | function CreateOrgAndInviteForm({ FILE: apps/web/components/LabelCombobox.tsx function LabelCombobox (line 10) | function LabelCombobox({ FILE: apps/web/components/LabelsSubMenu.tsx function LabelsSubMenu (line 9) | function LabelsSubMenu({ FILE: apps/web/components/LandingErrorBoundary.tsx function LandingErrorBoundary (line 9) | function LandingErrorBoundary({ FILE: apps/web/components/LegalPage.tsx function LegalPage (line 4) | function LegalPage(props: { FILE: apps/web/components/Linkify.tsx function Linkify (line 25) | function Linkify(props: { children: React.ReactNode }) { FILE: apps/web/components/List.tsx type ListItem (line 4) | type ListItem = { type ListProps (line 9) | interface ListProps { function List (line 16) | function List({ items, className, value, onSelect }: ListProps) { FILE: apps/web/components/Loading.tsx function Loading (line 3) | function Loading() { function LoadingMiniSpinner (line 11) | function LoadingMiniSpinner() { function ButtonLoader (line 15) | function ButtonLoader() { FILE: apps/web/components/LoadingContent.tsx type LoadingContentProps (line 5) | interface LoadingContentProps { function LoadingContent (line 13) | function LoadingContent(props: LoadingContentProps) { function shouldIgnoreError (line 34) | function shouldIgnoreError(error: LoadingContentProps["error"]): boolean { FILE: apps/web/components/Logo.tsx type LogoProps (line 4) | interface LogoProps { function Logo (line 8) | function Logo({ className }: LogoProps) { FILE: apps/web/components/MultiSelectFilter.tsx type MultiSelectFilterProps (line 24) | interface MultiSelectFilterProps<_TData, _TValue> { function MultiSelectFilter (line 36) | function MultiSelectFilter({ function useMultiSelectFilter (line 156) | function useMultiSelectFilter(options: string[]) { FILE: apps/web/components/MuxVideo.tsx type MuxVideoProps (line 7) | interface MuxVideoProps { function MuxVideo (line 14) | function MuxVideo({ FILE: apps/web/components/NavUser.tsx function NavUser (line 38) | function NavUser() { FILE: apps/web/components/Notice.tsx type NoticeProps (line 3) | interface NoticeProps { function Notice (line 16) | function Notice({ children, variant = "info", className }: NoticeProps) { FILE: apps/web/components/OnboardingModal.tsx function OnboardingModal (line 18) | function OnboardingModal({ function OnboardingModalDialog (line 52) | function OnboardingModalDialog({ function OnboardingDialogContent (line 79) | function OnboardingDialogContent({ FILE: apps/web/components/PageHeader.tsx type Video (line 7) | type Video = { type PageHeaderProps (line 14) | interface PageHeaderProps { function PageHeader (line 20) | function PageHeader({ title, video, description }: PageHeaderProps) { function WatchVideo (line 38) | function WatchVideo({ video }: { video: Video }) { FILE: apps/web/components/PageWrapper.tsx function PageWrapper (line 3) | function PageWrapper({ FILE: apps/web/components/Panel.tsx type PanelProps (line 4) | interface PanelProps { FILE: apps/web/components/PersonWithLogo.tsx function PersonWithLogo (line 3) | function PersonWithLogo({ function ABTestimonial (line 31) | function ABTestimonial() { FILE: apps/web/components/PlanBadge.tsx type Plan (line 15) | type Plan = Pick & { function PlanBadge (line 20) | function PlanBadge(props: { plan?: Plan; provider: string }) { function ActionBadge (line 85) | function ActionBadge({ function ActionBadgeExpanded (line 97) | function ActionBadgeExpanded({ function ActionContent (line 152) | function ActionContent({ action }: { action: ExecutedAction }) { function getActionLabel (line 160) | function getActionLabel(type: ActionType, provider: string) { function getActionMessage (line 189) | function getActionMessage(action: ExecutedAction, provider: string): str... function getActionColor (line 210) | function getActionColor(actionType: ActionType): Color { function getPlanColor (line 238) | function getPlanColor(plan: Plan | null, executed: boolean): Color { FILE: apps/web/components/PremiumAlert.tsx function usePremium (line 15) | function usePremium() { function PremiumAiAssistantAlert (line 56) | function PremiumAiAssistantAlert({ function PremiumAlertWithData (line 129) | function PremiumAlertWithData({ function PremiumTooltip (line 161) | function PremiumTooltip(props: { function PremiumTooltipContent (line 177) | function PremiumTooltipContent({ FILE: apps/web/components/PremiumCard.tsx type PremiumData (line 14) | interface PremiumData { type PremiumExpiredCardProps (line 22) | interface PremiumExpiredCardProps { function PremiumExpiredCardContent (line 27) | function PremiumExpiredCardContent({ function PremiumCard (line 214) | function PremiumCard({ FILE: apps/web/components/ProfileImage.tsx function ProfileImage (line 3) | function ProfileImage({ FILE: apps/web/components/ProgressPanel.tsx function ProgressPanel (line 8) | function ProgressPanel({ FILE: apps/web/components/ReferralDialog.tsx function ReferralDialog (line 23) | function ReferralDialog() { function Referrals (line 39) | function Referrals() { function ReferralDashboardSkeleton (line 194) | function ReferralDashboardSkeleton() { FILE: apps/web/components/ScrollableFadeContainer.tsx type ScrollableFadeContainerProps (line 7) | interface ScrollableFadeContainerProps { FILE: apps/web/components/SearchForm.tsx function SearchForm (line 12) | function SearchForm({ FILE: apps/web/components/Select.tsx type SelectProps (line 6) | interface SelectProps extends React.SelectHTMLAttributes) { function MailNav (line 304) | function MailNav({ path }: { path: string }) { FILE: apps/web/components/SideNavMenu.tsx type NavItem (line 14) | type NavItem = { function SideNavMenu (line 26) | function SideNavMenu({ FILE: apps/web/components/SideNavWithTopNav.tsx function ContentWrapper (line 18) | function ContentWrapper({ children }: { children: React.ReactNode }) { function SideNavWithTopNav (line 47) | function SideNavWithTopNav({ function MobileHeader (line 80) | function MobileHeader() { FILE: apps/web/components/SidebarRight.tsx function SidebarRight (line 7) | function SidebarRight({ FILE: apps/web/components/SlideOverSheet.tsx function SlideOverSheet (line 11) | function SlideOverSheet(props: { FILE: apps/web/components/StatsCards.tsx function StatsCards (line 4) | function StatsCards(props: { FILE: apps/web/components/TabSelect.tsx function TabSelect (line 44) | function TabSelect({ FILE: apps/web/components/TablePagination.tsx function TablePagination (line 12) | function TablePagination({ totalPages }: { totalPages: number }) { FILE: apps/web/components/Tabs.tsx type TabsProps (line 7) | interface TabsProps { type Tab (line 15) | interface Tab { function Tabs (line 21) | function Tabs(props: TabsProps) { FILE: apps/web/components/TabsToolbar.tsx type TabsToolbarProps (line 3) | interface TabsToolbarProps extends React.HTMLAttributes { function TabsToolbar (line 7) | function TabsToolbar({ FILE: apps/web/components/Tag.tsx type TagProps (line 18) | interface TagProps FILE: apps/web/components/TagInput.tsx type TagInputProps (line 13) | interface TagInputProps { function TagInput (line 24) | function TagInput({ FILE: apps/web/components/TimePicker.tsx type TimePickerProps (line 7) | interface TimePickerProps { function TimePicker (line 17) | function TimePicker({ FILE: apps/web/components/Toast.tsx function toastSuccess (line 3) | function toastSuccess(options: { function toastError (line 14) | function toastError(options: { title?: string; description: string }) { function toastInfo (line 21) | function toastInfo(options: { FILE: apps/web/components/Toggle.tsx type ToggleProps (line 6) | interface ToggleProps { FILE: apps/web/components/Tooltip.tsx type TooltipProps (line 11) | interface TooltipProps { FILE: apps/web/components/TooltipExplanation.tsx type TooltipExplanationProps (line 26) | interface TooltipExplanationProps function TooltipExplanation (line 33) | function TooltipExplanation({ FILE: apps/web/components/TopBar.tsx type TopBarProps (line 3) | interface TopBarProps { function TopBar (line 9) | function TopBar({ children, className, sticky = false }: TopBarProps) { FILE: apps/web/components/TopSection.tsx function TopSection (line 3) | function TopSection(props: { function TopSectionWithRightSection (line 24) | function TopSectionWithRightSection(props: { FILE: apps/web/components/TruncatedText.tsx function TruncatedText (line 11) | function TruncatedText({ FILE: apps/web/components/TruncatedTooltipText.tsx function TruncatedTooltipText (line 14) | function TruncatedTooltipText({ FILE: apps/web/components/Typography.tsx type LinkProps (line 115) | type LinkProps = React.ComponentProps; FILE: apps/web/components/VideoCard.tsx type VideoCardProps (line 19) | type VideoCardProps = ComponentProps & { function DismissibleVideoCard (line 23) | function DismissibleVideoCard({ storageKey, ...props }: VideoCardProps) { FILE: apps/web/components/ViewEmailButton.tsx function ViewEmailButton (line 8) | function ViewEmailButton({ FILE: apps/web/components/WebhookDocumentation.tsx function WebhookDocumentationDialog (line 15) | function WebhookDocumentationDialog({ function WebhookPayloadDocumentation (line 33) | function WebhookPayloadDocumentation() { function WebhookDocumentationLink (line 153) | function WebhookDocumentationLink() { FILE: apps/web/components/YouTubeVideo.tsx function YouTubeVideo (line 4) | function YouTubeVideo(props: { FILE: apps/web/components/ai-elements/actions.tsx type ActionsProps (line 13) | type ActionsProps = ComponentProps<"div">; type ActionProps (line 21) | type ActionProps = ComponentProps & { FILE: apps/web/components/ai-elements/code-block.tsx type CodeBlockContextType (line 14) | type CodeBlockContextType = { type CodeBlockProps (line 22) | type CodeBlockProps = HTMLAttributes & { type CodeBlockCopyButtonProps (line 102) | type CodeBlockCopyButtonProps = ComponentProps & { FILE: apps/web/components/ai-elements/conversation.tsx type ConversationProps (line 11) | type ConversationProps = ComponentProps; type ConversationContentProps (line 23) | type ConversationContentProps = ComponentProps< type ConversationEmptyStateProps (line 34) | type ConversationEmptyStateProps = ComponentProps<"div"> & { type ConversationScrollButtonProps (line 69) | type ConversationScrollButtonProps = ComponentProps & { FILE: apps/web/components/ai-elements/loader.tsx type LoaderIconProps (line 4) | type LoaderIconProps = { type LoaderProps (line 82) | type LoaderProps = HTMLAttributes & { FILE: apps/web/components/ai-elements/message.tsx type MessageProps (line 7) | type MessageProps = HTMLAttributes & { type MessageContentProps (line 44) | type MessageContentProps = HTMLAttributes & type MessageAvatarProps (line 61) | type MessageAvatarProps = ComponentProps & { FILE: apps/web/components/ai-elements/prompt-input.tsx type PromptInputProps (line 22) | type PromptInputProps = HTMLAttributes; type PromptInputTextareaProps (line 34) | type PromptInputTextareaProps = ComponentProps< type PromptInputToolbarProps (line 91) | type PromptInputToolbarProps = HTMLAttributes; type PromptInputToolsProps (line 103) | type PromptInputToolsProps = HTMLAttributes; type PromptInputButtonProps (line 119) | type PromptInputButtonProps = ComponentProps; type PromptInputSubmitProps (line 146) | type PromptInputSubmitProps = ComponentProps & { type PromptInputModelSelectProps (line 181) | type PromptInputModelSelectProps = ComponentProps; type PromptInputModelSelectTriggerProps (line 187) | type PromptInputModelSelectTriggerProps = ComponentProps< type PromptInputModelSelectContentProps (line 205) | type PromptInputModelSelectContentProps = ComponentProps< type PromptInputModelSelectItemProps (line 216) | type PromptInputModelSelectItemProps = ComponentProps; type PromptInputModelSelectValueProps (line 225) | type PromptInputModelSelectValueProps = ComponentProps< FILE: apps/web/components/ai-elements/reasoning.tsx type ReasoningContextValue (line 24) | interface ReasoningContextValue { type ReasoningProps (line 41) | type ReasoningProps = ComponentProps & { constant MS_IN_S (line 49) | const MS_IN_S = 1000; type ReasoningTriggerProps (line 114) | type ReasoningTriggerProps = ComponentProps< type ReasoningContentProps (line 164) | type ReasoningContentProps = ComponentProps< FILE: apps/web/components/ai-elements/response.tsx type ResponseProps (line 11) | type ResponseProps = ComponentProps; FILE: apps/web/components/ai-elements/shimmer.tsx type TextShimmerProps (line 13) | type TextShimmerProps = { FILE: apps/web/components/ai-elements/suggestion.tsx type SuggestionsProps (line 8) | type SuggestionsProps = ComponentProps; type SuggestionProps (line 23) | type SuggestionProps = Omit, "onClick"> & { FILE: apps/web/components/ai-elements/tool.tsx type ToolProps (line 24) | type ToolProps = ComponentProps; type ToolHeaderProps (line 33) | type ToolHeaderProps = { type ToolContentProps (line 94) | type ToolContentProps = ComponentProps; type ToolInputProps (line 106) | type ToolInputProps = ComponentProps<"div"> & { type ToolOutputProps (line 121) | type ToolOutputProps = ComponentProps<"div"> & { FILE: apps/web/components/assistant-chat/chat.tsx constant MAX_FILE_SIZE (line 37) | const MAX_FILE_SIZE = 4 * 1024 * 1024; constant MAX_FILES (line 38) | const MAX_FILES = 5; constant ACCEPTED_IMAGE_TYPES (line 39) | const ACCEPTED_IMAGE_TYPES = [ function Chat (line 46) | function Chat({ open }: { open: boolean }) { function ChatMessagesView (line 302) | function ChatMessagesView({ constant CHAT_EXAMPLES (line 358) | const CHAT_EXAMPLES = [ function NewChatView (line 364) | function NewChatView({ function ChatTopBar (line 398) | function ChatTopBar({ hasMessages }: { hasMessages: boolean }) { function NewChatButton (line 415) | function NewChatButton() { function ChatHistoryDropdown (line 428) | function ChatHistoryDropdown() { function getGreeting (line 487) | function getGreeting(firstName: string | undefined): string { FILE: apps/web/components/assistant-chat/email-lookup-context.tsx type EmailMeta (line 5) | type EmailMeta = { type EmailLookup (line 14) | type EmailLookup = Map; function useEmailLookup (line 20) | function useEmailLookup() { FILE: apps/web/components/assistant-chat/examples-dialog.tsx type ExamplesDialogProps (line 24) | interface ExamplesDialogProps { function ExamplesDialog (line 31) | function ExamplesDialog({ FILE: apps/web/components/assistant-chat/helpers.ts function convertToUIMessages (line 9) | function convertToUIMessages(chat: GetChatResponse): ChatMessage[] { FILE: apps/web/components/assistant-chat/inline-email-action-context.tsx type InlineEmailActionContextValue (line 6) | type InlineEmailActionContextValue = { function InlineEmailActionProvider (line 13) | function InlineEmailActionProvider({ function useInlineEmailActionContext (line 27) | function useInlineEmailActionContext() { FILE: apps/web/components/assistant-chat/inline-email-card.tsx type ActionState (line 38) | type ActionState = "idle" | "loading" | "done"; type InlineEmailListState (line 40) | type InlineEmailListState = { function InlineEmailList (line 49) | function InlineEmailList({ children }: { children?: ReactNode }) { function InlineEmailCard (line 263) | function InlineEmailCard({ function collectThreadIds (line 424) | function collectThreadIds(children: ReactNode): string[] { function EmailPreview (line 437) | function EmailPreview({ threadId }: { threadId: string }) { function resolveInlineEmailThreadId (line 500) | function resolveInlineEmailThreadId({ function addThreadIds (line 515) | function addThreadIds(current: Set, threadIds: string[]) { function getSuccessfulThreadIds (line 527) | function getSuccessfulThreadIds( function formatCompletedSummary (line 534) | function formatCompletedSummary({ FILE: apps/web/components/assistant-chat/message-editor.tsx type MessageEditorProps (line 16) | type MessageEditorProps = { function MessageEditor (line 23) | function MessageEditor({ function getTextFromMessage (line 114) | function getTextFromMessage(message: ChatMessage): string { FILE: apps/web/components/assistant-chat/message-part.tsx type MessagePartProps (line 32) | interface MessagePartProps { function ErrorToolCard (line 41) | function ErrorToolCard({ error }: { error: string }) { function isOutputWithError (line 45) | function isOutputWithError(output: unknown): output is { error: unknown } { function getOutputField (line 49) | function getOutputField(output: unknown, field: string): T | undefined { function MessagePart (line 56) | function MessagePart({ function getInProgressManageInboxOutput (line 511) | function getInProgressManageInboxOutput(input: { function renderToolStatus (line 522) | function renderToolStatus({ function renderPendingEmailAction (line 551) | function renderPendingEmailAction({ function getToolFailureMessage (line 598) | function getToolFailureMessage(output: unknown): string | null { function toFailureMessage (line 618) | function toFailureMessage(value: unknown): string | null { FILE: apps/web/components/assistant-chat/messages.tsx type MessagesProps (line 19) | interface MessagesProps { function Messages (line 29) | function Messages({ function buildEmailLookup (line 104) | function buildEmailLookup(messages: Array): EmailLookup { FILE: apps/web/components/assistant-chat/messaging-channel-hint.tsx constant HINT_ID (line 12) | const HINT_ID = "messaging-channel"; function MessagingChannelHint (line 14) | function MessagingChannelHint() { FILE: apps/web/components/assistant-chat/preview-attachment.tsx type PreviewableAttachment (line 8) | type PreviewableAttachment = Pick(output: unknown, field: string): T | undefined { function BasicToolInfo (line 77) | function BasicToolInfo({ text }: { text: string }) { function CollapsibleToolCard (line 85) | function CollapsibleToolCard({ function SearchInboxResult (line 136) | function SearchInboxResult({ output }: { output: unknown }) { function ManageInboxResult (line 163) | function ManageInboxResult({ type PendingEmailActionType (line 281) | type PendingEmailActionType = "send_email" | "reply_email" | "forward_em... type EmailConfirmationResult (line 283) | type EmailConfirmationResult = { function ReadEmailResult (line 292) | function ReadEmailResult({ output }: { output: unknown }) { function SendEmailResult (line 345) | function SendEmailResult({ function ReplyEmailResult (line 367) | function ReplyEmailResult({ function ForwardEmailResult (line 389) | function ForwardEmailResult({ function EmailActionResult (line 411) | function EmailActionResult({ function CreatedRuleToolCard (line 701) | function CreatedRuleToolCard({ function UpdatedRuleConditions (line 739) | function UpdatedRuleConditions({ function UpdatedRuleActions (line 797) | function UpdatedRuleActions({ function UpdatedLearnedPatterns (line 863) | function UpdatedLearnedPatterns({ function UpdatePersonalInstructions (line 913) | function UpdatePersonalInstructions({ function AddToKnowledgeBase (line 925) | function AddToKnowledgeBase({ function RuleActions (line 958) | function RuleActions({ ruleId }: { ruleId: string }) { function RuleActionsPreview (line 1039) | function RuleActionsPreview() { function LearnedPatternsActions (line 1065) | function LearnedPatternsActions({ ruleId }: { ruleId: string }) { function ToolCard (line 1091) | function ToolCard({ children }: { children: React.ReactNode }) { function RuleToolCardHeader (line 1095) | function RuleToolCardHeader({ function ExpandedToolCard (line 1110) | function ExpandedToolCard({ function ViewChangesCollapsible (line 1146) | function ViewChangesCollapsible({ children }: { children: React.ReactNod... function CollapsibleDiffContent (line 1158) | function CollapsibleDiffContent({ function parseManageInboxAction (line 1188) | function parseManageInboxAction( function getManageInboxActionLabel (line 1194) | function getManageInboxActionLabel({ function ToolSection (line 1236) | function ToolSection({ function ToolPanel (line 1251) | function ToolPanel({ function ToolDetailRow (line 1265) | function ToolDetailRow({ function ToolExternalLink (line 1280) | function ToolExternalLink({ function InlineMetadataItem (line 1300) | function InlineMetadataItem({ function parseConfirmationResult (line 1317) | function parseConfirmationResult( function getPendingString (line 1336) | function getPendingString( function getPendingOrOutputString (line 1344) | function getPendingOrOutputString({ function getActionBodyText (line 1358) | function getActionBodyText({ function getEmailActionLabel (line 1376) | function getEmailActionLabel(actionType: PendingEmailActionType) { function getEmailActionSentLabel (line 1382) | function getEmailActionSentLabel(actionType: PendingEmailActionType) { function getAssistantEmailSuccessMessage (line 1388) | function getAssistantEmailSuccessMessage(actionType: PendingEmailActionT... function getExternalMessageUrl (line 1394) | function getExternalMessageUrl({ function htmlToText (line 1417) | function htmlToText(html: string) { function asPendingEmailActionType (line 1431) | function asPendingEmailActionType( function asString (line 1444) | function asString(value: unknown): string | null { type RuleActionFields (line 1448) | type RuleActionFields = { function ActionBadgeList (line 1458) | function ActionBadgeList({ function formatPatternParts (line 1492) | function formatPatternParts( function isRecord (line 1503) | function isRecord(value: unknown): value is Record { type ToolEmailRow (line 1507) | type ToolEmailRow = { function ToolEmailRows (line 1517) | function ToolEmailRows({ emails }: { emails: ToolEmailRow[] }) { function buildConditionText (line 1554) | function buildConditionText(condition: { function formatActionsForDiff (line 1577) | function formatActionsForDiff( function FieldLabel (line 1594) | function FieldLabel({ FILE: apps/web/components/assistant-chat/types.ts type ChatTools (line 33) | type ChatTools = { type CustomUIDataTypes (line 59) | type CustomUIDataTypes = { type ChatMessage (line 70) | type ChatMessage = UIMessage< FILE: apps/web/components/bulk-archive/categoryIcons.ts function getCategoryIcon (line 9) | function getCategoryIcon(categoryName: string) { function getCategoryStyle (line 21) | function getCategoryStyle(categoryName: string) { FILE: apps/web/components/charts/DomainIcon.tsx function getFavicon (line 8) | function getFavicon(apexDomain: string) { type FallbackIconProps (line 12) | interface FallbackIconProps { function FallbackIcon (line 17) | function FallbackIcon({ seed, size = 20 }: FallbackIconProps) { type DomainIconProps (line 49) | interface DomainIconProps { function DomainIcon (line 55) | function DomainIcon({ FILE: apps/web/components/charts/HorizontalBarChart.tsx type HorizontalBarChartProps (line 7) | interface HorizontalBarChartProps { function HorizontalBarChart (line 17) | function HorizontalBarChart({ FILE: apps/web/components/drive/FilingStatusCell.tsx type FilingStatus (line 7) | type FilingStatus = "filing" | "pending" | "skipped" | "error" | "filed"; type FilingStatusCellProps (line 9) | interface FilingStatusCellProps { function FilingStatusCell (line 17) | function FilingStatusCell({ FILE: apps/web/components/drive/TableCellWithTooltip.tsx type TableCellWithTooltipProps (line 7) | interface TableCellWithTooltipProps { function TableCellWithTooltip (line 14) | function TableCellWithTooltip({ FILE: apps/web/components/drive/YesNoIndicator.tsx type YesNoIndicatorProps (line 7) | interface YesNoIndicatorProps { function YesNoIndicator (line 17) | function YesNoIndicator({ FILE: apps/web/components/editor/SimpleRichTextEditor.tsx type SimpleRichTextEditorProps (line 13) | interface SimpleRichTextEditorProps { type SimpleRichTextEditorRef (line 23) | interface SimpleRichTextEditorRef { FILE: apps/web/components/editor/Tiptap.tsx type TiptapHandle (line 11) | type TiptapHandle = { FILE: apps/web/components/editor/extensions.ts method addProseMirrorPlugins (line 6) | addProseMirrorPlugins() { FILE: apps/web/components/editor/extensions/LabelMention.tsx constant MAX_SUGGESTIONS (line 7) | const MAX_SUGGESTIONS = 10; type MarkdownSerializerState (line 9) | interface MarkdownSerializerState { type MarkdownNode (line 13) | interface MarkdownNode { type MarkdownItState (line 21) | interface MarkdownItState { type MarkdownItToken (line 28) | interface MarkdownItToken { type MarkdownItInstance (line 34) | interface MarkdownItInstance { method renderLabel (line 55) | renderLabel({ node }) { method onUpdate (line 132) | onUpdate(props) { method onKeyDown (line 157) | onKeyDown(props) { method onExit (line 172) | onExit() { method addStorage (line 214) | addStorage() { FILE: apps/web/components/editor/extensions/MentionList.tsx type MentionListProps (line 5) | interface MentionListProps { type MentionListRef (line 10) | interface MentionListRef { FILE: apps/web/components/email-list/EmailAttachments.tsx function EmailAttachments (line 7) | function EmailAttachments({ message }: { message: ThreadMessage }) { function mimeTypeToString (line 41) | function mimeTypeToString(mimeType: string): string { FILE: apps/web/components/email-list/EmailContents.tsx function HtmlEmail (line 5) | function HtmlEmail({ html }: { html: string }) { function PlainEmail (line 48) | function PlainEmail({ text }: { text: string }) { function getEmailContent (line 52) | function getEmailContent(html: string) { function getIframeHtml (line 71) | function getIframeHtml(html: string, isDarkMode: boolean) { function addDarkModeClass (line 204) | function addDarkModeClass(html: string, isDarkMode: boolean) { function useIframeHeight (line 240) | function useIframeHeight(iframeRef: React.RefObject; type ThreadMessage (line 14) | type ThreadMessage = Thread["messages"][number]; FILE: apps/web/components/feature-announcements/AnnouncementDialog.tsx function AnnouncementDialog (line 19) | function AnnouncementDialog() { type AnnouncementCardProps (line 113) | interface AnnouncementCardProps { function AnnouncementCard (line 118) | function AnnouncementCard({ function DetailItem (line 182) | function DetailItem({ detail }: { detail: AnnouncementDetail }) { FILE: apps/web/components/feature-announcements/AnnouncementDialogDemo.tsx constant DETAIL_ICON_CLASS (line 12) | const DETAIL_ICON_CLASS = "h-4 w-4 text-gray-600 dark:text-gray-400"; function AnnouncementDialogDemo (line 14) | function AnnouncementDialogDemo() { function getDemoAnnouncement (line 84) | function getDemoAnnouncement(): Announcement { FILE: apps/web/components/feature-announcements/FollowUpRemindersIllustration.tsx function FollowUpRemindersIllustration (line 6) | function FollowUpRemindersIllustration() { FILE: apps/web/components/feature-announcements/MeetingBriefsIllustration.tsx function MeetingBriefsIllustration (line 6) | function MeetingBriefsIllustration() { FILE: apps/web/components/kibo-ui/tree/index.tsx type TreeContextType (line 17) | type TreeContextType = { type TreeNodeContextType (line 40) | type TreeNodeContextType = { type TreeProviderProps (line 59) | type TreeProviderProps = { type TreeViewProps (line 167) | type TreeViewProps = HTMLAttributes; type TreeNodeProps (line 175) | type TreeNodeProps = HTMLAttributes & { type TreeNodeTriggerProps (line 224) | type TreeNodeTriggerProps = ComponentProps; type TreeNodeContentProps (line 325) | type TreeNodeContentProps = ComponentProps & { type TreeExpanderProps (line 371) | type TreeExpanderProps = ComponentProps & { type TreeIconProps (line 419) | type TreeIconProps = ComponentProps & { type TreeLabelProps (line 464) | type TreeLabelProps = HTMLAttributes; FILE: apps/web/components/layouts/BasicLayout.tsx constant LAYOUT_CLASSNAME (line 5) | const LAYOUT_CLASSNAME = "max-w-6xl mx-auto px-6 lg:px-8 xl:px-0"; function BasicLayout (line 7) | function BasicLayout(props: { children: React.ReactNode }) { FILE: apps/web/components/layouts/BlogLayout.tsx function BlogHeader (line 4) | function BlogHeader() { function BlogLayout (line 14) | function BlogLayout(props: { children: React.ReactNode }) { FILE: apps/web/components/new-landing/BrandScroller.tsx type BrandScrollerProps (line 10) | interface BrandScrollerProps { FILE: apps/web/components/new-landing/CallToAction.tsx type CallToActionProps (line 10) | interface CallToActionProps { function CallToAction (line 17) | function CallToAction({ FILE: apps/web/components/new-landing/FeatureCardGrid.tsx type FeatureItem (line 14) | interface FeatureItem { type FeatureCardGridProps (line 20) | interface FeatureCardGridProps { function FeatureCardGrid (line 26) | function FeatureCardGrid({ FILE: apps/web/components/new-landing/FooterLineLogo.tsx type FooterLineLogoProps (line 3) | interface FooterLineLogoProps { function FooterLineLogo (line 7) | function FooterLineLogo({ className }: FooterLineLogoProps) { FILE: apps/web/components/new-landing/HeaderLinks.tsx function HeaderLinks (line 91) | function HeaderLinks() { function EnhancedListItem (line 143) | function EnhancedListItem({ FILE: apps/web/components/new-landing/LiquidGlassButton.tsx type LiquidGlassButtonProps (line 3) | interface LiquidGlassButtonProps function LiquidGlassButton (line 9) | function LiquidGlassButton({ FILE: apps/web/components/new-landing/PatternBanner.tsx type PatternBannerProps (line 11) | interface PatternBannerProps { function PatternBanner (line 18) | function PatternBanner({ FILE: apps/web/components/new-landing/UnicornScene.tsx type UnicornStudioInitFlag (line 6) | type UnicornStudioInitFlag = { type Window (line 11) | interface Window { type UnicornSceneProps (line 22) | interface UnicornSceneProps { function UnicornScene (line 26) | function UnicornScene({ className }: UnicornSceneProps) { FILE: apps/web/components/new-landing/common/Anchor.tsx type AnchorProps (line 4) | interface AnchorProps { function Anchor (line 11) | function Anchor({ href, newTab, className, children }: AnchorProps) { FILE: apps/web/components/new-landing/common/Badge.tsx type BadgeVariant (line 3) | type BadgeVariant = type BadgeProps (line 17) | interface BadgeProps { function Badge (line 24) | function Badge({ FILE: apps/web/components/new-landing/common/BlurFade.tsx type MarginType (line 13) | type MarginType = UseInViewOptions["margin"]; type BlurFadeProps (line 15) | interface BlurFadeProps { function BlurFade (line 31) | function BlurFade({ FILE: apps/web/components/new-landing/common/Button.tsx type ButtonVariant (line 5) | type ButtonVariant = "primary" | "secondary" | "secondary-two"; type ButtonProps (line 7) | interface ButtonProps extends React.ButtonHTMLAttributes { function Sparkle (line 8) | function Sparkle({ FILE: apps/web/components/new-landing/icons/SparkleBlue.tsx function SparkleBlue (line 1) | function SparkleBlue() { FILE: apps/web/components/new-landing/icons/Team.tsx function Team (line 1) | function Team() { FILE: apps/web/components/new-landing/icons/Zap.tsx function Zap (line 1) | function Zap() { FILE: apps/web/components/new-landing/sections/Awards.tsx type Award (line 15) | type Award = { function Awards (line 55) | function Awards() { FILE: apps/web/components/new-landing/sections/BulkUnsubscribe.tsx function BulkUnsubscribe (line 12) | function BulkUnsubscribe() { FILE: apps/web/components/new-landing/sections/EverythingElseSection.tsx function EverythingElseSection (line 17) | function EverythingElseSection() { FILE: apps/web/components/new-landing/sections/Footer.tsx type FooterProps (line 11) | interface FooterProps { function Footer (line 33) | function Footer({ className, variant = "default" }: FooterProps) { function FooterList (line 137) | function FooterList(props: { FILE: apps/web/components/new-landing/sections/Header.tsx type HeaderProps (line 11) | interface HeaderProps { function Header (line 15) | function Header({ className }: HeaderProps) { FILE: apps/web/components/new-landing/sections/OrganizedInbox.tsx type OrganizedInboxProps (line 11) | interface OrganizedInboxProps { function OrganizedInbox (line 16) | function OrganizedInbox({ title, subtitle }: OrganizedInboxProps) { FILE: apps/web/components/new-landing/sections/PreWrittenDrafts.tsx type PreWrittenDraftsProps (line 11) | interface PreWrittenDraftsProps { function PreWrittenDrafts (line 16) | function PreWrittenDrafts({ title, subtitle }: PreWrittenDraftsProps) { FILE: apps/web/components/new-landing/sections/Pricing.tsx type PricingTier (line 37) | type PricingTier = Tier & { function Pricing (line 90) | function Pricing() { type PricingCardProps (line 175) | interface PricingCardProps { function PricingCard (line 182) | function PricingCard({ tier, tierIndex, isAnnual, posthog }: PricingCard... FILE: apps/web/components/new-landing/sections/StartedInMinutes.tsx type StartedInMinutesProps (line 29) | interface StartedInMinutesProps { function StartedInMinutes (line 34) | function StartedInMinutes({ title, subtitle }: StartedInMinutesProps) { FILE: apps/web/components/new-landing/sections/Testimonials.tsx type Testimonial (line 18) | type Testimonial = { function Testimonials (line 161) | function Testimonials() { function TestimonialCard (line 221) | function TestimonialCard({ FILE: apps/web/components/theme-provider.tsx function ThemeProvider (line 6) | function ThemeProvider({ children, ...props }: ThemeProviderProps) { FILE: apps/web/components/theme-toggle.tsx function ThemeToggle (line 7) | function ThemeToggle({ focus }: { focus?: boolean }) { FILE: apps/web/components/ui/avatar.tsx type AvatarFallbackColorProps (line 50) | interface AvatarFallbackColorProps FILE: apps/web/components/ui/badge.tsx type BadgeProps (line 29) | interface BadgeProps function Badge (line 33) | function Badge({ className, variant, ...props }: BadgeProps) { FILE: apps/web/components/ui/button.tsx type ButtonProps (line 52) | interface ButtonProps FILE: apps/web/components/ui/calendar.tsx type CalendarProps (line 9) | type CalendarProps = React.ComponentProps & { function Calendar (line 13) | function Calendar({ FILE: apps/web/components/ui/chart.tsx constant THEMES (line 9) | const THEMES = { light: "", dark: ".dark" } as const; type ChartConfig (line 11) | type ChartConfig = { type ChartContextProps (line 21) | type ChartContextProps = { function useChart (line 27) | function useChart() { function getPayloadConfigFromPayload (line 325) | function getPayloadConfigFromPayload( FILE: apps/web/components/ui/command.tsx type CommandDialogProps (line 26) | interface CommandDialogProps extends DialogProps {} FILE: apps/web/components/ui/empty.tsx function Empty (line 5) | function Empty({ className, ...props }: React.ComponentProps<"div">) { function EmptyHeader (line 18) | function EmptyHeader({ className, ...props }: React.ComponentProps<"div"... function EmptyMedia (line 46) | function EmptyMedia({ function EmptyTitle (line 61) | function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) { function EmptyDescription (line 71) | function EmptyDescription({ className, ...props }: React.ComponentProps<... function EmptyContent (line 84) | function EmptyContent({ className, ...props }: React.ComponentProps<"div... FILE: apps/web/components/ui/form.tsx type FormFieldContextValue (line 20) | type FormFieldContextValue< type FormItemContextValue (line 67) | type FormItemContextValue = { FILE: apps/web/components/ui/item.tsx function ItemGroup (line 8) | function ItemGroup({ className, ...props }: React.ComponentProps<"div">) { function ItemCard (line 19) | function ItemCard({ className, ...props }: React.ComponentProps<"div">) { function ItemSeparator (line 25) | function ItemSeparator({ function Item (line 60) | function Item({ function ItemMedia (line 97) | function ItemMedia({ function ItemContent (line 112) | function ItemContent({ className, ...props }: React.ComponentProps<"div"... function ItemTitle (line 125) | function ItemTitle({ className, ...props }: React.ComponentProps<"div">) { function ItemDescription (line 138) | function ItemDescription({ className, ...props }: React.ComponentProps<"... function ItemActions (line 152) | function ItemActions({ className, ...props }: React.ComponentProps<"div"... function ItemHeader (line 162) | function ItemHeader({ className, ...props }: React.ComponentProps<"div">) { function ItemFooter (line 175) | function ItemFooter({ className, ...props }: React.ComponentProps<"div">) { FILE: apps/web/components/ui/pagination.tsx type PaginationLinkProps (line 37) | type PaginationLinkProps = { FILE: apps/web/components/ui/sheet.tsx type SheetOverlayProps (line 18) | interface SheetOverlayProps type SheetContentProps (line 63) | interface SheetContentProps FILE: apps/web/components/ui/sidebar.tsx constant SIDEBAR_COOKIE_MAX_AGE (line 23) | const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; constant SIDEBAR_WIDTH (line 24) | const SIDEBAR_WIDTH = "16rem"; constant SIDEBAR_WIDTH_MOBILE (line 25) | const SIDEBAR_WIDTH_MOBILE = "18rem"; constant SIDEBAR_WIDTH_ICON (line 26) | const SIDEBAR_WIDTH_ICON = "3rem"; constant SIDEBAR_KEYBOARD_SHORTCUT (line 27) | const SIDEBAR_KEYBOARD_SHORTCUT = "b"; type SidebarContext (line 29) | type SidebarContext = { function useSidebar (line 42) | function useSidebar() { FILE: apps/web/components/ui/skeleton.tsx function Skeleton (line 3) | function Skeleton({ FILE: apps/web/components/ui/switch.tsx type SwitchProps (line 40) | interface SwitchProps FILE: apps/web/components/ui/tabs.tsx type Context (line 10) | interface Context { function Tabs (line 18) | function Tabs(props: { function TabsList (line 71) | function TabsList(props: { function TabsContent (line 108) | function TabsContent(props: { FILE: apps/web/components/ui/tooltip.tsx function TooltipProvider (line 8) | function TooltipProvider({ function Tooltip (line 21) | function Tooltip({ function TooltipTrigger (line 31) | function TooltipTrigger({ function TooltipContent (line 37) | function TooltipContent({ FILE: apps/web/ee/billing/lemon/index.ts function setUpLemon (line 12) | function setUpLemon() { function updateSubscriptionItemQuantity (line 19) | async function updateSubscriptionItemQuantity(options: { function getLemonCustomer (line 33) | async function getLemonCustomer(customerId: string) { function activateLemonLicenseKey (line 38) | async function activateLemonLicenseKey( FILE: apps/web/ee/billing/stripe/ai-overage.test.ts function upcomingInvoiceEvent (line 186) | function upcomingInvoiceEvent(): Stripe.Event { FILE: apps/web/ee/billing/stripe/ai-overage.ts constant BILLING_UNIT_GENERATIONS (line 11) | const BILLING_UNIT_GENERATIONS = 1000; constant USD_TO_CENTS (line 12) | const USD_TO_CENTS = 100; type OverageConfig (line 19) | type OverageConfig = z.infer; function syncAiGenerationOverageForUpcomingInvoice (line 26) | async function syncAiGenerationOverageForUpcomingInvoice({ function saveCheckpoint (line 182) | async function saveCheckpoint({ function getTierOverageConfig (line 203) | function getTierOverageConfig( function getParsedOverageConfig (line 213) | function getParsedOverageConfig( function getPremiumTier (line 254) | function getPremiumTier( function normalizeId (line 263) | function normalizeId( function toMilliseconds (line 271) | function toMilliseconds(value: number | null | undefined): number | null { function getOverageIdempotencyKey (line 276) | function getOverageIdempotencyKey({ FILE: apps/web/ee/billing/stripe/loops-events.ts function handleLoopsEvents (line 9) | async function handleLoopsEvents({ FILE: apps/web/ee/billing/stripe/posthog-events.test.ts function subscriptionEvent (line 106) | function subscriptionEvent(overrides: Partial): Stripe.Eve... FILE: apps/web/ee/billing/stripe/posthog-events.ts function getStripeTrialStartedProperties (line 3) | function getStripeTrialStartedProperties( function getTrialStartingSubscription (line 23) | function getTrialStartingSubscription( FILE: apps/web/ee/billing/stripe/sync-stripe.ts function syncStripeDataToDb (line 11) | async function syncStripeDataToDb({ FILE: apps/web/hooks/use-mobile.tsx constant MOBILE_BREAKPOINT (line 3) | const MOBILE_BREAKPOINT = 768; function useIsMobile (line 5) | function useIsMobile() { FILE: apps/web/hooks/useAccounts.ts function useAccounts (line 4) | function useAccounts() { FILE: apps/web/hooks/useActionTiming.ts function useActionTiming (line 3) | function useActionTiming() { FILE: apps/web/hooks/useAdminTopSpenders.ts function useAdminTopSpenders (line 4) | function useAdminTopSpenders() { FILE: apps/web/hooks/useAnalytics.ts type OnboardingAnalyticsProps (line 5) | type OnboardingAnalyticsProps = { function useOnboardingAnalytics (line 15) | function useOnboardingAnalytics(variant: "onboarding" | "welcome") { FILE: apps/web/hooks/useApiKeys.ts function useApiKeys (line 6) | function useApiKeys() { FILE: apps/web/hooks/useAutomationJob.ts function useAutomationJob (line 4) | function useAutomationJob(emailAccountId?: string | null) { function getAccountScopedKey (line 10) | function getAccountScopedKey(path: string, emailAccountId?: string | nul... FILE: apps/web/hooks/useBeforeUnload.ts function useBeforeUnload (line 7) | function useBeforeUnload(enabled: boolean) { FILE: apps/web/hooks/useCalendarUpcomingEvents.tsx function useCalendarUpcomingEvents (line 4) | function useCalendarUpcomingEvents() { FILE: apps/web/hooks/useCalendars.ts function useCalendars (line 4) | function useCalendars() { FILE: apps/web/hooks/useCategories.ts function useCategories (line 4) | function useCategories() { FILE: apps/web/hooks/useChatMessages.ts function useChatMessages (line 4) | function useChatMessages(chatId: string | null) { FILE: apps/web/hooks/useChats.ts function useChats (line 4) | function useChats(shouldFetch: boolean) { FILE: apps/web/hooks/useCommandPaletteCommands.ts type NavigationItem (line 32) | interface NavigationItem { function useNavigationItems (line 39) | function useNavigationItems(): NavigationItem[] { function useCommandPaletteCommands (line 118) | function useCommandPaletteCommands() { FILE: apps/web/hooks/useDialogState.ts type DialogState (line 3) | interface DialogState { function useDialogState (line 8) | function useDialogState(initialState?: DialogState) { FILE: apps/web/hooks/useDriveConnections.ts function useDriveConnections (line 4) | function useDriveConnections() { FILE: apps/web/hooks/useDriveFolders.ts function useDriveFolders (line 6) | function useDriveFolders(emailAccountId?: string) { FILE: apps/web/hooks/useDriveSourceChildren.ts function useDriveSourceChildren (line 5) | function useDriveSourceChildren( FILE: apps/web/hooks/useDriveSourceItems.ts function useDriveSourceItems (line 4) | function useDriveSourceItems(shouldFetch = true) { FILE: apps/web/hooks/useDriveSubfolders.ts function useDriveSubfolders (line 7) | function useDriveSubfolders( FILE: apps/web/hooks/useEmailAccountFull.ts function useEmailAccountFull (line 5) | function useEmailAccountFull() { FILE: apps/web/hooks/useExecutedRules.tsx function useExecutedRules (line 4) | function useExecutedRules({ FILE: apps/web/hooks/useExecutedRulesCount.ts function useExecutedRulesCount (line 4) | function useExecutedRulesCount(organizationId: string) { FILE: apps/web/hooks/useFeatureFlags.ts function useCleanerEnabled (line 7) | function useCleanerEnabled() { function useFollowUpRemindersEnabled (line 12) | function useFollowUpRemindersEnabled() { function useMeetingBriefsEnabled (line 17) | function useMeetingBriefsEnabled() { function useIntegrationsEnabled (line 21) | function useIntegrationsEnabled() { function useSmartFilingEnabled (line 26) | function useSmartFilingEnabled() { constant HERO_FLAG_NAME (line 31) | const HERO_FLAG_NAME = "hero-copy-7"; type HeroVariant (line 33) | type HeroVariant = "control" | "clean-up-in-minutes"; function useHeroVariant (line 35) | function useHeroVariant() { function useHeroVariantEnabled (line 39) | function useHeroVariantEnabled() { type PricingVariant (line 43) | type PricingVariant = "control" | "basic-business" | "business-basic"; function usePricingVariant (line 45) | function usePricingVariant() { type PricingFrequencyDefault (line 52) | type PricingFrequencyDefault = "control" | "monthly"; function usePricingFrequencyDefault (line 54) | function usePricingFrequencyDefault() { type TestimonialsVariant (line 62) | type TestimonialsVariant = "control" | "senja-widget"; function useTestimonialsVariant (line 64) | function useTestimonialsVariant() { type HeroLayoutVariant (line 71) | type HeroLayoutVariant = "control" | "social-proof-first"; function useHeroLayoutVariant (line 73) | function useHeroLayoutVariant() { type WelcomePricingVariant (line 81) | type WelcomePricingVariant = "control" | "two-tiers"; function useWelcomePricingVariant (line 83) | function useWelcomePricingVariant() { FILE: apps/web/hooks/useFilingActivity.ts function useFilingActivity (line 7) | function useFilingActivity({ limit, offset }: GetFilingsQuery) { FILE: apps/web/hooks/useFilingPreview.ts function useFilingPreview (line 4) | function useFilingPreview(shouldFetch: boolean) { FILE: apps/web/hooks/useFilingPreviewAttachments.ts function useFilingPreviewAttachments (line 4) | function useFilingPreviewAttachments( FILE: apps/web/hooks/useFolders.ts function useFolders (line 5) | function useFolders(provider: string) { FILE: apps/web/hooks/useIntegrations.tsx function useIntegrations (line 4) | function useIntegrations() { FILE: apps/web/hooks/useInterval.ts function useInterval (line 3) | function useInterval(callback: () => void, delay: number | null) { FILE: apps/web/hooks/useLabels.ts type UserLabel (line 6) | type UserLabel = { type OutlookLabel (line 18) | type OutlookLabel = { type GenericLabel (line 25) | type GenericLabel = UserLabel | OutlookLabel; type SortableLabel (line 27) | type SortableLabel = { function isHidden (line 37) | function isHidden(label: EmailLabel): boolean { function useAllLabels (line 41) | function useAllLabels() { function useLabels (line 62) | function useLabels() { function useSplitLabels (line 90) | function useSplitLabels() { function sortLabels (line 121) | function sortLabels(a: SortableLabel, b: SortableLabel) { FILE: apps/web/hooks/useMeetingBriefs.ts function useMeetingBriefSettings (line 5) | function useMeetingBriefSettings() { function useMeetingBriefsHistory (line 9) | function useMeetingBriefsHistory() { FILE: apps/web/hooks/useMessagesBatch.ts function useMessagesBatch (line 5) | function useMessagesBatch({ FILE: apps/web/hooks/useMessagingChannels.ts function useMessagingChannels (line 5) | function useMessagingChannels(emailAccountId?: string | null) { function useChannelTargets (line 11) | function useChannelTargets( function getAccountScopedKey (line 25) | function getAccountScopedKey(path: string, emailAccountId?: string | nul... FILE: apps/web/hooks/useModal.tsx function useModal (line 3) | function useModal() { FILE: apps/web/hooks/useModifierKey.ts function useModifierKey (line 1) | function useModifierKey() { FILE: apps/web/hooks/useOrgAccess.ts function useOrgAccess (line 6) | function useOrgAccess() { FILE: apps/web/hooks/useOrgSWR.ts function useOrgSWR (line 11) | function useOrgSWR( FILE: apps/web/hooks/useOrgStatsEmailBuckets.ts function useOrgStatsEmailBuckets (line 5) | function useOrgStatsEmailBuckets( FILE: apps/web/hooks/useOrgStatsRulesBuckets.ts function useOrgStatsRulesBuckets (line 5) | function useOrgStatsRulesBuckets( FILE: apps/web/hooks/useOrgStatsTotals.ts function useOrgStatsTotals (line 5) | function useOrgStatsTotals( FILE: apps/web/hooks/useOrganization.ts function useOrganization (line 4) | function useOrganization(organizationId: string) { FILE: apps/web/hooks/useOrganizationMembers.ts function useOrganizationMembers (line 4) | function useOrganizationMembers(organizationId: string) { FILE: apps/web/hooks/useOrganizationMembership.ts function useOrganizationMembership (line 5) | function useOrganizationMembership(emailAccountId?: string) { FILE: apps/web/hooks/usePersona.ts function usePersona (line 4) | function usePersona() { FILE: apps/web/hooks/useRule.tsx function useRule (line 4) | function useRule(ruleId?: string | null) { FILE: apps/web/hooks/useRules.tsx function useRules (line 5) | function useRules(emailAccountId?: string) { FILE: apps/web/hooks/useSetupProgress.ts function useSetupProgress (line 4) | function useSetupProgress() { FILE: apps/web/hooks/useSlackConnect.ts function useSlackConnect (line 11) | function useSlackConnect({ FILE: apps/web/hooks/useTableKeyboardNavigation.ts type UseTableKeyboardNavigationOptions (line 3) | interface UseTableKeyboardNavigationOptions { function useTableKeyboardNavigation (line 8) | function useTableKeyboardNavigation({ FILE: apps/web/hooks/useThread.ts function useThread (line 4) | function useThread( FILE: apps/web/hooks/useThreads.ts type Thread (line 6) | type Thread = EmailThread; function useThreads (line 8) | function useThreads({ FILE: apps/web/hooks/useThreadsByIds.ts function useThreadsByIds (line 4) | function useThreadsByIds( FILE: apps/web/hooks/useToggleSelect.ts function useToggleSelect (line 3) | function useToggleSelect(items: { id: string }[]) { FILE: apps/web/hooks/useUser.ts function useUser (line 5) | function useUser() { FILE: apps/web/instrumentation.ts function register (line 4) | function register() { FILE: apps/web/lib/commands/fuzzy-search.ts function fuzzySearch (line 14) | function fuzzySearch(query: string, commands: Command[]): Command[] { FILE: apps/web/lib/commands/types.ts type CommandSection (line 3) | type CommandSection = type Command (line 10) | interface Command { FILE: apps/web/mdx-components.tsx function useMDXComponents (line 5) | function useMDXComponents(components: MDXComponents): MDXComponents { FILE: apps/web/next.config.ts method redirects (line 70) | async redirects() { method rewrites (line 186) | async rewrites() { method headers (line 207) | async headers() { FILE: apps/web/prisma/migrations/20230730073019_init/migration.sql type "Account" (line 5) | CREATE TABLE "Account" ( type "Session" (line 25) | CREATE TABLE "Session" ( type "User" (line 35) | CREATE TABLE "User" ( type "VerificationToken" (line 51) | CREATE TABLE "VerificationToken" ( type "PromptHistory" (line 58) | CREATE TABLE "PromptHistory" ( type "Label" (line 69) | CREATE TABLE "Label" ( type "Rule" (line 83) | CREATE TABLE "Rule" ( type "Action" (line 95) | CREATE TABLE "Action" ( type "ExecutedRule" (line 112) | CREATE TABLE "ExecutedRule" ( type "Account" (line 128) | CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account... type "Session" (line 131) | CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken") type "User" (line 134) | CREATE UNIQUE INDEX "User_email_key" ON "User"("email") type "VerificationToken" (line 137) | CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"... type "VerificationToken" (line 140) | CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "Verific... type "Label" (line 143) | CREATE UNIQUE INDEX "Label_gmailLabelId_userId_key" ON "Label"("gmailLab... type "Label" (line 146) | CREATE UNIQUE INDEX "Label_name_userId_key" ON "Label"("name", "userId") FILE: apps/web/prisma/migrations/20230804105315_rule_name/migration.sql type "Rule" (line 5) | CREATE UNIQUE INDEX "Rule_name_userId_key" ON "Rule"("name", "userId") FILE: apps/web/prisma/migrations/20231027022923_unique_account/migration.sql type "Account" (line 9) | CREATE UNIQUE INDEX "Account_userId_key" ON "Account"("userId") FILE: apps/web/prisma/migrations/20231213064514_newsletter_status/migration.sql type "Newsletter" (line 5) | CREATE TABLE "Newsletter" ( type "Newsletter" (line 17) | CREATE UNIQUE INDEX "Newsletter_email_userId_key" ON "Newsletter"("email... FILE: apps/web/prisma/migrations/20240116235134_shared_premium/migration.sql type "Premium" (line 11) | CREATE TABLE "Premium" ( FILE: apps/web/prisma/migrations/20240319131634_executed_actions/migration.sql type "ExecutedAction" (line 9) | CREATE TABLE "ExecutedAction" ( FILE: apps/web/prisma/migrations/20240319151146_unique_executed_rule/migration.sql type "ExecutedRule" (line 24) | CREATE UNIQUE INDEX "ExecutedRule_userId_threadId_messageId_key" ON "Exe... FILE: apps/web/prisma/migrations/20240424111051_groups/migration.sql type "Group" (line 15) | CREATE TABLE "Group" ( type "GroupItem" (line 27) | CREATE TABLE "GroupItem" ( type "Group" (line 39) | CREATE UNIQUE INDEX "Group_name_userId_key" ON "Group"("name", "userId") type "GroupItem" (line 42) | CREATE UNIQUE INDEX "GroupItem_groupId_type_value_key" ON "GroupItem"("g... type "Rule" (line 45) | CREATE UNIQUE INDEX "Rule_groupId_key" ON "Rule"("groupId") FILE: apps/web/prisma/migrations/20240513103627_mark_not_cold_email/migration.sql type "Newsletter" (line 8) | CREATE INDEX "Newsletter_email_coldEmail_idx" ON "Newsletter"("email", "... type "Newsletter" (line 11) | CREATE INDEX "Newsletter_email_status_idx" ON "Newsletter"("email", "sta... FILE: apps/web/prisma/migrations/20240516112326_remove_newsletter_cold_email/migration.sql type "Newsletter" (line 22) | CREATE INDEX "Newsletter_userId_status_idx" ON "Newsletter"("userId", "s... FILE: apps/web/prisma/migrations/20240516112350_cold_email_model/migration.sql type "ColdEmail" (line 5) | CREATE TABLE "ColdEmail" ( type "ColdEmail" (line 20) | CREATE INDEX "ColdEmail_userId_status_idx" ON "ColdEmail"("userId", "sta... type "ColdEmail" (line 23) | CREATE UNIQUE INDEX "ColdEmail_userId_fromEmail_key" ON "ColdEmail"("use... FILE: apps/web/prisma/migrations/20240728084326_api_key/migration.sql type "ApiKey" (line 2) | CREATE TABLE "ApiKey" ( type "ApiKey" (line 15) | CREATE UNIQUE INDEX "ApiKey_hashedKey_key" ON "ApiKey"("hashedKey") type "ApiKey" (line 18) | CREATE INDEX "ApiKey_userId_isActive_idx" ON "ApiKey"("userId", "isActive") FILE: apps/web/prisma/migrations/20241023204900_category/migration.sql type "Category" (line 5) | CREATE TABLE "Category" ( type "Category" (line 17) | CREATE UNIQUE INDEX "Category_name_userId_key" ON "Category"("name", "us... FILE: apps/web/prisma/migrations/20241027173153_category_filter/migration.sql type "_CategoryToRule" (line 17) | CREATE TABLE "_CategoryToRule" ( type "_CategoryToRule" (line 23) | CREATE UNIQUE INDEX "_CategoryToRule_AB_unique" ON "_CategoryToRule"("A"... type "_CategoryToRule" (line 26) | CREATE INDEX "_CategoryToRule_B_index" ON "_CategoryToRule"("B") FILE: apps/web/prisma/migrations/20250112081255_pending_invite/migration.sql type "Premium" (line 5) | CREATE INDEX "Premium_pendingInvites_idx" ON "Premium"("pendingInvites") FILE: apps/web/prisma/migrations/20250202092329_reply_tracker/migration.sql type "ThreadTracker" (line 8) | CREATE TABLE "ThreadTracker" ( type "ThreadTracker" (line 23) | CREATE INDEX "ThreadTracker_userId_resolved_idx" ON "ThreadTracker"("use... type "ThreadTracker" (line 26) | CREATE UNIQUE INDEX "ThreadTracker_userId_threadId_messageId_key" ON "Th... type "Rule" (line 35) | CREATE UNIQUE INDEX "Rule_userId_trackReplies_unique" FILE: apps/web/prisma/migrations/20250204162638_email_token/migration.sql type "EmailToken" (line 2) | CREATE TABLE "EmailToken" ( type "EmailToken" (line 14) | CREATE UNIQUE INDEX "EmailToken_token_key" ON "EmailToken"("token") FILE: apps/web/prisma/migrations/20250210224905_summary_indexes/migration.sql type "ColdEmail" (line 2) | CREATE INDEX "ColdEmail_userId_createdAt_idx" ON "ColdEmail"("userId", "... type "ExecutedRule" (line 5) | CREATE INDEX "ExecutedRule_userId_status_createdAt_idx" ON "ExecutedRule... type "User" (line 8) | CREATE INDEX "User_lastSummaryEmailAt_idx" ON "User"("lastSummaryEmailAt") FILE: apps/web/prisma/migrations/20250210225300_tracker_indexes/migration.sql type "ThreadTracker" (line 2) | CREATE INDEX "ThreadTracker_userId_resolved_sentAt_type_idx" ON "ThreadT... type "ThreadTracker" (line 5) | CREATE INDEX "ThreadTracker_userId_type_resolved_sentAt_idx" ON "ThreadT... FILE: apps/web/prisma/migrations/20250227135610_payments/migration.sql type "Payment" (line 2) | CREATE TABLE "Payment" ( type "Payment" (line 23) | CREATE UNIQUE INDEX "Payment_processorId_key" ON "Payment"("processorId") FILE: apps/web/prisma/migrations/20250309095123_cleaner/migration.sql type "CleanupJob" (line 2) | CREATE TABLE "CleanupJob" ( type "CleanupThread" (line 12) | CREATE TABLE "CleanupThread" ( FILE: apps/web/prisma/migrations/20250316155443_email_message/migration.sql type "EmailMessage" (line 2) | CREATE TABLE "EmailMessage" ( type "EmailMessage" (line 25) | CREATE INDEX "EmailMessage_userId_threadId_idx" ON "EmailMessage"("userI... type "EmailMessage" (line 28) | CREATE INDEX "EmailMessage_userId_date_idx" ON "EmailMessage"("userId", ... type "EmailMessage" (line 31) | CREATE INDEX "EmailMessage_userId_from_idx" ON "EmailMessage"("userId", ... type "EmailMessage" (line 34) | CREATE UNIQUE INDEX "EmailMessage_userId_threadId_messageId_key" ON "Ema... FILE: apps/web/prisma/migrations/20250403104153_unique_knowledge_title/migration.sql type "Knowledge" (line 2) | CREATE TABLE "Knowledge" ( type "Knowledge" (line 14) | CREATE UNIQUE INDEX "Knowledge_userId_title_key" ON "Knowledge"("userId"... FILE: apps/web/prisma/migrations/20250414091625_rule_system_type/migration.sql type "Rule" (line 14) | CREATE UNIQUE INDEX "Rule_userId_systemType_key" ON "Rule"("userId", "sy... FILE: apps/web/prisma/migrations/20250415162053_draft_score/migration.sql type "DraftSendLog" (line 6) | CREATE TABLE "DraftSendLog" ( type "DraftSendLog" (line 17) | CREATE UNIQUE INDEX "DraftSendLog_executedActionId_key" ON "DraftSendLog... type "DraftSendLog" (line 20) | CREATE INDEX "DraftSendLog_executedActionId_idx" ON "DraftSendLog"("exec... FILE: apps/web/prisma/migrations/20250417135524_writing_style/migration.sql type "EmailAccount" (line 11) | CREATE TABLE "EmailAccount" ( type "EmailAccount" (line 24) | CREATE UNIQUE INDEX "EmailAccount_email_key" ON "EmailAccount"("email") type "EmailAccount" (line 27) | CREATE UNIQUE INDEX "EmailAccount_accountId_key" ON "EmailAccount"("acco... type "Account" (line 30) | CREATE UNIQUE INDEX "Account_emailAccountId_key" ON "Account"("emailAcco... FILE: apps/web/prisma/migrations/20250420131728_email_account_settings/migration.sql type "EmailAccount" (line 49) | CREATE INDEX "EmailAccount_lastSummaryEmailAt_idx" ON "EmailAccount"("la... FILE: apps/web/prisma/migrations/20250429192105_mutli_email/migration.sql type "EmailAccount" (line 238) | CREATE UNIQUE INDEX "EmailAccount_email_key" ON "EmailAccount"("email") type "Category" (line 241) | CREATE UNIQUE INDEX "Category_name_emailAccountId_key" ON "Category"("na... type "ColdEmail" (line 244) | CREATE INDEX "ColdEmail_emailAccountId_status_idx" ON "ColdEmail"("email... type "ColdEmail" (line 247) | CREATE INDEX "ColdEmail_emailAccountId_createdAt_idx" ON "ColdEmail"("em... type "ColdEmail" (line 250) | CREATE UNIQUE INDEX "ColdEmail_emailAccountId_fromEmail_key" ON "ColdEma... type "EmailMessage" (line 253) | CREATE INDEX "EmailMessage_emailAccountId_threadId_idx" ON "EmailMessage... type "EmailMessage" (line 256) | CREATE INDEX "EmailMessage_emailAccountId_date_idx" ON "EmailMessage"("e... type "EmailMessage" (line 259) | CREATE INDEX "EmailMessage_emailAccountId_from_idx" ON "EmailMessage"("e... type "EmailMessage" (line 262) | CREATE UNIQUE INDEX "EmailMessage_emailAccountId_threadId_messageId_key"... type "ExecutedRule" (line 265) | CREATE INDEX "ExecutedRule_emailAccountId_status_createdAt_idx" ON "Exec... type "ExecutedRule" (line 268) | CREATE UNIQUE INDEX "ExecutedRule_emailAccountId_threadId_messageId_key"... type "Group" (line 271) | CREATE UNIQUE INDEX "Group_name_emailAccountId_key" ON "Group"("name", "... type "Knowledge" (line 274) | CREATE UNIQUE INDEX "Knowledge_emailAccountId_title_key" ON "Knowledge"(... type "Label" (line 277) | CREATE UNIQUE INDEX "Label_gmailLabelId_emailAccountId_key" ON "Label"("... type "Label" (line 280) | CREATE UNIQUE INDEX "Label_name_emailAccountId_key" ON "Label"("name", "... type "Newsletter" (line 283) | CREATE INDEX "Newsletter_emailAccountId_status_idx" ON "Newsletter"("ema... type "Newsletter" (line 286) | CREATE UNIQUE INDEX "Newsletter_email_emailAccountId_key" ON "Newsletter... type "Rule" (line 289) | CREATE UNIQUE INDEX "Rule_name_emailAccountId_key" ON "Rule"("name", "em... type "Rule" (line 292) | CREATE UNIQUE INDEX "Rule_emailAccountId_systemType_key" ON "Rule"("emai... type "ThreadTracker" (line 295) | CREATE INDEX "ThreadTracker_emailAccountId_resolved_idx" ON "ThreadTrack... type "ThreadTracker" (line 298) | CREATE INDEX "ThreadTracker_emailAccountId_resolved_sentAt_type_idx" ON ... type "ThreadTracker" (line 301) | CREATE INDEX "ThreadTracker_emailAccountId_type_resolved_sentAt_idx" ON ... type "ThreadTracker" (line 304) | CREATE UNIQUE INDEX "ThreadTracker_emailAccountId_threadId_messageId_key... FILE: apps/web/prisma/migrations/20250506025728_stripe/migration.sql type "Premium" (line 46) | CREATE UNIQUE INDEX "Premium_stripeCustomerId_key" ON "Premium"("stripeC... type "Premium" (line 49) | CREATE UNIQUE INDEX "Premium_stripeSubscriptionId_key" ON "Premium"("str... type "Premium" (line 52) | CREATE UNIQUE INDEX "Premium_stripeSubscriptionItemId_key" ON "Premium"(... FILE: apps/web/prisma/migrations/20250521104911_chat/migration.sql type "Chat" (line 2) | CREATE TABLE "Chat" ( type "ChatMessage" (line 12) | CREATE TABLE "ChatMessage" ( type "Chat" (line 24) | CREATE INDEX "Chat_emailAccountId_idx" ON "Chat"("emailAccountId") type "ChatMessage" (line 27) | CREATE INDEX "ChatMessage_chatId_idx" ON "ChatMessage"("chatId") FILE: apps/web/prisma/migrations/20250609204102_rule_history/migration.sql type "RuleHistory" (line 5) | CREATE TABLE "RuleHistory" ( type "RuleHistory" (line 31) | CREATE INDEX "RuleHistory_ruleId_createdAt_idx" ON "RuleHistory"("ruleId... type "RuleHistory" (line 34) | CREATE UNIQUE INDEX "RuleHistory_ruleId_version_key" ON "RuleHistory"("r... FILE: apps/web/prisma/migrations/20250612142528_referrals/migration.sql type "Referral" (line 17) | CREATE TABLE "Referral" ( type "Referral" (line 33) | CREATE UNIQUE INDEX "Referral_referredUserId_key" ON "Referral"("referre... type "Referral" (line 36) | CREATE INDEX "Referral_referrerUserId_idx" ON "Referral"("referrerUserId") type "Referral" (line 39) | CREATE INDEX "Referral_status_idx" ON "Referral"("status") type "User" (line 42) | CREATE UNIQUE INDEX "User_referralCode_key" ON "User"("referralCode") FILE: apps/web/prisma/migrations/20250616122919_add_digest/migration.sql type "Digest" (line 21) | CREATE TABLE "Digest" ( type "DigestItem" (line 33) | CREATE TABLE "DigestItem" ( type "Schedule" (line 48) | CREATE TABLE "Schedule" ( type "Digest" (line 64) | CREATE INDEX "Digest_emailAccountId_idx" ON "Digest"("emailAccountId") type "DigestItem" (line 67) | CREATE UNIQUE INDEX "DigestItem_digestId_threadId_messageId_key" ON "Dig... type "Schedule" (line 70) | CREATE UNIQUE INDEX "Schedule_emailAccountId_key" ON "Schedule"("emailAc... type "EmailAccount" (line 73) | CREATE UNIQUE INDEX "EmailAccount_digestScheduleId_key" ON "EmailAccount... FILE: apps/web/prisma/migrations/20250722084939_schedule_actions/migration.sql type "ScheduledAction" (line 11) | CREATE TABLE "ScheduledAction" ( type "ScheduledAction" (line 38) | CREATE UNIQUE INDEX "ScheduledAction_executedActionId_key" ON "Scheduled... type "ScheduledAction" (line 41) | CREATE INDEX "ScheduledAction_status_scheduledFor_idx" ON "ScheduledActi... type "ScheduledAction" (line 44) | CREATE INDEX "ScheduledAction_emailAccountId_messageId_idx" ON "Schedule... FILE: apps/web/prisma/migrations/20250904131746_add_sso_and_organizations/migration.sql type "Organization" (line 5) | CREATE TABLE "Organization" ( type "Member" (line 18) | CREATE TABLE "Member" ( type "invitation" (line 30) | CREATE TABLE "invitation" ( type "verification" (line 43) | CREATE TABLE "verification" ( type "ssoProvider" (line 55) | CREATE TABLE "ssoProvider" ( type "Organization" (line 69) | CREATE UNIQUE INDEX "Organization_slug_key" ON "Organization"("slug") type "Member" (line 72) | CREATE UNIQUE INDEX "Member_organizationId_userId_key" ON "Member"("orga... type "ssoProvider" (line 75) | CREATE UNIQUE INDEX "ssoProvider_providerId_key" ON "ssoProvider"("provi... FILE: apps/web/prisma/migrations/20250912071705_calendar/migration.sql type "public" (line 2) | CREATE TABLE "public"."CalendarConnection" ( type "public" (line 18) | CREATE TABLE "public"."Calendar" ( type "public" (line 34) | CREATE UNIQUE INDEX "CalendarConnection_emailAccountId_provider_email_ke... type "public" (line 37) | CREATE UNIQUE INDEX "Calendar_connectionId_calendarId_key" ON "public"."... FILE: apps/web/prisma/migrations/20250918194235_update_org_tables_to_email_account/migration.sql type "Member" (line 31) | CREATE UNIQUE INDEX "Member_organizationId_emailAccountId_key" ON "Membe... type "Member" (line 43) | CREATE INDEX "Member_emailAccountId_idx" ON "Member"("emailAccountId") FILE: apps/web/prisma/migrations/20251001142931_mcp/migration.sql type "McpIntegration" (line 2) | CREATE TABLE "McpIntegration" ( type "McpConnection" (line 17) | CREATE TABLE "McpConnection" ( type "McpTool" (line 34) | CREATE TABLE "McpTool" ( type "McpIntegration" (line 48) | CREATE UNIQUE INDEX "McpIntegration_name_key" ON "McpIntegration"("name") type "McpConnection" (line 51) | CREATE UNIQUE INDEX "McpConnection_emailAccountId_integrationId_key" ON ... type "McpTool" (line 54) | CREATE UNIQUE INDEX "McpTool_connectionId_name_key" ON "McpTool"("connec... FILE: apps/web/prisma/migrations/20251021123040_drop_executed_rule_unique/migration.sql type "ExecutedRule" (line 5) | CREATE INDEX "ExecutedRule_emailAccountId_threadId_messageId_ruleId_idx"... type "ExecutedRule" (line 8) | CREATE INDEX "ExecutedRule_emailAccountId_messageId_idx" ON "ExecutedRul... FILE: apps/web/prisma/migrations/20251030010539_indexes/migration.sql type "Account" (line 2) | CREATE INDEX IF NOT EXISTS "Account_userId_idx" ON "Account"("userId") type "Action" (line 5) | CREATE INDEX IF NOT EXISTS "Action_ruleId_idx" ON "Action"("ruleId") type "CleanupJob" (line 8) | CREATE INDEX IF NOT EXISTS "CleanupJob_emailAccountId_idx" ON "CleanupJo... type "CleanupThread" (line 11) | CREATE INDEX IF NOT EXISTS "CleanupThread_jobId_idx" ON "CleanupThread"(... type "DigestItem" (line 14) | CREATE INDEX IF NOT EXISTS "DigestItem_actionId_idx" ON "DigestItem"("ac... type "DigestItem" (line 17) | CREATE INDEX IF NOT EXISTS "DigestItem_coldEmailId_idx" ON "DigestItem"(... type "EmailAccount" (line 20) | CREATE INDEX IF NOT EXISTS "EmailAccount_userId_idx" ON "EmailAccount"("... type "EmailToken" (line 23) | CREATE INDEX IF NOT EXISTS "EmailToken_emailAccountId_idx" ON "EmailToke... type "ExecutedAction" (line 26) | CREATE INDEX IF NOT EXISTS "ExecutedAction_executedRuleId_idx" ON "Execu... type "Newsletter" (line 29) | CREATE INDEX IF NOT EXISTS "Newsletter_categoryId_idx" ON "Newsletter"("... type "Payment" (line 32) | CREATE INDEX IF NOT EXISTS "Payment_premiumId_idx" ON "Payment"("premium... type "ScheduledAction" (line 35) | CREATE INDEX IF NOT EXISTS "ScheduledAction_executedRuleId_idx" ON "Sche... type "Session" (line 38) | CREATE INDEX IF NOT EXISTS "Session_userId_idx" ON "Session"("userId") type "Session" (line 41) | CREATE INDEX IF NOT EXISTS "Session_activeOrganizationId_idx" ON "Sessio... type "invitation" (line 44) | CREATE INDEX IF NOT EXISTS "invitation_organizationId_idx" ON "invitatio... type "invitation" (line 47) | CREATE INDEX IF NOT EXISTS "invitation_inviterId_idx" ON "invitation"("i... type "ssoProvider" (line 50) | CREATE INDEX IF NOT EXISTS "ssoProvider_emailAccountId_idx" ON "ssoProvi... type "ssoProvider" (line 53) | CREATE INDEX IF NOT EXISTS "ssoProvider_organizationId_idx" ON "ssoProvi... FILE: apps/web/prisma/migrations/20251204222441_fromname_index/migration.sql type "EmailMessage" (line 2) | CREATE INDEX "EmailMessage_emailAccountId_fromName_idx" ON "EmailMessage... FILE: apps/web/prisma/migrations/20251207172822_response_time/migration.sql type "ResponseTime" (line 2) | CREATE TABLE "ResponseTime" ( type "ResponseTime" (line 17) | CREATE INDEX "ResponseTime_emailAccountId_sentAt_idx" ON "ResponseTime"(... type "ResponseTime" (line 20) | CREATE UNIQUE INDEX "ResponseTime_emailAccountId_sentMessageId_key" ON "... FILE: apps/web/prisma/migrations/20251210202624_meeting_briefs/migration.sql type "MeetingBriefing" (line 9) | CREATE TABLE "MeetingBriefing" ( type "MeetingBriefing" (line 23) | CREATE INDEX "MeetingBriefing_emailAccountId_idx" ON "MeetingBriefing"("... type "MeetingBriefing" (line 26) | CREATE UNIQUE INDEX "MeetingBriefing_emailAccountId_calendarEventId_key"... FILE: apps/web/prisma/migrations/20251221132935_drive/migration.sql type "DriveConnection" (line 9) | CREATE TABLE "DriveConnection" ( type "FilingFolder" (line 25) | CREATE TABLE "FilingFolder" ( type "DocumentFiling" (line 39) | CREATE TABLE "DocumentFiling" ( type "DriveConnection" (line 65) | CREATE INDEX "DriveConnection_emailAccountId_idx" ON "DriveConnection"("... type "DriveConnection" (line 68) | CREATE UNIQUE INDEX "DriveConnection_emailAccountId_provider_key" ON "Dr... type "FilingFolder" (line 71) | CREATE INDEX "FilingFolder_driveConnectionId_idx" ON "FilingFolder"("dri... type "FilingFolder" (line 74) | CREATE UNIQUE INDEX "FilingFolder_emailAccountId_folderId_key" ON "Filin... type "DocumentFiling" (line 77) | CREATE UNIQUE INDEX "DocumentFiling_notificationToken_key" ON "DocumentF... type "DocumentFiling" (line 80) | CREATE INDEX "DocumentFiling_emailAccountId_status_idx" ON "DocumentFili... type "DocumentFiling" (line 83) | CREATE INDEX "DocumentFiling_driveConnectionId_idx" ON "DocumentFiling"(... type "DocumentFiling" (line 86) | CREATE INDEX "DocumentFiling_messageId_idx" ON "DocumentFiling"("message... type "DocumentFiling" (line 89) | CREATE INDEX "DocumentFiling_notificationToken_idx" ON "DocumentFiling"(... FILE: apps/web/prisma/migrations/20251223000001_rename_notification_token_to_message_id/migration.sql type "DocumentFiling" (line 6) | CREATE INDEX "DocumentFiling_notificationMessageId_idx" ON "DocumentFili... FILE: apps/web/prisma/migrations/20260115091612_follow_up_index/migration.sql type "ThreadTracker" (line 2) | CREATE INDEX IF NOT EXISTS "ThreadTracker_emailAccountId_type_resolved_f... FILE: apps/web/prisma/migrations/20260126000001_enforce_single_org_per_email/migration.sql type "Member" (line 2) | CREATE UNIQUE INDEX "Member_emailAccountId_key" ON "Member"("emailAccoun... FILE: apps/web/prisma/migrations/20260208000000_add_messaging_channels/migration.sql type "MessagingChannel" (line 8) | CREATE TABLE "MessagingChannel" ( type "MessagingChannel" (line 29) | CREATE INDEX "MessagingChannel_emailAccountId_idx" ON "MessagingChannel"... type "MessagingChannel" (line 32) | CREATE INDEX "MessagingChannel_provider_teamId_idx" ON "MessagingChannel... type "MessagingChannel" (line 35) | CREATE UNIQUE INDEX "MessagingChannel_emailAccountId_provider_teamId_key... FILE: apps/web/prisma/migrations/20260209111238_add_executed_rule_created_at_index/migration.sql type "ExecutedRule" (line 2) | CREATE INDEX "ExecutedRule_emailAccountId_createdAt_idx" ON "ExecutedRul... FILE: apps/web/prisma/migrations/20260214000000_chat_compaction_memory/migration.sql type "ChatCompaction" (line 5) | CREATE TABLE "ChatCompaction" ( type "ChatMemory" (line 17) | CREATE TABLE "ChatMemory" ( type "ChatCompaction" (line 29) | CREATE INDEX "ChatCompaction_chatId_idx" ON "ChatCompaction"("chatId") type "ChatMemory" (line 32) | CREATE INDEX "ChatMemory_emailAccountId_idx" ON "ChatMemory"("emailAccou... FILE: apps/web/prisma/migrations/20260219024141_automation_jobs/migration.sql type "AutomationJob" (line 5) | CREATE TABLE "AutomationJob" ( type "AutomationJobRun" (line 21) | CREATE TABLE "AutomationJobRun" ( type "AutomationJob" (line 36) | CREATE INDEX "AutomationJob_emailAccountId_enabled_nextRunAt_idx" ON "Au... type "AutomationJob" (line 39) | CREATE INDEX "AutomationJob_enabled_nextRunAt_idx" ON "AutomationJob"("e... type "AutomationJob" (line 42) | CREATE INDEX "AutomationJob_messagingChannelId_emailAccountId_idx" ON "A... type "AutomationJob" (line 45) | CREATE UNIQUE INDEX "AutomationJob_emailAccountId_key" ON "AutomationJob... type "AutomationJobRun" (line 48) | CREATE INDEX "AutomationJobRun_automationJobId_createdAt_idx" ON "Automa... type "AutomationJobRun" (line 51) | CREATE INDEX "AutomationJobRun_status_createdAt_idx" ON "AutomationJobRu... type "AutomationJobRun" (line 54) | CREATE UNIQUE INDEX "AutomationJobRun_automationJobId_scheduledFor_key" ... type "MessagingChannel" (line 57) | CREATE UNIQUE INDEX "MessagingChannel_id_emailAccountId_key" ON "Messagi... FILE: apps/web/prisma/migrations/20260311120000_account_scoped_api_keys/migration.sql type "ApiKey" (line 16) | CREATE INDEX "ApiKey_emailAccountId_isActive_idx" ON "ApiKey"("emailAcco... FILE: apps/web/prisma/migrations/20260311130000_add_attachment_sources/migration.sql type "AttachmentSource" (line 3) | CREATE TABLE "AttachmentSource" ( type "AttachmentDocument" (line 17) | CREATE TABLE "AttachmentDocument" ( type "AttachmentSource" (line 35) | CREATE UNIQUE INDEX "AttachmentSource_ruleId_driveConnectionId_type_sour... type "AttachmentSource" (line 38) | CREATE INDEX "AttachmentSource_ruleId_idx" ON "AttachmentSource"("ruleId") type "AttachmentSource" (line 39) | CREATE INDEX "AttachmentSource_driveConnectionId_idx" ON "AttachmentSour... type "AttachmentDocument" (line 41) | CREATE UNIQUE INDEX "AttachmentDocument_attachmentSourceId_fileId_key" type "AttachmentDocument" (line 44) | CREATE INDEX "AttachmentDocument_attachmentSourceId_modifiedAt_idx" FILE: apps/web/prisma/migrations/20260317113949_add_reply_memories/migration.sql type "ReplyMemory" (line 7) | CREATE TABLE "ReplyMemory" ( type "ReplyMemorySource" (line 22) | CREATE TABLE "ReplyMemorySource" ( type "ReplyMemory" (line 31) | CREATE INDEX "ReplyMemory_emailAccountId_updatedAt_idx" ON "ReplyMemory"... type "ReplyMemory" (line 34) | CREATE INDEX "ReplyMemory_emailAccountId_scopeType_scopeValue_idx" ON "R... type "ReplyMemory" (line 37) | CREATE UNIQUE INDEX "ReplyMemory_emailAccountId_kind_scopeType_scopeValu... type "ReplyMemorySource" (line 40) | CREATE INDEX "ReplyMemorySource_draftSendLogId_idx" ON "ReplyMemorySourc... type "DraftSendLog" (line 49) | CREATE INDEX "DraftSendLog_replyMemoryProcessedAt_replyMemoryAttemptCoun... FILE: apps/web/providers/AppProviders.tsx function AppProviders (line 10) | function AppProviders(props: { children: React.ReactNode }) { FILE: apps/web/providers/ChatProvider.tsx type Attachment (line 29) | type Attachment = { type Chat (line 36) | type Chat = ReturnType>; type ChatContextType (line 38) | type ChatContextType = { function ChatProvider (line 54) | function ChatProvider({ children }: { children: React.ReactNode }) { function useChat (line 198) | function useChat(): ChatContextType { function generateUUID (line 207) | function generateUUID(): string { FILE: apps/web/providers/ComposeModalProvider.tsx type Context (line 13) | type Context = { function ComposeModalProvider (line 23) | function ComposeModalProvider(props: { children: React.ReactNode }) { FILE: apps/web/providers/EmailAccountProvider.tsx type Context (line 8) | type Context = { function EmailAccountProvider (line 18) | function EmailAccountProvider({ function useAccount (line 85) | function useAccount() { FILE: apps/web/providers/EmailProvider.tsx type EmailLabel (line 12) | type EmailLabel = { type EmailLabels (line 24) | type EmailLabels = Record; type Context (line 26) | interface Context { function mapLabelColor (line 38) | function mapLabelColor(provider: string, label: any): EmailLabel["color"] { function EmailProvider (line 60) | function EmailProvider(props: { children: React.ReactNode }) { FILE: apps/web/providers/GlobalProviders.tsx function GlobalProviders (line 8) | function GlobalProviders(props: { children: React.ReactNode }) { FILE: apps/web/providers/GmailProvider.tsx type GmailLabel (line 6) | type GmailLabel = { type GmailLabels (line 16) | type GmailLabels = Record; type Context (line 18) | interface Context { function GmailProvider (line 30) | function GmailProvider(props: { children: React.ReactNode }) { FILE: apps/web/providers/PostHogProvider.tsx function PostHogPageview (line 13) | function PostHogPageview() { function PostHogIdentify (line 32) | function PostHogIdentify() { function PostHogProvider (line 72) | function PostHogProvider({ children }: { children: React.ReactNode }) { FILE: apps/web/providers/SWRProvider.tsx type Context (line 110) | interface Context { function getDevOnlySWRConfig (line 175) | function getDevOnlySWRConfig() { FILE: apps/web/providers/StatLoaderProvider.tsx type Context (line 15) | type Context = { class StatLoader (line 37) | class StatLoader { method loadStats (line 40) | async loadStats({ function StatLoaderProvider (line 69) | function StatLoaderProvider(props: { children: React.ReactNode }) { function LoadStats (line 116) | function LoadStats(props: { loadBefore: boolean; showToast: boolean }) { FILE: apps/web/sanity.config.ts function hasMarketingSanityConfig (line 35) | function hasMarketingSanityConfig() { FILE: apps/web/scripts/addUsersToResend.ts function main (line 13) | async function main() { FILE: apps/web/scripts/check-enum-imports.js constant PRISMA_ENUMS (line 36) | const PRISMA_ENUMS = [ FILE: apps/web/scripts/generate-llm-pricing.ts constant OPENROUTER_MODELS_URLS (line 12) | const OPENROUTER_MODELS_URLS = [ constant OUTPUT_FILE (line 16) | const OUTPUT_FILE = new URL( constant COMMON_OPENROUTER_MODEL_IDS (line 20) | const COMMON_OPENROUTER_MODEL_IDS = [ constant COMMON_MODEL_ALIASES (line 25) | const COMMON_MODEL_ALIASES: Record = { type OpenRouterModel (line 52) | type OpenRouterModel = z.infer; type OpenRouterModelsResponse (line 53) | type OpenRouterModelsResponse = z.infer) { function buildPricingMap (line 118) | function buildPricingMap(payload: OpenRouterModelsResponse) { function parsePricing (line 174) | function parsePricing(pricing: OpenRouterModel["pricing"]) { function parsePrice (line 190) | function parsePrice(value: string | number | null | undefined) { function buildOpenRouterModelIdCandidates (line 198) | function buildOpenRouterModelIdCandidates(supportedModelId: string): str... function renderGeneratedFile (line 220) | function renderGeneratedFile(pricingByModel: Record { FILE: apps/web/store/QueueInitializer.tsx function useInitializeQueues (line 9) | function useInitializeQueues() { function QueueInitializer (line 26) | function QueueInitializer() { FILE: apps/web/store/ai-categorize-sender-queue.ts type CategorizationStatus (line 10) | type CategorizationStatus = "pending" | "processing" | "completed"; type QueueItem (line 12) | interface QueueItem { function processAiCategorizeSenderQueue (line 65) | function processAiCategorizeSenderQueue({ FILE: apps/web/store/archive-queue.ts type ActionType (line 13) | type ActionType = "archive" | "delete" | "markRead"; type QueueItem (line 15) | type QueueItem = { type QueueState (line 21) | type QueueState = { function useQueueState (line 50) | function useQueueState() { type ActionFunction (line 54) | type ActionFunction = ({ function removeThreadFromQueue (line 158) | function removeThreadFromQueue(threadId: string, actionType: ActionType) { function processQueue (line 174) | function processQueue({ FILE: apps/web/store/sender-queue.ts type QueueStatus (line 8) | type QueueStatus = "pending" | "processing" | "completed"; type QueueItem (line 10) | interface QueueItem { type ProcessThreadsFn (line 16) | type ProcessThreadsFn = (params: { function createSenderQueue (line 24) | function createSenderQueue(processThreads: ProcessThreadsFn) { function fetchSenderThreads (line 139) | async function fetchSenderThreads({ FILE: apps/web/utils/account-linking.ts function getAccountLinkingUrl (line 10) | async function getAccountLinkingUrl( FILE: apps/web/utils/account.ts function getGmailClientForEmail (line 21) | async function getGmailClientForEmail({ function getGmailAndAccessTokenForEmail (line 39) | async function getGmailAndAccessTokenForEmail({ function getOutlookClientForEmail (line 58) | async function getOutlookClientForEmail({ function getOutlookAndAccessTokenForEmail (line 76) | async function getOutlookAndAccessTokenForEmail({ function getOutlookClientForEmailId (line 95) | async function getOutlookClientForEmailId({ function getTokens (line 120) | async function getTokens({ emailAccountId }: { emailAccountId: string }) { function redirectToEmailAccountPath (line 137) | async function redirectToEmailAccountPath( function getLastEmailAccountFromCookie (line 169) | async function getLastEmailAccountFromCookie( FILE: apps/web/utils/action-display.tsx function getActionDisplay (line 19) | function getActionDisplay( function getActionIcon (line 89) | function getActionIcon(actionType: ActionType) { FILE: apps/web/utils/action-item.ts function getActionFields (line 157) | function getActionFields(fields: Action | ExecutedAction | undefined) { type ActionFieldsSelection (line 184) | type ActionFieldsSelection = Pick< type SanitizableActionFields (line 201) | type SanitizableActionFields = Partial< function sanitizeActionFields (line 208) | function sanitizeActionFields( FILE: apps/web/utils/action-sort.ts constant ACTION_TYPE_PRIORITY_ORDER (line 8) | const ACTION_TYPE_PRIORITY_ORDER: ActionType[] = [ function getActionTypePriority (line 31) | function getActionTypePriority(actionType: ActionType): number { function sortActionsByPriority (line 41) | function sortActionsByPriority( FILE: apps/web/utils/actions/__tests__/invitation-actions.test.ts method AUTO_ENABLE_ORG_ANALYTICS (line 26) | get AUTO_ENABLE_ORG_ANALYTICS() { FILE: apps/web/utils/actions/__tests__/organization-actions.test.ts method AUTO_ENABLE_ORG_ANALYTICS (line 23) | get AUTO_ENABLE_ORG_ANALYTICS() { FILE: apps/web/utils/actions/admin.ts function findUserWithDetails (line 492) | async function findUserWithDetails(email?: string, userId?: string) { FILE: apps/web/utils/actions/admin.validation.ts type HashEmailBody (line 6) | type HashEmailBody = z.infer; type ConvertGmailUrlBody (line 12) | type ConvertGmailUrlBody = z.infer; type GetLabelsBody (line 17) | type GetLabelsBody = z.infer; type WatchEmailsBody (line 22) | type WatchEmailsBody = z.infer; type GetUserInfoBody (line 27) | type GetUserInfoBody = z.infer; type DisableAllRulesBody (line 32) | type DisableAllRulesBody = z.infer; type CleanupDraftsBody (line 37) | type CleanupDraftsBody = z.infer; FILE: apps/web/utils/actions/ai-rule.validation.ts type TestAiCustomContentBody (line 6) | type TestAiCustomContentBody = z.infer; type RunRulesBody (line 14) | type RunRulesBody = z.infer; FILE: apps/web/utils/actions/announcements.validation.ts type AnnouncementDismissedBody (line 6) | type AnnouncementDismissedBody = z.infer< FILE: apps/web/utils/actions/api-key.ts function getApiKeyExpiryDate (line 54) | function getApiKeyExpiryDate(expiresIn: ApiKeyExpiryValue): Date | null { FILE: apps/web/utils/actions/api-key.validation.ts type CreateApiKeyBody (line 12) | type CreateApiKeyBody = z.infer; type DeactivateApiKeyBody (line 15) | type DeactivateApiKeyBody = z.infer; FILE: apps/web/utils/actions/assistant-chat.test.ts function buildPendingSendPart (line 591) | function buildPendingSendPart() { function buildProcessingSendPart (line 613) | function buildProcessingSendPart({ function buildPendingReplyPart (line 628) | function buildPendingReplyPart() { function buildPendingForwardPart (line 652) | function buildPendingForwardPart() { FILE: apps/web/utils/actions/assistant-chat.ts constant CONFIRMATION_IN_PROGRESS_ERROR (line 24) | const CONFIRMATION_IN_PROGRESS_ERROR = constant CONFIRMATION_PROCESSING_LEASE_MS (line 26) | const CONFIRMATION_PROCESSING_LEASE_MS = 5 * 60 * 1000; constant CONFIRMATION_PERSIST_MAX_ATTEMPTS (line 27) | const CONFIRMATION_PERSIST_MAX_ATTEMPTS = 3; constant ASSISTANT_EMAIL_ACTION_METADATA (line 29) | const ASSISTANT_EMAIL_ACTION_METADATA: Record< function confirmAssistantEmailActionForAccount (line 80) | async function confirmAssistantEmailActionForAccount({ function executeAssistantEmailAction (line 181) | async function executeAssistantEmailAction({ function confirmPendingSendEmailAction (line 220) | async function confirmPendingSendEmailAction({ function confirmPendingReplyEmailAction (line 260) | async function confirmPendingReplyEmailAction({ function confirmPendingForwardEmailAction (line 294) | async function confirmPendingForwardEmailAction({ function findPendingAssistantEmailPart (line 330) | function findPendingAssistantEmailPart({ function updateAssistantEmailPartWithConfirmation (line 367) | function updateAssistantEmailPartWithConfirmation({ function updateAssistantEmailPartWithProcessing (line 395) | function updateAssistantEmailPartWithProcessing({ function updateAssistantEmailPartWithPending (line 414) | function updateAssistantEmailPartWithPending({ function reservePendingAssistantEmailAction (line 430) | async function reservePendingAssistantEmailAction({ function clearAssistantEmailPartProcessing (line 567) | async function clearAssistantEmailPartProcessing({ function getLatestMessageInThreadSafe (line 608) | async function getLatestMessageInThreadSafe( function getAssistantEmailActionErrorMessage (line 619) | function getAssistantEmailActionErrorMessage( function getAssistantToolTypeForAction (line 625) | function getAssistantToolTypeForAction( function parsePendingAssistantEmailOutput (line 631) | function parsePendingAssistantEmailOutput({ function updateAssistantEmailPartOutput (line 641) | function updateAssistantEmailPartOutput({ function persistConfirmedAssistantEmailPart (line 678) | async function persistConfirmedAssistantEmailPart({ function hasProcessingLeaseExpired (line 706) | function hasProcessingLeaseExpired(processingAt?: string | null) { function warnAndThrowAssistantEmailConfirmationError (line 715) | function warnAndThrowAssistantEmailConfirmationError({ function findChatMessageForPendingAssistantEmailAction (line 739) | async function findChatMessageForPendingAssistantEmailAction({ function parsePendingSendEmailOutput (line 807) | function parsePendingSendEmailOutput(output: unknown) { function parsePendingReplyEmailOutput (line 812) | function parsePendingReplyEmailOutput(output: unknown) { function parsePendingForwardEmailOutput (line 817) | function parsePendingForwardEmailOutput(output: unknown) { function getOutputWithoutProcessingMetadata (line 822) | function getOutputWithoutProcessingMetadata(output: Record { FILE: apps/web/utils/actions/assistant-chat.validation.ts type AssistantPendingEmailActionType (line 10) | type AssistantPendingEmailActionType = z.infer< type AssistantEmailConfirmationResult (line 22) | type AssistantEmailConfirmationResult = z.infer< type PendingSendEmailToolOutput (line 43) | type PendingSendEmailToolOutput = z.infer< type PendingReplyEmailToolOutput (line 67) | type PendingReplyEmailToolOutput = z.infer< type PendingForwardEmailToolOutput (line 94) | type PendingForwardEmailToolOutput = z.infer< type AssistantPendingEmailToolOutput (line 98) | type AssistantPendingEmailToolOutput = type ConfirmAssistantEmailActionBody (line 110) | type ConfirmAssistantEmailActionBody = z.infer< type AssistantInput (line 151) | type AssistantInput = z.infer; FILE: apps/web/utils/actions/attachment-sources.ts function getSourceKey (line 129) | function getSourceKey(source: { FILE: apps/web/utils/actions/attachment-sources.validation.ts type UpsertRuleAttachmentSourcesBody (line 8) | type UpsertRuleAttachmentSourcesBody = z.infer< FILE: apps/web/utils/actions/automation-jobs.helpers.ts function canEnableAutomationJobs (line 8) | async function canEnableAutomationJobs(userId: string) { function assertCanEnableAutomationJobs (line 13) | async function assertCanEnableAutomationJobs(userId: string) { function createAutomationJob (line 19) | async function createAutomationJob({ FILE: apps/web/utils/actions/automation-jobs.ts constant AUTOMATION_JOBS_TOPIC (line 34) | const AUTOMATION_JOBS_TOPIC = "automation-jobs-execute"; function getDefaultMessagingChannel (line 221) | async function getDefaultMessagingChannel(emailAccountId: string) { function getAutomationMessagingChannelValidationError (line 254) | function getAutomationMessagingChannelValidationError(channel: { FILE: apps/web/utils/actions/automation-jobs.validation.ts type ToggleAutomationJobBody (line 6) | type ToggleAutomationJobBody = z.infer; type SaveAutomationJobBody (line 13) | type SaveAutomationJobBody = z.infer; type TriggerTestCheckInBody (line 16) | type TriggerTestCheckInBody = z.infer; FILE: apps/web/utils/actions/calendar.validation.ts type DisconnectCalendarBody (line 6) | type DisconnectCalendarBody = z.infer; type ToggleCalendarBody (line 12) | type ToggleCalendarBody = z.infer; type UpdateTimezoneBody (line 17) | type UpdateTimezoneBody = z.infer; type UpdateBookingLinkBody (line 26) | type UpdateBookingLinkBody = z.infer; FILE: apps/web/utils/actions/categorize.ts function deleteCategory (line 214) | async function deleteCategory({ function upsertCategory (line 226) | async function upsertCategory({ FILE: apps/web/utils/actions/categorize.validation.ts type CreateCategoryBody (line 8) | type CreateCategoryBody = z.infer; FILE: apps/web/utils/actions/clean.ts function isMaxEmailsReached (line 187) | function isMaxEmailsReached(totalEmailsProcessed: number, maxEmails?: nu... FILE: apps/web/utils/actions/clean.validation.ts type CleanInboxBody (line 18) | type CleanInboxBody = z.infer; type UndoCleanInboxBody (line 25) | type UndoCleanInboxBody = z.infer; type ChangeKeepToDoneBody (line 31) | type ChangeKeepToDoneBody = z.infer; FILE: apps/web/utils/actions/client.ts function onAutoArchive (line 8) | async function onAutoArchive({ function onDeleteFilter (line 37) | async function onDeleteFilter({ function onTrashThread (line 57) | async function onTrashThread({ FILE: apps/web/utils/actions/cold-email.ts function removeColdEmailLabelFromSender (line 55) | async function removeColdEmailLabelFromSender( FILE: apps/web/utils/actions/cold-email.validation.ts type ColdEmailBlockerBody (line 14) | type ColdEmailBlockerBody = z.infer; type MarkNotColdEmailBody (line 17) | type MarkNotColdEmailBody = z.infer; FILE: apps/web/utils/actions/drive.ts type FileAttachmentFiled (line 238) | type FileAttachmentFiled = { type FileAttachmentSkipped (line 248) | type FileAttachmentSkipped = { type FileAttachmentResult (line 254) | type FileAttachmentResult = FileAttachmentFiled | FileAttachmentSkipped; FILE: apps/web/utils/actions/drive.validation.ts type DisconnectDriveBody (line 6) | type DisconnectDriveBody = z.infer; type UpdateFilingPromptBody (line 11) | type UpdateFilingPromptBody = z.infer; type UpdateFilingEnabledBody (line 16) | type UpdateFilingEnabledBody = z.infer; type UpdateFilingFoldersBody (line 28) | type UpdateFilingFoldersBody = z.infer; type AddFilingFolderBody (line 31) | type AddFilingFolderBody = z.infer; type RemoveFilingFolderBody (line 36) | type RemoveFilingFolderBody = z.infer; type CleanupStaleFilingFoldersBody (line 41) | type CleanupStaleFilingFoldersBody = z.infer< type SubmitPreviewFeedbackBody (line 49) | type SubmitPreviewFeedbackBody = z.infer< type MoveFilingBody (line 58) | type MoveFilingBody = z.infer; type CreateDriveFolderBody (line 64) | type CreateDriveFolderBody = z.infer; type FileAttachmentBody (line 70) | type FileAttachmentBody = z.infer; FILE: apps/web/utils/actions/error-handling.ts type SafeActionError (line 4) | type SafeActionError = Parameters[0]; type SettingActionErrorOptions (line 6) | type SettingActionErrorOptions = { function showSettingActionError (line 12) | function showSettingActionError({ function createSettingActionErrorHandler (line 27) | function createSettingActionErrorHandler( FILE: apps/web/utils/actions/follow-up-reminders.validation.ts constant DEFAULT_FOLLOW_UP_DAYS (line 3) | const DEFAULT_FOLLOW_UP_DAYS = 3; type ToggleFollowUpRemindersBody (line 8) | type ToggleFollowUpRemindersBody = z.infer< type SaveFollowUpSettingsBody (line 19) | type SaveFollowUpSettingsBody = z.infer; type SaveFollowUpSettingsFormInput (line 26) | type SaveFollowUpSettingsFormInput = z.infer< FILE: apps/web/utils/actions/generate-reply.validation.ts type GenerateReplySchema (line 21) | type GenerateReplySchema = z.infer; FILE: apps/web/utils/actions/group.validation.ts type CreateGroupBody (line 7) | type CreateGroupBody = z.infer; type AddGroupItemBody (line 15) | type AddGroupItemBody = z.infer; FILE: apps/web/utils/actions/knowledge.validation.ts type CreateKnowledgeBody (line 8) | type CreateKnowledgeBody = z.infer; type UpdateKnowledgeBody (line 16) | type UpdateKnowledgeBody = z.infer; type DeleteKnowledgeBody (line 22) | type DeleteKnowledgeBody = z.infer; FILE: apps/web/utils/actions/mcp.validation.ts type DisconnectMcpConnectionBody (line 6) | type DisconnectMcpConnectionBody = z.infer< type ToggleMcpConnectionBody (line 14) | type ToggleMcpConnectionBody = z.infer; type ToggleMcpToolBody (line 20) | type ToggleMcpToolBody = z.infer; type McpAgentActionInput (line 27) | type McpAgentActionInput = z.infer; FILE: apps/web/utils/actions/meeting-briefs.validation.ts type UpdateMeetingBriefsEnabledBody (line 7) | type UpdateMeetingBriefsEnabledBody = z.infer< type UpdateMeetingBriefsMinutesBeforeBody (line 18) | type UpdateMeetingBriefsMinutesBeforeBody = z.infer< type SendDebugBriefBody (line 41) | type SendDebugBriefBody = z.infer; FILE: apps/web/utils/actions/messaging-channels.ts function getTelegramBotUrl (line 298) | async function getTelegramBotUrl() { FILE: apps/web/utils/actions/onboarding.ts function extractSurveyAnswers (line 29) | function extractSurveyAnswers(questions: any[], answers: any) { FILE: apps/web/utils/actions/onboarding.validation.ts type StepWhoSchema (line 13) | type StepWhoSchema = z.infer; type SaveOnboardingFeaturesSchema (line 19) | type SaveOnboardingFeaturesSchema = z.infer< FILE: apps/web/utils/actions/organization.ts function getInvitation (line 177) | async function getInvitation({ function acceptInvitation (line 221) | async function acceptInvitation({ function getOrganizationPremium (line 388) | async function getOrganizationPremium(organizationId: string) { function getUserFromEmailAccount (line 412) | async function getUserFromEmailAccount(emailAccountId: string) { function getRandomId (line 539) | function getRandomId(): string { function generateUniqueSlug (line 543) | async function generateUniqueSlug(baseSlug: string): Promise { function authorizeMemberManagement (line 567) | async function authorizeMemberManagement({ type MemberManagementAction (line 613) | type MemberManagementAction = "remove" | "updateRole"; FILE: apps/web/utils/actions/organization.validation.ts type CreateOrganizationBody (line 19) | type CreateOrganizationBody = z.infer; type InviteMemberBody (line 30) | type InviteMemberBody = z.infer; type HandleInvitationBody (line 35) | type HandleInvitationBody = z.infer; type RemoveMemberBody (line 41) | type RemoveMemberBody = z.infer; type UpdateMemberRoleBody (line 48) | type UpdateMemberRoleBody = z.infer; type CancelInvitationBody (line 54) | type CancelInvitationBody = z.infer; type UpdateAnalyticsConsentBody (line 60) | type UpdateAnalyticsConsentBody = z.infer< type CreateOrganizationAndInviteBody (line 76) | type CreateOrganizationAndInviteBody = z.infer< FILE: apps/web/utils/actions/permissions.ts function checkOutlookPermissions (line 107) | async function checkOutlookPermissions({ FILE: apps/web/utils/actions/premium.ts constant TEN_YEARS (line 36) | const TEN_YEARS = 10 * 365 * 24 * 60 * 60 * 1000; FILE: apps/web/utils/actions/premium.validation.ts type ActivateLicenseKeyOptions (line 6) | type ActivateLicenseKeyOptions = z.infer< FILE: apps/web/utils/actions/report.ts type EmailReportData (line 20) | type EmailReportData = Awaited>; function getEmailReportData (line 29) | async function getEmailReportData({ function fetchGmailLabels (line 161) | async function fetchGmailLabels( function fetchGmailSignature (line 225) | async function fetchGmailSignature( FILE: apps/web/utils/actions/rule.ts function createSystemRuleForOnboarding (line 320) | async function createSystemRuleForOnboarding( function deleteRule (line 357) | async function deleteRule( function toggleRule (line 655) | async function toggleRule({ function mapActionToSanitizedFields (line 759) | function mapActionToSanitizedFields(action: { function handleRuleError (line 814) | function handleRuleError(error: unknown, logger: Logger) { function resolveActionLabels (line 827) | async function resolveActionLabels< function getActionsFromCategoryAction (line 897) | async function getActionsFromCategoryAction({ FILE: apps/web/utils/actions/rule.validation.ts type ZodCondition (line 104) | type ZodCondition = z.infer; type CreateRuleBody (line 250) | type CreateRuleBody = z.infer; type UpdateRuleBody (line 253) | type UpdateRuleBody = z.infer; type CreateRulesBody (line 258) | type CreateRulesBody = z.infer; type UpdateRuleSettingsBody (line 264) | type UpdateRuleSettingsBody = z.infer; type EnableDraftRepliesBody (line 267) | type EnableDraftRepliesBody = z.infer; type EnableMultiRuleSelectionBody (line 270) | type EnableMultiRuleSelectionBody = z.infer< type UpdateDraftReplyConfidenceBody (line 277) | type UpdateDraftReplyConfidenceBody = z.infer< type CategoryAction (line 289) | type CategoryAction = z.infer; type CategoryConfig (line 302) | type CategoryConfig = z.infer; type CreateRulesOnboardingBody (line 305) | type CreateRulesOnboardingBody = z.infer< type ToggleAllRulesBody (line 322) | type ToggleAllRulesBody = z.infer; type CopyRulesFromAccountBody (line 329) | type CopyRulesFromAccountBody = z.infer; type ImportRulesBody (line 434) | type ImportRulesBody = z.infer; type ImportedRule (line 435) | type ImportedRule = z.infer; function addRecipientRequirementIssue (line 437) | function addRecipientRequirementIssue({ FILE: apps/web/utils/actions/safe-action.ts method defineMetadataSchema (line 18) | defineMetadataSchema() { method handleServerError (line 22) | handleServerError(error, { metadata, ctx, bindArgsClientInputs }) { FILE: apps/web/utils/actions/settings.validation.ts type SaveDigestScheduleBody (line 11) | type SaveDigestScheduleBody = z.infer; type SaveEmailUpdateSettingsBody (line 22) | type SaveEmailUpdateSettingsBody = z.infer< type SaveAiSettingsBody (line 49) | type SaveAiSettingsBody = z.infer; type UpdateDigestItemsBody (line 54) | type UpdateDigestItemsBody = z.infer; type ToggleDigestBody (line 60) | type ToggleDigestBody = z.infer; FILE: apps/web/utils/actions/sso.validation.ts type SsoRegistrationBody (line 9) | type SsoRegistrationBody = z.infer; FILE: apps/web/utils/actions/stats.ts constant PAGE_SIZE (line 23) | const PAGE_SIZE = 20; constant MAX_PAGES (line 25) | const MAX_PAGES = 50; function loadEmails (line 68) | async function loadEmails( function saveBatch (line 155) | async function saveBatch({ function mergeUnsubscribeSources (line 232) | function mergeUnsubscribeSources({ FILE: apps/web/utils/actions/unsubscriber.validation.ts type SetNewsletterStatusBody (line 8) | type SetNewsletterStatusBody = z.infer; type UnsubscribeSenderBody (line 15) | type UnsubscribeSenderBody = z.infer; FILE: apps/web/utils/actions/user.validation.ts type SaveAboutBody (line 4) | type SaveAboutBody = z.infer; type SaveSignatureBody (line 9) | type SaveSignatureBody = z.infer; type SaveWritingStyleBody (line 14) | type SaveWritingStyleBody = z.infer; FILE: apps/web/utils/actions/webhook.ts function generateWebhookSecret (line 17) | function generateWebhookSecret(length = 32) { FILE: apps/web/utils/actions/whitelist.ts constant RECENT_SIGNUP_DAYS (line 10) | const RECENT_SIGNUP_DAYS = 1; FILE: apps/web/utils/admin.ts function isAdmin (line 3) | function isAdmin({ email }: { email?: string | null }) { FILE: apps/web/utils/ai/actions.ts constant MODULE (line 26) | const MODULE = "ai-actions"; type ActionFunction (line 28) | type ActionFunction>> = (opti... function lazyUpdateActionLabelId (line 485) | async function lazyUpdateActionLabelId({ function getDraftSelectedAttachments (line 520) | async function getDraftSelectedAttachments({ function resolveActionAttachments (line 553) | async function resolveActionAttachments({ function lazyUpdateActionFolderId (line 611) | async function lazyUpdateActionFolderId({ function parseStaticAttachments (line 646) | function parseStaticAttachments(raw: unknown): SelectedAttachment[] { FILE: apps/web/utils/ai/assistant/chat-calendar-tools.ts type GetCalendarEventsTool (line 104) | type GetCalendarEventsTool = InferUITool< function trackToolCall (line 108) | async function trackToolCall({ FILE: apps/web/utils/ai/assistant/chat-inbox-tools.test.ts constant TEST_EMAIL (line 20) | const TEST_EMAIL = "user@test.com"; FILE: apps/web/utils/ai/assistant/chat-inbox-tools.ts type GetAccountOverviewTool (line 171) | type GetAccountOverviewTool = InferUITool< function getSearchQueryDescription (line 175) | function getSearchQueryDescription(provider: string): string { function searchInboxInputSchema (line 182) | function searchInboxInputSchema(provider: string) { type SearchInboxTool (line 262) | type SearchInboxTool = InferUITool>; type ReadEmailTool (line 321) | type ReadEmailTool = InferUITool>; type ReadAttachmentTool (line 423) | type ReadAttachmentTool = InferUITool< function getManageInboxLabelDescription (line 439) | function getManageInboxLabelDescription(provider: string) { function manageInboxInputSchema (line 445) | function manageInboxInputSchema(provider: string) { type ManageInboxTool (line 700) | type ManageInboxTool = InferUITool>; type UpdateInboxFeaturesTool (line 831) | type UpdateInboxFeaturesTool = InferUITool< type SendEmailTool (line 876) | type SendEmailTool = InferUITool>; type ReplyEmailTool (line 919) | type ReplyEmailTool = InferUITool>; type ForwardEmailTool (line 961) | type ForwardEmailTool = InferUITool>; function trackToolCall (line 963) | async function trackToolCall({ function listLabelNames (line 976) | async function listLabelNames({ type PendingEmailActionType (line 999) | type PendingEmailActionType = "send_email" | "reply_email" | "forward_em... function createPendingSendEmailOutput (line 1001) | function createPendingSendEmailOutput( function createPendingReplyEmailOutput (line 1023) | function createPendingReplyEmailOutput( function createPendingForwardEmailOutput (line 1045) | function createPendingForwardEmailOutput( function mapMessageForSearchResult (line 1070) | function mapMessageForSearchResult( type ConversationCategory (line 1098) | type ConversationCategory = function inferConversationCategory (line 1105) | function inferConversationCategory(labelNames: string[]): ConversationCa... function summarizeSearchResults (line 1120) | function summarizeSearchResults( function createLabelLookupMap (line 1147) | function createLabelLookupMap(labels: Array<{ id: string; name: string }... function runThreadActionsInParallel (line 1173) | async function runThreadActionsInParallel({ function applyLabelToThread (line 1195) | async function applyLabelToThread({ function resolveThreadLabel (line 1228) | async function resolveThreadLabel({ function runSenderUnsubscribeActions (line 1249) | async function runSenderUnsubscribeActions({ function getSenderUnsubscribeSource (line 1304) | async function getSenderUnsubscribeSource({ function getManageInboxValidationError (line 1338) | function getManageInboxValidationError(error: z.ZodError) { function getSendEmailValidationError (line 1356) | function getSendEmailValidationError(error: z.ZodError) { function getForwardEmailValidationError (line 1360) | function getForwardEmailValidationError(error: z.ZodError) { function getReplyEmailValidationError (line 1364) | function getReplyEmailValidationError(error: z.ZodError) { function hasOnlyValidRecipients (line 1368) | function hasOnlyValidRecipients(recipientList: string) { function normalizeSenderEmails (line 1377) | function normalizeSenderEmails(fromEmails: string[]) { function getValidationErrorMessage (line 1387) | function getValidationErrorMessage(toolName: string, error: z.ZodError) { constant MAX_ATTACHMENT_TEXT_LENGTH (line 1405) | const MAX_ATTACHMENT_TEXT_LENGTH = 8000; constant EXTRACTABLE_MIME_TYPES (line 1407) | const EXTRACTABLE_MIME_TYPES = new Set([ function isExtractableMimeType (line 1415) | function isExtractableMimeType(mimeType: string): boolean { function extractAttachmentText (line 1419) | async function extractAttachmentText( FILE: apps/web/utils/ai/assistant/chat-label-tools.test.ts constant TEST_EMAIL (line 13) | const TEST_EMAIL = "user@test.com"; FILE: apps/web/utils/ai/assistant/chat-label-tools.ts type ListLabelsTool (line 119) | type ListLabelsTool = InferUITool>; type CreateOrGetLabelTool (line 120) | type CreateOrGetLabelTool = InferUITool< function trackToolCall (line 124) | async function trackToolCall({ FILE: apps/web/utils/ai/assistant/chat-memory-tools.ts type SearchMemoriesTool (line 64) | type SearchMemoriesTool = InferUITool< type SaveMemoryTool (line 122) | type SaveMemoryTool = InferUITool>; FILE: apps/web/utils/ai/assistant/chat-rule-tools.ts type GetUserRulesAndSettingsOutput (line 30) | type GetUserRulesAndSettingsOutput = constant RULE_READ_FRESHNESS_WINDOW_MS (line 68) | const RULE_READ_FRESHNESS_WINDOW_MS = 2 * 60 * 1000; type RuleReadState (line 70) | type RuleReadState = { type GetUserRulesAndSettingsTool (line 193) | type GetUserRulesAndSettingsTool = InferUITool< type GetLearnedPatternsTool (line 252) | type GetLearnedPatternsTool = InferUITool< type CreateRuleTool (line 315) | type CreateRuleTool = InferUITool>; type UpdateRuleConditionSchema (line 316) | type UpdateRuleConditionSchema = z.infer< type UpdateRuleConditionsTool (line 435) | type UpdateRuleConditionsTool = InferUITool< type UpdateRuleConditionsOutput (line 439) | type UpdateRuleConditionsOutput = { type UpdateRuleActionsTool (line 631) | type UpdateRuleActionsTool = InferUITool< type UpdateRuleActionsOutput (line 635) | type UpdateRuleActionsOutput = { type UpdateLearnedPatternsTool (line 787) | type UpdateLearnedPatternsTool = InferUITool< type UpdatePersonalInstructionsTool (line 846) | type UpdatePersonalInstructionsTool = InferUITool< type AddToKnowledgeBaseTool (line 891) | type AddToKnowledgeBaseTool = InferUITool< function trackToolCall (line 895) | async function trackToolCall({ function validateRuleWasReadRecently (line 908) | function validateRuleWasReadRecently({ FILE: apps/web/utils/ai/assistant/chat-settings-tools.ts type AccountSettingsSnapshot (line 157) | type AccountSettingsSnapshot = { type ScheduledCheckInsConfig (line 214) | type ScheduledCheckInsConfig = { type DraftKnowledgeItem (line 221) | type DraftKnowledgeItem = type AccountSettingsSnapshotRaw (line 303) | type AccountSettingsSnapshotRaw = Prisma.EmailAccountGetPayload<{ type ScheduledCheckInsAutomationJob (line 323) | type ScheduledCheckInsAutomationJob = Prisma.AutomationJobGetPayload<{ type ScheduledCheckInsSnapshotSource (line 327) | type ScheduledCheckInsSnapshotSource = { type GetAssistantCapabilitiesTool (line 420) | type GetAssistantCapabilitiesTool = InferUITool< type UpdateAssistantSettingsTool (line 497) | type UpdateAssistantSettingsTool = InferUITool< function trackToolCall (line 501) | async function trackToolCall({ function executeUpdateAssistantSettings (line 514) | async function executeUpdateAssistantSettings({ function getUpdateAssistantSettingsValidationError (line 764) | function getUpdateAssistantSettingsValidationError(error: z.ZodError) { function dedupeSettingsChanges (line 776) | function dedupeSettingsChanges( function resolveNextValue (line 801) | function resolveNextValue({ function getCurrentValue (line 826) | function getCurrentValue({ function getWritableCapabilities (line 861) | function getWritableCapabilities(snapshot: AccountSettingsSnapshot) { function getReadOnlyCapabilities (line 941) | function getReadOnlyCapabilities(snapshot: AccountSettingsSnapshot) { function getReadOnlyValue (line 953) | function getReadOnlyValue({ function areValuesEqual (line 978) | function areValuesEqual(left: unknown, right: unknown) { function resolveKnowledgeContent (line 982) | function resolveKnowledgeContent({ function mergeAppendableText (line 994) | function mergeAppendableText({ function resolveScheduledCheckInsConfig (line 1013) | function resolveScheduledCheckInsConfig({ function normalizePrompt (line 1069) | function normalizePrompt(prompt: string | null) { function applyScheduledCheckInsConfig (line 1074) | async function applyScheduledCheckInsConfig({ function buildScheduledCheckInsSnapshot (line 1118) | function buildScheduledCheckInsSnapshot( function formatMessagingChannelLabel (line 1157) | function formatMessagingChannelLabel({ function requiresScheduledCheckInsPremium (line 1176) | function requiresScheduledCheckInsPremium({ function isDisableOnlyScheduledCheckInsChange (line 1186) | function isDisableOnlyScheduledCheckInsChange({ function loadAccountSettingsSnapshot (line 1202) | async function loadAccountSettingsSnapshot(emailAccountId: string) { function loadAccountSettingsSnapshotRaw (line 1265) | async function loadAccountSettingsSnapshotRaw( function loadScheduledCheckInsAutomationJob (line 1274) | async function loadScheduledCheckInsAutomationJob(emailAccountId: string) { FILE: apps/web/utils/ai/assistant/chat.ts type AssistantChatOnStepFinish (line 83) | type AssistantChatOnStepFinish = NonNullable< function aiProcessAssistantChat (line 87) | async function aiProcessAssistantChat({ function buildCacheOptimizedMessages (line 497) | function buildCacheOptimizedMessages({ function addAnthropicCacheControl (line 532) | function addAnthropicCacheControl( function getChatProviderOptionsForCaching (line 568) | function getChatProviderOptionsForCaching({ chatId }: { chatId?: string ... function isConversationStatusFixContext (line 578) | function isConversationStatusFixContext( function getExpectedFixContextSystemTypeSafe (line 589) | async function getExpectedFixContextSystemTypeSafe({ function getExpectedFixContextSystemType (line 611) | async function getExpectedFixContextSystemType({ function getSendEmailSurfacePolicy (line 646) | function getSendEmailSurfacePolicy({ function getFormattingRules (line 665) | function getFormattingRules(responseSurface: "web" | "messaging") { type Capability (line 710) | type Capability = (typeof capabilityGroupValues)[number]; function activateToolsTool (line 735) | function activateToolsTool() { function getActivatedCapabilities (line 747) | function getActivatedCapabilities( FILE: apps/web/utils/ai/assistant/compact.ts constant RECENT_MESSAGES_TO_KEEP (line 8) | const RECENT_MESSAGES_TO_KEEP = 6; constant COMPACTION_TOKEN_THRESHOLD (line 9) | const COMPACTION_TOKEN_THRESHOLD = 80_000; function estimateTokens (line 11) | function estimateTokens(messages: ModelMessage[]): number { function shouldCompact (line 35) | function shouldCompact(messages: ModelMessage[]): boolean { function compactMessages (line 39) | async function compactMessages({ function extractMemories (line 129) | async function extractMemories({ function serializeMessages (line 171) | function serializeMessages(messages: ModelMessage[]): string { function serializeContent (line 181) | function serializeContent(content: ModelMessage["content"]): string { FILE: apps/web/utils/ai/assistant/get-inbox-stats-for-chat-context.ts function getInboxStatsForChatContext (line 4) | async function getInboxStatsForChatContext({ FILE: apps/web/utils/ai/assistant/get-recent-chat-memories.ts constant MAX_CHAT_MEMORIES (line 5) | const MAX_CHAT_MEMORIES = 20; function getRecentChatMemories (line 7) | async function getRecentChatMemories({ FILE: apps/web/utils/ai/assistant/inline-email-actions.ts constant MAX_INLINE_EMAIL_THREAD_IDS (line 3) | const MAX_INLINE_EMAIL_THREAD_IDS = 200; type InlineEmailAction (line 18) | type InlineEmailAction = z.infer; type InlineEmailActionType (line 19) | type InlineEmailActionType = z.infer; function normalizeInlineEmailThreadIds (line 21) | function normalizeInlineEmailThreadIds(threadIds: string[]) { function mergeInlineEmailActions (line 40) | function mergeInlineEmailActions( function buildInlineEmailActionSystemMessage (line 76) | function buildInlineEmailActionSystemMessage( function normalizeInlineEmailActions (line 101) | function normalizeInlineEmailActions(actions: InlineEmailAction[]) { function cloneInlineEmailActions (line 108) | function cloneInlineEmailActions(actions: InlineEmailAction[]) { function findOrCreateAction (line 115) | function findOrCreateAction( FILE: apps/web/utils/ai/assistant/manage-inbox-actions.ts type ManageInboxAction (line 10) | type ManageInboxAction = (typeof manageInboxActions)[number]; function isManageInboxAction (line 24) | function isManageInboxAction( function requiresThreadIds (line 30) | function requiresThreadIds( function requiresSenderEmails (line 39) | function requiresSenderEmails( FILE: apps/web/utils/ai/automation-jobs/generate-check-in-message.ts constant MAX_INBOX_MESSAGES_FOR_PROMPT (line 13) | const MAX_INBOX_MESSAGES_FOR_PROMPT = 8; type AutomationCheckInEmailAccount (line 19) | type AutomationCheckInEmailAccount = Pick< function aiGenerateAutomationCheckInMessage (line 26) | async function aiGenerateAutomationCheckInMessage({ function buildAutomationPrompt (line 98) | function buildAutomationPrompt({ FILE: apps/web/utils/ai/calendar/availability.ts type CalendarAvailabilityContext (line 31) | type CalendarAvailabilityContext = z.infer; function aiGetCalendarAvailability (line 33) | async function aiGetCalendarAvailability({ function getUserTimezone (line 180) | function getUserTimezone( FILE: apps/web/utils/ai/categorize-sender/ai-categorize-senders.ts constant REQUEST_MORE_INFORMATION_CATEGORY (line 10) | const REQUEST_MORE_INFORMATION_CATEGORY = "RequestMoreInformation"; constant UNKNOWN_CATEGORY (line 11) | const UNKNOWN_CATEGORY = "Other"; function aiCategorizeSenders (line 23) | async function aiCategorizeSenders({ function matchSendersWithFullEmail (line 128) | function matchSendersWithFullEmail( FILE: apps/web/utils/ai/categorize-sender/ai-categorize-single-sender.ts function aiCategorizeSender (line 8) | async function aiCategorizeSender({ FILE: apps/web/utils/ai/categorize-sender/format-categories.ts function formatCategoriesForPrompt (line 3) | function formatCategoriesForPrompt( FILE: apps/web/utils/ai/choose-rule/ai-choose-args.ts constant TEMPLATE_DRAFT_PIPELINE_VERSION (line 24) | const TEMPLATE_DRAFT_PIPELINE_VERSION = 1; type ActionArgResponse (line 51) | type ActionArgResponse = { type ActionArgGenerationResult (line 59) | type ActionArgGenerationResult = { function aiGenerateArgs (line 64) | async function aiGenerateArgs({ function getSystemPrompt (line 147) | function getSystemPrompt() { function getPrompt (line 167) | function getPrompt({ function printConditions (line 189) | function printConditions(condition: RuleWithActions) { function printStaticConditions (line 207) | function printStaticConditions(condition: RuleWithActions) { FILE: apps/web/utils/ai/choose-rule/ai-choose-rule.ts type GetAiResponseOptions (line 11) | type GetAiResponseOptions = { function aiChooseRule (line 18) | async function aiChooseRule< function getAiResponse (line 68) | async function getAiResponse(options: GetAiResponseOptions): Promise<{ function getAiResponseSingleRule (line 109) | async function getAiResponseSingleRule({ function getAiResponseMultiRule (line 197) | async function getAiResponseMultiRule({ constant METADATA_GUIDELINE (line 309) | const METADATA_GUIDELINE = FILE: apps/web/utils/ai/choose-rule/ai-detect-recurring-pattern.ts type DetectPatternResult (line 19) | type DetectPatternResult = z.infer; function aiDetectRecurringPattern (line 21) | async function aiDetectRecurringPattern({ FILE: apps/web/utils/ai/choose-rule/bulk-process-emails.ts function bulkProcessInboxEmails (line 8) | async function bulkProcessInboxEmails({ function getLatestMessagePerThread (line 97) | function getLatestMessagePerThread(messages: ParsedMessage[]): ParsedMes... FILE: apps/web/utils/ai/choose-rule/choose-args.test.ts function createMockAction (line 13) | function createMockAction(overrides: Partial = {}): Action { FILE: apps/web/utils/ai/choose-rule/choose-args.ts constant MODULE (line 23) | const MODULE = "choose-args"; type EmailAccountForDrafting (line 24) | type EmailAccountForDrafting = EmailAccountWithAI & { type DraftAttributionFields (line 28) | type DraftAttributionFields = { type ActionWithDraftAttribution (line 35) | type ActionWithDraftAttribution = Action & DraftAttributionFields; function getActionItemsWithAiArgs (line 37) | async function getActionItemsWithAiArgs({ function combineActionsWithAiArgs (line 142) | function combineActionsWithAiArgs( function filterIncompleteDraftActions (line 209) | function filterIncompleteDraftActions( function extractActionsNeedingAiGeneration (line 252) | function extractActionsNeedingAiGeneration(actions: Action[]) { function getParameterFieldsForAction (line 302) | function getParameterFieldsForAction( function parseTemplate (line 376) | function parseTemplate(template: string): { function mergeTemplateWithVars (line 407) | function mergeTemplateWithVars( FILE: apps/web/utils/ai/choose-rule/draft-management.ts function handlePreviousDraftDeletion (line 12) | async function handlePreviousDraftDeletion({ function updateExecutedActionWithDraftId (line 98) | async function updateExecutedActionWithDraftId({ function extractDraftPlainText (line 125) | function extractDraftPlainText(draft: ParsedMessage): string { function stripQuotedContent (line 140) | function stripQuotedContent(text: string): string { function isDraftUnmodified (line 163) | function isDraftUnmodified({ FILE: apps/web/utils/ai/choose-rule/execute.ts constant MODULE (line 11) | const MODULE = "ai-execute-act"; type ExecutedRuleWithActionItems (line 13) | type ExecutedRuleWithActionItems = Prisma.ExecutedRuleGetPayload<{ type ActionFailure (line 17) | type ActionFailure = { function executeAct (line 22) | async function executeAct({ function getActionFailure (line 135) | function getActionFailure( function buildFailureReason (line 164) | function buildFailureReason( FILE: apps/web/utils/ai/choose-rule/match-rules.test.ts function getRule (line 1773) | function getRule(overrides: Partial = {}): RuleWithActi... function getHeaders (line 1819) | function getHeaders( function getMessage (line 1851) | function getMessage(overrides: Partial = {}): ParsedMessa... function getGroup (line 1891) | function getGroup( function getGroupItem (line 1919) | function getGroupItem(overrides: Partial = {}): GroupItem { function getStaticRule (line 3056) | function getStaticRule( FILE: apps/web/utils/ai/choose-rule/match-rules.ts constant MODULE (line 44) | const MODULE = "match-rules"; constant TO_REPLY_RECEIVED_THRESHOLD (line 46) | const TO_REPLY_RECEIVED_THRESHOLD = 10; type MatchingRulesResult (line 48) | type MatchingRulesResult = { function findMatchingRules (line 56) | async function findMatchingRules({ function findPotentialMatchingRules (line 138) | async function findPotentialMatchingRules({ function evaluateRuleConditions (line 265) | function evaluateRuleConditions({ class LearnedPatternsLoader (line 323) | class LearnedPatternsLoader { method getGroups (line 326) | async getGroups(emailAccountId: string) { class PreviousThreadRulesLoader (line 334) | class PreviousThreadRulesLoader { method constructor (line 339) | constructor({ method getRuleIds (line 350) | async getRuleIds(): Promise> { function getMatchReason (line 361) | function getMatchReason(matchReasons?: MatchReason[]): string | undefined { function findMatchingRulesWithReasons (line 380) | async function findMatchingRulesWithReasons( function matchesStaticRule (line 464) | function matchesStaticRule( function matchesGroupRule (line 557) | function matchesGroupRule( function filterConversationStatusRules (line 580) | async function filterConversationStatusRules< function filterMultipleSystemRules (line 655) | function filterMultipleSystemRules< function getPreviouslyExecutedRuleIds (line 678) | async function getPreviouslyExecutedRuleIds({ function normalizeEmailHeaderForRuleMatching (line 701) | function normalizeEmailHeaderForRuleMatching( function normalizeEmailDisplayNameHeaderForRuleMatching (line 714) | function normalizeEmailDisplayNameHeaderForRuleMatching(header: string) { function matchesEmailFieldPattern (line 731) | function matchesEmailFieldPattern({ function logInvalidEmailMatchPattern (line 768) | function logInvalidEmailMatchPattern({ FILE: apps/web/utils/ai/choose-rule/run-rules.ts constant MODULE (line 50) | const MODULE = "ai/choose-rule"; type RunRulesResult (line 52) | type RunRulesResult = { constant CONVERSATION_TRACKING_META_RULE_ID (line 74) | const CONVERSATION_TRACKING_META_RULE_ID = "conversation-tracking-meta"; constant CONVERSATION_TRACKING_INSTRUCTIONS (line 76) | const CONVERSATION_TRACKING_INSTRUCTIONS = `Conversations and communicat... function runRules (line 93) | async function runRules({ function prepareRulesWithMetaRule (line 259) | function prepareRulesWithMetaRule(rules: RuleWithActions[]): { function executeMatchedRule (line 292) | async function executeMatchedRule( function analyzeSenderPatternIfAiMatch (line 519) | async function analyzeSenderPatternIfAiMatch({ function shouldAnalyzeSenderPattern (line 575) | function shouldAnalyzeSenderPattern({ function isSenderPatternAlreadyAnalyzed (line 605) | async function isSenderPatternAlreadyAnalyzed({ function checkPreviousConversationRuleInThread (line 632) | async function checkPreviousConversationRuleInThread({ function ensureConversationRuleContinuity (line 665) | async function ensureConversationRuleContinuity({ function isConversationRule (line 727) | function isConversationRule(ruleId: string): boolean { function limitDraftEmailActions (line 739) | function limitDraftEmailActions< FILE: apps/web/utils/ai/choose-rule/types.ts type StaticMatch (line 6) | type StaticMatch = { type LearnedPatternMatch (line 10) | type LearnedPatternMatch = { type AiMatch (line 16) | type AiMatch = { type PresetMatch (line 20) | type PresetMatch = { type MatchReason (line 25) | type MatchReason = type MatchingRuleResult (line 31) | type MatchingRuleResult = { type SerializedMatchReason (line 44) | type SerializedMatchReason = function serializeMatchReasons (line 62) | function serializeMatchReasons( FILE: apps/web/utils/ai/clean/ai-clean-select-labels.ts function aiCleanSelectLabels (line 8) | async function aiCleanSelectLabels({ FILE: apps/web/utils/ai/clean/ai-clean.ts function aiClean (line 22) | async function aiClean({ FILE: apps/web/utils/ai/digest/summarize-email-for-digest.ts type AISummarizeResult (line 16) | type AISummarizeResult = z.infer; function aiSummarizeEmailForDigest (line 18) | async function aiSummarizeEmailForDigest({ FILE: apps/web/utils/ai/document-filing/analyze-document.ts type DocumentAnalysisResult (line 50) | type DocumentAnalysisResult = z.infer; type EmailContext (line 52) | type EmailContext = { subject: string; sender: string }; type AttachmentContext (line 53) | type AttachmentContext = { filename: string; content: string }; type DriveFolder (line 54) | type DriveFolder = { function analyzeDocument (line 61) | async function analyzeDocument({ function buildSystem (line 90) | function buildSystem(filingPrompt: string): string { function buildPrompt (line 121) | function buildPrompt({ FILE: apps/web/utils/ai/document-filing/parse-filing-reply.ts type ParseFilingReplyResult (line 24) | type ParseFilingReplyResult = z.infer; type FilingContext (line 26) | interface FilingContext { type Message (line 31) | type Message = { role: "user" | "assistant"; content: string }; function aiParseFilingReply (line 33) | async function aiParseFilingReply({ FILE: apps/web/utils/ai/draft-cleanup.ts constant STALE_DAYS (line 7) | const STALE_DAYS = 3; function cleanupAIDraftsForAccount (line 9) | async function cleanupAIDraftsForAccount({ FILE: apps/web/utils/ai/group/create-group.ts constant GENERATE_GROUP_ITEMS (line 13) | const GENERATE_GROUP_ITEMS = "generateGroupItems"; constant VERIFY_GROUP_ITEMS (line 14) | const VERIFY_GROUP_ITEMS = "verifyGroupItems"; function aiGenerateGroupItems (line 56) | async function aiGenerateGroupItems( function verifyGroupItems (line 126) | async function verifyGroupItems( FILE: apps/web/utils/ai/group/find-newsletters.ts function findNewsletters (line 12) | async function findNewsletters( function isNewsletterSender (line 36) | function isNewsletterSender(sender: string) { FILE: apps/web/utils/ai/group/find-receipts.ts function findReceipts (line 41) | async function findReceipts(gmail: gmail_v1.Gmail, userEmail: string) { function findReceiptSenders (line 100) | async function findReceiptSenders(gmail: gmail_v1.Gmail) { function findReceiptSubjects (line 120) | async function findReceiptSubjects(gmail: gmail_v1.Gmail) { function isReceiptSender (line 136) | function isReceiptSender(sender: string) { function isReceiptSubject (line 140) | function isReceiptSubject(subject: string) { function isReceipt (line 147) | function isReceipt(message: ParsedMessage) { function isMaybeReceipt (line 154) | function isMaybeReceipt(message: ParsedMessage) { FILE: apps/web/utils/ai/helpers.ts function getTodayForLLM (line 5) | function getTodayForLLM(date: Date = new Date()) { FILE: apps/web/utils/ai/knowledge/extract-from-email-history.ts function aiExtractFromEmailHistory (line 65) | async function aiExtractFromEmailHistory({ FILE: apps/web/utils/ai/knowledge/extract.ts type ExtractedKnowledge (line 76) | type ExtractedKnowledge = z.infer; function aiExtractRelevantKnowledge (line 78) | async function aiExtractRelevantKnowledge({ FILE: apps/web/utils/ai/knowledge/persona.ts type PersonaAnalysis (line 45) | type PersonaAnalysis = z.infer; function aiAnalyzePersona (line 47) | async function aiAnalyzePersona(options: { FILE: apps/web/utils/ai/knowledge/writing-style.ts function aiAnalyzeWritingStyle (line 13) | async function aiAnalyzeWritingStyle(options: { FILE: apps/web/utils/ai/mcp/mcp-agent.ts type McpAgentOptions (line 12) | type McpAgentOptions = { type McpAgentResponse (line 17) | type McpAgentResponse = { constant NO_RELEVANT_INFO_FOUND (line 26) | const NO_RELEVANT_INFO_FOUND = "NO_RELEVANT_INFO_FOUND"; function runMcpAgent (line 28) | async function runMcpAgent( function mcpAgent (line 108) | async function mcpAgent( FILE: apps/web/utils/ai/mcp/mcp-tools.ts type MCPClient (line 8) | type MCPClient = Awaited>; type MCPToolsResult (line 10) | type MCPToolsResult = { function createMcpToolsForAgent (line 15) | async function createMcpToolsForAgent( function mergeToolsWithConflictResolution (line 149) | function mergeToolsWithConflictResolution( FILE: apps/web/utils/ai/meeting-briefs/generate-briefing.ts constant MAX_AGENT_STEPS (line 26) | const MAX_AGENT_STEPS = 15; constant MAX_EMAILS_PER_GUEST (line 27) | const MAX_EMAILS_PER_GUEST = 10; constant MAX_MEETINGS_PER_GUEST (line 28) | const MAX_MEETINGS_PER_GUEST = 10; constant MAX_DESCRIPTION_LENGTH (line 29) | const MAX_DESCRIPTION_LENGTH = 500; type BriefingContent (line 44) | type BriefingContent = z.infer; constant AGENTIC_SYSTEM_PROMPT (line 46) | const AGENTIC_SYSTEM_PROMPT = `You are an AI assistant that prepares con... function aiGenerateMeetingBriefing (line 78) | async function aiGenerateMeetingBriefing({ function generateFallbackBriefing (line 160) | function generateFallbackBriefing( type SearchToolsResult (line 172) | type SearchToolsResult = { function buildSearchTools (line 177) | async function buildSearchTools({ type WebSearchConfig (line 284) | type WebSearchConfig = { function getWebSearchConfig (line 290) | function getWebSearchConfig(): WebSearchConfig | null { function createWebSearchTool (line 316) | function createWebSearchTool({ function buildPrompt (line 387) | function buildPrompt( type GuestContextForPrompt (line 443) | type GuestContextForPrompt = { function formatGuestContext (line 451) | function formatGuestContext(guest: GuestContextForPrompt): string { function selectRecentMeetingsForGuest (line 493) | function selectRecentMeetingsForGuest( function selectRecentEmailsForGuest (line 505) | function selectRecentEmailsForGuest( function messageIncludesEmail (line 517) | function messageIncludesEmail( function formatMeetingForContext (line 531) | function formatMeetingForContext( FILE: apps/web/utils/ai/reply/check-if-needs-reply.ts function aiCheckIfNeedsReply (line 14) | async function aiCheckIfNeedsReply({ FILE: apps/web/utils/ai/reply/determine-thread-status.test.ts function getCustomizedRules (line 6) | function getCustomizedRules(conversationRules: RuleWithActions[]) { function createMockRule (line 14) | function createMockRule( FILE: apps/web/utils/ai/reply/determine-thread-status.ts function aiDetermineThreadStatus (line 11) | async function aiDetermineThreadStatus({ FILE: apps/web/utils/ai/reply/draft-attribution.ts constant DRAFT_PIPELINE_VERSION (line 4) | const DRAFT_PIPELINE_VERSION = 3; type DraftAttribution (line 6) | type DraftAttribution = { function createDraftAttributionTracker (line 12) | function createDraftAttributionTracker( FILE: apps/web/utils/ai/reply/draft-confidence.ts constant DEFAULT_DRAFT_REPLY_CONFIDENCE (line 3) | const DEFAULT_DRAFT_REPLY_CONFIDENCE = DraftReplyConfidence.ALL_EMAILS; constant DRAFT_REPLY_CONFIDENCE_RANK (line 5) | const DRAFT_REPLY_CONFIDENCE_RANK: Record = { constant DRAFT_REPLY_CONFIDENCE_OPTIONS (line 11) | const DRAFT_REPLY_CONFIDENCE_OPTIONS = [ function getDraftReplyConfidenceOption (line 29) | function getDraftReplyConfidenceOption( function normalizeDraftReplyConfidence (line 39) | function normalizeDraftReplyConfidence( function meetsDraftReplyConfidenceRequirement (line 52) | function meetsDraftReplyConfidenceRequirement({ FILE: apps/web/utils/ai/reply/draft-context-metadata.ts type DraftContextMetadata (line 45) | type DraftContextMetadata = z.infer; FILE: apps/web/utils/ai/reply/draft-follow-up.ts function aiDraftFollowUp (line 77) | async function aiDraftFollowUp({ FILE: apps/web/utils/ai/reply/draft-reply.formatting.test.ts function getDraftParams (line 299) | function getDraftParams() { FILE: apps/web/utils/ai/reply/draft-reply.ts constant DRAFT_OUTPUT_INSTRUCTION (line 19) | const DRAFT_OUTPUT_INSTRUCTION = type DraftReplyResult (line 197) | type DraftReplyResult = { function aiDraftReplyWithConfidence (line 203) | async function aiDraftReplyWithConfidence({ function aiDraftReply (line 293) | async function aiDraftReply({ function normalizeDraftReplyFormatting (line 335) | function normalizeDraftReplyFormatting(reply: string): string { function shouldConvertSingleLineBreaksToParagraphs (line 366) | function shouldConvertSingleLineBreaksToParagraphs(lines: string[]): boo... function isLikelyListItem (line 377) | function isLikelyListItem(line: string): boolean { constant REPETITIVE_TEXT_PATTERN (line 382) | const REPETITIVE_TEXT_PATTERN = /([^\s\-=_*.#~])\1{49,}/u; function getSchedulingContext (line 384) | function getSchedulingContext({ FILE: apps/web/utils/ai/reply/generate-nudge.ts function aiGenerateNudge (line 12) | async function aiGenerateNudge({ FILE: apps/web/utils/ai/reply/reply-context-collector.ts type ReplyContextCollectorResult (line 28) | type ReplyContextCollectorResult = z.infer; function aiCollectReplyContext (line 70) | async function aiCollectReplyContext({ FILE: apps/web/utils/ai/reply/reply-memory.test.ts function createReplyMemory (line 992) | function createReplyMemory( function createSourceMessage (line 1023) | function createSourceMessage( function createDraftSendLog (line 1043) | function createDraftSendLog( FILE: apps/web/utils/ai/reply/reply-memory.ts constant REPLY_MEMORY_RETENTION_DAYS (line 19) | const REPLY_MEMORY_RETENTION_DAYS = 7; constant MAX_REPLY_MEMORY_SOURCE_FETCH_ATTEMPTS (line 20) | const MAX_REPLY_MEMORY_SOURCE_FETCH_ATTEMPTS = 3; constant MAX_MEMORIES_PER_EDIT (line 21) | const MAX_MEMORIES_PER_EDIT = 3; constant MAX_EXISTING_MEMORIES_IN_PROMPT (line 22) | const MAX_EXISTING_MEMORIES_IN_PROMPT = 12; constant MAX_RETRIEVED_REPLY_MEMORIES (line 23) | const MAX_RETRIEVED_REPLY_MEMORIES = 6; constant MAX_RETRIEVED_TOPIC_REPLY_MEMORIES (line 24) | const MAX_RETRIEVED_TOPIC_REPLY_MEMORIES = 3; function saveDraftSendLogReplyMemory (line 72) | async function saveDraftSendLogReplyMemory({ function syncReplyMemoriesFromDraftSendLogs (line 89) | async function syncReplyMemoriesFromDraftSendLogs({ function getReplyMemoryContent (line 166) | async function getReplyMemoryContent({ function getReplyMemoriesForPrompt (line 187) | async function getReplyMemoriesForPrompt({ function isMeaningfulDraftEdit (line 274) | function isMeaningfulDraftEdit({ function formatReplyMemoryContent (line 295) | function formatReplyMemoryContent(memories: ReplyMemory[]) { function processReplyMemoryDraftSendLog (line 308) | async function processReplyMemoryDraftSendLog({ function aiExtractReplyMemoriesFromDraftEdit (line 446) | async function aiExtractReplyMemoriesFromDraftEdit({ function formatExistingMemories (line 535) | function formatExistingMemories( function fetchReplyMemoriesByScope (line 553) | async function fetchReplyMemoriesByScope({ function normalizeMemoryText (line 573) | function normalizeMemoryText(value: string) { function getReplyMemoryScopes (line 577) | function getReplyMemoryScopes({ function markDraftSendLogReplyMemoryProcessed (line 606) | async function markDraftSendLogReplyMemoryProcessed(id: string) { function recordDraftSendLogReplyMemoryFailure (line 616) | async function recordDraftSendLogReplyMemoryFailure( type DraftSendLogReplyMemoryPayload (line 654) | type DraftSendLogReplyMemoryPayload = Prisma.DraftSendLogGetPayload<{ function sortReplyMemories (line 658) | function sortReplyMemories(memories: ReplyMemory[]) { function dedupeReplyMemories (line 667) | function dedupeReplyMemories(memories: ReplyMemory[]) { function getScopePriority (line 677) | function getScopePriority(scopeType: ReplyMemoryScopeType) { function getNormalizedReplyMemoryScopeValue (line 690) | function getNormalizedReplyMemoryScopeValue({ FILE: apps/web/utils/ai/report/analyze-email-behavior.ts function aiAnalyzeEmailBehavior (line 29) | async function aiAnalyzeEmailBehavior( FILE: apps/web/utils/ai/report/analyze-label-optimization.ts function aiAnalyzeLabelOptimization (line 24) | async function aiAnalyzeLabelOptimization( FILE: apps/web/utils/ai/report/build-user-persona.ts type UserPersona (line 18) | type UserPersona = z.infer; function aiBuildUserPersona (line 20) | async function aiBuildUserPersona( FILE: apps/web/utils/ai/report/fetch.ts function fetchEmailsForReport (line 10) | async function fetchEmailsForReport({ function fetchReceivedEmails (line 42) | async function fetchReceivedEmails( function fetchSentEmails (line 54) | async function fetchSentEmails( function fetchEmailTemplates (line 66) | async function fetchEmailTemplates( FILE: apps/web/utils/ai/report/generate-actionable-recommendations.ts function aiGenerateActionableRecommendations (line 38) | async function aiGenerateActionableRecommendations( FILE: apps/web/utils/ai/report/generate-executive-summary.ts function aiGenerateExecutiveSummary (line 52) | async function aiGenerateExecutiveSummary( FILE: apps/web/utils/ai/report/response-patterns.ts function aiAnalyzeResponsePatterns (line 46) | async function aiAnalyzeResponsePatterns( FILE: apps/web/utils/ai/report/summarize-emails.ts type EmailSummary (line 20) | type EmailSummary = z.infer; function aiSummarizeEmails (line 22) | async function aiSummarizeEmails( function processEmailBatch (line 55) | async function processEmailBatch( FILE: apps/web/utils/ai/rule/create-rule-schema.test.ts function buildRule (line 238) | function buildRule(action: { FILE: apps/web/utils/ai/rule/create-rule-schema.ts function getAvailableActions (line 48) | function getAvailableActions(provider: string) { type CreateRuleSchema (line 153) | type CreateRuleSchema = z.infer>; type CreateOrUpdateRuleSchema (line 154) | type CreateOrUpdateRuleSchema = CreateRuleSchema & { FILE: apps/web/utils/ai/rule/diff-rules.ts function aiDiffRules (line 7) | async function aiDiffRules({ FILE: apps/web/utils/ai/rule/find-existing-rules.ts function aiFindExistingRules (line 7) | async function aiFindExistingRules({ FILE: apps/web/utils/ai/rule/prompt-to-rules.ts function aiPromptToRules (line 14) | async function aiPromptToRules({ function getSystemPrompt (line 58) | function getSystemPrompt() { FILE: apps/web/utils/ai/rule/rule-condition-descriptions.ts constant AI_INSTRUCTIONS_PROMPT_DESCRIPTION (line 1) | const AI_INSTRUCTIONS_PROMPT_DESCRIPTION = constant STATIC_FROM_CONDITION_DESCRIPTION (line 4) | const STATIC_FROM_CONDITION_DESCRIPTION = constant INVALID_STATIC_FROM_MESSAGE (line 7) | const INVALID_STATIC_FROM_MESSAGE = function isInvalidStaticFromValue (line 10) | function isInvalidStaticFromValue(value: string | null | undefined) { function isValidStaticFromToken (line 20) | function isValidStaticFromToken(value: string) { FILE: apps/web/utils/ai/security.ts constant PROMPT_SECURITY_INSTRUCTIONS (line 6) | const PROMPT_SECURITY_INSTRUCTIONS = ` constant PLAIN_TEXT_OUTPUT_INSTRUCTION (line 19) | const PLAIN_TEXT_OUTPUT_INSTRUCTION = FILE: apps/web/utils/ai/snippets/find-snippets.ts function aiFindSnippets (line 8) | async function aiFindSnippets({ FILE: apps/web/utils/ai/types.ts type EmailForAction (line 4) | type EmailForAction = Pick< type ActionItem (line 17) | type ActionItem = { FILE: apps/web/utils/announcements.tsx constant DETAIL_ICON_CLASS (line 3) | const DETAIL_ICON_CLASS = "h-4 w-4 text-gray-600 dark:text-gray-400"; type AnnouncementDetail (line 5) | interface AnnouncementDetail { type Announcement (line 11) | interface Announcement { constant ANNOUNCEMENTS (line 23) | const ANNOUNCEMENTS: Announcement[] = [ function getActiveAnnouncements (line 70) | function getActiveAnnouncements(): Announcement[] { function hasNewAnnouncements (line 77) | function hasNewAnnouncements( FILE: apps/web/utils/api-auth.test.ts function getRequest (line 19) | function getRequest(apiKey: string | null) { FILE: apps/web/utils/api-auth.ts constant API_KEY_HEADER (line 10) | const API_KEY_HEADER = "API-Key"; type AccountApiKeyPrincipal (line 12) | type AccountApiKeyPrincipal = { type StatsApiKeyPrincipal (line 22) | type StatsApiKeyPrincipal = { function validateApiKey (line 32) | async function validateApiKey( function getUserFromApiKey (line 68) | async function getUserFromApiKey(secretKey: string) { function validateAccountApiKey (line 86) | async function validateAccountApiKey( function validateApiKeyAndGetEmailProvider (line 110) | async function validateApiKeyAndGetEmailProvider( function getStoredApiKey (line 133) | async function getStoredApiKey(secretKey: string) { function isExpired (line 160) | function isExpired(expiresAt: Date | null): boolean { FILE: apps/web/utils/api-key-scopes.ts constant API_KEY_SCOPES (line 3) | const API_KEY_SCOPES = [ type ApiKeyScopeValue (line 13) | type ApiKeyScopeValue = z.infer; constant API_KEY_SCOPE_METADATA (line 15) | const API_KEY_SCOPE_METADATA: Record< constant API_KEY_SCOPE_OPTIONS (line 48) | const API_KEY_SCOPE_OPTIONS: Array<{ constant DEFAULT_API_KEY_SCOPES (line 67) | const DEFAULT_API_KEY_SCOPES: ApiKeyScopeValue[] = [ constant API_KEY_EXPIRY_OPTIONS (line 73) | const API_KEY_EXPIRY_OPTIONS = [ type ApiKeyExpiryValue (line 87) | type ApiKeyExpiryValue = z.infer; function formatApiKeyScope (line 89) | function formatApiKeyScope(scope: ApiKeyScopeValue): string { FILE: apps/web/utils/api-key.ts function generateSecureToken (line 4) | function generateSecureToken(): string { function hashApiKey (line 8) | function hashApiKey(apiKey: string): string { FILE: apps/web/utils/api-middleware.test.ts function createMockRequest (line 51) | function createMockRequest( FILE: apps/web/utils/api-middleware.ts type RequestWithAccountApiKey (line 19) | interface RequestWithAccountApiKey extends RequestWithLogger { type RequestWithStatsApiKey (line 23) | interface RequestWithStatsApiKey extends RequestWithLogger { function withAccountApiKey (line 28) | function withAccountApiKey( function withStatsApiKey (line 67) | function withStatsApiKey( function getApiBaseLogFields (line 103) | function getApiBaseLogFields( function getApiAuthLogFields (line 116) | function getApiAuthLogFields( function logApiRequestCompleted (line 133) | function logApiRequestCompleted({ function logApiRequestFailed (line 148) | function logApiRequestFailed({ function getApiFailureLogFields (line 163) | function getApiFailureLogFields(error: unknown) { function getApiLogUrl (line 194) | function getApiLogUrl(url: string) { function assertExternalApiEnabled (line 200) | function assertExternalApiEnabled() { FILE: apps/web/utils/assess.ts function assessUser (line 12) | async function assessUser({ function getUnreadEmailCount (line 59) | async function getUnreadEmailCount(client: EmailProvider) { function getInboxCount (line 69) | async function getInboxCount(client: EmailProvider) { function getUnreadCount (line 79) | async function getUnreadCount(client: EmailProvider) { function getSentCount (line 89) | async function getSentCount(client: EmailProvider) { function getLabelCount (line 99) | async function getLabelCount(client: EmailProvider) { function getFiltersCount (line 110) | async function getFiltersCount(client: EmailProvider) { function getForwardingAddressesCount (line 120) | async function getForwardingAddressesCount( function getEmailClients (line 139) | async function getEmailClients(client: EmailProvider, logger: Logger) { function getUnhandledCount (line 162) | async function getUnhandledCount(client: EmailProvider): Promise<{ FILE: apps/web/utils/async.ts type BoundedConcurrencyResult (line 1) | type BoundedConcurrencyResult = { function runWithBoundedConcurrency (line 6) | async function runWithBoundedConcurrency({ FILE: apps/web/utils/attachments/draft-attachments.ts constant MAX_ATTACHMENTS (line 20) | const MAX_ATTACHMENTS = 3; constant MAX_MODEL_CANDIDATES (line 21) | const MAX_MODEL_CANDIDATES = 12; constant MAX_INDEX_TARGETS (line 22) | const MAX_INDEX_TARGETS = 12; constant PDF_MIME_TYPE (line 23) | const PDF_MIME_TYPE = "application/pdf"; constant SOURCE_REFRESH_INTERVAL_MS (line 24) | const SOURCE_REFRESH_INTERVAL_MS = 15 * 60 * 1000; type AttachmentSourceWithDocuments (line 37) | type AttachmentSourceWithDocuments = Prisma.AttachmentSourceGetPayload<{ type SourceDocument (line 54) | type SourceDocument = { type CandidateDocument (line 60) | type CandidateDocument = SourceDocument & { type DiscoveredDriveFile (line 66) | type DiscoveredDriveFile = { function selectDraftAttachmentsForRule (line 71) | async function selectDraftAttachmentsForRule({ function resolveDraftAttachments (line 182) | async function resolveDraftAttachments({ function syncAttachmentSource (line 259) | async function syncAttachmentSource({ function discoverSourceFiles (line 414) | async function discoverSourceFiles({ function indexAttachmentDocument (line 483) | async function indexAttachmentDocument({ function aiSelectRelevantAttachments (line 556) | async function aiSelectRelevantAttachments({ function buildAttachmentContext (line 649) | function buildAttachmentContext( function getDriveProvider (line 688) | async function getDriveProvider({ function hasDraftAttachmentAccess (line 716) | async function hasDraftAttachmentAccess(userId: string) { function dedupeDocuments (line 720) | function dedupeDocuments(documents: SourceDocument[]) { function getCachedSourceDocuments (line 739) | function getCachedSourceDocuments(source: AttachmentSourceWithDocuments) { function toCandidateDocument (line 747) | function toCandidateDocument({ function getDocumentRanking (line 771) | function getDocumentRanking( function scoreDocument (line 782) | function scoreDocument({ function computeDiscoveryScore (line 809) | function computeDiscoveryScore({ function getSearchTokens (line 829) | function getSearchTokens(text: string) { function normalizeSearchText (line 835) | function normalizeSearchText(text: string) { function needsIndexing (line 839) | function needsIndexing( function shouldRefreshSourceDocuments (line 851) | function shouldRefreshSourceDocuments( function isSameModifiedAt (line 865) | function isSameModifiedAt( function getDocumentPath (line 874) | function getDocumentPath(metadata: Prisma.JsonValue | null) { FILE: apps/web/utils/attachments/rule.ts function handleRuleAttachmentSourceSave (line 6) | async function handleRuleAttachmentSourceSave({ FILE: apps/web/utils/attachments/source-schema.ts type AttachmentSourceInput (line 11) | type AttachmentSourceInput = z.infer; type SelectedAttachment (line 20) | type SelectedAttachment = z.infer; FILE: apps/web/utils/auth-cookies.ts function getAndClearAuthErrorCookie (line 1) | function getAndClearAuthErrorCookie(): string | undefined { FILE: apps/web/utils/auth.ts function postSignUp (line 208) | async function postSignUp({ function handlePendingPremiumInvite (line 277) | async function handlePendingPremiumInvite({ email }: { email: string }) { function handleReferralOnSignUp (line 317) | async function handleReferralOnSignUp({ function getProfileData (line 365) | async function getProfileData(providerId: string, accessToken: string) { function handleLinkAccount (line 413) | async function handleLinkAccount(account: Account) { function saveTokens (line 585) | async function saveTokens({ function autoJoinOrganization (line 680) | async function autoJoinOrganization(emailAccountId: string) { FILE: apps/web/utils/auth/cleanup-invalid-tokens.ts function cleanupInvalidTokens (line 14) | async function cleanupInvalidTokens({ FILE: apps/web/utils/auth/local-bypass-config.ts constant LOCAL_BYPASS_USER_EMAIL (line 3) | const LOCAL_BYPASS_USER_EMAIL = "local-bypass@inboxzero.local"; constant LOCAL_BYPASS_USER_NAME (line 4) | const LOCAL_BYPASS_USER_NAME = "Local Test User"; constant LOCAL_BYPASS_PROVIDER (line 5) | const LOCAL_BYPASS_PROVIDER = "google"; constant LOCAL_BYPASS_PROVIDER_ACCOUNT_PREFIX (line 6) | const LOCAL_BYPASS_PROVIDER_ACCOUNT_PREFIX = "local-bypass:"; constant LOCAL_BYPASS_ACCESS_TOKEN (line 7) | const LOCAL_BYPASS_ACCESS_TOKEN = "local-bypass-access-token"; function isLocalAuthBypassEnabled (line 9) | function isLocalAuthBypassEnabled() { function getLocalBypassProviderAccountId (line 13) | function getLocalBypassProviderAccountId(userId: string) { function isLocalBypassProviderAccountId (line 17) | function isLocalBypassProviderAccountId( function isLocalBypassUserEmail (line 26) | function isLocalBypassUserEmail(email: string | null | undefined) { FILE: apps/web/utils/auth/local-bypass-email-account.ts function isLocalBypassEmailAccount (line 7) | async function isLocalBypassEmailAccount(emailAccountId: string) { FILE: apps/web/utils/auth/local-bypass-plugin.ts type LocalBypassUser (line 20) | type LocalBypassUser = { type LocalBypassInternalAdapter (line 30) | type LocalBypassInternalAdapter = { function localBypassAuthPlugin (line 39) | function localBypassAuthPlugin() { function getOrCreateLocalBypassUser (line 88) | async function getOrCreateLocalBypassUser( function ensureLocalBypassAccount (line 113) | async function ensureLocalBypassAccount(user: LocalBypassUser) { function getFutureDate (line 161) | function getFutureDate() { FILE: apps/web/utils/auto-draft.ts function shouldSkipAutoDraft (line 4) | function shouldSkipAutoDraft({ FILE: apps/web/utils/automation-jobs/cron.ts constant CRON_PART_COUNT (line 3) | const CRON_PART_COUNT = 5; constant MAX_SEARCH_MINUTES (line 4) | const MAX_SEARCH_MINUTES = 60 * 24 * 366; type ParsedAutomationCron (line 6) | type ParsedAutomationCron = { function validateAutomationCronExpression (line 12) | function validateAutomationCronExpression(cronExpression: string) { function getNextAutomationJobRunAt (line 16) | function getNextAutomationJobRunAt({ function parseAutomationCronExpression (line 43) | function parseAutomationCronExpression( function matchesCronAtUtc (line 87) | function matchesCronAtUtc(parsed: ParsedAutomationCron, date: Date) { function parseCronField (line 99) | function parseCronField({ function parseRangeToken (line 160) | function parseRangeToken({ function parsePositiveInt (line 207) | function parsePositiveInt(value: string, label: string) { function parseStep (line 225) | function parseStep(value: string, label: string) { function normalizeDayOfWeek (line 231) | function normalizeDayOfWeek(value: number) { function identity (line 235) | function identity(value: number) { FILE: apps/web/utils/automation-jobs/defaults.ts constant DEFAULT_AUTOMATION_JOB_CRON (line 1) | const DEFAULT_AUTOMATION_JOB_CRON = "0 9,14 * * 1-5"; constant AUTOMATION_CRON_PRESETS (line 3) | const AUTOMATION_CRON_PRESETS = [ function getDefaultAutomationJobName (line 21) | function getDefaultAutomationJobName() { FILE: apps/web/utils/automation-jobs/describe.ts function describeCronSchedule (line 3) | function describeCronSchedule(cronExpression: string): string { function describeWeekdays (line 60) | function describeWeekdays(dowField: string): string { function getTimezoneAbbr (line 68) | function getTimezoneAbbr(tz: string): string { function cronstrueFallback (line 79) | function cronstrueFallback(cronExpression: string): string { FILE: apps/web/utils/automation-jobs/execute.ts function executeAutomationJobRun (line 17) | async function executeAutomationJobRun({ function markAutomationJobRunSkipped (line 232) | async function markAutomationJobRunSkipped({ FILE: apps/web/utils/automation-jobs/message.ts function getAutomationJobMessage (line 8) | async function getAutomationJobMessage({ FILE: apps/web/utils/automation-jobs/messaging-channel.ts constant SUPPORTED_AUTOMATION_MESSAGING_PROVIDERS (line 3) | const SUPPORTED_AUTOMATION_MESSAGING_PROVIDERS: MessagingProvider[] = [ type AutomationMessagingChannel (line 9) | type AutomationMessagingChannel = { function isSupportedAutomationMessagingProvider (line 17) | function isSupportedAutomationMessagingProvider( function hasAutomationMessagingDestination (line 23) | function hasAutomationMessagingDestination( function isAutomationMessagingChannelReady (line 36) | function isAutomationMessagingChannelReady( FILE: apps/web/utils/automation-jobs/messaging.ts function sendAutomationMessage (line 10) | async function sendAutomationMessage({ function sendAutomationMessageToTeams (line 52) | async function sendAutomationMessageToTeams({ function sendAutomationMessageToTelegram (line 102) | async function sendAutomationMessageToTelegram({ FILE: apps/web/utils/automation-jobs/slack.ts type SlackMessagingChannel (line 6) | type SlackMessagingChannel = { class AutomationJobConfigurationError (line 13) | class AutomationJobConfigurationError extends Error { method constructor (line 14) | constructor(message: string) { function sendAutomationMessageToSlack (line 20) | async function sendAutomationMessageToSlack({ function isSlackError (line 118) | function isSlackError( FILE: apps/web/utils/automation-jobs/stale.ts constant ONE_HOUR_MS (line 1) | const ONE_HOUR_MS = 60 * 60 * 1000; function isStaleAutomationJobRun (line 3) | function isStaleAutomationJobRun({ FILE: apps/web/utils/braintrust.ts class Braintrust (line 7) | class Braintrust { method constructor (line 10) | constructor(dataset: string) { method insertToDataset (line 16) | insertToDataset(data: { id: string; input: unknown; expected?: unknown... FILE: apps/web/utils/branding.ts constant BRAND_NAME (line 3) | const BRAND_NAME = env.NEXT_PUBLIC_BRAND_NAME; constant BRAND_LOGO_URL (line 4) | const BRAND_LOGO_URL = env.NEXT_PUBLIC_BRAND_LOGO_URL?.trim(); constant BRAND_ICON_URL (line 5) | const BRAND_ICON_URL = constant SUPPORT_EMAIL (line 7) | const SUPPORT_EMAIL = env.NEXT_PUBLIC_SUPPORT_EMAIL; function getBrandTitle (line 9) | function getBrandTitle(pageTitle: string) { function getPossessiveBrandName (line 13) | function getPossessiveBrandName() { function toAbsoluteUrl (line 17) | function toAbsoluteUrl(urlOrPath: string) { FILE: apps/web/utils/brands.ts type Brand (line 1) | type Brand = { constant BRANDS (line 7) | const BRANDS = { type BrandKey (line 47) | type BrandKey = keyof typeof BRANDS; constant BRANDS_LIST (line 49) | const BRANDS_LIST = { type BrandListKey (line 71) | type BrandListKey = keyof typeof BRANDS_LIST; FILE: apps/web/utils/bulk-archive/get-archive-candidates.test.ts function createEmailGroup (line 7) | function createEmailGroup( FILE: apps/web/utils/bulk-archive/get-archive-candidates.ts type EmailGroup (line 3) | type EmailGroup = { type ConfidenceLevel (line 9) | type ConfidenceLevel = "high" | "medium" | "low"; type ArchiveCandidate (line 11) | type ArchiveCandidate = { function getArchiveCandidates (line 24) | function getArchiveCandidates( FILE: apps/web/utils/calendar/availability-types.ts type BusyPeriod (line 1) | type BusyPeriod = { type CalendarAvailabilityProvider (line 6) | interface CalendarAvailabilityProvider { FILE: apps/web/utils/calendar/client.ts type AuthOptions (line 8) | type AuthOptions = { function getCalendarOAuth2Client (line 29) | function getCalendarOAuth2Client() { function fetchGoogleCalendars (line 118) | async function fetchGoogleCalendars( function saveCalendarTokens (line 131) | async function saveCalendarTokens({ FILE: apps/web/utils/calendar/constants.ts constant CALENDAR_STATE_COOKIE_NAME (line 1) | const CALENDAR_STATE_COOKIE_NAME = "calendar_state"; constant CALENDAR_ONBOARDING_RETURN_COOKIE (line 2) | const CALENDAR_ONBOARDING_RETURN_COOKIE = "calendar_onboarding_return"; FILE: apps/web/utils/calendar/event-provider.ts function createCalendarEventProviders (line 12) | async function createCalendarEventProviders( FILE: apps/web/utils/calendar/event-types.ts type CalendarEventAttendee (line 1) | interface CalendarEventAttendee { type CalendarEvent (line 6) | interface CalendarEvent { type CalendarEventProvider (line 18) | interface CalendarEventProvider { FILE: apps/web/utils/calendar/handle-calendar-callback.ts function handleCalendarCallback (line 27) | async function handleCalendarCallback( FILE: apps/web/utils/calendar/oauth-callback-helpers.ts function validateOAuthCallback (line 29) | async function validateOAuthCallback( function parseAndValidateCalendarState (line 102) | function parseAndValidateCalendarState( function buildCalendarRedirectUrl (line 133) | function buildCalendarRedirectUrl( function getCalendarRedirectPath (line 143) | function getCalendarRedirectPath( function checkExistingConnection (line 177) | async function checkExistingConnection( function createCalendarConnection (line 194) | async function createCalendarConnection(params: { function extractAadstsCode (line 215) | function extractAadstsCode( function mapCalendarOAuthError (line 223) | function mapCalendarOAuthError(params: { function getSafeOAuthErrorDescription (line 250) | function getSafeOAuthErrorDescription( FILE: apps/web/utils/calendar/oauth-types.ts type CalendarTokens (line 3) | interface CalendarTokens { type CalendarOAuthProvider (line 10) | interface CalendarOAuthProvider { type OAuthCallbackValidation (line 29) | interface OAuthCallbackValidation { type CalendarOAuthState (line 36) | interface CalendarOAuthState { FILE: apps/web/utils/calendar/providers/google-availability.ts function fetchGoogleCalendarBusyPeriods (line 9) | async function fetchGoogleCalendarBusyPeriods({ function createGoogleAvailabilityProvider (line 63) | function createGoogleAvailabilityProvider( FILE: apps/web/utils/calendar/providers/google-events.ts type GoogleCalendarConnectionParams (line 9) | interface GoogleCalendarConnectionParams { class GoogleCalendarEventProvider (line 16) | class GoogleCalendarEventProvider implements CalendarEventProvider { method constructor (line 20) | constructor(connection: GoogleCalendarConnectionParams, logger: Logger) { method getClient (line 25) | private async getClient(): Promise { method fetchEventsWithAttendee (line 35) | async fetchEventsWithAttendee({ method fetchEvents (line 70) | async fetchEvents({ method parseEvent (line 95) | private parseEvent(event: calendar_v3.Schema$Event) { FILE: apps/web/utils/calendar/providers/google.ts function createGoogleCalendarProvider (line 12) | function createGoogleCalendarProvider( FILE: apps/web/utils/calendar/providers/microsoft-availability.ts function fetchMicrosoftCalendarBusyPeriods (line 9) | async function fetchMicrosoftCalendarBusyPeriods({ function createMicrosoftAvailabilityProvider (line 89) | function createMicrosoftAvailabilityProvider( FILE: apps/web/utils/calendar/providers/microsoft-events.ts type MicrosoftCalendarConnectionParams (line 9) | interface MicrosoftCalendarConnectionParams { type MicrosoftEvent (line 16) | type MicrosoftEvent = { class MicrosoftCalendarEventProvider (line 31) | class MicrosoftCalendarEventProvider implements CalendarEventProvider { method constructor (line 35) | constructor(connection: MicrosoftCalendarConnectionParams, logger: Log... method getClient (line 40) | private async getClient(): Promise { method fetchEventsWithAttendee (line 50) | async fetchEventsWithAttendee({ method fetchEvents (line 89) | async fetchEvents({ method parseEvent (line 120) | private parseEvent(event: MicrosoftEvent) { FILE: apps/web/utils/calendar/providers/microsoft.ts function createMicrosoftCalendarProvider (line 11) | function createMicrosoftCalendarProvider( FILE: apps/web/utils/calendar/timezone-helpers.ts function autoPopulateTimezone (line 7) | async function autoPopulateTimezone( FILE: apps/web/utils/calendar/unified-availability.ts function getUnifiedCalendarAvailability (line 13) | async function getUnifiedCalendarAvailability({ function convertBusyPeriodsToTimezone (line 161) | function convertBusyPeriodsToTimezone( function parseDateInTimezone (line 181) | function parseDateInTimezone( FILE: apps/web/utils/categories.ts type SenderCategoryKey (line 50) | type SenderCategoryKey = keyof typeof defaultCategory; type SenderCategoryValue (line 51) | type SenderCategoryValue = (typeof defaultCategory)[SenderCategoryKey]; type SenderCategory (line 52) | type SenderCategory = SenderCategoryValue["name"]; FILE: apps/web/utils/categorize/senders/categorize.ts function categorizeSender (line 17) | async function categorizeSender( function updateSenderCategory (line 76) | async function updateSenderCategory({ function updateCategoryForSender (line 120) | async function updateCategoryForSender({ function preCategorizeSendersWithStaticRules (line 143) | function preCategorizeSendersWithStaticRules( function getCategories (line 157) | async function getCategories({ function categorizeWithAi (line 167) | async function categorizeWithAi({ FILE: apps/web/utils/category.server.ts type CategoryWithRules (line 4) | type CategoryWithRules = Prisma.CategoryGetPayload<{ FILE: apps/web/utils/cold-email/cold-email-blocker-enabled.ts type RuleWithActions (line 4) | type RuleWithActions = Prisma.RuleGetPayload<{ function isColdEmailBlockerEnabled (line 8) | function isColdEmailBlockerEnabled(rules: RuleWithActions[]) { FILE: apps/web/utils/cold-email/cold-email-rule.ts type ColdEmailRule (line 4) | type ColdEmailRule = NonNullable< function getColdEmailRule (line 8) | async function getColdEmailRule(emailAccountId: string) { function isColdEmailRuleEnabled (line 34) | function isColdEmailRuleEnabled(coldEmailRule: ColdEmailRule) { FILE: apps/web/utils/cold-email/is-cold-email.ts constant COLD_EMAIL_FOLDER_NAME (line 15) | const COLD_EMAIL_FOLDER_NAME = "Cold Emails"; type ColdEmailBlockerReason (line 17) | type ColdEmailBlockerReason = function isColdEmail (line 23) | async function isColdEmail({ function aiIsColdEmail (line 110) | async function aiIsColdEmail( FILE: apps/web/utils/cold-email/prompt.ts constant DEFAULT_COLD_EMAIL_PROMPT (line 1) | const DEFAULT_COLD_EMAIL_PROMPT = `Examples of cold emails: FILE: apps/web/utils/cold-email/send-notification.ts function sendColdEmailNotification (line 6) | async function sendColdEmailNotification({ FILE: apps/web/utils/colors.ts function getRandomColor (line 21) | function getRandomColor() { constant COLORS (line 25) | const COLORS = { FILE: apps/web/utils/condition.ts type RuleConditions (line 10) | type RuleConditions = Partial< function isAIRule (line 25) | function isAIRule( function isGroupRule (line 31) | function isGroupRule( function isStaticRule (line 37) | function isStaticRule(rule: RuleConditions) { function getConditions (line 41) | function getConditions(rule: RuleConditions) { function getConditionTypes (line 103) | function getConditionTypes( function getEmptyCondition (line 115) | function getEmptyCondition(type: CoreConditionType): ZodCondition { type FlattenedConditions (line 139) | type FlattenedConditions = { function conditionTypesToString (line 176) | function conditionTypesToString(rule: RuleConditions) { function conditionTypeToString (line 182) | function conditionTypeToString(conditionType: ConditionType): string { function conditionsToString (line 199) | function conditionsToString(rule: RuleConditions) { FILE: apps/web/utils/config.ts constant AI_GENERATED_FIELD_VALUE (line 1) | const AI_GENERATED_FIELD_VALUE = "___AI_GENERATE___"; constant EMAIL_ACCOUNT_HEADER (line 3) | const EMAIL_ACCOUNT_HEADER = "X-Email-Account-ID"; constant NO_REFRESH_TOKEN_ERROR_CODE (line 5) | const NO_REFRESH_TOKEN_ERROR_CODE = "NO_REFRESH_TOKEN"; constant MICROSOFT_AUTH_EXPIRED_ERROR_CODE (line 6) | const MICROSOFT_AUTH_EXPIRED_ERROR_CODE = "MICROSOFT_AUTH_EXPIRED"; constant KNOWLEDGE_BASIC_MAX_ITEMS (line 11) | const KNOWLEDGE_BASIC_MAX_ITEMS = 1; constant KNOWLEDGE_BASIC_MAX_CHARS (line 12) | const KNOWLEDGE_BASIC_MAX_CHARS = 2000; type ConditionType (line 21) | type ConditionType = (typeof ConditionType)[keyof typeof ConditionType]; type CoreConditionType (line 22) | type CoreConditionType = Extract; constant WELCOME_PATH (line 24) | const WELCOME_PATH = "/welcome-redirect"; constant EXTENSION_URL (line 26) | const EXTENSION_URL = "https://go.getinboxzero.com/extension"; constant TELEGRAM_BOT_URL (line 28) | const TELEGRAM_BOT_URL = "https://t.me/getinboxzerobot"; constant ONBOARDING_PROCESS_EMAILS_COUNT (line 30) | const ONBOARDING_PROCESS_EMAILS_COUNT = 20; FILE: apps/web/utils/constants/user-roles.ts constant USER_ROLES (line 1) | const USER_ROLES = [ type UserRole (line 68) | type UserRole = (typeof USER_ROLES)[number]; type UserRoleValue (line 69) | type UserRoleValue = UserRole["value"]; FILE: apps/web/utils/cookies.server.ts function clearLastEmailAccountCookie (line 4) | async function clearLastEmailAccountCookie() { FILE: apps/web/utils/cookies.ts constant ASSISTANT_ONBOARDING_COOKIE (line 1) | const ASSISTANT_ONBOARDING_COOKIE = "viewed_assistant_onboarding"; constant REPLY_ZERO_ONBOARDING_COOKIE (line 2) | const REPLY_ZERO_ONBOARDING_COOKIE = "viewed_reply_zero_onboarding"; constant INVITATION_COOKIE (line 3) | const INVITATION_COOKIE = "invitation_id"; constant LAST_EMAIL_ACCOUNT_COOKIE (line 4) | const LAST_EMAIL_ACCOUNT_COOKIE = "last_email_account_id"; type LastEmailAccountCookieValue (line 6) | type LastEmailAccountCookieValue = { function markOnboardingAsCompleted (line 11) | function markOnboardingAsCompleted(cookie: string) { function setInvitationCookie (line 15) | function setInvitationCookie(invitationId: string) { function clearInvitationCookie (line 19) | function clearInvitationCookie() { function parseLastEmailAccountCookieValue (line 23) | function parseLastEmailAccountCookieValue({ FILE: apps/web/utils/cron.test.ts function createMockRequestWithLogger (line 12) | function createMockRequestWithLogger( FILE: apps/web/utils/cron.ts function hasCronSecret (line 4) | function hasCronSecret(request: RequestWithLogger) { function hasPostCronSecret (line 19) | async function hasPostCronSecret(request: RequestWithLogger) { function getCronSecretHeader (line 35) | function getCronSecretHeader() { FILE: apps/web/utils/date.ts constant ONE_MINUTE_MS (line 7) | const ONE_MINUTE_MS = 1000 * 60; constant ONE_HOUR_MS (line 8) | const ONE_HOUR_MS = ONE_MINUTE_MS * 60; constant ONE_DAY_MS (line 9) | const ONE_DAY_MS = ONE_HOUR_MS * 24; constant ONE_MONTH_MS (line 10) | const ONE_MONTH_MS = ONE_DAY_MS * 30; constant ONE_YEAR_MS (line 11) | const ONE_YEAR_MS = ONE_DAY_MS * 365; constant ONE_HOUR_MINUTES (line 13) | const ONE_HOUR_MINUTES = 60; constant ONE_DAY_MINUTES (line 14) | const ONE_DAY_MINUTES = ONE_HOUR_MINUTES * 24; constant ONE_WEEK_MINUTES (line 15) | const ONE_WEEK_MINUTES = ONE_DAY_MINUTES * 7; constant NINETY_DAYS_MINUTES (line 16) | const NINETY_DAYS_MINUTES = ONE_DAY_MINUTES * 90; function formatShortDate (line 25) | function formatShortDate( function dateToSeconds (line 58) | function dateToSeconds(date: Date) { function internalDateToDate (line 62) | function internalDateToDate( function formatDateForLLM (line 82) | function formatDateForLLM(date: Date) { function formatUtcDate (line 86) | function formatUtcDate(date: Date) { function formatRelativeTimeForLLM (line 90) | function formatRelativeTimeForLLM(date: Date) { function formatDateSimple (line 95) | function formatDateSimple(date: Date) { function sortByInternalDate (line 107) | function sortByInternalDate( constant DEFAULT_TIMEZONE (line 121) | const DEFAULT_TIMEZONE = "UTC"; function formatInUserTimezone (line 132) | function formatInUserTimezone( function formatTimeInUserTimezone (line 159) | function formatTimeInUserTimezone( function formatDateTimeInUserTimezone (line 170) | function formatDateTimeInUserTimezone( FILE: apps/web/utils/delayed-actions.ts constant SUPPORTED_DELAYED_ACTIONS (line 4) | const SUPPORTED_DELAYED_ACTIONS: ActionType[] = [ function canActionBeDelayed (line 14) | function canActionBeDelayed(actionType: ActionType): boolean { FILE: apps/web/utils/digest/digest-enabled.ts function isDigestEnabled (line 4) | function isDigestEnabled(ruleActions: Pick[]) { FILE: apps/web/utils/digest/index.ts constant AI_DIGEST_TOPIC (line 8) | const AI_DIGEST_TOPIC = "ai-digest"; function enqueueDigestItem (line 10) | async function enqueueDigestItem({ FILE: apps/web/utils/digest/schedule.ts type DigestScheduleForProgression (line 4) | type DigestScheduleForProgression = Pick< function isDigestScheduleDue (line 13) | function isDigestScheduleDue( function getDigestScheduleProgression (line 20) | function getDigestScheduleProgression( FILE: apps/web/utils/digest/summary-limit.ts constant DIGEST_SUMMARY_WINDOW_MS (line 6) | const DIGEST_SUMMARY_WINDOW_MS = 24 * 60 * 60 * 1000; constant DIGEST_SUMMARY_WINDOW_TTL_SECONDS (line 7) | const DIGEST_SUMMARY_WINDOW_TTL_SECONDS = 24 * 60 * 60; constant DIGEST_SUMMARY_LIMIT_KEY_PREFIX (line 8) | const DIGEST_SUMMARY_LIMIT_KEY_PREFIX = "digest:summary-limit"; constant DIGEST_SUMMARY_RESERVATION_CONTENT (line 9) | const DIGEST_SUMMARY_RESERVATION_CONTENT = "__digest_summary_reservation... constant DIGEST_SUMMARY_RESERVATION_PREFIX (line 10) | const DIGEST_SUMMARY_RESERVATION_PREFIX = "digest-summary-reservation"; constant RESERVE_DIGEST_SUMMARY_SLOT_SCRIPT (line 11) | const RESERVE_DIGEST_SUMMARY_SLOT_SCRIPT = ` function getDigestSummaryWindowStart (line 22) | function getDigestSummaryWindowStart(now = new Date()): Date { type DigestSummarySlotReservation (line 26) | type DigestSummarySlotReservation = { function reserveDigestSummarySlot (line 32) | async function reserveDigestSummarySlot({ function releaseDigestSummarySlot (line 79) | async function releaseDigestSummarySlot({ function hasReachedDigestSummaryLimit (line 112) | async function hasReachedDigestSummaryLimit({ function countDigestSummariesInWindow (line 131) | async function countDigestSummariesInWindow({ function getDigestSummaryLimitKey (line 150) | function getDigestSummaryLimitKey(emailAccountId: string) { function runReserveDigestSummarySlotScript (line 154) | async function runReserveDigestSummarySlotScript({ function reserveDigestSummarySlotWithPrisma (line 184) | async function reserveDigestSummarySlotWithPrisma({ function getPrismaReservationMessageId (line 255) | function getPrismaReservationMessageId(reservationToken: string) { function getPrismaReservationThreadId (line 259) | function getPrismaReservationThreadId(reservationToken: string) { FILE: apps/web/utils/drive/client.ts function getGoogleDriveOAuth2Client (line 16) | function getGoogleDriveOAuth2Client() { type GoogleDriveAccessLevel (line 27) | type GoogleDriveAccessLevel = "limited" | "full"; function getGoogleDriveOAuth2Url (line 29) | function getGoogleDriveOAuth2Url( function exchangeGoogleDriveCode (line 47) | async function exchangeGoogleDriveCode(code: string) { function getMicrosoftDriveOAuth2Url (line 85) | function getMicrosoftDriveOAuth2Url(state: string): string { function exchangeMicrosoftDriveCode (line 106) | async function exchangeMicrosoftDriveCode(code: string) { FILE: apps/web/utils/drive/constants.ts constant DRIVE_STATE_COOKIE_NAME (line 1) | const DRIVE_STATE_COOKIE_NAME = "drive_state"; FILE: apps/web/utils/drive/document-extraction.ts type ExtractionResult (line 21) | interface ExtractionResult { type ExtractionOptions (line 27) | interface ExtractionOptions { constant EXTRACTABLE_MIME_TYPES (line 37) | const EXTRACTABLE_MIME_TYPES = [ type ExtractableMimeType (line 43) | type ExtractableMimeType = (typeof EXTRACTABLE_MIME_TYPES)[number]; function extractTextFromDocument (line 53) | async function extractTextFromDocument( function isExtractableMimeType (line 84) | function isExtractableMimeType(mimeType: string): boolean { function canUseNativePdfSupport (line 93) | function canUseNativePdfSupport( function extractFromPdf (line 110) | async function extractFromPdf( function extractFromDocx (line 176) | async function extractFromDocx( function extractFromPlainText (line 204) | function extractFromPlainText( function getDocumentPreview (line 225) | function getDocumentPreview(text: string, length = 200): string { function cleanExtractedText (line 233) | function cleanExtractedText(text: string): string { FILE: apps/web/utils/drive/filing-engine.ts type FilingResult (line 21) | interface FilingResult { type ProcessAttachmentOptions (line 38) | interface ProcessAttachmentOptions { function processAttachment (line 64) | async function processAttachment({ function getFilableAttachments (line 329) | function getFilableAttachments(message: ParsedMessage): Attachment[] { type FolderWithConnection (line 337) | interface FolderWithConnection { type FolderTarget (line 345) | interface FolderTarget { function resolveFolderTarget (line 352) | function resolveFolderTarget( FILE: apps/web/utils/drive/filing-notifications.ts type SourceMessageInfo (line 14) | interface SourceMessageInfo { type FilingNotificationParams (line 20) | interface FilingNotificationParams { function sendFiledNotification (line 37) | async function sendFiledNotification({ function sendAskNotification (line 98) | async function sendAskNotification({ function sendCorrectionConfirmation (line 155) | async function sendCorrectionConfirmation({ function buildFiledEmailHtml (line 204) | function buildFiledEmailHtml({ function buildAskEmailHtml (line 238) | function buildAskEmailHtml({ function buildCorrectionConfirmationHtml (line 268) | function buildCorrectionConfirmationHtml({ FILE: apps/web/utils/drive/filing-slack-notifications.ts function sendFilingSlackNotifications (line 10) | async function sendFilingSlackNotifications({ FILE: apps/web/utils/drive/folder-utils.test.ts function createMockFolder (line 8) | function createMockFolder(id: string, name: string): DriveFolder { function createMockProvider (line 17) | function createMockProvider( FILE: apps/web/utils/drive/folder-utils.ts type FolderPathResult (line 5) | interface FolderPathResult { function createFolderPath (line 14) | async function createFolderPath( function createAndSaveFilingFolder (line 53) | async function createAndSaveFilingFolder({ FILE: apps/web/utils/drive/handle-drive-callback.ts function handleDriveCallback (line 32) | async function handleDriveCallback( function validateOAuthCallback (line 177) | async function validateOAuthCallback( function parseAndValidateDriveState (line 213) | function parseAndValidateDriveState( function buildDriveRedirectUrl (line 247) | function buildDriveRedirectUrl(emailAccountId: string): URL { function upsertDriveConnection (line 254) | async function upsertDriveConnection(params: { FILE: apps/web/utils/drive/handle-filing-reply.ts type ProcessFilingReplyArgs (line 17) | interface ProcessFilingReplyArgs { function processFilingReply (line 31) | async function processFilingReply({ function verifyUserSentEmail (line 130) | function verifyUserSentEmail({ function handleApprove (line 149) | async function handleApprove(filingId: string): Promise { constant TO_DELETE_FOLDER (line 159) | const TO_DELETE_FOLDER = "Inbox Zero - To Delete"; function handleUndo (line 161) | async function handleUndo({ function handleMove (line 200) | async function handleMove({ function findFilingFromThread (line 275) | async function findFilingFromThread({ FILE: apps/web/utils/drive/provider.ts type OAuthTokenResponse (line 15) | type OAuthTokenResponse = { function createDriveProvider (line 27) | function createDriveProvider( function createDriveProviderWithRefresh (line 52) | async function createDriveProviderWithRefresh( function refreshMicrosoftDriveToken (line 88) | async function refreshMicrosoftDriveToken( function refreshGoogleDriveToken (line 174) | async function refreshGoogleDriveToken( function saveDriveTokens (line 255) | async function saveDriveTokens({ function markDriveConnectionAsDisconnected (line 295) | async function markDriveConnectionAsDisconnected(connectionId: string) { FILE: apps/web/utils/drive/providers/google-token.ts function refreshGoogleDriveToken (line 10) | async function refreshGoogleDriveToken( FILE: apps/web/utils/drive/providers/google.ts class GoogleDriveProvider (line 13) | class GoogleDriveProvider implements DriveProvider { method constructor (line 19) | constructor(accessToken: string, logger?: Logger) { method toJSON (line 36) | toJSON() { method getAccessToken (line 40) | getAccessToken(): string { method listFolders (line 48) | async listFolders(parentId?: string): Promise { method getFolder (line 83) | async getFolder(folderId: string): Promise { method createFolder (line 115) | async createFolder(name: string, parentId?: string): Promise { method getFile (line 171) | async getFile(fileId: string): Promise { method listFiles (line 200) | async listFiles( method downloadFile (line 242) | async downloadFile( method moveFile (line 259) | async moveFile(fileId: string, targetFolderId: string): Promise { method getFolder (line 65) | async getFolder(folderId: string): Promise { method createFolder (line 106) | async createFolder(name: string, parentId?: string): Promise { method getFile (line 173) | async getFile(fileId: string): Promise { method listFiles (line 200) | async listFiles( method downloadFile (line 228) | async downloadFile( method moveFile (line 254) | async moveFile(fileId: string, targetFolderId: string): Promise { method getThread (line 131) | async getThread(threadId: string): Promise { method getLabels (line 152) | async getLabels(): Promise { method getLabelById (line 172) | async getLabelById(labelId: string): Promise { method getLabelByName (line 189) | async getLabelByName(name: string): Promise { method getMessage (line 202) | async getMessage(messageId: string): Promise { method getMessageByRfc822MessageId (line 207) | async getMessageByRfc822MessageId( method getSentMessages (line 215) | async getSentMessages(maxResults = 20): Promise { method getInboxMessages (line 219) | async getInboxMessages(maxResults = 20): Promise { method getSentMessageIds (line 227) | async getSentMessageIds(options: { method getSentThreadsExcluding (line 251) | async getSentThreadsExcluding(options: { method archiveThread (line 288) | async archiveThread(threadId: string, ownerEmail: string): Promise { method archiveMessagesBulk (line 335) | private async archiveMessagesBulk(messageIds: string[]): Promise { method archiveMessagesFromSenders (line 356) | private async archiveMessagesFromSenders( method trashThreadsFromSenders (line 438) | private async trashThreadsFromSenders( method bulkArchiveFromSenders (line 551) | async bulkArchiveFromSenders( method bulkTrashFromSenders (line 563) | async bulkTrashFromSenders( method trashThread (line 571) | async trashThread( method labelMessage (line 584) | async labelMessage({ method getDraft (line 653) | async getDraft(draftId: string): Promise { method deleteDraft (line 657) | async deleteDraft(draftId: string): Promise { method sendDraft (line 661) | async sendDraft( method createDraft (line 667) | async createDraft(params: { method updateDraft (line 716) | async updateDraft( method draftEmail (line 767) | async draftEmail( method replyToEmail (line 820) | async replyToEmail( method sendEmail (line 832) | async sendEmail(args: { method sendEmailWithHtml (line 843) | async sendEmailWithHtml(body: { method forwardEmail (line 869) | async forwardEmail( method markSpam (line 878) | async markSpam(threadId: string): Promise { method markRead (line 882) | async markRead(threadId: string): Promise { method blockUnsubscribedEmail (line 890) | async blockUnsubscribedEmail(messageId: string): Promise { method getThreadMessages (line 911) | async getThreadMessages(threadId: string): Promise { method getThreadMessagesInInbox (line 915) | async getThreadMessagesInInbox(threadId: string): Promise { method deleteLabel (line 963) | async deleteLabel(labelId: string): Promise { method getOrCreateInboxZeroLabel (line 970) | async getOrCreateInboxZeroLabel(key: InboxZeroLabel): Promise { method createFilter (line 1009) | async createFilter(options: { method createAutoArchiveFilter (line 1021) | async createAutoArchiveFilter(options: { method deleteFilter (line 1033) | async deleteFilter(id: string) { method getMessagesWithPagination (line 1037) | async getMessagesWithPagination(options: { method searchMessages (line 1087) | async searchMessages(options: { method getMessagesWithAttachments (line 1109) | async getMessagesWithAttachments(options: { method getMessagesFromSender (line 1120) | async getMessagesFromSender(options: { method getThreadsWithParticipant (line 1139) | async getThreadsWithParticipant(options: { method getThreadsWithLabel (line 1178) | async getThreadsWithLabel(options: { method getLatestMessageFromThreadSnapshot (line 1189) | async getLatestMessageFromThreadSnapshot( method getLatestMessageInThread (line 1203) | async getLatestMessageInThread( method getDrafts (line 1215) | async getDrafts(options?: { maxResults?: number }): Promise { method getAccessToken (line 1236) | getAccessToken(): string { method markReadThread (line 1240) | async markReadThread(threadId: string, read: boolean): Promise { method checkIfReplySent (line 1248) | async checkIfReplySent(senderEmail: string): Promise { method countReceivedMessages (line 1271) | async countReceivedMessages( method getAttachment (line 1300) | async getAttachment( method getThreadsWithQuery (line 1315) | async getThreadsWithQuery(options: { method hasPreviousCommunicationsWithSenderOrDomain (line 1444) | async hasPreviousCommunicationsWithSenderOrDomain(options: { method getThreadsFromSenderWithSubject (line 1452) | async getThreadsFromSenderWithSubject( method processHistory (line 1464) | async processHistory(options: { method watchEmails (line 1487) | async watchEmails(): Promise<{ method unwatchEmails (line 1500) | async unwatchEmails(): Promise { method isReplyInThread (line 1505) | isReplyInThread(message: ParsedMessage): boolean { method isSentMessage (line 1509) | isSentMessage(message: ParsedMessage): boolean { method getFolders (line 1513) | async getFolders() { method moveThreadToFolder (line 1518) | async moveThreadToFolder( method getOrCreateFolderIdByName (line 1526) | async getOrCreateFolderIdByName(_folderName: string): Promise { method getSignatures (line 1531) | async getSignatures(): Promise { method getInboxStats (line 1541) | async getInboxStats(): Promise<{ total: number; unread: number }> { method withRateLimitTracking (line 1549) | private async withRateLimitTracking( FILE: apps/web/utils/email/latest-message.test.ts type TestMessage (line 4) | type TestMessage = { FILE: apps/web/utils/email/latest-message.ts function getLatestNonDraftMessage (line 1) | function getLatestNonDraftMessage({ FILE: apps/web/utils/email/local-bypass-provider.ts function createLocalBypassEmailProvider (line 18) | function createLocalBypassEmailProvider(logger?: Logger): EmailProvider { function getFutureDate (line 347) | function getFutureDate() { function getFallbackMessage (line 353) | function getFallbackMessage(): ParsedMessage { function getLocalBypassLabels (line 377) | function getLocalBypassLabels(): EmailLabel[] { function getLocalBypassUserLabelId (line 413) | function getLocalBypassUserLabelId(name: string) { function getLocalBypassMessages (line 417) | function getLocalBypassMessages(): ParsedMessage[] { function buildMessage (line 580) | function buildMessage(options: { function getThreadById (line 627) | function getThreadById( function toThreads (line 645) | function toThreads(messages: ParsedMessage[]): EmailThread[] { function paginateMessages (line 671) | function paginateMessages( function paginateThreads (line 685) | function paginateThreads( function filterMessages (line 699) | function filterMessages( function matchesTextQuery (line 724) | function matchesTextQuery(message: ParsedMessage, query: string) { function matchesSender (line 742) | function matchesSender(message: ParsedMessage, senderEmail: string) { function hasLabel (line 749) | function hasLabel(message: ParsedMessage, label: string) { function sortMessagesByDateDesc (line 753) | function sortMessagesByDateDesc(messages: ParsedMessage[]) { function sortMessagesByDateAsc (line 757) | function sortMessagesByDateAsc(messages: ParsedMessage[]) { function getMessageTime (line 761) | function getMessageTime(message: ParsedMessage) { function parseOffset (line 765) | function parseOffset(pageToken?: string) { function normalizeLimit (line 772) | function normalizeLimit(value: number | undefined, fallback: number) { function normalizeComparableEmail (line 777) | function normalizeComparableEmail(value: string) { FILE: apps/web/utils/email/message-timestamp.ts type MessageTimestampInput (line 3) | type MessageTimestampInput = { function getMessageTimestamp (line 8) | function getMessageTimestamp( FILE: apps/web/utils/email/microsoft.test.ts function createMockOutlookClient (line 112) | function createMockOutlookClient(messages: Message[]) { function createMessage (line 126) | function createMessage({ FILE: apps/web/utils/email/microsoft.ts class OutlookProvider (line 81) | class OutlookProvider implements EmailProvider { method constructor (line 86) | constructor(client: OutlookClient, logger?: Logger) { method toJSON (line 93) | toJSON() { method getThreads (line 97) | async getThreads(folderId?: string): Promise { method getThread (line 116) | async getThread(threadId: string): Promise { method getLabels (line 135) | async getLabels(): Promise { method getLabelById (line 144) | async getLabelById(labelId: string): Promise { method getLabelByName (line 149) | async getLabelByName(name: string): Promise { method resolveCategoryWithFallback (line 159) | private async resolveCategoryWithFallback( method getMessage (line 178) | async getMessage(messageId: string): Promise { method getMessageByRfc822MessageId (line 182) | async getMessageByRfc822MessageId( method getMessages (line 208) | private async getMessages({ method getSentMessages (line 247) | async getSentMessages(maxResults = 20): Promise { method getInboxMessages (line 269) | async getInboxMessages(maxResults = 20): Promise { method getSentMessageIds (line 291) | async getSentMessageIds(options: { method getSentThreadsExcluding (line 332) | async getSentThreadsExcluding(options: { method archiveThread (line 397) | async archiveThread(threadId: string, ownerEmail: string): Promise { method deleteDraft (line 515) | async deleteDraft(draftId: string): Promise { method sendDraft (line 519) | async sendDraft( method createDraft (line 525) | async createDraft(params: { method updateDraft (line 582) | async updateDraft( method draftEmail (line 607) | async draftEmail( method replyToEmail (line 660) | async replyToEmail( method sendEmail (line 672) | async sendEmail(args: { method sendEmailWithHtml (line 683) | async sendEmailWithHtml(body: { method forwardEmail (line 710) | async forwardEmail( method markSpam (line 721) | async markSpam(threadId: string): Promise { method markRead (line 725) | async markRead(threadId: string): Promise { method markReadMessage (line 734) | async markReadMessage(messageId: string): Promise { method blockUnsubscribedEmail (line 740) | async blockUnsubscribedEmail(messageId: string): Promise { method getThreadMessages (line 745) | async getThreadMessages(threadId: string): Promise { method getThreadMessagesInInbox (line 764) | async getThreadMessagesInInbox(threadId: string): Promise { method deleteLabel (line 916) | async deleteLabel(labelId: string): Promise { method getOrCreateInboxZeroLabel (line 923) | async getOrCreateInboxZeroLabel(key: InboxZeroLabel): Promise { method createFilter (line 977) | async createFilter(options: { method createAutoArchiveFilter (line 989) | async createAutoArchiveFilter(options: { from: string; labelName?: str... method deleteFilter (line 998) | async deleteFilter(id: string) { method getMessagesWithPagination (line 1002) | async getMessagesWithPagination(options: { method searchMessages (line 1103) | async searchMessages(options: { method getMessagesWithAttachments (line 1124) | async getMessagesWithAttachments(options: { method getMessagesFromSender (line 1138) | async getMessagesFromSender(options: { method getThreadsWithParticipant (line 1172) | async getThreadsWithParticipant(options: { method getThreadsWithLabel (line 1249) | async getThreadsWithLabel(options: { method getLatestMessageFromThreadSnapshot (line 1302) | async getLatestMessageFromThreadSnapshot( method getLatestMessageInThread (line 1308) | async getLatestMessageInThread( method getDrafts (line 1333) | async getDrafts(options?: { maxResults?: number }): Promise { method getAccessToken (line 1352) | getAccessToken(): string { method markReadThread (line 1356) | async markReadThread(threadId: string, read: boolean): Promise { method checkIfReplySent (line 1364) | async checkIfReplySent(senderEmail: string): Promise { method countReceivedMessages (line 1387) | async countReceivedMessages( method getAttachment (line 1423) | async getAttachment( method getThreadsWithQuery (line 1445) | async getThreadsWithQuery(options: { method hasPreviousCommunicationsWithSenderOrDomain (line 1669) | async hasPreviousCommunicationsWithSenderOrDomain(options: { method getThreadsFromSenderWithSubject (line 1802) | async getThreadsFromSenderWithSubject( method processHistory (line 1814) | async processHistory(options: { method watchEmails (line 1841) | async watchEmails(): Promise<{ method unwatchEmails (line 1860) | async unwatchEmails(subscriptionId?: string): Promise { method isReplyInThread (line 1868) | isReplyInThread(message: ParsedMessage): boolean { method isSentMessage (line 1881) | isSentMessage(message: ParsedMessage): boolean { method moveThreadToFolder (line 1885) | async moveThreadToFolder( method archiveMessage (line 1900) | async archiveMessage(messageId: string): Promise { method bulkArchiveFromSenders (line 1918) | async bulkArchiveFromSenders( method bulkTrashFromSenders (line 1934) | async bulkTrashFromSenders( method getOrCreateFolderIdByName (line 1950) | async getOrCreateFolderIdByName(folderName: string): Promise { method getFolders (line 1958) | async getFolders() { method getSignatures (line 1962) | async getSignatures(): Promise { method getInboxStats (line 1997) | async getInboxStats(): Promise<{ total: number; unread: number }> { constant LABEL_TO_FOLDER_KEY (line 2015) | const LABEL_TO_FOLDER_KEY: Record = { function resolveOutlookFolderId (line 2024) | function resolveOutlookFolderId( FILE: apps/web/utils/email/provider-types.ts function isGoogleProvider (line 1) | function isGoogleProvider(provider: string | null | undefined) { function isMicrosoftProvider (line 5) | function isMicrosoftProvider(provider: string | null | undefined) { FILE: apps/web/utils/email/provider.ts function createEmailProvider (line 15) | async function createEmailProvider({ function getLocalBypassProvider (line 51) | async function getLocalBypassProvider({ FILE: apps/web/utils/email/quoted-plain-text.ts function buildQuotedPlainText (line 1) | function buildQuotedPlainText({ function quotePlainTextContent (line 17) | function quotePlainTextContent(content?: string) { FILE: apps/web/utils/email/rate-limit-mode-error.ts type EmailProviderRateLimitProvider (line 3) | type EmailProviderRateLimitProvider = EmailProvider["name"]; type EmailProviderRateLimitMetadata (line 5) | type EmailProviderRateLimitMetadata = { constant EMAIL_PROVIDER_RATE_LIMIT_METADATA (line 11) | const EMAIL_PROVIDER_RATE_LIMIT_METADATA = { class ProviderRateLimitModeError (line 27) | class ProviderRateLimitModeError extends Error { method constructor (line 31) | constructor({ function toRateLimitProvider (line 48) | function toRateLimitProvider( function getProviderFromRateLimitApiErrorType (line 55) | function getProviderFromRateLimitApiErrorType( function getProviderRateLimitApiErrorType (line 68) | function getProviderRateLimitApiErrorType( function getProviderRateLimitMessageLabel (line 74) | function getProviderRateLimitMessageLabel( function getProviderRateLimitBannerLabel (line 80) | function getProviderRateLimitBannerLabel( function isProviderRateLimitModeError (line 86) | function isProviderRateLimitModeError( FILE: apps/web/utils/email/rate-limit.ts constant DEFAULT_RATE_LIMIT_DELAY_MS (line 26) | const DEFAULT_RATE_LIMIT_DELAY_MS = 30_000; constant RETRY_AT_BUFFER_SECONDS (line 27) | const RETRY_AT_BUFFER_SECONDS = 5; type EmailProviderRateLimitState (line 29) | type EmailProviderRateLimitState = { function getEmailProviderRateLimitState (line 35) | async function getEmailProviderRateLimitState({ function recordRateLimitFromApiError (line 55) | async function recordRateLimitFromApiError({ type RateLimitRecordingContext (line 89) | type RateLimitRecordingContext = { function setEmailProviderRateLimitState (line 101) | async function setEmailProviderRateLimitState({ function assertProviderNotRateLimited (line 178) | async function assertProviderNotRateLimited({ function recordProviderRateLimitFromError (line 209) | async function recordProviderRateLimitFromError({ function withRateLimitRecording (line 243) | async function withRateLimitRecording( function getProviderRateLimitDelayMs (line 285) | function getProviderRateLimitDelayMs({ function getGoogleRateLimitDelayMs (line 301) | function getGoogleRateLimitDelayMs(error: unknown, attemptNumber: number) { function getMicrosoftRateLimitDelayMs (line 319) | function getMicrosoftRateLimitDelayMs(error: unknown, attemptNumber: num... function calculateProviderRateLimitDelay (line 337) | function calculateProviderRateLimitDelay({ FILE: apps/web/utils/email/render-safe-links.ts type RenderSafeLinksOptions (line 4) | type RenderSafeLinksOptions = { type ExplicitLinkTarget (line 8) | type ExplicitLinkTarget = constant HTML_ANCHOR_REGEX (line 13) | const HTML_ANCHOR_REGEX = constant HTML_TAG_REGEX (line 15) | const HTML_TAG_REGEX = /<[^>]+>/g; constant URL_REGEX (line 16) | const URL_REGEX = /\bhttps?:\/\/[^\s<>()]+/gi; constant SCHEMELESS_URL_REGEX (line 17) | const SCHEMELESS_URL_REGEX = constant EMAIL_REGEX (line 19) | const EMAIL_REGEX = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi; constant DOMAIN_REGEX (line 20) | const DOMAIN_REGEX = constant TRAILING_PUNCTUATION_REGEX (line 22) | const TRAILING_PUNCTUATION_REGEX = /[),.;:!?]+$/g; constant WHITESPACE_REGEX (line 23) | const WHITESPACE_REGEX = /\s+/g; constant WWW_PREFIX_REGEX (line 24) | const WWW_PREFIX_REGEX = /^www\./i; constant CRLF_REGEX (line 25) | const CRLF_REGEX = /\r\n/g; constant URL_SCHEME_PREFIX_REGEX (line 26) | const URL_SCHEME_PREFIX_REGEX = /^[A-Z][A-Z\d+.-]*:\/\//i; constant URL_SUFFIX_PREFIX_REGEX (line 27) | const URL_SUFFIX_PREFIX_REGEX = /[/?#]/; constant EXPLICIT_PORT_SUFFIX_REGEX (line 28) | const EXPLICIT_PORT_SUFFIX_REGEX = /:\d+$/; function renderEmailTextWithSafeLinks (line 30) | function renderEmailTextWithSafeLinks( function findLinkMatches (line 68) | function findLinkMatches(text: string) { function findHtmlAnchorMatches (line 80) | function findHtmlAnchorMatches(text: string) { function findMarkdownLinkMatches (line 106) | function findMarkdownLinkMatches(text: string) { function formatLinkLabel (line 134) | function formatLinkLabel(label: string, url: string) { function getDisclosureDestinationLabel (line 151) | function getDisclosureDestinationLabel( function getVisibleLinkText (line 162) | function getVisibleLinkText(url: string) { function getLinkDestinationLabel (line 171) | function getLinkDestinationLabel(url: string) { function getSafeEmailLinkUrl (line 180) | function getSafeEmailLinkUrl(url: string) { function stripHtmlTags (line 197) | function stripHtmlTags(value: string) { function extractExplicitLinkTargets (line 201) | function extractExplicitLinkTargets(value: string) { function doesTargetMatchUrl (line 244) | function doesTargetMatchUrl(target: ExplicitLinkTarget, url: string) { function doesUrlTargetMatch (line 259) | function doesUrlTargetMatch(targetUrl: string, destination: URL) { function doesUrlOriginMatch (line 295) | function doesUrlOriginMatch( function doesUrlLabelSpecifyPathOrQuery (line 308) | function doesUrlLabelSpecifyPathOrQuery(rawTargetUrl: string, url: URL) { function doesUrlLabelSpecifyFragment (line 314) | function doesUrlLabelSpecifyFragment(rawTargetUrl: string) { function getRawTargetSuffix (line 318) | function getRawTargetSuffix(rawTargetUrl: string) { function parseExplicitUrlTarget (line 326) | function parseExplicitUrlTarget(targetUrl: string) { function hasRawTargetPort (line 345) | function hasRawTargetPort(rawTargetUrl: string) { function getRawTargetAuthority (line 349) | function getRawTargetAuthority(rawTargetUrl: string) { function getComparablePort (line 357) | function getComparablePort(url: URL) { function normalizeComparablePath (line 364) | function normalizeComparablePath(pathname: string) { function normalizeHostname (line 368) | function normalizeHostname(value: string) { function trimTrailingPunctuation (line 372) | function trimTrailingPunctuation(value: string) { function findNextMarkdownLinkMatch (line 376) | function findNextMarkdownLinkMatch(text: string, startIndex: number) { function findMarkdownLinkUrlEnd (line 401) | function findMarkdownLinkUrlEnd(text: string, startIndex: number) { function decodeHtmlEntities (line 430) | function decodeHtmlEntities(value: string) { function normalizeWhitespace (line 434) | function normalizeWhitespace(value: string) { function escapeTextSegment (line 438) | function escapeTextSegment(value: string) { FILE: apps/web/utils/email/reply-all.ts type ReplyAllRecipients (line 4) | interface ReplyAllRecipients { function buildReplyAllRecipients (line 18) | function buildReplyAllRecipients( function formatCcList (line 59) | function formatCcList(ccList: string[]): string | undefined { function mergeAndDedupeRecipients (line 67) | function mergeAndDedupeRecipients( function addHeaderRecipientsToCcSet (line 94) | function addHeaderRecipientsToCcSet({ FILE: apps/web/utils/email/signature-extraction.ts function extractSignatureFromHtml (line 9) | function extractSignatureFromHtml(htmlContent: string): string | null { FILE: apps/web/utils/email/subject.ts function formatReplySubject (line 6) | function formatReplySubject(subject: string): string { FILE: apps/web/utils/email/threading.ts function buildThreadingHeaders (line 6) | function buildThreadingHeaders(options: { FILE: apps/web/utils/email/types.ts type EmailThread (line 8) | interface EmailThread { type EmailLabel (line 15) | interface EmailLabel { type EmailFilter (line 28) | interface EmailFilter { type EmailSignature (line 39) | interface EmailSignature { type EmailProvider (line 46) | interface EmailProvider { FILE: apps/web/utils/email/watch-manager.ts type WatchEmailAccountResult (line 12) | type WatchEmailAccountResult = function ensureEmailAccountsWatched (line 25) | async function ensureEmailAccountsWatched({ function getEmailAccountsToWatch (line 36) | async function getEmailAccountsToWatch(userIds: string[] | null) { function watchEmailAccounts (line 77) | async function watchEmailAccounts( function watchEmailAccount (line 128) | async function watchEmailAccount( function watchEmails (line 214) | async function watchEmails({ function unwatchEmails (line 274) | async function unwatchEmails({ FILE: apps/web/utils/encryption.ts constant ALGORITHM (line 13) | const ALGORITHM = "aes-256-gcm"; constant IV_LENGTH (line 14) | const IV_LENGTH = 16; constant AUTH_TAG_LENGTH (line 15) | const AUTH_TAG_LENGTH = 16; constant KEY_LENGTH (line 16) | const KEY_LENGTH = 32; function encryptToken (line 29) | function encryptToken(text: string | null): string | null { function decryptToken (line 57) | function decryptToken(encryptedText: string | null): string | null { FILE: apps/web/utils/error-messages/index.ts type ErrorMessageEntry (line 10) | type ErrorMessageEntry = { type ErrorMessages (line 16) | type ErrorMessages = Record; function getUserErrorMessages (line 18) | async function getUserErrorMessages( function addUserErrorMessage (line 28) | async function addUserErrorMessage( function clearUserErrorMessages (line 56) | async function clearUserErrorMessages({ function clearSpecificErrorMessages (line 74) | async function clearSpecificErrorMessages({ function addUserErrorMessageWithNotification (line 177) | async function addUserErrorMessageWithNotification({ FILE: apps/web/utils/error.server.ts function logErrorToPosthog (line 6) | async function logErrorToPosthog( FILE: apps/web/utils/error.test.ts function createAPICallError (line 70) | function createAPICallError({ FILE: apps/web/utils/error.ts type ErrorMessage (line 14) | type ErrorMessage = { error: string; data?: any }; type ZodError (line 15) | type ZodError = { type ApiErrorType (line 18) | type ApiErrorType = { constant RATE_LIMIT_MESSAGE_TEMPLATE (line 24) | const RATE_LIMIT_MESSAGE_TEMPLATE = function isError (line 27) | function isError(value: any): value is ErrorMessage | ZodError { function isGmailError (line 31) | function isGmailError( type CaptureExceptionContext (line 42) | type CaptureExceptionContext = { function captureException (line 55) | function captureException( type ActionError (line 87) | type ActionError> = { type ServerActionResponse (line 90) | type ServerActionResponse< class SafeError (line 96) | class SafeError extends Error { method constructor (line 100) | constructor(safeMessage?: string, statusCode?: number) { function isGmailInsufficientPermissionsError (line 108) | function isGmailInsufficientPermissionsError(error: unknown): boolean { function isGmailRateLimitExceededError (line 112) | function isGmailRateLimitExceededError(error: unknown): boolean { function isGmailQuotaExceededError (line 116) | function isGmailQuotaExceededError(error: unknown): boolean { function isIncorrectAPIKeyError (line 120) | function isIncorrectAPIKeyError(error: APICallError): boolean { function isInvalidOpenAIModelError (line 130) | function isInvalidOpenAIModelError(error: APICallError): boolean { function isInvalidAIModelError (line 136) | function isInvalidAIModelError(error: APICallError): boolean { function isAPIKeyDeactivatedError (line 165) | function isAPIKeyDeactivatedError(error: APICallError): boolean { function isAnthropicInsufficientBalanceError (line 172) | function isAnthropicInsufficientBalanceError( function isInsufficientCreditsError (line 180) | function isInsufficientCreditsError(error: APICallError): boolean { constant HANDLED_USER_KEY_ERROR (line 184) | const HANDLED_USER_KEY_ERROR = "__handledUserKeyError"; function markAsHandledUserKeyError (line 186) | function markAsHandledUserKeyError(error: unknown): void { function isHandledUserKeyError (line 191) | function isHandledUserKeyError(error: unknown): boolean { function isAiQuotaExceededError (line 196) | function isAiQuotaExceededError(error: RetryError): boolean { function isOutlookThrottlingError (line 209) | function isOutlookThrottlingError(error: unknown): boolean { function isOutlookAccessDeniedError (line 224) | function isOutlookAccessDeniedError(error: unknown): boolean { function isOutlookItemNotFoundError (line 236) | function isOutlookItemNotFoundError(error: unknown): boolean { function isKnownOutlookError (line 250) | function isKnownOutlookError(error: unknown): boolean { function isAICallError (line 258) | function isAICallError(error: unknown): error is APICallError { function isKnownApiError (line 263) | function isKnownApiError(error: unknown): boolean { function checkCommonErrors (line 280) | function checkCommonErrors( function getErrorMessage (line 371) | function getErrorMessage(error: unknown): string | undefined { function getUserFacingErrorMessage (line 387) | function getUserFacingErrorMessage( function asRecord (line 400) | function asRecord(value: unknown): Record | null { function getStringProp (line 406) | function getStringProp( function parseJsonRecord (line 414) | function parseJsonRecord(message: string): Record | null { type FlattenedErrors (line 424) | type FlattenedErrors = FlattenedValidationErrors>; type SafeActionError (line 426) | type SafeActionError = { type ActionErrorMessageOptions (line 432) | type ActionErrorMessageOptions = { function getActionErrorMessage (line 452) | function getActionErrorMessage( function extractActionErrorMessage (line 475) | function extractActionErrorMessage(error: SafeActionError): string | null { function getValidationMessages (line 493) | function getValidationMessages( function isKnownAIErrorMessage (line 506) | function isKnownAIErrorMessage(message: string): boolean { FILE: apps/web/utils/fb.ts function hash (line 54) | function hash(value: string): string { FILE: apps/web/utils/filebot/is-filebot-email.ts constant FILEBOT_SUFFIX (line 11) | const FILEBOT_SUFFIX = `ai${env.NODE_ENV === "development" ? "-test" : "... constant FILEBOT_DISPLAY_NAME (line 12) | const FILEBOT_DISPLAY_NAME = "Inbox Zero Assistant"; function isFilebotEmail (line 19) | function isFilebotEmail({ function getFilebotEmail (line 50) | function getFilebotEmail({ userEmail }: { userEmail: string }): string { function getFilebotReplyTo (line 58) | function getFilebotReplyTo({ function getFilebotFrom (line 69) | function getFilebotFrom({ userEmail }: { userEmail: string }): string { function isFilebotNotificationMessage (line 78) | function isFilebotNotificationMessage({ function buildFilebotPattern (line 116) | function buildFilebotPattern(localPart: string, domain: string): RegExp { function escapeRegex (line 132) | function escapeRegex(str: string): string { FILE: apps/web/utils/filter-ignored-senders.ts function isIgnoredSender (line 4) | function isIgnoredSender(sender: string) { FILE: apps/web/utils/follow-up/cleanup.ts constant STALE_DRAFT_DAYS (line 7) | const STALE_DRAFT_DAYS = 7; function cleanupStaleDrafts (line 9) | async function cleanupStaleDrafts({ FILE: apps/web/utils/follow-up/generate-draft.ts function generateFollowUpDraft (line 22) | async function generateFollowUpDraft({ function isMessageFromUser (line 186) | function isMessageFromUser( FILE: apps/web/utils/follow-up/labels.ts function getOrCreateFollowUpLabel (line 8) | async function getOrCreateFollowUpLabel( function applyFollowUpLabel (line 28) | async function applyFollowUpLabel({ function removeFollowUpLabel (line 54) | async function removeFollowUpLabel({ function hasFollowUpLabel (line 90) | async function hasFollowUpLabel({ function clearFollowUpLabel (line 114) | async function clearFollowUpLabel({ FILE: apps/web/utils/get-email-from-message.ts function getEmailForLLM (line 6) | function getEmailForLLM( FILE: apps/web/utils/gmail/attachment.ts function getGmailAttachment (line 4) | async function getGmailAttachment( FILE: apps/web/utils/gmail/batch.ts constant BATCH_LIMIT (line 6) | const BATCH_LIMIT = 100; function getBatch (line 10) | async function getBatch( function parseBatchResponse (line 46) | function parseBatchResponse(batchResponse: string, contentType: string |... function checkBatchResponseForError (line 86) | function checkBatchResponseForError(batchResponse: string) { FILE: apps/web/utils/gmail/client.ts type AuthOptions (line 9) | type AuthOptions = { function getLinkingOAuth2Client (line 38) | function getLinkingOAuth2Client() { FILE: apps/web/utils/gmail/constants.ts type MessageVisibility (line 5) | type MessageVisibility = type LabelVisibility (line 13) | type LabelVisibility = constant GOOGLE_LINKING_STATE_COOKIE_NAME (line 16) | const GOOGLE_LINKING_STATE_COOKIE_NAME = "google_linking_state"; FILE: apps/web/utils/gmail/contact.ts function searchContacts (line 3) | async function searchContacts(client: people_v1.People, query: string) { FILE: apps/web/utils/gmail/decode.ts function decodeSnippet (line 3) | function decodeSnippet(snippet?: string | null) { FILE: apps/web/utils/gmail/draft.ts function getDraft (line 11) | async function getDraft(draftId: string, gmail: gmail_v1.Gmail) { function isNotFoundError (line 63) | function isNotFoundError(error: unknown): boolean { function isValidGmailDraftId (line 87) | function isValidGmailDraftId(draftId: string): boolean { function sendDraft (line 91) | async function sendDraft( function deleteDraft (line 118) | async function deleteDraft(gmail: gmail_v1.Gmail, draftId: string) { FILE: apps/web/utils/gmail/filter.ts function createFilter (line 7) | async function createFilter(options: { function createAutoArchiveFilter (line 67) | async function createAutoArchiveFilter({ function deleteFilter (line 92) | async function deleteFilter(options: { function getFiltersList (line 103) | async function getFiltersList(options: { gmail: gmail_v1.Gmail }) { function isFilterExistsError (line 109) | function isFilterExistsError(error: unknown): boolean { FILE: apps/web/utils/gmail/history.ts function getHistory (line 5) | async function getHistory( FILE: apps/web/utils/gmail/label-validation.ts constant GMAIL_RESERVED_LABELS (line 22) | const GMAIL_RESERVED_LABELS = [ constant GMAIL_LABEL_INVALID_CHARS (line 57) | const GMAIL_LABEL_INVALID_CHARS = [ constant GMAIL_LABEL_MAX_LENGTH (line 67) | const GMAIL_LABEL_MAX_LENGTH = 225; type LabelValidationResult (line 72) | type LabelValidationResult = { function validateLabelNameBasic (line 83) | function validateLabelNameBasic(name: string): LabelValidationResult { function validateGmailLabelName (line 139) | function validateGmailLabelName(name: string): LabelValidationResult { FILE: apps/web/utils/gmail/label.test.ts function gmailClient (line 101) | function gmailClient({ function labelsResponse (line 118) | function labelsResponse(labels: gmail_v1.Schema$Label[]) { FILE: apps/web/utils/gmail/label.ts function labelThread (line 38) | async function labelThread(options: { function removeThreadLabel (line 102) | async function removeThreadLabel( function archiveThread (line 114) | async function archiveThread({ function labelMessage (line 170) | async function labelMessage({ function markReadThread (line 190) | async function markReadThread(options: { function createLabel (line 212) | async function createLabel({ function ensureParentLabelsExist (line 283) | async function ensureParentLabelsExist(gmail: gmail_v1.Gmail, name: stri... function getLabels (line 298) | async function getLabels( function getLabel (line 310) | async function getLabel(options: { function getLabelById (line 324) | async function getLabelById(options: { function getOrCreateLabel (line 334) | async function getOrCreateLabel({ function getOrCreateInboxZeroLabel (line 348) | async function getOrCreateInboxZeroLabel({ function normalizeLabelForConflictLookup (line 383) | function normalizeLabelForConflictLookup(name: string) { function normalizeSlashPath (line 389) | function normalizeSlashPath(name: string) { function stripInvisibleCharacters (line 398) | function stripInvisibleCharacters(name: string) { FILE: apps/web/utils/gmail/mail.ts type SendEmailBody (line 52) | type SendEmailBody = z.infer; type MailSendEmailBody (line 53) | type MailSendEmailBody = WithMailerAttachments; function sendEmailWithHtml (line 115) | async function sendEmailWithHtml( function sendEmailWithPlainText (line 149) | async function sendEmailWithPlainText( function replyToEmail (line 157) | async function replyToEmail( function forwardEmail (line 207) | async function forwardEmail( function draftEmail (line 271) | async function draftEmail( function createDraft (line 325) | async function createDraft( function convertTextToHtmlParagraphs (line 352) | function convertTextToHtmlParagraphs(text?: string | null): string { function buildReplyMessageText (line 368) | function buildReplyMessageText({ function renderReplyBodyAsPlainText (line 386) | function renderReplyBodyAsPlainText(textContent?: string) { FILE: apps/web/utils/gmail/message.ts function parseMessage (line 22) | function parseMessage( function parseMessages (line 36) | function parseMessages( function getMessage (line 69) | async function getMessage( function getMessageByRfc822Id (line 85) | async function getMessageByRfc822Id( function getMessagesBatch (line 112) | async function getMessagesBatch({ function findPreviousEmailsWithSender (line 195) | async function findPreviousEmailsWithSender( function hasPreviousCommunicationWithSender (line 213) | async function hasPreviousCommunicationWithSender( function hasPreviousCommunicationsWithSenderOrDomain (line 229) | async function hasPreviousCommunicationsWithSenderOrDomain( function getMessages (line 245) | async function getMessages( function isMessage (line 276) | function isMessage( function queryBatchMessages (line 282) | async function queryBatchMessages( function queryBatchMessagesPages (line 317) | async function queryBatchMessagesPages( function getSentMessages (line 342) | async function getSentMessages(gmail: gmail_v1.Gmail, maxResults = 20) { FILE: apps/web/utils/gmail/permissions.ts function checkGmailPermissions (line 12) | async function checkGmailPermissions({ function handleGmailPermissionsCheck (line 75) | async function handleGmailPermissionsCheck({ FILE: apps/web/utils/gmail/reply.ts function detectTextDirection (line 59) | function detectTextDirection(text: string): "ltr" | "rtl" { function formatEmailDate (line 66) | function formatEmailDate(date: Date): string { FILE: apps/web/utils/gmail/retry.ts constant MAX_GMAIL_BLOCKING_RETRY_DELAY_MS (line 8) | const MAX_GMAIL_BLOCKING_RETRY_DELAY_MS = 10_000; type RetryLogContext (line 10) | interface RetryLogContext { type ErrorInfo (line 14) | interface ErrorInfo { function withGmailRetry (line 27) | async function withGmailRetry( function extractErrorInfo (line 111) | function extractErrorInfo(error: unknown): ErrorInfo { function isRetryableError (line 150) | function isRetryableError(errorInfo: ErrorInfo): { function calculateRetryDelay (line 198) | function calculateRetryDelay( function parseRetryTime (line 258) | function parseRetryTime(errorMessage: string): Date | null { function trimErrorMessage (line 274) | function trimErrorMessage(errorMessage: string): string | undefined { function buildRetryLogFields (line 281) | function buildRetryLogFields(errorInfo: ErrorInfo) { function getRetryAfterHeader (line 292) | function getRetryAfterHeader(error: unknown): string | undefined { function getFirstErrorValue (line 296) | function getFirstErrorValue( function getRetryAttemptError (line 307) | function getRetryAttemptError(attempt: unknown): unknown { function getRetryAttemptNumber (line 315) | function getRetryAttemptNumber(attempt: unknown): number { function toErrorInstance (line 324) | function toErrorInstance(error: unknown, fallbackMessage: string): Error { function getAbortOriginalError (line 340) | function getAbortOriginalError(error: unknown): unknown | undefined { function toRecord (line 347) | function toRecord(value: unknown): Record { FILE: apps/web/utils/gmail/scopes.ts constant SCOPES (line 3) | const SCOPES = [ constant CALENDAR_SCOPES (line 14) | const CALENDAR_SCOPES = [ FILE: apps/web/utils/gmail/settings.ts function getFilters (line 4) | async function getFilters(gmail: gmail_v1.Gmail) { function getForwardingAddresses (line 11) | async function getForwardingAddresses(gmail: gmail_v1.Gmail) { FILE: apps/web/utils/gmail/signature-settings.ts type GmailSignature (line 7) | interface GmailSignature { function getGmailSignatures (line 18) | async function getGmailSignatures( FILE: apps/web/utils/gmail/snippet.ts function snippetRemoveReply (line 2) | function snippetRemoveReply(snippet?: string | null): string { FILE: apps/web/utils/gmail/spam.ts function markSpam (line 5) | async function markSpam(options: { FILE: apps/web/utils/gmail/thread.ts function getThread (line 13) | async function getThread( type MinimalThread (line 24) | interface MinimalThread { function getThreads (line 30) | async function getThreads( function getThreadsWithNextPageToken (line 57) | async function getThreadsWithNextPageToken({ function getThreadsBatch (line 91) | async function getThreadsBatch( function getThreadsFromSender (line 104) | async function getThreadsFromSender( function getThreadsFromSenderWithSubject (line 129) | async function getThreadsFromSenderWithSubject( function getThreadMessages (line 160) | async function getThreadMessages( FILE: apps/web/utils/gmail/trash.ts function trashThread (line 12) | async function trashThread(options: { function trashMessage (line 71) | async function trashMessage(options: { FILE: apps/web/utils/gmail/watch.ts function watchGmail (line 6) | async function watchGmail(gmail: gmail_v1.Gmail) { function unwatchGmail (line 21) | async function unwatchGmail(gmail: gmail_v1.Gmail) { FILE: apps/web/utils/group/find-matching-group.ts type GroupsWithRules (line 7) | type GroupsWithRules = Awaited>; function getGroupsWithRules (line 9) | async function getGroupsWithRules({ function findMatchingGroup (line 25) | function findMatchingGroup( function matchesPattern (line 44) | function matchesPattern>( function findExclusionMatch (line 74) | function findExclusionMatch< function findInclusionMatch (line 82) | function findInclusionMatch< function findMatchingGroupItem (line 91) | function findMatchingGroupItem< FILE: apps/web/utils/group/group-item.ts function addGroupItem (line 6) | async function addGroupItem(data: { function deleteGroupItem (line 23) | async function deleteGroupItem({ FILE: apps/web/utils/hash.ts function hash (line 10) | function hash( FILE: apps/web/utils/index.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { function filterNullProperties (line 11) | function filterNullProperties>( FILE: apps/web/utils/internal-api.ts constant INTERNAL_API_KEY_HEADER (line 4) | const INTERNAL_API_KEY_HEADER = "x-api-key"; function getInternalApiUrl (line 6) | function getInternalApiUrl(): string { FILE: apps/web/utils/label.server.ts function labelMessageAndSync (line 13) | async function labelMessageAndSync({ FILE: apps/web/utils/label.ts constant PARENT_LABEL (line 5) | const PARENT_LABEL = "Inbox Zero"; constant LABEL_COLORS (line 19) | const LABEL_COLORS = [ type InboxZeroLabel (line 65) | type InboxZeroLabel = keyof typeof inboxZeroLabels; constant FOLLOW_UP_LABEL (line 67) | const FOLLOW_UP_LABEL = "Follow-up"; function getLabelColor (line 69) | function getLabelColor(name: string) { function getRandomLabelColor (line 98) | function getRandomLabelColor() { FILE: apps/web/utils/label/find-label-by-name.ts function findLabelByName (line 1) | function findLabelByName({ FILE: apps/web/utils/label/normalize-label-name.ts function normalizeLabelName (line 1) | function normalizeLabelName(name: string) { FILE: apps/web/utils/label/resolve-label.ts function resolveLabelNameAndId (line 15) | async function resolveLabelNameAndId({ FILE: apps/web/utils/llms/config.ts constant DEFAULT_PROVIDER (line 1) | const DEFAULT_PROVIDER = "DEFAULT"; FILE: apps/web/utils/llms/index.ts constant MAX_LOG_LENGTH (line 60) | const MAX_LOG_LENGTH = 200; constant NO_USER_AI_FIELDS (line 61) | const NO_USER_AI_FIELDS: UserAIFields = { type LLMProviderOptions (line 67) | type LLMProviderOptions = Record>; function createGenerateText (line 75) | function createGenerateText({ function createGenerateObject (line 209) | function createGenerateObject({ function chatCompletionStream (line 359) | async function chatCompletionStream({ function toolCallAgentStream (line 497) | async function toolCallAgentStream({ function handleError (line 674) | async function handleError( function getCostControlledModelOptions (line 770) | async function getCostControlledModelOptions({ function resolveModelCandidates (line 850) | async function resolveModelCandidates({ function getModelCandidates (line 877) | function getModelCandidates(modelOptions: SelectModel): ResolvedModel[] { function shouldFallbackToNextModel (line 888) | function shouldFallbackToNextModel(error: unknown): boolean { function mergeProviderOptions (line 899) | function mergeProviderOptions( function buildProviderOptions (line 918) | function buildProviderOptions({ function withOpenRouterMetadata (line 956) | function withOpenRouterMetadata({ function normalizeOpenRouterReasoningOptions (line 1023) | function normalizeOpenRouterReasoningOptions({ function isOpenRouterXaiGrokModel (line 1062) | function isOpenRouterXaiGrokModel(modelName?: string) { function isJsonObject (line 1066) | function isJsonObject( function withPosthogTracing (line 1072) | function withPosthogTracing({ FILE: apps/web/utils/llms/model-id.ts constant OPENROUTER_PROVIDER_PREFIX_BY_PROVIDER (line 1) | const OPENROUTER_PROVIDER_PREFIX_BY_PROVIDER: Record = { function stripOnlineModelSuffix (line 11) | function stripOnlineModelSuffix(model: string): string { function getOpenRouterProviderPrefix (line 15) | function getOpenRouterProviderPrefix(provider: string): string | null { FILE: apps/web/utils/llms/model-usage-guard.ts function shouldForceNanoModel (line 7) | async function shouldForceNanoModel(options: { FILE: apps/web/utils/llms/model.ts constant DEFAULT_GOOGLE_THINKING_BUDGET (line 20) | const DEFAULT_GOOGLE_THINKING_BUDGET = 128; type ModelType (line 24) | type ModelType = "default" | "economy" | "chat" | "nano" | "draft"; type ResolvedModel (line 26) | type ResolvedModel = { type SelectModel (line 33) | type SelectModel = ResolvedModel & { type AiGatewayProviderOptions (line 38) | type AiGatewayProviderOptions = { function getModel (line 46) | function getModel( function selectModelByType (line 72) | function selectModelByType( function selectModel (line 93) | function selectModel( function createOpenRouterProviderOptions (line 298) | function createOpenRouterProviderOptions( function selectEconomyModel (line 327) | function selectEconomyModel( function selectChatModel (line 369) | function selectChatModel(userAi: UserAIFields, online = false): Resolved... function selectNanoModel (line 405) | function selectNanoModel(userAi: UserAIFields, online = false): Resolved... function selectDraftModel (line 431) | function selectDraftModel(userAi: UserAIFields, online = false): Resolve... function selectDefaultModel (line 457) | function selectDefaultModel( function getProviderApiKey (line 512) | function getProviderApiKey(provider: string) { function resolveApiKey (line 541) | function resolveApiKey( function getVertexConfig (line 548) | function getVertexConfig(): { function normalizePrivateKey (line 585) | function normalizePrivateKey(value: string | undefined): string | undefi... function getFallbackModels (line 589) | function getFallbackModels({ function getFallbackConfig (line 667) | function getFallbackConfig(modelType: ModelType): string | undefined { function getConfiguredFallbacksByType (line 671) | function getConfiguredFallbacksByType( function getOpenRouterProviderOptionsByType (line 686) | function getOpenRouterProviderOptionsByType( function shouldIncludeOpenRouterReasoning (line 703) | function shouldIncludeOpenRouterReasoning(modelName?: string | null): bo... function isXaiGrokModel (line 707) | function isXaiGrokModel(modelName?: string | null): boolean { function getGoogleProviderOptions (line 711) | function getGoogleProviderOptions( function getGoogleThinkingConfig (line 720) | function getGoogleThinkingConfig( function getGoogleThinkingBudget (line 733) | function getGoogleThinkingBudget(): number | undefined { function isGemini3Model (line 739) | function isGemini3Model(modelName: string): boolean { function getAiGatewayProviderOptions (line 743) | function getAiGatewayProviderOptions( function normalizeGoogleModelName (line 772) | function normalizeGoogleModelName(modelName: string): string { function parseFallbackConfig (line 776) | function parseFallbackConfig( function isSupportedProvider (line 800) | function isSupportedProvider(provider: string): boolean { FILE: apps/web/utils/llms/pricing.generated.ts type ModelPricing (line 5) | type ModelPricing = { constant OPENROUTER_MODEL_PRICING (line 11) | const OPENROUTER_MODEL_PRICING: Record = { FILE: apps/web/utils/llms/retry.test.ts function createError (line 10) | function createError( FILE: apps/web/utils/llms/retry.ts constant MAX_RETRIES (line 9) | const MAX_RETRIES = 2; function withRetry (line 14) | async function withRetry( function isTransientNetworkError (line 56) | function isTransientNetworkError(error: unknown): boolean { function withNetworkRetry (line 96) | async function withNetworkRetry( type LLMErrorInfo (line 137) | interface LLMErrorInfo { function extractLLMErrorInfo (line 148) | function extractLLMErrorInfo(error: unknown): LLMErrorInfo { function withLLMRetry (line 219) | async function withLLMRetry( FILE: apps/web/utils/llms/supported-model-pricing.ts type ModelPricing (line 2) | type ModelPricing = { constant STATIC_MODEL_PRICING (line 38) | const STATIC_MODEL_PRICING: Record = { constant OPENROUTER_MODEL_ID_BY_SUPPORTED_MODEL (line 141) | const OPENROUTER_MODEL_ID_BY_SUPPORTED_MODEL: Partial< FILE: apps/web/utils/llms/types.ts type UserAIFields (line 3) | type UserAIFields = Prisma.UserGetPayload<{ type EmailAccountWithAI (line 10) | type EmailAccountWithAI = Prisma.EmailAccountGetPayload<{ FILE: apps/web/utils/llms/unsupported-tools.ts constant GROK_TOOL_REPLACEMENTS (line 4) | const GROK_TOOL_REPLACEMENTS: Record = { constant INTERNAL_TOOL_NAMES (line 8) | const INTERNAL_TOOL_NAMES = new Set(Object.values(GROK_TOOL_REPLACEMENTS)); function filterUnsupportedToolsForModel (line 10) | function filterUnsupportedToolsForModel({ function isXaiGrokModel (line 67) | function isXaiGrokModel(modelName: string): boolean { FILE: apps/web/utils/log-error-with-dedupe.ts type DedupeValue (line 7) | type DedupeValue = string | number | boolean | null | undefined; type DedupeLogInput (line 9) | type DedupeLogInput = { constant DEFAULT_TTL_SECONDS (line 20) | const DEFAULT_TTL_SECONDS = 5 * 60; constant DEFAULT_SUMMARY_INTERVAL_SECONDS (line 21) | const DEFAULT_SUMMARY_INTERVAL_SECONDS = 60; constant KEY_PREFIX (line 22) | const KEY_PREFIX = "log-dedupe:v1"; function logErrorWithDedupe (line 24) | async function logErrorWithDedupe({ type DedupeDecision (line 74) | type DedupeDecision = function getDedupeDecision (line 79) | async function getDedupeDecision({ function createDedupeKey (line 125) | function createDedupeKey({ function getErrorFingerprint (line 149) | function getErrorFingerprint(error: unknown) { function isRedisDedupeEnabled (line 170) | function isRedisDedupeEnabled() { function asRecord (line 176) | function asRecord(value: unknown): Record | null { function getString (line 181) | function getString( FILE: apps/web/utils/logger-client.ts function createClientLogger (line 10) | function createClientLogger(scope: string) { FILE: apps/web/utils/logger-flush.ts type LoggerFlushExtra (line 4) | type LoggerFlushExtra = Record; function flushLoggerSafely (line 6) | async function flushLoggerSafely( function runWithBackgroundLoggerFlush (line 22) | async function runWithBackgroundLoggerFlush({ FILE: apps/web/utils/logger.test.ts method AXIOM_TOKEN (line 12) | get AXIOM_TOKEN() { method AXIOM_TOKEN (line 18) | set AXIOM_TOKEN(value: string | undefined) { method setThrowOnAxiomTokenAccess (line 21) | setThrowOnAxiomTokenAccess(value: boolean) { FILE: apps/web/utils/logger.ts type Logger (line 6) | type Logger = ReturnType; type LogLevel (line 8) | type LogLevel = "info" | "error" | "warn" | "trace"; function createScopedLogger (line 18) | function createScopedLogger(scope: string) { function createAxiomLogger (line 85) | function createAxiomLogger(scope: string) { function createNullLogger (line 115) | function createNullLogger() { function formatError (line 126) | function formatError(args?: Record) { function processErrorsInObject (line 141) | function processErrorsInObject(obj: unknown): unknown { function getSimpleErrorMessage (line 161) | function getSimpleErrorMessage(error: unknown): string | undefined { function hasMessageField (line 188) | function hasMessageField(value: unknown): value is { message?: unknown } { function hasNestedErrorField (line 192) | function hasNestedErrorField(value: unknown): value is { error: unknown } { constant SENSITIVE_FIELD_NAMES (line 197) | const SENSITIVE_FIELD_NAMES = new Set(["from", "sender", "to", "replyTo"]); constant REDACTED_FIELD_NAMES (line 200) | const REDACTED_FIELD_NAMES = new Set([ constant CONTENT_FIELD_NAMES (line 215) | const CONTENT_FIELD_NAMES = new Set(["text", "body", "content"]); function hashSensitiveFields (line 225) | function hashSensitiveFields(obj: T, depth = 0): T { function isPlainObject (line 280) | function isPlainObject(obj: unknown): obj is Record { FILE: apps/web/utils/mail.ts function parseReply (line 9) | function parseReply(plainText: string) { function htmlToText (line 17) | function htmlToText(html: string, removeLinks = true, removeImages = tru... function getEmailClient (line 33) | function getEmailClient(messageId: string) { function removeForwardedContent (line 43) | function removeForwardedContent(text: string): string { type EmailToContentOptions (line 68) | type EmailToContentOptions = { function emailToContent (line 74) | function emailToContent( function convertEmailHtmlToText (line 105) | function convertEmailHtmlToText({ function ensureEmailSendingEnabled (line 132) | function ensureEmailSendingEnabled(): void { FILE: apps/web/utils/mcp/integrations.ts type McpIntegrationConfig (line 1) | type McpIntegrationConfig = { constant MCP_INTEGRATIONS (line 12) | const MCP_INTEGRATIONS: Record< type IntegrationKey (line 138) | type IntegrationKey = keyof typeof MCP_INTEGRATIONS; function getIntegration (line 140) | function getIntegration( function getStaticCredentials (line 150) | function getStaticCredentials( FILE: apps/web/utils/mcp/list-tools.ts function listMcpTools (line 9) | async function listMcpTools( FILE: apps/web/utils/mcp/oauth.ts constant DEFAULT_TOKEN_EXPIRY_MS (line 24) | const DEFAULT_TOKEN_EXPIRY_MS = 60 * 60 * 1000; function generateOAuthUrl (line 30) | async function generateOAuthUrl({ function handleOAuthCallback (line 81) | async function handleOAuthCallback({ function getAuthToken (line 163) | async function getAuthToken({ function getValidAccessToken (line 201) | async function getValidAccessToken({ function refreshOAuthTokens (line 248) | async function refreshOAuthTokens({ function discoverMetadata (line 318) | async function discoverMetadata( function getOAuthClient (line 439) | async function getOAuthClient( function upsertMcpIntegration (line 525) | async function upsertMcpIntegration( function createAuthServerMetadata (line 542) | function createAuthServerMetadata( function calculateTokenExpiration (line 562) | function calculateTokenExpiration( function getMetadataForIntegration (line 583) | async function getMetadataForIntegration( function getOAuthServerUrl (line 591) | function getOAuthServerUrl( function getResourceParam (line 609) | function getResourceParam( FILE: apps/web/utils/mcp/sync-tools.ts function syncMcpTools (line 7) | async function syncMcpTools( constant READ_ONLY_ACTIONS (line 107) | const READ_ONLY_ACTIONS = [ function isReadOnlyTool (line 126) | function isReadOnlyTool(toolName: string): boolean { FILE: apps/web/utils/mcp/transport.ts function createMcpTransport (line 3) | function createMcpTransport( FILE: apps/web/utils/meeting-briefs/fetch-upcoming-events.test.ts function createProvider (line 85) | function createProvider(events: CalendarEvent[]): CalendarEventProvider { function createEvent (line 92) | function createEvent(overrides: Partial): CalendarEvent { FILE: apps/web/utils/meeting-briefs/fetch-upcoming-events.ts constant MAX_EVENTS_PER_PROVIDER (line 7) | const MAX_EVENTS_PER_PROVIDER = 20; function fetchUpcomingEvents (line 9) | async function fetchUpcomingEvents({ function filterEventsWithExternalGuests (line 58) | function filterEventsWithExternalGuests( function isCancelledEventTitle (line 79) | function isCancelledEventTitle(title: string): boolean { FILE: apps/web/utils/meeting-briefs/gather-context.ts constant MAX_THREADS (line 13) | const MAX_THREADS = 10; constant MAX_MESSAGES_PER_THREAD (line 14) | const MAX_MESSAGES_PER_THREAD = 10; constant MAX_MEETINGS (line 15) | const MAX_MEETINGS = 10; constant THREADS_PER_PARTICIPANT (line 16) | const THREADS_PER_PARTICIPANT = 3; constant MEETINGS_PER_PARTICIPANT (line 17) | const MEETINGS_PER_PARTICIPANT = 3; type ExternalGuest (line 21) | interface ExternalGuest { type InternalTeamMember (line 26) | interface InternalTeamMember { type MeetingBriefingData (line 31) | interface MeetingBriefingData { function gatherContextForEvent (line 39) | async function gatherContextForEvent({ function fetchEmailThreadsWithParticipants (line 115) | async function fetchEmailThreadsWithParticipants({ function getExternalAttendees (line 163) | function getExternalAttendees( function getInternalTeamMembers (line 184) | function getInternalTeamMembers( function fetchPastMeetingsWithParticipants (line 205) | async function fetchPastMeetingsWithParticipants({ FILE: apps/web/utils/meeting-briefs/process.ts type EmailAccountForBrief (line 15) | type EmailAccountForBrief = { function processMeetingBriefings (line 33) | async function processMeetingBriefings({ function runMeetingBrief (line 138) | async function runMeetingBrief({ function claimMeetingBriefing (line 253) | async function claimMeetingBriefing({ function upsertMeetingBriefingStatus (line 286) | async function upsertMeetingBriefingStatus({ FILE: apps/web/utils/meeting-briefs/recipient-context.ts constant RECENT_MEETING_LOOKBACK_DAYS (line 8) | const RECENT_MEETING_LOOKBACK_DAYS = 14; constant UPCOMING_MEETING_LOOKAHEAD_DAYS (line 9) | const UPCOMING_MEETING_LOOKAHEAD_DAYS = 7; constant MAX_MEETINGS_PER_CATEGORY (line 10) | const MAX_MEETINGS_PER_CATEGORY = 5; constant MAX_DESCRIPTION_LENGTH (line 11) | const MAX_DESCRIPTION_LENGTH = 500; type MeetingContext (line 13) | interface MeetingContext { function allRecipientsAreAttendees (line 24) | function allRecipientsAreAttendees( function getMeetingContext (line 44) | async function getMeetingContext({ function truncateDescription (line 158) | function truncateDescription( function formatMeeting (line 166) | function formatMeeting( function formatMeetingContextForPrompt (line 190) | function formatMeetingContextForPrompt( FILE: apps/web/utils/meeting-briefs/send-briefing.ts function sendBriefing (line 22) | async function sendBriefing({ function sendBriefingViaEmail (line 133) | async function sendBriefingViaEmail({ function sendBriefingViaSlack (line 199) | async function sendBriefingViaSlack({ FILE: apps/web/utils/mention.ts function convertMentionsToLabels (line 6) | function convertMentionsToLabels(promptFile: string): string { function convertLabelsToDisplay (line 14) | function convertLabelsToDisplay(text: string): string { function processMentions (line 21) | function processMentions( FILE: apps/web/utils/messaging/chat-sdk/bot.ts constant MAX_CHAT_CONTEXT_MESSAGES (line 59) | const MAX_CHAT_CONTEXT_MESSAGES = 12; constant CHAT_SDK_STATE_KEY_PREFIX (line 60) | const CHAT_SDK_STATE_KEY_PREFIX = "inbox-zero:chat-sdk"; constant CONNECT_COMMAND_REGEX (line 61) | const CONNECT_COMMAND_REGEX = constant PENDING_EMAIL_CONFIRM_ACTION_ID (line 63) | const PENDING_EMAIL_CONFIRM_ACTION_ID = "acpe"; constant LEGACY_PENDING_EMAIL_CONFIRM_ACTION_ID (line 64) | const LEGACY_PENDING_EMAIL_CONFIRM_ACTION_ID = constant UNSUPPORTED_MESSAGING_ATTACHMENT_MESSAGE (line 66) | const UNSUPPORTED_MESSAGING_ATTACHMENT_MESSAGE = constant SLACK_ASSISTANT_SUGGESTED_PROMPTS (line 69) | const SLACK_ASSISTANT_SUGGESTED_PROMPTS = [ type SupportedPlatform (line 81) | type SupportedPlatform = MessagingPlatform; type MessagingAdapters (line 83) | type MessagingAdapters = { type MessagingChatSdkContext (line 89) | type MessagingChatSdkContext = { type SlackCandidate (line 94) | type SlackCandidate = { type LinkedProviderCandidate (line 102) | type LinkedProviderCandidate = { type ImagePart (line 106) | type ImagePart = { type ResolvedMessagingContext (line 113) | type ResolvedMessagingContext = { type LinkedProviderIdentity (line 124) | type LinkedProviderIdentity = { type TeamsRawActivity (line 132) | type TeamsRawActivity = { type PendingEmailToolPart (line 146) | type PendingEmailToolPart = { type LegacyPendingEmailActionPayload (line 165) | type LegacyPendingEmailActionPayload = { type PendingEmailActionResolution (line 172) | type PendingEmailActionResolution = { type ParsedPendingEmailActionValue (line 178) | type ParsedPendingEmailActionValue = type SlackActionRawPayload (line 182) | type SlackActionRawPayload = { function getMessagingChatSdkBot (line 192) | function getMessagingChatSdkBot(): MessagingChatSdkContext { function withMessagingRequestLogger (line 200) | function withMessagingRequestLogger({ function hasMessagingAdapter (line 210) | function hasMessagingAdapter(platform: SupportedPlatform): boolean { function extractSlackTeamIdFromWebhook (line 215) | function extractSlackTeamIdFromWebhook( function ensureSlackTeamInstallation (line 259) | async function ensureSlackTeamInstallation( function syncSlackInstallation (line 301) | async function syncSlackInstallation({ function createMessagingChatSdkBot (line 334) | function createMessagingChatSdkBot(): MessagingChatSdkContext { function registerMessagingHandlers (line 394) | function registerMessagingHandlers({ function subscribeMessagingThreadSafely (line 471) | async function subscribeMessagingThreadSafely({ function processMessagingAssistantMessage (line 489) | async function processMessagingAssistantMessage({ function handlePendingEmailConfirmAction (line 758) | async function handlePendingEmailConfirmAction({ function postPendingEmailCard (line 923) | async function postPendingEmailCard({ function collectAssistantUiMessage (line 989) | async function collectAssistantUiMessage({ function getUiMessageText (line 1011) | function getUiMessageText(message: UIMessage): string { function getPendingEmailToolPart (line 1022) | function getPendingEmailToolPart( function getPendingEmailToolParts (line 1028) | function getPendingEmailToolParts(parts: unknown[]): PendingEmailToolPar... function pendingActionTypeFromToolPartType (line 1050) | function pendingActionTypeFromToolPartType( function buildPendingEmailSummary (line 1063) | function buildPendingEmailSummary({ function buildPendingEmailSuccessFeedback (line 1107) | function buildPendingEmailSuccessFeedback({ function getSlackTeamIdFromActionRaw (line 1137) | function getSlackTeamIdFromActionRaw(raw: unknown): string | null { function postPendingEmailActionFeedback (line 1144) | async function postPendingEmailActionFeedback({ function getSupportedPlatform (line 1182) | function getSupportedPlatform(adapterName: string): SupportedPlatform | ... function getMessagingChatIdForThread (line 1189) | function getMessagingChatIdForThread({ function parsePendingEmailActionValue (line 1206) | function parsePendingEmailActionValue( function decodeLegacyPendingEmailActionPayload (line 1221) | function decodeLegacyPendingEmailActionPayload( function getTeamIdFromActionEvent (line 1252) | function getTeamIdFromActionEvent({ function createPendingEmailActionToken (line 1287) | function createPendingEmailActionToken({ function resolvePendingEmailActionFromToken (line 1302) | async function resolvePendingEmailActionFromToken({ function startSlackProcessingReaction (line 1347) | async function startSlackProcessingReaction({ function handleMessagingLinkCommand (line 1403) | async function handleMessagingLinkCommand({ function extractConnectCode (line 1490) | function extractConnectCode(text: string): string | null { constant SWITCH_COMMAND_REGEX (line 1497) | const SWITCH_COMMAND_REGEX = /^\/switch(?:@[A-Za-z0-9_]+)?(?:\s+(\d+))?\... function handleSwitchCommand (line 1499) | async function handleSwitchCommand({ function handleHelpCommand (line 1612) | async function handleHelpCommand({ function resolveMessagingContext (line 1641) | async function resolveMessagingContext({ function resolveSlackMessagingContext (line 1681) | async function resolveSlackMessagingContext({ function resolveLinkedProviderMessagingContext (line 1763) | async function resolveLinkedProviderMessagingContext({ function resolveTeamsIdentity (line 1855) | function resolveTeamsIdentity({ function resolveTelegramIdentity (line 1888) | function resolveTelegramIdentity({ function getTelegramMessageText (line 1914) | function getTelegramMessageText(message: Message): string { constant SUPPORTED_IMAGE_MIME_TYPES (line 1922) | const SUPPORTED_IMAGE_MIME_TYPES = new Set([ function isImageAttachment (line 1929) | function isImageAttachment(attachment: Attachment): boolean { function hasUnsupportedMessagingAttachment (line 1936) | function hasUnsupportedMessagingAttachment({ function extractImagePartsFromMessage (line 1967) | async function extractImagePartsFromMessage({ function getTelegramChatName (line 2023) | function getTelegramChatName(rawMessage: TelegramRawMessage): string | n... function resolveLinkedProviderCandidate (line 2035) | async function resolveLinkedProviderCandidate({ function resolveSlackMessagingChannel (line 2058) | async function resolveSlackMessagingChannel({ function selectCandidateFromExistingChat (line 2102) | async function selectCandidateFromExistingChat< function sendUnauthorizedMessage (line 2139) | async function sendUnauthorizedMessage({ function sendLinkRequiredMessage (line 2160) | async function sendLinkRequiredMessage({ function sendDmRequiredMessage (line 2180) | async function sendDmRequiredMessage({ function sendUnlinkedChannelMessage (line 2200) | async function sendUnlinkedChannelMessage({ function postMessagingThreadMessage (line 2216) | async function postMessagingThreadMessage({ function createChatStateAdapter (line 2239) | function createChatStateAdapter() { function getSlackChatId (line 2254) | function getSlackChatId({ function normalizeThreadIdForStorage (line 2264) | function normalizeThreadIdForStorage(threadId: string): string { function stripLeadingSlackMention (line 2268) | function stripLeadingSlackMention(text: string): string { function normalizeMessagingAssistantText (line 2275) | function normalizeMessagingAssistantText({ text }: { text: string }) { function buildPendingEmailCardFallbackText (line 2290) | function buildPendingEmailCardFallbackText(normalizedText: string) { function getMessagingAssistantPostPayload (line 2305) | function getMessagingAssistantPostPayload({ function toMessagingProvider (line 2323) | function toMessagingProvider(provider: SupportedPlatform) { function prependAccountIndicator (line 2329) | function prependAccountIndicator({ FILE: apps/web/utils/messaging/chat-sdk/link-code-consume.ts function consumeMessagingLinkCode (line 7) | async function consumeMessagingLinkCode({ FILE: apps/web/utils/messaging/chat-sdk/link-code.ts constant MESSAGING_LINK_CODE_MAX_AGE_MS (line 7) | const MESSAGING_LINK_CODE_MAX_AGE_MS = 10 * 60 * 1000; constant LINKABLE_MESSAGING_PROVIDERS (line 9) | const LINKABLE_MESSAGING_PROVIDERS = ["TEAMS", "TELEGRAM"] as const; type LinkableMessagingProvider (line 19) | type LinkableMessagingProvider = function generateMessagingLinkCode (line 22) | function generateMessagingLinkCode({ function parseMessagingLinkCode (line 36) | function parseMessagingLinkCode({ FILE: apps/web/utils/messaging/chat-sdk/webhook-route.ts type RouteConfig (line 10) | type RouteConfig = { function handleMessagingWebhookRoute (line 19) | async function handleMessagingWebhookRoute({ FILE: apps/web/utils/messaging/pending-email-preview.ts constant PENDING_EMAIL_PREVIEW_MAX_CHARS (line 4) | const PENDING_EMAIL_PREVIEW_MAX_CHARS = 600; type PendingEmailPreviewPart (line 6) | type PendingEmailPreviewPart = { function buildPendingEmailPreview (line 16) | function buildPendingEmailPreview( function getPendingEmailPreviewContent (line 28) | function getPendingEmailPreviewContent(part: PendingEmailPreviewPart) { FILE: apps/web/utils/messaging/platforms.ts type MessagingPlatform (line 1) | type MessagingPlatform = "slack" | "teams" | "telegram"; type MessagingProvider (line 2) | type MessagingProvider = "SLACK" | "TEAMS" | "TELEGRAM"; constant PROVIDER_NAMES (line 4) | const PROVIDER_NAMES: Record = { function getMessagingProviderName (line 10) | function getMessagingProviderName( FILE: apps/web/utils/messaging/prompt-commands.ts constant SLASH_COMMAND_REGEX (line 3) | const SLASH_COMMAND_REGEX = /^\/([a-z0-9_]+)(?:@[A-Za-z0-9_]+)?(?:\s+.*)... constant HELP_COMMAND_REGEX (line 4) | const HELP_COMMAND_REGEX = /^\/help(?:@[A-Za-z0-9_]+)?\s*$/i; constant PROMPT_COMMANDS (line 6) | const PROMPT_COMMANDS: Record = { constant COMMAND_LINES (line 13) | const COMMAND_LINES = [ constant PLATFORM_INTRO (line 23) | const PLATFORM_INTRO: Record = { function expandPromptCommand (line 29) | function expandPromptCommand(text: string): string { function isHelpCommand (line 36) | function isHelpCommand(text: string): boolean { function getHelpText (line 40) | function getHelpText(platform: MessagingPlatform): string { function parseSlashCommand (line 46) | function parseSlashCommand(text: string): string | null { FILE: apps/web/utils/messaging/providers/slack/channels.ts type SlackChannel (line 3) | type SlackChannel = { function getChannelInfo (line 9) | async function getChannelInfo( constant MAX_PAGES (line 24) | const MAX_PAGES = 10; function listChannels (line 26) | async function listChannels(client: WebClient): Promise { FILE: apps/web/utils/messaging/providers/slack/client.ts function createSlackClient (line 3) | function createSlackClient(accessToken: string): WebClient { FILE: apps/web/utils/messaging/providers/slack/constants.ts constant SLACK_STATE_COOKIE_NAME (line 1) | const SLACK_STATE_COOKIE_NAME = "slack_oauth_state"; constant SLACK_OAUTH_STATE_TYPE (line 2) | const SLACK_OAUTH_STATE_TYPE = "slack"; constant SLACK_SCOPES (line 4) | const SLACK_SCOPES = [ FILE: apps/web/utils/messaging/providers/slack/format.ts function markdownToSlackMrkdwn (line 10) | function markdownToSlackMrkdwn(text: string): string { FILE: apps/web/utils/messaging/providers/slack/handle-slack-callback.ts type SlackOAuthResponse (line 43) | type SlackOAuthResponse = z.infer; function handleSlackCallback (line 45) | async function handleSlackCallback( function validateOAuthCallback (line 203) | function validateOAuthCallback( function parseAndValidateSlackState (line 261) | function parseAndValidateSlackState( function extractEmailAccountIdFromState (line 291) | function extractEmailAccountIdFromState(state: string): string | null { function buildSettingsRedirectUrl (line 300) | function buildSettingsRedirectUrl(emailAccountId: string): URL { function exchangeCodeForTokens (line 308) | async function exchangeCodeForTokens( function upsertMessagingChannel (line 356) | async function upsertMessagingChannel(params: { function getRedirectReason (line 392) | function getRedirectReason(redirectUrl: URL): string { function mapSlackCallbackErrorReason (line 399) | function mapSlackCallbackErrorReason(error: unknown): string { function sanitizeReason (line 413) | function sanitizeReason(reason: string): string { function applyRedirectParams (line 420) | function applyRedirectParams(url: URL, params: Record) { function flushLogger (line 426) | async function flushLogger(logger: Logger): Promise { FILE: apps/web/utils/messaging/providers/slack/messages/document-filing.ts type DocumentFiledBlocksParams (line 3) | type DocumentFiledBlocksParams = { type DocumentAskBlocksParams (line 9) | type DocumentAskBlocksParams = { function buildDocumentFiledBlocks (line 14) | function buildDocumentFiledBlocks({ function buildDocumentAskBlocks (line 49) | function buildDocumentAskBlocks({ FILE: apps/web/utils/messaging/providers/slack/messages/meeting-briefing.ts type GuestBriefing (line 3) | type GuestBriefing = { type InternalTeamMember (line 9) | type InternalTeamMember = { type BriefingContent (line 14) | type BriefingContent = { type MeetingBriefingBlocksParams (line 19) | type MeetingBriefingBlocksParams = { function buildMeetingBriefingBlocks (line 27) | function buildMeetingBriefingBlocks({ FILE: apps/web/utils/messaging/providers/slack/reactions.ts type Logger (line 3) | type Logger = { warn: (msg: string, meta?: Record) => v... function addReaction (line 5) | async function addReaction( function removeReaction (line 19) | async function removeReaction( FILE: apps/web/utils/messaging/providers/slack/send-onboarding-direct-message.ts function sendSlackOnboardingDirectMessageWithLogging (line 4) | async function sendSlackOnboardingDirectMessageWithLogging({ FILE: apps/web/utils/messaging/providers/slack/send.ts type SlackBriefingParams (line 15) | type SlackBriefingParams = MeetingBriefingBlocksParams & { function sendMeetingBriefingToSlack (line 20) | async function sendMeetingBriefingToSlack({ function sendChannelConfirmation (line 45) | async function sendChannelConfirmation({ function sendConnectionOnboardingDirectMessage (line 59) | async function sendConnectionOnboardingDirectMessage({ type SlackDocumentFiledParams (line 74) | type SlackDocumentFiledParams = DocumentFiledBlocksParams & { function sendDocumentFiledToSlack (line 79) | async function sendDocumentFiledToSlack({ type SlackDocumentAskParams (line 99) | type SlackDocumentAskParams = DocumentAskBlocksParams & { function sendDocumentAskToSlack (line 104) | async function sendDocumentAskToSlack({ constant SLACK_DM_CHANNEL_SENTINEL (line 123) | const SLACK_DM_CHANNEL_SENTINEL = "DM"; function isSlackDmChannel (line 125) | function isSlackDmChannel(channelId: string | null): boolean { function resolveSlackDestination (line 129) | async function resolveSlackDestination({ type Blocks (line 151) | type Blocks = (KnownBlock | Block)[]; function postMessageWithJoin (line 153) | async function postMessageWithJoin( function isSlackError (line 186) | function isSlackError( FILE: apps/web/utils/messaging/providers/slack/slash-commands.ts constant MAX_CHAT_CONTEXT_MESSAGES (line 17) | const MAX_CHAT_CONTEXT_MESSAGES = 12; function processSlackSlashCommand (line 19) | async function processSlackSlashCommand({ function runSlackSlashCommandAi (line 108) | async function runSlackSlashCommandAi({ function postToSlackResponseUrl (line 227) | async function postToSlackResponseUrl( FILE: apps/web/utils/messaging/providers/slack/users.ts function lookupSlackUserByEmail (line 3) | async function lookupSlackUserByEmail( FILE: apps/web/utils/messaging/providers/slack/verify-signature.ts constant MAX_SLACK_REQUEST_AGE_SECONDS (line 3) | const MAX_SLACK_REQUEST_AGE_SECONDS = 60 * 5; type SlackWebhookValidationResult (line 5) | type SlackWebhookValidationResult = function validateSlackWebhookRequest (line 9) | function validateSlackWebhookRequest({ FILE: apps/web/utils/messaging/providers/telegram/api.ts type TelegramBotApiResponse (line 1) | type TelegramBotApiResponse = { function callTelegramBotApi (line 7) | async function callTelegramBotApi({ FILE: apps/web/utils/messaging/providers/telegram/bot-config.ts type TelegramBotCommand (line 3) | type TelegramBotCommand = { type TelegramUser (line 8) | type TelegramUser = { type TelegramUserProfilePhotos (line 12) | type TelegramUserProfilePhotos = { constant TELEGRAM_BOT_COMMANDS (line 16) | const TELEGRAM_BOT_COMMANDS: TelegramBotCommand[] = [ function configureTelegramBotMetadata (line 47) | async function configureTelegramBotMetadata({ function setTelegramBotCommands (line 64) | async function setTelegramBotCommands({ botToken }: { botToken: string }) { function setTelegramProfilePhotoIfMissing (line 76) | async function setTelegramProfilePhotoIfMissing({ function hasTelegramProfilePhoto (line 115) | async function hasTelegramProfilePhoto({ FILE: apps/web/utils/messaging/providers/telegram/format.ts function markdownToTelegramText (line 1) | function markdownToTelegramText(text: string): string { function normalizeTelegramLine (line 14) | function normalizeTelegramLine(line: string): string { FILE: apps/web/utils/middleware.test.ts type RequestWithAuthAndEmail (line 347) | type RequestWithAuthAndEmail = RequestWithAuth & { FILE: apps/web/utils/middleware.ts constant SLOW_MIDDLEWARE_STEP_MS (line 27) | const SLOW_MIDDLEWARE_STEP_MS = 2000; constant SLOW_MIDDLEWARE_TOTAL_MS (line 28) | const SLOW_MIDDLEWARE_TOTAL_MS = 4000; type NextHandler (line 30) | type NextHandler = ( type RequestWithLogger (line 35) | interface RequestWithLogger extends NextRequest { type RequestWithAuth (line 40) | interface RequestWithAuth extends RequestWithLogger { type RequestWithEmailAccount (line 44) | interface RequestWithEmailAccount extends RequestWithLogger { type RequestWithEmailProvider (line 51) | interface RequestWithEmailProvider extends RequestWithEmailAccount { type MiddlewareOptions (line 55) | interface MiddlewareOptions { function withMiddleware (line 64) | function withMiddleware( function authMiddleware (line 224) | async function authMiddleware( function emailAccountMiddleware (line 244) | async function emailAccountMiddleware( function emailProviderMiddleware (line 375) | async function emailProviderMiddleware( function adminMiddleware (line 457) | async function adminMiddleware( function withError (line 490) | function withError( function withAuth (line 516) | function withAuth( function withAdmin (line 526) | function withAdmin( function withEmailAccount (line 543) | function withEmailAccount( function withEmailProvider (line 573) | function withEmailProvider( function isErrorWithConfigAndHeaders (line 593) | function isErrorWithConfigAndHeaders( function getLogger (line 604) | function getLogger(req: NextRequest): Logger { function getEmailAccountId (line 609) | function getEmailAccountId(req: NextRequest): string | undefined { function flushLogger (line 614) | function flushLogger(req: NextRequest) { function runTimedMiddlewareStep (line 624) | async function runTimedMiddlewareStep({ function logSlowMiddlewareTotal (line 655) | function logSlowMiddlewareTotal({ FILE: apps/web/utils/network/safe-http-url.ts constant BLOCKED_HOSTNAMES (line 9) | const BLOCKED_HOSTNAMES = new Set([ type ResolvedAddress (line 16) | type ResolvedAddress = { type ResolvedSafeExternalHttpUrl (line 21) | type ResolvedSafeExternalHttpUrl = { function isSafeExternalHttpUrl (line 34) | function isSafeExternalHttpUrl(url: string) { function resolveSafeExternalHttpUrl (line 57) | async function resolveSafeExternalHttpUrl( function isPrivateIpv4 (line 85) | function isPrivateIpv4(hostname: string) { function isPrivateIpv6 (line 105) | function isPrivateIpv6(hostname: string) { function stripIpv6Brackets (line 122) | function stripIpv6Brackets(hostname: string) { function normalizeHostname (line 130) | function normalizeHostname(hostname: string) { function isBlockedHostname (line 134) | function isBlockedHostname(hostname: string) { function getMappedIpv4Address (line 142) | function getMappedIpv4Address(ipv6Address: string) { function resolvePublicAddresses (line 162) | async function resolvePublicAddresses( function isResolvedAddressPrivate (line 188) | function isResolvedAddressPrivate(address: string) { function createPinnedLookup (line 195) | function createPinnedLookup(addresses: ResolvedAddress[]) { FILE: apps/web/utils/oauth/account-linking.ts type AccountLinkingParams (line 7) | interface AccountLinkingParams { function handleAccountLinking (line 17) | async function handleAccountLinking({ FILE: apps/web/utils/oauth/callback-validation.ts type ValidateCallbackParams (line 6) | interface ValidateCallbackParams { type ValidationResult (line 14) | type ValidationResult = function validateOAuthCallback (line 25) | function validateOAuthCallback({ FILE: apps/web/utils/oauth/error-handler.ts type ErrorHandlerParams (line 8) | interface ErrorHandlerParams { function handleOAuthCallbackError (line 16) | function handleOAuthCallbackError({ FILE: apps/web/utils/oauth/microsoft-oauth.ts function extractAadstsCode (line 1) | function extractAadstsCode(errorMessage: string | null | undefined) { function parseMicrosoftScopes (line 8) | function parseMicrosoftScopes(scope: string | null | undefined) { function getMissingMicrosoftScopes (line 17) | function getMissingMicrosoftScopes( function classifyMicrosoftOAuthError (line 25) | function classifyMicrosoftOAuthError( function classifyMicrosoftOAuthCallbackError (line 66) | function classifyMicrosoftOAuthCallbackError(params: { function getSafeMicrosoftOAuthErrorDescription (line 98) | function getSafeMicrosoftOAuthErrorDescription( FILE: apps/web/utils/oauth/provider-config.ts function isConfiguredValue (line 3) | function isConfiguredValue(value: string | undefined) { function hasGoogleOauthConfig (line 14) | function hasGoogleOauthConfig() { function hasMicrosoftOauthConfig (line 21) | function hasMicrosoftOauthConfig() { function isConfiguredOauthValue (line 28) | function isConfiguredOauthValue(value: string | undefined) { FILE: apps/web/utils/oauth/redirect.ts class RedirectError (line 7) | class RedirectError extends Error { method constructor (line 11) | constructor(redirectUrl: URL, responseHeaders: Headers) { function redirectWithMessage (line 22) | function redirectWithMessage( function redirectWithError (line 34) | function redirectWithError( FILE: apps/web/utils/oauth/state.ts constant OAUTH_STATE_DEFAULT_MAX_AGE_MS (line 5) | const OAUTH_STATE_DEFAULT_MAX_AGE_MS = 10 * 60 * 1000; function generateOAuthState (line 12) | function generateOAuthState>( function parseOAuthState (line 27) | function parseOAuthState>( function generateSignedOAuthState (line 33) | function generateSignedOAuthState>( function parseSignedOAuthState (line 48) | function parseSignedOAuthState>( function signOAuthStatePayload (line 115) | function signOAuthStatePayload(payloadEncoded: string): string { function getOAuthStateSigningSecret (line 122) | function getOAuthStateSigningSecret(): string { FILE: apps/web/utils/oauth/verify.ts function verifyEmailAccountAccess (line 10) | async function verifyEmailAccountAccess( FILE: apps/web/utils/organizations/access.ts function getMemberEmailAccount (line 8) | async function getMemberEmailAccount( function getCallerEmailAccount (line 34) | async function getCallerEmailAccount( function fetchAndCheckIsAdmin (line 60) | async function fetchAndCheckIsAdmin({ function fetchAndCheckIsMember (line 78) | async function fetchAndCheckIsMember({ function getAuthorizedOrganizationAdminMembership (line 100) | async function getAuthorizedOrganizationAdminMembership({ FILE: apps/web/utils/organizations/invitations.ts function sendOrganizationInvitation (line 5) | async function sendOrganizationInvitation({ FILE: apps/web/utils/organizations/roles.ts constant ADMIN_ROLES (line 1) | const ADMIN_ROLES = ["admin", "owner"]; function hasOrganizationAdminRole (line 3) | function hasOrganizationAdminRole(role: string): boolean { function isOrganizationAdmin (line 7) | function isOrganizationAdmin( FILE: apps/web/utils/outlook/attachment.ts function getOutlookAttachment (line 4) | async function getOutlookAttachment( FILE: apps/web/utils/outlook/batch.ts constant GRAPH_JSON_BATCH_LIMIT (line 10) | const GRAPH_JSON_BATCH_LIMIT = 20; type GraphBatchRequestItem (line 12) | type GraphBatchRequestItem = { type GraphBatchResponseItem (line 20) | type GraphBatchResponseItem = { type GraphBatchResponse (line 27) | type GraphBatchResponse = { function batch (line 31) | async function batch({ function moveMessagesInBatches (line 105) | async function moveMessagesInBatches({ function moveMessagesForSenders (line 168) | async function moveMessagesForSenders({ FILE: apps/web/utils/outlook/calendar-client.ts class CalendarAuthProvider (line 11) | class CalendarAuthProvider implements AuthenticationProvider { method constructor (line 14) | constructor(accessToken: string) { method getAccessToken (line 18) | async getAccessToken(): Promise { function getCalendarOAuth2Url (line 23) | function getCalendarOAuth2Url(state: string): string { function fetchMicrosoftCalendars (line 136) | async function fetchMicrosoftCalendars( function saveCalendarTokens (line 160) | async function saveCalendarTokens({ FILE: apps/web/utils/outlook/client.ts constant TOKEN_REFRESH_BUFFER_MS (line 11) | const TOKEN_REFRESH_BUFFER_MS = 10 * 60 * 1000; class OutlookClient (line 14) | class OutlookClient { method constructor (line 21) | constructor(accessToken: string, logger: Logger) { method getClient (line 39) | getClient(): Client { method getAccessToken (line 43) | getAccessToken(): string { method getFolderIdCache (line 47) | getFolderIdCache(): Record | null { method setFolderIdCache (line 51) | setFolderIdCache(cache: Record): void { method getCategoryMapCache (line 55) | getCategoryMapCache(): Map | null { method setCategoryMapCache (line 59) | setCategoryMapCache(cache: Map): void { method invalidateCategoryMapCache (line 63) | invalidateCategoryMapCache(): void { method getUserProfile (line 68) | async getUserProfile(): Promise { method getUserPhoto (line 75) | async getUserPhoto(): Promise { function getLinkingOAuth2Url (line 249) | function getLinkingOAuth2Url() { FILE: apps/web/utils/outlook/constants.ts constant OUTLOOK_LINKING_STATE_COOKIE_NAME (line 1) | const OUTLOOK_LINKING_STATE_COOKIE_NAME = "outlook_linking_state"; FILE: apps/web/utils/outlook/draft.ts function getDraft (line 12) | async function getDraft({ function sendDraft (line 57) | async function sendDraft({ function deleteDraft (line 99) | async function deleteDraft({ FILE: apps/web/utils/outlook/errors.ts function isAlreadyExistsError (line 7) | function isAlreadyExistsError(error: unknown): boolean { function isNotFoundError (line 22) | function isNotFoundError(error: unknown): boolean { FILE: apps/web/utils/outlook/filter.ts function createFilter (line 12) | async function createFilter(options: { function createAutoArchiveFilter (line 56) | async function createAutoArchiveFilter({ function deleteFilter (line 99) | async function deleteFilter({ function getFiltersList (line 125) | async function getFiltersList({ function createCategoryFilter (line 151) | async function createCategoryFilter({ function updateFilter (line 184) | async function updateFilter({ function resolveCategoryNames (line 240) | async function resolveCategoryNames( function buildFilterActions (line 270) | async function buildFilterActions(options: { FILE: apps/web/utils/outlook/folders.test.ts function createMockClient (line 19) | function createMockClient( FILE: apps/web/utils/outlook/folders.ts constant FOLDER_SEPARATOR (line 8) | const FOLDER_SEPARATOR = " ⦙ "; type OutlookFolder (line 10) | type OutlookFolder = { function convertMailFolderToOutlookFolder (line 17) | function convertMailFolderToOutlookFolder(folder: MailFolder): OutlookFo... function getOutlookRootFolders (line 27) | async function getOutlookRootFolders( function getOutlookChildFolders (line 49) | async function getOutlookChildFolders( function findOutlookFolderByName (line 72) | async function findOutlookFolderByName( function expandFolderChildren (line 100) | async function expandFolderChildren( function getOutlookFolderTree (line 145) | async function getOutlookFolderTree( function getOrCreateOutlookFolderIdByName (line 168) | async function getOrCreateOutlookFolderIdByName( FILE: apps/web/utils/outlook/label-validation.ts constant OUTLOOK_CATEGORY_MAX_LENGTH (line 3) | const OUTLOOK_CATEGORY_MAX_LENGTH = 255; function sanitizeOutlookCategoryName (line 5) | function sanitizeOutlookCategoryName(name: string): string { function normalizeOutlookCategoryName (line 20) | function normalizeOutlookCategoryName(name: string): string { FILE: apps/web/utils/outlook/label.test.ts function createMockOutlookClient (line 95) | function createMockOutlookClient(api: ReturnType) { FILE: apps/web/utils/outlook/label.ts constant OUTLOOK_COLORS (line 33) | const OUTLOOK_COLORS: Array = [ constant OUTLOOK_COLOR_MAP (line 47) | const OUTLOOK_COLOR_MAP = { function getLabels (line 60) | async function getLabels(client: OutlookClient) { function getLabelById (line 71) | async function getLabelById(options: { function createLabel (line 83) | async function createLabel({ function getLabel (line 136) | async function getLabel(options: { function getOrCreateLabel (line 153) | async function getOrCreateLabel({ function getOrCreateLabels (line 175) | async function getOrCreateLabels({ function labelMessage (line 238) | async function labelMessage({ function labelThread (line 258) | async function labelThread({ function removeThreadLabel (line 286) | async function removeThreadLabel({ function archiveThread (line 345) | async function archiveThread({ function markReadThread (line 510) | async function markReadThread({ function markImportantMessage (line 577) | async function markImportantMessage({ function getOrCreateInboxZeroLabel (line 601) | async function getOrCreateInboxZeroLabel({ function assertNoNormalizedInputCollisions (line 622) | function assertNoNormalizedInputCollisions( FILE: apps/web/utils/outlook/mail.test.ts function createMockOutlookClient (line 527) | function createMockOutlookClient( function getContentRangeHeader (line 546) | function getContentRangeHeader(init?: RequestInit) { function parseContentRange (line 551) | function parseContentRange(contentRange: string) { function createUploadChunkProgressResponse (line 562) | function createUploadChunkProgressResponse(init?: RequestInit) { FILE: apps/web/utils/outlook/mail.ts type GraphRecipient (line 20) | type GraphRecipient = { type MailSendEmailBody (line 23) | type MailSendEmailBody = WithMailerAttachments; constant MAX_GRAPH_ATTACHMENT_SIZE_BYTES (line 25) | const MAX_GRAPH_ATTACHMENT_SIZE_BYTES = 3 * 1024 * 1024; constant MAX_GRAPH_UPLOAD_SESSION_SIZE_BYTES (line 26) | const MAX_GRAPH_UPLOAD_SESSION_SIZE_BYTES = 150 * 1024 * 1024; constant GRAPH_UPLOAD_CHUNK_SIZE_BYTES (line 27) | const GRAPH_UPLOAD_CHUNK_SIZE_BYTES = 320 * 1024; type OutlookMessageRequest (line 29) | interface OutlookMessageRequest { type SentEmailResult (line 41) | type SentEmailResult = Pick; function sendEmailWithHtml (line 43) | async function sendEmailWithHtml( function sendEmailWithPlainText (line 104) | async function sendEmailWithPlainText( function replyToEmail (line 113) | async function replyToEmail( function forwardEmail (line 194) | async function forwardEmail( function draftEmail (line 262) | async function draftEmail( function convertTextToHtmlParagraphs (line 390) | function convertTextToHtmlParagraphs(text?: string | null): string { function sendReplyUsingCreateReply (line 407) | async function sendReplyUsingCreateReply( function buildGraphRecipients (line 474) | function buildGraphRecipients( function addAttachmentsToDraft (line 508) | async function addAttachmentsToDraft({ function getAttachmentContent (line 553) | function getAttachmentContent( function assertGraphAttachmentSizeSupported (line 561) | function assertGraphAttachmentSizeSupported({ function decodeAttachmentString (line 577) | function decodeAttachmentString(content: string): { function looksLikeBase64 (line 592) | function looksLikeBase64(value: string) { function isCanonicalBase64Match (line 596) | function isCanonicalBase64Match(value: string, decoded: Buffer) { function uploadAttachmentViaSession (line 602) | async function uploadAttachmentViaSession({ function uploadAttachmentChunk (line 654) | async function uploadAttachmentChunk({ type UploadSessionStatus (line 719) | interface UploadSessionStatus { function getUploadSessionStatus (line 723) | async function getUploadSessionStatus( function getNextExpectedRangeStart (line 742) | function getNextExpectedRangeStart(nextExpectedRanges?: string[]) { function throwOutlookResponseError (line 753) | async function throwOutlookResponseError( FILE: apps/web/utils/outlook/message.ts constant MESSAGE_SELECT_FIELDS (line 16) | const MESSAGE_SELECT_FIELDS = constant MESSAGE_EXPAND_ATTACHMENTS (line 20) | const MESSAGE_EXPAND_ATTACHMENTS = constant WELL_KNOWN_FOLDERS (line 24) | const WELL_KNOWN_FOLDERS = { function getFolderIds (line 33) | async function getFolderIds( function getCategoryMap (line 90) | async function getCategoryMap( function getOutlookLabels (line 119) | function getOutlookLabels( constant OUTLOOK_SEARCH_DISALLOWED_CHARS (line 173) | const OUTLOOK_SEARCH_DISALLOWED_CHARS = /[?]/g; constant KQL_FIELD_PATTERN (line 177) | const KQL_FIELD_PATTERN = /^(\w+):.+$/; constant URL_SCHEME_PATTERN (line 178) | const URL_SCHEME_PATTERN = /^(https?|ftp|mailto|file):/i; function sanitizeKqlValue (line 184) | function sanitizeKqlValue(value: string): string { function sanitizeKqlFieldQuery (line 200) | function sanitizeKqlFieldQuery(query: string): string { function sanitizeKqlTextQuery (line 231) | function sanitizeKqlTextQuery(query: string): string { function sanitizeOutlookSearchQuery (line 243) | function sanitizeOutlookSearchQuery(query: string): { function queryBatchMessages (line 270) | async function queryBatchMessages( function queryMessagesWithFilters (line 436) | async function queryMessagesWithFilters( function convertMessages (line 535) | async function convertMessages( function queryMessagesWithAttachments (line 545) | async function queryMessagesWithAttachments( function getMessage (line 610) | async function getMessage( function getMessages (line 628) | async function getMessages( function createMessagesRequest (line 669) | function createMessagesRequest(client: OutlookClient) { function createMessageRequest (line 680) | function createMessageRequest(client: OutlookClient, messageId: string) { function formatRecipientsList (line 692) | function formatRecipientsList( function convertMessage (line 715) | function convertMessage( function convertAttachments (line 775) | function convertAttachments( function logWellKnownFolderFetchError (line 796) | function logWellKnownFolderFetchError( FILE: apps/web/utils/outlook/odata-escape.ts function escapeODataString (line 13) | function escapeODataString(value: string): string { FILE: apps/web/utils/outlook/reply.ts function detectTextDirection (line 63) | function detectTextDirection(text: string): "ltr" | "rtl" { function formatEmailDate (line 70) | function formatEmailDate(date: Date): string { FILE: apps/web/utils/outlook/retry.ts type ErrorInfo (line 7) | interface ErrorInfo { constant MAX_OUTLOOK_BLOCKING_RETRY_DELAY_MS (line 17) | const MAX_OUTLOOK_BLOCKING_RETRY_DELAY_MS = 10_000; function withOutlookRetry (line 24) | async function withOutlookRetry( function extractErrorInfo (line 98) | function extractErrorInfo(error: unknown): ErrorInfo { function isRetryableError (line 129) | function isRetryableError(errorInfo: ErrorInfo): { function calculateRetryDelay (line 177) | function calculateRetryDelay( FILE: apps/web/utils/outlook/scopes.ts constant SCOPES (line 5) | const SCOPES = [ constant CALENDAR_SCOPES (line 16) | const CALENDAR_SCOPES = [ FILE: apps/web/utils/outlook/spam.ts function markSpam (line 6) | async function markSpam( FILE: apps/web/utils/outlook/subscription-history.ts type SubscriptionHistoryEntry (line 3) | type SubscriptionHistoryEntry = { type SubscriptionHistory (line 9) | type SubscriptionHistory = SubscriptionHistoryEntry[]; function parseSubscriptionHistory (line 14) | function parseSubscriptionHistory( function createHistoryEntry (line 53) | function createHistoryEntry( function cleanupOldHistoryEntries (line 68) | function cleanupOldHistoryEntries( function isSubscriptionInHistory (line 79) | function isSubscriptionInHistory( function addToHistory (line 90) | function addToHistory( function addCurrentSubscriptionToHistory (line 105) | function addCurrentSubscriptionToHistory( FILE: apps/web/utils/outlook/subscription-manager.ts class OutlookSubscriptionManager (line 16) | class OutlookSubscriptionManager { method constructor (line 21) | constructor(client: EmailProvider, emailAccountId: string, logger: Log... method createSubscription (line 27) | async createSubscription(): Promise<{ method ensureSubscription (line 89) | async ensureSubscription(): Promise { method cancelExistingSubscription (line 125) | private async cancelExistingSubscription() { method getExistingSubscription (line 159) | private async getExistingSubscription() { method updateSubscriptionInDatabase (line 180) | async updateSubscriptionInDatabase(subscription: { method addSubscriptionToHistoryIfMissing (line 261) | private async addSubscriptionToHistoryIfMissing( function createManagedOutlookSubscription (line 287) | async function createManagedOutlookSubscription({ FILE: apps/web/utils/outlook/thread-helpers.test.ts function mockClient (line 75) | function mockClient(messages: { id: string; conversationId: string }[]) { FILE: apps/web/utils/outlook/thread-helpers.ts function processThreadMessagesFallback (line 8) | async function processThreadMessagesFallback({ FILE: apps/web/utils/outlook/thread.ts function getThread (line 14) | async function getThread( function getThreads (line 52) | async function getThreads( function getThreadsWithNextPageToken (line 96) | async function getThreadsWithNextPageToken({ function getThreadsFromSender (line 141) | async function getThreadsFromSender( function getThreadsFromSenderWithSubject (line 173) | async function getThreadsFromSenderWithSubject( function getThreadMessages (line 209) | async function getThreadMessages( FILE: apps/web/utils/outlook/trash.ts function trashThread (line 7) | async function trashThread(options: { FILE: apps/web/utils/outlook/watch.ts function watchOutlook (line 8) | async function watchOutlook(client: Client, logger: Logger) { function unwatchOutlook (line 36) | async function unwatchOutlook( FILE: apps/web/utils/parse/calender-event.ts type CalendarEventInfo (line 3) | interface CalendarEventInfo { type CalendarEventStatus (line 14) | type CalendarEventStatus = { function analyzeCalendarEvent (line 24) | function analyzeCalendarEvent(email: ParsedMessage): CalendarEventInfo { function hasIcsAttachment (line 241) | function hasIcsAttachment(email: ParsedMessage): boolean { function isCalendarEventInPast (line 251) | function isCalendarEventInPast(email: ParsedMessage) { function getCalendarEventStatus (line 261) | function getCalendarEventStatus( function isCalendarInvite (line 281) | function isCalendarInvite(email: ParsedMessage): boolean { function hasCalendarMimeType (line 289) | function hasCalendarMimeType(email: ParsedMessage): boolean { function hasICalendarContent (line 303) | function hasICalendarContent(email: ParsedMessage): boolean { FILE: apps/web/utils/parse/cta.ts function containsCtaKeyword (line 17) | function containsCtaKeyword(text: string) { FILE: apps/web/utils/parse/extract-reply.client.ts function extractEmailReply (line 1) | function extractEmailReply(html: string): { FILE: apps/web/utils/parse/parseHtml.client.ts function findUnsubscribeLink (line 9) | function findUnsubscribeLink(html?: string | null): string | undefined { function findCtaLink (line 53) | function findCtaLink( function htmlToText (line 83) | function htmlToText(html: string): string { function removeReplyFromTextPlain (line 93) | function removeReplyFromTextPlain(text: string) { function isMarketingEmail (line 97) | function isMarketingEmail(html: string) { FILE: apps/web/utils/parse/parseHtml.server.ts function findUnsubscribeLink (line 7) | function findUnsubscribeLink(html?: string | null) { FILE: apps/web/utils/parse/unsubscribe.ts function containsUnsubscribeKeyword (line 9) | function containsUnsubscribeKeyword(text: string) { function containsUnsubscribeUrlPattern (line 20) | function containsUnsubscribeUrlPattern(url: string) { function cleanUnsubscribeLink (line 25) | function cleanUnsubscribeLink(unsubscribeLink?: string | null) { function parseListUnsubscribeHeader (line 35) | function parseListUnsubscribeHeader( function getHttpUnsubscribeLink (line 46) | function getHttpUnsubscribeLink(options: { function getUserFacingUnsubscribeLink (line 53) | function getUserFacingUnsubscribeLink(options: { function getMatchingUnsubscribeLink (line 60) | function getMatchingUnsubscribeLink( function parseStoredUnsubscribeLinks (line 83) | function parseStoredUnsubscribeLinks(unsubscribeLink?: string | null) { function normalizeAllowedUnsubscribeLink (line 98) | function normalizeAllowedUnsubscribeLink( function isSingleUnsubscribeLink (line 111) | function isSingleUnsubscribeLink(link: string) { function hasMultipleBracketedUnsubscribeLinks (line 120) | function hasMultipleBracketedUnsubscribeLinks(link: string) { FILE: apps/web/utils/path.ts function isInternalPath (line 6) | function isInternalPath(path: string | null | undefined): boolean { FILE: apps/web/utils/posthog.ts function getPosthogLlmClient (line 10) | function getPosthogLlmClient() { function isPosthogLlmEvalApproved (line 28) | function isPosthogLlmEvalApproved(email: string) { function getPosthogUserId (line 37) | async function getPosthogUserId(options: { email: string }) { function deletePosthogUser (line 72) | async function deletePosthogUser(options: { email: string }) { function aliasPosthogUser (line 103) | async function aliasPosthogUser({ function posthogCaptureEvent (line 130) | async function posthogCaptureEvent( function trackUserSignedUp (line 155) | async function trackUserSignedUp(email: string, createdAt: Date) { function trackStripeCustomerCreated (line 166) | async function trackStripeCustomerCreated( function trackStripeCheckoutCreated (line 180) | async function trackStripeCheckoutCreated( function trackStripeCheckoutCompleted (line 187) | async function trackStripeCheckoutCompleted( function trackError (line 194) | async function trackError({ function trackTrialStarted (line 212) | async function trackTrialStarted(email: string, attributes: any) { function trackUpgradedToPremium (line 223) | async function trackUpgradedToPremium(email: string, attributes: any) { function trackSubscriptionTrialStarted (line 234) | async function trackSubscriptionTrialStarted( function trackBillingTrialStarted (line 248) | async function trackBillingTrialStarted( function trackSubscriptionCustom (line 262) | async function trackSubscriptionCustom( function trackSubscriptionStatusChanged (line 279) | async function trackSubscriptionStatusChanged( function trackSubscriptionCancelled (line 293) | async function trackSubscriptionCancelled( function trackSwitchedPremiumPlan (line 308) | async function trackSwitchedPremiumPlan( function trackPaymentSuccess (line 323) | async function trackPaymentSuccess({ function trackStripeEvent (line 341) | async function trackStripeEvent(email: string, data: any) { function trackUserDeleted (line 345) | async function trackUserDeleted(userId: string) { function getPosthogLlmEvalApprovedEmails (line 349) | function getPosthogLlmEvalApprovedEmails() { FILE: apps/web/utils/premium/create-premium.ts function createPremiumForUser (line 3) | async function createPremiumForUser({ userId }: { userId: string }) { FILE: apps/web/utils/premium/index.ts function isPremiumStripe (line 5) | function isPremiumStripe(stripeSubscriptionStatus: string | null): boole... function isPremiumLemonSqueezy (line 11) | function isPremiumLemonSqueezy(lemonSqueezyRenewsAt: Date | null): boole... function isOnHigherTier (line 137) | function isOnHigherTier( function getPremiumUserFilter (line 147) | function getPremiumUserFilter() { FILE: apps/web/utils/premium/server.ts function upgradeToPremiumLemon (line 15) | async function upgradeToPremiumLemon(options: { function extendPremiumLemon (line 69) | async function extendPremiumLemon(options: { function cancelPremiumLemon (line 86) | async function cancelPremiumLemon({ function updateAccountSeats (line 113) | async function updateAccountSeats({ userId }: { userId: string }) { function syncPremiumSeats (line 129) | async function syncPremiumSeats(premiumId: string) { function addUserToPremium (line 150) | async function addUserToPremium({ function removeUserFromPremium (line 164) | async function removeUserFromPremium({ function removeFromPendingInvites (line 178) | async function removeFromPendingInvites({ function claimPendingPremiumInvite (line 205) | async function claimPendingPremiumInvite({ function updateAccountSeatsForPremium (line 218) | async function updateAccountSeatsForPremium( function checkHasAccess (line 240) | async function checkHasAccess({ FILE: apps/web/utils/prisma-extensions.ts method compute (line 10) | compute(account) { method compute (line 16) | compute(account) { method compute (line 24) | compute(connection) { method compute (line 30) | compute(connection) { method compute (line 38) | compute(connection) { method compute (line 44) | compute(connection) { method compute (line 50) | compute(connection) { method compute (line 58) | compute(connection) { method compute (line 64) | compute(connection) { method compute (line 72) | compute(connection) { method compute (line 78) | compute(connection) { method create (line 86) | async create({ args, query }) { method update (line 95) | async update({ args, query }) { method updateMany (line 116) | async updateMany({ args, query }) { method upsert (line 137) | async upsert({ args, query }) { method create (line 168) | async create({ args, query }) { method update (line 177) | async update({ args, query }) { method updateMany (line 198) | async updateMany({ args, query }) { method upsert (line 219) | async upsert({ args, query }) { method create (line 248) | async create({ args, query }) { method update (line 260) | async update({ args, query }) { method updateMany (line 288) | async updateMany({ args, query }) { method upsert (line 316) | async upsert({ args, query }) { method create (line 355) | async create({ args, query }) { method update (line 364) | async update({ args, query }) { method updateMany (line 385) | async updateMany({ args, query }) { method upsert (line 406) | async upsert({ args, query }) { method create (line 435) | async create({ args, query }) { method update (line 444) | async update({ args, query }) { method updateMany (line 465) | async updateMany({ args, query }) { method upsert (line 486) | async upsert({ args, query }) { FILE: apps/web/utils/prisma-helpers.ts function isDuplicateError (line 3) | function isDuplicateError(error: unknown, key?: string) { function isNotFoundError (line 14) | function isNotFoundError(error: unknown) { FILE: apps/web/utils/prisma-retry.ts function withPrismaRetry (line 17) | async function withPrismaRetry( FILE: apps/web/utils/qstash.test.ts function createRequest (line 6) | function createRequest(headers?: Record) { function loadMiddleware (line 15) | async function loadMiddleware({ FILE: apps/web/utils/qstash.ts function withQstashOrInternal (line 9) | function withQstashOrInternal( function normalizeContext (line 36) | function normalizeContext(params?: { params?: Record }) { FILE: apps/web/utils/queue/create-forwarding-queue-handler.ts type QueueMetadata (line 7) | type QueueMetadata = { function createForwardingQueueHandler (line 12) | function createForwardingQueueHandler({ FILE: apps/web/utils/queue/dispatch.ts function enqueueBackgroundJob (line 7) | async function enqueueBackgroundJob({ function shouldUseQstashQueue (line 46) | function shouldUseQstashQueue() { FILE: apps/web/utils/queue/forward-to-internal-api.ts function forwardQueueMessageToInternalApi (line 8) | async function forwardQueueMessageToInternalApi({ function getResponseBody (line 54) | async function getResponseBody(response: Response) { FILE: apps/web/utils/queue/retry.ts function getQueueRetryBackoffSeconds (line 1) | function getQueueRetryBackoffSeconds({ FILE: apps/web/utils/queue/vercel.ts function isVercelQueueDispatchEnabled (line 1) | function isVercelQueueDispatchEnabled() { FILE: apps/web/utils/redirect.ts function buildRedirectUrl (line 1) | function buildRedirectUrl( FILE: apps/web/utils/redis/account-validation.ts constant EXPIRATION (line 5) | const EXPIRATION = 60 * 60; function getValidationKey (line 10) | function getValidationKey({ function getEmailAccount (line 26) | async function getEmailAccount({ function invalidateAccountValidation (line 67) | async function invalidateAccountValidation({ FILE: apps/web/utils/redis/categorization-progress.ts type RedisCategorizationProgress (line 8) | type RedisCategorizationProgress = z.infer; function getKey (line 9) | function getKey({ emailAccountId }: { emailAccountId: string }) { function getCategoryKey (line 12) | function getCategoryKey({ threadId }: { threadId: string }) { function getCategory (line 16) | async function getCategory({ function saveCategory (line 30) | async function saveCategory({ function deleteCategory (line 44) | async function deleteCategory({ function deleteCategories (line 56) | async function deleteCategories({ FILE: apps/web/utils/redis/clean.ts constant EXPIRATION (line 8) | const EXPIRATION = 60 * 60 * 6; function saveThread (line 20) | async function saveThread({ function updateThread (line 47) | async function updateThread({ function publishThread (line 68) | async function publishThread({ function getThread (line 87) | async function getThread({ function getThreadsByJobId (line 99) | async function getThreadsByJobId({ function deleteAllUserData (line 134) | async function deleteAllUserData(userId: string) { FILE: apps/web/utils/redis/clean.types.ts type CleanThread (line 1) | type CleanThread = { FILE: apps/web/utils/redis/email-provider-rate-limit.ts constant RATE_LIMIT_KEY_PREFIX (line 9) | const RATE_LIMIT_KEY_PREFIX = "email-provider-rate-limit"; type StoredEmailProviderRateLimitState (line 11) | type StoredEmailProviderRateLimitState = { type RedisEmailProviderRateLimitState (line 18) | type RedisEmailProviderRateLimitState = { function getRateLimitKey (line 24) | function getRateLimitKey(emailAccountId: string) { function getEmailProviderRateLimitStateFromRedis (line 28) | async function getEmailProviderRateLimitStateFromRedis({ function setEmailProviderRateLimitStateInRedis (line 58) | async function setEmailProviderRateLimitStateInRedis({ function deleteEmailProviderRateLimitStateFromRedis (line 83) | async function deleteEmailProviderRateLimitStateFromRedis({ function isEmailProviderRateLimitRedisConfigured (line 92) | function isEmailProviderRateLimitRedisConfigured() { function parseStoredEmailProviderRateLimitState (line 99) | function parseStoredEmailProviderRateLimitState( FILE: apps/web/utils/redis/index.ts function expire (line 9) | async function expire(key: string, seconds: number) { FILE: apps/web/utils/redis/message-processing.ts function getProcessingKey (line 3) | function getProcessingKey({ function markMessageAsProcessing (line 13) | async function markMessageAsProcessing({ FILE: apps/web/utils/redis/messaging-link-code.ts constant MESSAGING_LINK_NONCE_TTL_SECONDS (line 5) | const MESSAGING_LINK_NONCE_TTL_SECONDS = 10 * 60; function getMessagingLinkNonceKey (line 8) | function getMessagingLinkNonceKey(nonce: string) { function consumeMessagingLinkNonce (line 16) | async function consumeMessagingLinkNonce( FILE: apps/web/utils/redis/oauth-code.ts function createOAuthCodeCacheKey (line 5) | function createOAuthCodeCacheKey(code: string): string { function getCodeKey (line 9) | function getCodeKey(code: string) { type OAuthCodeResult (line 13) | interface OAuthCodeResult { function acquireOAuthCodeLock (line 18) | async function acquireOAuthCodeLock(code: string): Promise { function getOAuthCodeResult (line 27) | async function getOAuthCodeResult( function setOAuthCodeResult (line 43) | async function setOAuthCodeResult( function clearOAuthCode (line 59) | async function clearOAuthCode(code: string): Promise { FILE: apps/web/utils/redis/outbound-thread-status.ts constant PROCESSING_TTL_SECONDS (line 4) | const PROCESSING_TTL_SECONDS = 60 * 5; constant PROCESSED_TTL_SECONDS (line 5) | const PROCESSED_TTL_SECONDS = 60 * 60 * 24 * 30; constant PROCESSED_STATUS (line 6) | const PROCESSED_STATUS = "processed"; constant MARK_PROCESSED_IF_OWNED_SCRIPT (line 7) | const MARK_PROCESSED_IF_OWNED_SCRIPT = ` constant CLEAR_LOCK_IF_OWNED_SCRIPT (line 14) | const CLEAR_LOCK_IF_OWNED_SCRIPT = ` type OutboundThreadStatusKey (line 22) | type OutboundThreadStatusKey = { function acquireOutboundThreadStatusLock (line 29) | async function acquireOutboundThreadStatusLock({ function markOutboundThreadStatusProcessed (line 47) | async function markOutboundThreadStatusProcessed({ function clearOutboundThreadStatusLock (line 64) | async function clearOutboundThreadStatusLock({ function getOutboundThreadStatusKey (line 81) | function getOutboundThreadStatusKey({ FILE: apps/web/utils/redis/reply-tracker-analyzing.ts function getKey (line 3) | function getKey({ emailAccountId }: { emailAccountId: string }) { function startAnalyzingReplyTracker (line 7) | async function startAnalyzingReplyTracker({ function stopAnalyzingReplyTracker (line 17) | async function stopAnalyzingReplyTracker({ function isAnalyzingReplyTracker (line 26) | async function isAnalyzingReplyTracker({ FILE: apps/web/utils/redis/reply.ts type ReplyWithConfidence (line 13) | type ReplyWithConfidence = { function getReply (line 21) | async function getReply({ function getReplyWithConfidence (line 38) | async function getReplyWithConfidence({ function saveReply (line 53) | async function saveReply({ function getReplyKey (line 87) | function getReplyKey({ function parseCachedReply (line 101) | function parseCachedReply( function parseReplyWithConfidenceFromObject (line 114) | function parseReplyWithConfidenceFromObject( function isDraftReplyConfidence (line 147) | function isDraftReplyConfidence( function parseDraftAttribution (line 158) | function parseDraftAttribution(value: unknown): DraftAttribution | null { function parseDraftContextMetadata (line 176) | function parseDraftContextMetadata( function isSelectedAttachment (line 183) | function isSelectedAttachment(value: unknown): value is SelectedAttachme... FILE: apps/web/utils/redis/research-cache.ts constant CACHE_KEY_PREFIX (line 8) | const CACHE_KEY_PREFIX = "research"; constant CACHE_TTL_SECONDS (line 9) | const CACHE_TTL_SECONDS = 30 * 24 * 60 * 60; constant MAX_CONTENT_SIZE (line 10) | const MAX_CONTENT_SIZE = 1024 * 1024; type ResearchSource (line 12) | type ResearchSource = "perplexity" | "websearch"; function isRedisConfigured (line 14) | function isRedisConfigured(): boolean { function getResearchCacheKey (line 18) | function getResearchCacheKey( function getUserKeyPattern (line 31) | function getUserKeyPattern(userId: string, source?: ResearchSource) { function clearCachedResearchForUser (line 39) | async function clearCachedResearchForUser( function getCachedResearch (line 82) | async function getCachedResearch( function setCachedResearch (line 100) | async function setCachedResearch( FILE: apps/web/utils/redis/subscriber.ts class RedisSubscriber (line 8) | class RedisSubscriber { method getInstance (line 11) | static getInstance(): Redis { method disconnect (line 33) | static disconnect(): void { FILE: apps/web/utils/redis/summary.ts function getSummary (line 3) | async function getSummary(text: string): Promise { function saveSummary (line 7) | async function saveSummary(text: string, summary: string) { FILE: apps/web/utils/redis/usage.ts constant WEEKLY_USAGE_COST_DAYS (line 7) | const WEEKLY_USAGE_COST_DAYS = 7; constant WEEKLY_USAGE_COST_TTL_SECONDS (line 8) | const WEEKLY_USAGE_COST_TTL_SECONDS = 8 * 24 * 60 * 60; constant WEEKLY_USAGE_COST_KEY_PREFIX (line 9) | const WEEKLY_USAGE_COST_KEY_PREFIX = "usage-weekly-cost"; type RedisUsage (line 11) | type RedisUsage = { type WeeklyUsageCostByEmail (line 21) | type WeeklyUsageCostByEmail = { function getUsageKey (line 26) | function getUsageKey(email: string) { function getUsage (line 30) | async function getUsage(options: { email: string }) { function saveUsage (line 36) | async function saveUsage(options: { function getWeeklyUsageCost (line 73) | async function getWeeklyUsageCost({ function getTopWeeklyUsageCosts (line 92) | async function getTopWeeklyUsageCosts({ function getWeeklyUsageCostKeys (line 140) | function getWeeklyUsageCostKeys(email: string, now: Date) { function getWeeklyUsageCostDays (line 145) | function getWeeklyUsageCostDays(now: Date) { function getWeeklyUsageCostKey (line 153) | function getWeeklyUsageCostKey(email: string, date: Date | string) { function parseWeeklyUsageCostKey (line 158) | function parseWeeklyUsageCostKey(key: string) { function parseUsageCost (line 172) | function parseUsageCost(rawCost: string | number | undefined): number { function getUtcDay (line 178) | function getUtcDay(date: Date) { FILE: apps/web/utils/referral/referral-code.ts function generateRandomString (line 10) | function generateRandomString(length: number): string { function generateReferralCode (line 22) | async function generateReferralCode(): Promise { function getOrCreateReferralCode (line 29) | async function getOrCreateReferralCode(userId: string) { function validateReferralCode (line 83) | async function validateReferralCode(code: string) { function checkUserReferral (line 107) | async function checkUserReferral(userId: string) { function createReferral (line 128) | async function createReferral( FILE: apps/web/utils/referral/referral-link.ts function generateReferralLink (line 3) | function generateReferralLink(code: string): string { FILE: apps/web/utils/referral/referral-tracking.ts constant REWARD_AMOUNT_CENTS (line 6) | const REWARD_AMOUNT_CENTS = 2000; function completeReferralAndGrantReward (line 12) | async function completeReferralAndGrantReward( FILE: apps/web/utils/reply-tracker/check-sender-reply-history.ts function checkSenderReplyHistory (line 15) | async function checkSenderReplyHistory( FILE: apps/web/utils/reply-tracker/conversation-status-config.ts constant CONVERSATION_STATUS_TYPES (line 3) | const CONVERSATION_STATUS_TYPES: SystemType[] = [ type ConversationStatus (line 10) | type ConversationStatus = function isConversationStatusType (line 16) | function isConversationStatusType( FILE: apps/web/utils/reply-tracker/draft-tracking.test.ts function createSentMessage (line 111) | function createSentMessage(): ParsedMessage { FILE: apps/web/utils/reply-tracker/draft-tracking.ts function trackSentDraftStatus (line 19) | async function trackSentDraftStatus({ function cleanupThreadAIDrafts (line 173) | async function cleanupThreadAIDrafts({ function queueReplyMemoryLearning (line 370) | function queueReplyMemoryLearning({ FILE: apps/web/utils/reply-tracker/error-logging.ts type LogReplyTrackerErrorArgs (line 5) | type LogReplyTrackerErrorArgs = { function logReplyTrackerError (line 16) | async function logReplyTrackerError({ FILE: apps/web/utils/reply-tracker/generate-draft.test.ts type EmailAccountSignatureSettings (line 103) | type EmailAccountSignatureSettings = { FILE: apps/web/utils/reply-tracker/generate-draft.ts type DraftGenerationResult (line 34) | type DraftGenerationResult = { function fetchMessagesAndGenerateDraft (line 45) | async function fetchMessagesAndGenerateDraft( function fetchMessagesAndGenerateDraftWithConfidenceThreshold (line 70) | async function fetchMessagesAndGenerateDraftWithConfidenceThreshold( function fetchThreadAndConversationMessages (line 148) | async function fetchThreadAndConversationMessages( function generateDraftContent (line 171) | async function generateDraftContent( FILE: apps/web/utils/reply-tracker/handle-conversation-status.ts function determineConversationStatus (line 20) | async function determineConversationStatus({ function updateThreadTrackers (line 111) | async function updateThreadTrackers({ FILE: apps/web/utils/reply-tracker/handle-outbound.ts function handleOutboundMessage (line 11) | async function handleOutboundMessage({ FILE: apps/web/utils/reply-tracker/label-helpers.ts type LabelIds (line 13) | type LabelIds = Record< function removeConflictingThreadStatusLabels (line 21) | async function removeConflictingThreadStatusLabels({ function applyThreadStatusLabel (line 110) | async function applyThreadStatusLabel({ function getLabelsFromDb (line 194) | async function getLabelsFromDb( FILE: apps/web/utils/reply-tracker/outbound.ts function handleOutboundReply (line 21) | async function handleOutboundReply({ function getEnabledStatuses (line 167) | async function getEnabledStatuses({ function isMessageLatestInThread (line 185) | function isMessageLatestInThread( FILE: apps/web/utils/request-timing.ts constant DEFAULT_RUNNING_WARN_AFTER_MS (line 3) | const DEFAULT_RUNNING_WARN_AFTER_MS = 10_000; constant DEFAULT_SLOW_WARN_AFTER_MS (line 4) | const DEFAULT_SLOW_WARN_AFTER_MS = 3000; function startRequestTimer (line 6) | function startRequestTimer({ FILE: apps/web/utils/retry/get-retry-after-header.ts function getRetryAfterHeaderFromError (line 1) | function getRetryAfterHeaderFromError( function getHeaderValue (line 13) | function getHeaderValue(headers: unknown): string | undefined { function toRecord (line 36) | function toRecord(value: unknown): Record { FILE: apps/web/utils/retry/is-fetch-error.ts function isFetchError (line 1) | function isFetchError(errorInfo: { errorMessage: string }): boolean { FILE: apps/web/utils/risk.ts constant RISK_LEVELS (line 6) | const RISK_LEVELS = { type RiskLevel (line 13) | type RiskLevel = (typeof RISK_LEVELS)[keyof typeof RISK_LEVELS]; type RiskAction (line 15) | type RiskAction = { function getActionRiskLevel (line 24) | function getActionRiskLevel( function hasAnyFieldWithStatus (line 105) | function hasAnyFieldWithStatus( function compareRiskLevels (line 112) | function compareRiskLevels(a: RiskLevel, b: RiskLevel): RiskLevel { function getRiskLevel (line 122) | function getRiskLevel( function getFieldsDynamicStatus (line 147) | function getFieldsDynamicStatus(action: RiskAction) { function isFullyDynamicField (line 165) | function isFullyDynamicField(field: string) { function isPartiallyDynamicField (line 170) | function isPartiallyDynamicField(field: string) { FILE: apps/web/utils/rule/check-sender-rule-history.ts type SenderRuleHistory (line 8) | interface SenderRuleHistory { function checkSenderRuleHistory (line 19) | async function checkSenderRuleHistory({ FILE: apps/web/utils/rule/consts.ts function getRuleConfig (line 125) | function getRuleConfig(systemType: SystemType) { function getRuleName (line 131) | function getRuleName(systemType: SystemType) { function getRuleLabel (line 135) | function getRuleLabel(systemType: SystemType) { function shouldLearnFromLabelRemoval (line 139) | function shouldLearnFromLabelRemoval(systemType: SystemType): boolean { function getCategoryAction (line 143) | function getCategoryAction(systemType: SystemType, provider: string) { constant SYSTEM_RULE_ORDER (line 153) | const SYSTEM_RULE_ORDER: SystemType[] = [ function getDefaultActions (line 166) | function getDefaultActions( type ActionTypeConfig (line 300) | type ActionTypeConfig = { function getActionTypesForCategoryAction (line 306) | function getActionTypesForCategoryAction({ function getSystemRuleActionTypes (line 347) | function getSystemRuleActionTypes( FILE: apps/web/utils/rule/email-from-pattern.ts function splitEmailPatterns (line 5) | function splitEmailPatterns(pattern: string): string[] { function isAddressLikeEmailPattern (line 13) | function isAddressLikeEmailPattern(pattern: string): boolean { FILE: apps/web/utils/rule/learned-patterns.ts function saveLearnedPattern (line 11) | async function saveLearnedPattern({ function saveLearnedPatterns (line 82) | async function saveLearnedPatterns({ function getOrCreateGroupForRule (line 169) | async function getOrCreateGroupForRule({ FILE: apps/web/utils/rule/mapRulesToExtensionTabs.ts type SyncTab (line 6) | type SyncTab = { constant DEFAULT_TABS (line 14) | const DEFAULT_TABS = [ constant LABEL_TO_DEFAULT_TAB (line 31) | const LABEL_TO_DEFAULT_TAB = Object.fromEntries( constant LABEL_ORDER (line 36) | const LABEL_ORDER = DEFAULT_TABS.map((tab) => normalizeLabelName(tab.lab... function labelToGmailSlug (line 38) | function labelToGmailSlug(label: string): string { function mapRulesToExtensionTabs (line 46) | function mapRulesToExtensionTabs(rules: RulesResponse): SyncTab[] { function normalizeSeenLabel (line 99) | function normalizeSeenLabel(label: string) { FILE: apps/web/utils/rule/recipient-validation.ts function getMissingRecipientMessage (line 4) | function getMissingRecipientMessage({ function addMissingRecipientIssue (line 24) | function addMissingRecipientIssue({ FILE: apps/web/utils/rule/record-label-removal-learning.ts function recordLabelRemovalLearning (line 6) | async function recordLabelRemovalLearning({ FILE: apps/web/utils/rule/rule-history.ts type RuleHistoryTrigger (line 4) | type RuleHistoryTrigger = "created" | "updated"; function createRuleHistory (line 9) | async function createRuleHistory({ FILE: apps/web/utils/rule/rule-to-text.ts type RuleWithActions (line 4) | interface RuleWithActions extends Rule { function ruleToText (line 9) | function ruleToText(rule: RuleWithActions): string { FILE: apps/web/utils/rule/rule.ts type RuleRecordData (line 23) | type RuleRecordData = { function partialUpdateRule (line 39) | function partialUpdateRule({ function updateRuleInstructions (line 53) | function updateRuleInstructions({ function setRuleRunOnThreads (line 68) | function setRuleRunOnThreads({ function setRuleEnabled (line 83) | function setRuleEnabled({ function createRuleWithResolvedActions (line 99) | async function createRuleWithResolvedActions({ function replaceRuleWithResolvedActions (line 137) | async function replaceRuleWithResolvedActions({ function createRule (line 178) | async function createRule({ function updateRule (line 246) | async function updateRule({ function upsertSystemRule (line 302) | async function upsertSystemRule({ function updateRuleActions (line 392) | async function updateRuleActions({ function deleteRule (line 437) | async function deleteRule({ function shouldEnable (line 457) | function shouldEnable(rule: CreateOrUpdateRuleSchema, actions: RiskActio... function validateLowTrustStaticFromOutboundActions (line 485) | function validateLowTrustStaticFromOutboundActions({ function mapActionFields (line 501) | async function mapActionFields( FILE: apps/web/utils/rule/sort.ts type SortableRule (line 3) | type SortableRule = { function sortRulesForAutomation (line 10) | function sortRulesForAutomation( function getSystemRuleOrderIndex (line 38) | function getSystemRuleOrderIndex(systemType?: string | null) { FILE: apps/web/utils/rule/static-from-risk.ts constant LOW_TRUST_FROM_BLOCKED_ACTION_TYPES (line 7) | const LOW_TRUST_FROM_BLOCKED_ACTION_TYPES = new Set([ constant LOW_TRUST_STATIC_FROM_OUTBOUND_MESSAGE (line 13) | const LOW_TRUST_STATIC_FROM_OUTBOUND_MESSAGE = function hasLowTrustStaticFromPattern (line 16) | function hasLowTrustStaticFromPattern(from: string | null | undefined) { function getBlockedLowTrustStaticFromActionTypes (line 24) | function getBlockedLowTrustStaticFromActionTypes( FILE: apps/web/utils/rule/types.ts type CreateRuleResult (line 4) | type CreateRuleResult = NonNullable< type RuleWithRelations (line 8) | type RuleWithRelations = Rule & { FILE: apps/web/utils/schedule.test.ts function createTestDate (line 36) | function createTestDate(isoString: string): Date { FILE: apps/web/utils/schedule.ts function createCanonicalTimeOfDay (line 12) | function createCanonicalTimeOfDay(hours: number, minutes: number): Date { constant DAYS (line 24) | const DAYS = { function dayOfWeekToBitmask (line 56) | function dayOfWeekToBitmask(jsDay: number): number { function bitmaskToDayOfWeek (line 82) | function bitmaskToDayOfWeek(bitmask: number): number | null { function bitmaskToDaysOfWeek (line 103) | function bitmaskToDaysOfWeek(bitmask: number): number[] { function calculateNextScheduleDate (line 124) | function calculateNextScheduleDate( FILE: apps/web/utils/scheduled-actions/executor.ts constant MODULE (line 13) | const MODULE = "scheduled-actions-executor"; function executeScheduledAction (line 18) | async function executeScheduledAction( function validateEmailState (line 100) | async function validateEmailState( function executeDelayedAction (line 147) | async function executeDelayedAction({ function markActionCompleted (line 227) | async function markActionCompleted( function markActionFailed (line 252) | async function markActionFailed( function checkAndCompleteExecutedRule (line 274) | async function checkAndCompleteExecutedRule( FILE: apps/web/utils/scheduled-actions/scheduler.ts type ScheduledActionPayload (line 14) | interface ScheduledActionPayload { function getQstashClient (line 18) | function getQstashClient() { function createScheduledAction (line 23) | async function createScheduledAction({ function scheduleDelayedActions (line 118) | async function scheduleDelayedActions({ function cancelScheduledActions (line 169) | async function cancelScheduledActions({ function scheduleMessage (line 258) | async function scheduleMessage({ function cancelMessage (line 321) | async function cancelMessage( function markQStashActionAsExecuting (line 337) | async function markQStashActionAsExecuting(scheduledActionId: string) { FILE: apps/web/utils/scripts/lemon.tsx function LemonScript (line 6) | function LemonScript() { FILE: apps/web/utils/sender.ts function findSenderByEmail (line 4) | async function findSenderByEmail({ FILE: apps/web/utils/senders/record.ts type NewsletterRecordChanges (line 5) | type NewsletterRecordChanges = { function extractEmailOrThrow (line 11) | function extractEmailOrThrow(newsletterEmail: string) { function upsertSenderRecord (line 17) | async function upsertSenderRecord({ FILE: apps/web/utils/senders/unsubscribe.test.ts function queueHttpsResponse (line 196) | function queueHttpsResponse({ FILE: apps/web/utils/senders/unsubscribe.ts constant ONE_CLICK_REQUEST_BODY (line 16) | const ONE_CLICK_REQUEST_BODY = "List-Unsubscribe=One-Click"; constant UNSUBSCRIBE_REQUEST_TIMEOUT_MS (line 17) | const UNSUBSCRIBE_REQUEST_TIMEOUT_MS = 10_000; constant MAX_UNSUBSCRIBE_REDIRECTS (line 18) | const MAX_UNSUBSCRIBE_REDIRECTS = 5; type AutomaticUnsubscribeResult (line 20) | type AutomaticUnsubscribeResult = { function setSenderStatus (line 33) | async function setSenderStatus({ function unsubscribeSenderAndMark (line 49) | async function unsubscribeSenderAndMark({ function attemptAutomaticUnsubscribe (line 101) | async function attemptAutomaticUnsubscribe({ function sendUnsubscribeRequest (line 170) | async function sendUnsubscribeRequest({ function sendPinnedUnsubscribeRequest (line 250) | async function sendPinnedUnsubscribeRequest({ function getRedirectUrl (line 324) | function getRedirectUrl({ function getHeaderValue (line 341) | function getHeaderValue( function isRedirectStatusCode (line 348) | function isRedirectStatusCode(statusCode: number) { function getRedirectMethod (line 358) | function getRedirectMethod({ function isRequestTimeoutError (line 375) | function isRequestTimeoutError(error: unknown) { FILE: apps/web/utils/similarity-score.ts function normalizeForOutlook (line 10) | function normalizeForOutlook(content: string): string { function decodeHtmlEntities (line 23) | function decodeHtmlEntities(text: string): string { function normalizeForGmail (line 45) | function normalizeForGmail(content: string): string { function calculateSimilarity (line 59) | function calculateSimilarity( FILE: apps/web/utils/size.ts function bytesToMegabytes (line 1) | function bytesToMegabytes(bytes: number): number { FILE: apps/web/utils/sleep.ts function sleep (line 1) | async function sleep(ms: number) { FILE: apps/web/utils/sso/extract-sso-provider-config-from-xml.ts type SSOProviderConfig (line 4) | interface SSOProviderConfig { function extractSSOProviderConfigFromXML (line 21) | function extractSSOProviderConfigFromXML( FILE: apps/web/utils/sso/validate-idp-metadata.ts function validateIdpMetadata (line 3) | function validateIdpMetadata(xml: string): boolean { FILE: apps/web/utils/stats.ts function formatStat (line 1) | function formatStat(stat?: number) { FILE: apps/web/utils/string.ts function escapeHtml (line 3) | function escapeHtml(text: string): string { function truncate (line 7) | function truncate(str: string, length: number) { function trimToNonEmptyString (line 11) | function trimToNonEmptyString(value: unknown): string | undefined { function removeExcessiveWhitespace (line 18) | function removeExcessiveWhitespace(str: string) { function generalizeSubject (line 40) | function generalizeSubject(subject = "") { function pluralize (line 53) | function pluralize( function formatBulletList (line 61) | function formatBulletList(list: string[]) { function slugify (line 65) | function slugify(text: string): string { function convertNewlinesToBr (line 74) | function convertNewlinesToBr(text: string): string { FILE: apps/web/utils/stringify-email.ts function stringifyEmail (line 4) | function stringifyEmail(email: EmailForLLM, maxLength: number) { function stringifyEmailSimple (line 29) | function stringifyEmailSimple(email: EmailForLLM) { function stringifyEmailFromBody (line 39) | function stringifyEmailFromBody(email: EmailForLLM) { FILE: apps/web/utils/swr.ts function useSWRWithEmailAccount (line 7) | function useSWRWithEmailAccount(url: string) { type NormalizedError (line 12) | type NormalizedError = { error: string }; function processSWRResponse (line 21) | function processSWRResponse< FILE: apps/web/utils/template.ts constant TEMPLATE_VARIABLE_PATTERN (line 2) | const TEMPLATE_VARIABLE_PATTERN = "\\{\\{[\\s\\S]*?\\}\\}"; FILE: apps/web/utils/terminology.ts type EmailTerminology (line 3) | interface EmailTerminology { function getEmailTerminology (line 17) | function getEmailTerminology(provider: string): EmailTerminology { FILE: apps/web/utils/types.ts type PartialRecord (line 9) | type PartialRecord = Partial>; function isDefined (line 12) | function isDefined(value: T | undefined | null): value is T { type RuleWithActions (line 16) | type RuleWithActions = Prisma.RuleGetPayload<{ type BatchError (line 20) | type BatchError = { function isBatchError (line 29) | function isBatchError( type MessageWithPayload (line 35) | type MessageWithPayload = { type ThreadWithPayloadMessages (line 47) | type ThreadWithPayloadMessages = gmail_v1.Schema$Thread & { type ParsedMessage (line 51) | interface ParsedMessage { type Attachment (line 76) | interface Attachment { type Headers (line 84) | interface Headers { type Inline (line 91) | interface Inline { type Headers2 (line 99) | interface Headers2 { type ParsedMessageHeaders (line 106) | interface ParsedMessageHeaders { type EmailForLLM (line 121) | type EmailForLLM = { FILE: apps/web/utils/types/mail.ts type Attachment (line 9) | type Attachment = z.infer; type WithMailerAttachments (line 11) | type WithMailerAttachments = FILE: apps/web/utils/unsubscribe.ts function createUnsubscribeToken (line 5) | async function createUnsubscribeToken({ FILE: apps/web/utils/upstash/categorize-senders.ts constant CATEGORIZE_SENDERS_PREFIX (line 8) | const CATEGORIZE_SENDERS_PREFIX = "ai-categorize-senders"; function publishToAiCategorizeSendersQueue (line 20) | async function publishToAiCategorizeSendersQueue( function deleteEmptyCategorizeSendersQueues (line 54) | async function deleteEmptyCategorizeSendersQueues({ function deleteEmptyQueues (line 65) | async function deleteEmptyQueues({ FILE: apps/web/utils/upstash/index.test.ts function setupFetchMock (line 8) | function setupFetchMock() { function loadUpstashModule (line 16) | async function loadUpstashModule({ FILE: apps/web/utils/upstash/index.ts function getQstashClient (line 12) | function getQstashClient() { function publishToQstash (line 17) | async function publishToQstash( function bulkPublishToQstash (line 40) | async function bulkPublishToQstash({ function publishToQstashQueue (line 72) | async function publishToQstashQueue({ function fallbackPublishToQstash (line 107) | async function fallbackPublishToQstash( function listQueues (line 139) | async function listQueues() { function deleteQueue (line 147) | async function deleteQueue(queueName: string) { function normalizeBaseUrl (line 155) | function normalizeBaseUrl(url: string) { function getQstashCallbackBaseUrl (line 159) | function getQstashCallbackBaseUrl() { FILE: apps/web/utils/url.ts function getGmailBaseUrl (line 1) | function getGmailBaseUrl(emailAddress?: string | null) { function getOutlookBaseUrl (line 5) | function getOutlookBaseUrl() { constant PROVIDER_CONFIG (line 9) | const PROVIDER_CONFIG: Record< function getProviderConfig (line 53) | function getProviderConfig( function getEmailUrl (line 60) | function getEmailUrl( function getEmailUrlForMessage (line 74) | function getEmailUrlForMessage( function getGmailUrl (line 87) | function getGmailUrl( function getGmailSearchUrl (line 94) | function getGmailSearchUrl(from: string, emailAddress?: string | null) { function getEmailSearchUrl (line 99) | function getEmailSearchUrl( function getGmailBasicSearchUrl (line 110) | function getGmailBasicSearchUrl(emailAddress: string, query: string) { function getGmailFilterSettingsUrl (line 126) | function getGmailFilterSettingsUrl(emailAddress?: string | null) { FILE: apps/web/utils/usage.ts function saveAiUsage (line 18) | async function saveAiUsage({ function calculateUsageCost (line 64) | function calculateUsageCost(options: { function getModelPricing (line 91) | function getModelPricing(options: { function buildModelLookupCandidates (line 119) | function buildModelLookupCandidates({ function toTinybirdBoolean (line 145) | function toTinybirdBoolean(value: boolean): 0 | 1 { FILE: apps/web/utils/user.ts function logOut (line 6) | async function logOut(callbackUrl?: string) { FILE: apps/web/utils/user/delete.ts function deleteUser (line 14) | async function deleteUser({ function deleteResources (line 102) | async function deleteResources({ function deleteExecutedRulesInBatches (line 156) | async function deleteExecutedRulesInBatches({ FILE: apps/web/utils/user/get.ts type EmailAccountWithAIAndTokens (line 7) | type EmailAccountWithAIAndTokens = Prisma.EmailAccountGetPayload<{ function getEmailAccountWithAi (line 40) | async function getEmailAccountWithAi({ type EmailAccountForRuleExecution (line 72) | type EmailAccountForRuleExecution = EmailAccountWithAI & { function getEmailAccountForRuleExecution (line 77) | async function getEmailAccountForRuleExecution({ function getEmailAccountWithAiAndTokens (line 110) | async function getEmailAccountWithAiAndTokens({ function getUserPremium (line 154) | async function getUserPremium({ userId }: { userId: string }) { function getWritingStyle (line 167) | async function getWritingStyle({ FILE: apps/web/utils/user/merge-account.ts type MergeAccountOptions (line 5) | interface MergeAccountOptions { function mergeAccount (line 14) | async function mergeAccount({ FILE: apps/web/utils/user/merge-premium.ts function transferPremiumDuringMerge (line 9) | async function transferPremiumDuringMerge({ FILE: apps/web/utils/user/orphaned-account.ts function cleanupOrphanedAccount (line 4) | async function cleanupOrphanedAccount( FILE: apps/web/utils/user/validate.ts function validateUserAndAiAccess (line 5) | async function validateUserAndAiAccess({ FILE: apps/web/utils/webhook-validation.ts constant PRIVATE_IP_RANGES (line 4) | const PRIVATE_IP_RANGES = [ constant BLOCKED_HOSTNAMES (line 30) | const BLOCKED_HOSTNAMES = [ type WebhookUrlValidationResult (line 40) | type WebhookUrlValidationResult = function validateWebhookUrl (line 53) | async function validateWebhookUrl( function isPrivateIP (line 178) | function isPrivateIP(ip: string): boolean { FILE: apps/web/utils/webhook.ts type WebhookPayload (line 10) | type WebhookPayload = { FILE: apps/web/utils/webhook/error-handler.ts function handleWebhookError (line 10) | async function handleWebhookError( FILE: apps/web/utils/webhook/process-history-item.test.ts function getDefaultEmailAccount (line 50) | function getDefaultEmailAccount() { FILE: apps/web/utils/webhook/process-history-item.ts type SharedProcessHistoryOptions (line 29) | type SharedProcessHistoryOptions = { function processHistoryItem (line 42) | async function processHistoryItem( FILE: apps/web/utils/webhook/validate-webhook-account.test.ts function createMockEmailAccount (line 37) | function createMockEmailAccount( FILE: apps/web/utils/webhook/validate-webhook-account.ts type WebhookEmailAccount (line 55) | type WebhookEmailAccount = Prisma.EmailAccountGetPayload<{ function getWebhookEmailAccount (line 59) | async function getWebhookEmailAccount( type ValidatedWebhookAccountData (line 131) | type ValidatedWebhookAccountData = Awaited< type ValidatedWebhookAccount (line 135) | type ValidatedWebhookAccount = { type ValidationResult (line 141) | type ValidationResult = function validateWebhookAccount (line 145) | async function validateWebhookAccount( FILE: docs/scripts/build-changelog.mjs constant HEADER (line 9) | const HEADER = `--- function formatDate (line 16) | function formatDate(filename) { function parseFrontmatter (line 26) | function parseFrontmatter(raw) { function escapeAttr (line 37) | function escapeAttr(str) { function buildUpdate (line 41) | function buildUpdate(filename, { meta, content }) { FILE: packages/api/src/api-types.ts type RuleActionFields (line 1) | type RuleActionFields = { type RuleAction (line 12) | type RuleAction = { type RuleCondition (line 30) | type RuleCondition = { type Rule (line 40) | type Rule = { type RulesResponse (line 51) | type RulesResponse = { type RuleResponse (line 55) | type RuleResponse = { type NullableRuleResponse (line 59) | type NullableRuleResponse = { type StatsByPeriodResponse (line 63) | type StatsByPeriodResponse = { type ResponseTimeResponse (line 79) | type ResponseTimeResponse = { FILE: packages/api/src/client.ts type RequestOptions (line 1) | type RequestOptions = { type ApiErrorPayload (line 7) | type ApiErrorPayload = { class ApiClient (line 12) | class ApiClient { method constructor (line 18) | constructor(config: { apiKey: string; baseUrl: string }) { method delete (line 22) | async delete(pathname: string) { method get (line 26) | async get( method post (line 33) | async post(pathname: string, body?: string) { method put (line 37) | async put(pathname: string, body?: string) { method request (line 41) | private async request(pathname: string, options: RequestOptions) { function normalizeBaseUrl (line 67) | function normalizeBaseUrl(baseUrl: string): string { function buildApiUrl (line 85) | function buildApiUrl( function createApiError (line 102) | async function createApiError(response: Response) { FILE: packages/api/src/config.ts constant CONFIG_PATH (line 11) | const CONFIG_PATH = resolve(homedir(), ".inbox-zero-api", "config.json"); constant DEFAULT_BASE_URL (line 12) | const DEFAULT_BASE_URL = "https://www.getinboxzero.com"; type ApiCliConfig (line 14) | type ApiCliConfig = { type RuntimeOptions (line 19) | type RuntimeOptions = { function loadConfig (line 24) | function loadConfig(configPath = CONFIG_PATH): ApiCliConfig { function saveConfig (line 33) | function saveConfig( function updateConfig (line 50) | function updateConfig( function resolveRuntimeConfig (line 64) | function resolveRuntimeConfig( FILE: packages/api/src/io.ts function readJsonInput (line 3) | async function readJsonInput(filePath: string) { function readFromStdin (line 10) | function readFromStdin(): Promise { function stripUtf8Bom (line 23) | function stripUtf8Bom(input: string) { FILE: packages/api/src/main.ts type ProgramOptions (line 28) | type ProgramOptions = { function main (line 33) | async function main() { function addConfigCommands (line 56) | function addConfigCommands() { function addOpenApiCommand (line 99) | function addOpenApiCommand() { function addRuleCommands (line 125) | function addRuleCommands() { function addStatsCommands (line 216) | function addStatsCommands() { function createClient (line 270) | function createClient(options: ProgramOptions) { function getOpenApiDocument (line 275) | async function getOpenApiDocument(options: ProgramOptions) { function getConfigValue (line 290) | function getConfigValue( function getObjectField (line 303) | function getObjectField(value: unknown, key: string): Record( function addSsmParameterTags (line 32) | function addSsmParameterTags( function putSsmParameterWithTags (line 51) | function putSsmParameterWithTags(params: { function readSecretJson (line 79) | function readSecretJson>( FILE: packages/cli/src/aws-setup/google-pubsub.ts function getWebhookUrl (line 4) | function getWebhookUrl( function setupGooglePubSub (line 45) | function setupGooglePubSub(params: { FILE: packages/cli/src/aws-setup/ssm-urls.ts function ensureDatabaseUrlParameters (line 8) | function ensureDatabaseUrlParameters( function ensureRedisUrlParameter (line 95) | function ensureRedisUrlParameter( function buildDatabaseUrl (line 164) | function buildDatabaseUrl(params: { function buildRedisUrl (line 176) | function buildRedisUrl(params: { FILE: packages/cli/src/main.ts function findRepoRoot (line 26) | function findRepoRoot(): string | null { constant REPO_ROOT (line 42) | const REPO_ROOT = findRepoRoot(); constant STANDALONE_CONFIG_DIR (line 45) | const STANDALONE_CONFIG_DIR = resolve(homedir(), ".inbox-zero"); constant STANDALONE_ENV_FILE (line 46) | const STANDALONE_ENV_FILE = resolve(STANDALONE_CONFIG_DIR, ".env"); constant STANDALONE_COMPOSE_FILE (line 47) | const STANDALONE_COMPOSE_FILE = resolve( function ensureConfigDir (line 53) | function ensureConfigDir(configDir: string) { function checkDocker (line 60) | function checkDocker(): boolean { function checkDockerCompose (line 66) | function checkDockerCompose(): boolean { function requireDocker (line 80) | function requireDocker() { function fixComposeEnvPaths (line 112) | function fixComposeEnvPaths(composeContent: string): string { function findEnvFile (line 118) | function findEnvFile(name?: string): string | null { function main (line 132) | async function main() { function stripSetupAwsDoubleDash (line 275) | function stripSetupAwsDoubleDash(argv: string[]) { function runSetup (line 288) | async function runSetup(options: { name?: string }) { function runSetupQuick (line 327) | async function runSetupQuick(options: { name?: string }) { function runSetupAdvanced (line 751) | async function runSetupAdvanced(options: { name?: string }) { function runStart (line 1254) | async function runStart(options: { detach: boolean }) { function runStop (line 1359) | async function runStop() { function runLogs (line 1393) | async function runLogs(options: { follow: boolean; tail: string }) { function runStatus (line 1431) | async function runStatus() { function runUpdate (line 1448) | async function runUpdate() { constant CONFIG_CATEGORIES (line 1522) | const CONFIG_CATEGORIES: Record< function requireEnvFile (line 1573) | function requireEnvFile(name?: string): { envFile: string; content: stri... function runConfigInteractive (line 1585) | async function runConfigInteractive(name?: string) { constant VALID_CONFIG_KEYS (line 1661) | const VALID_CONFIG_KEYS = new Set( function runConfigSet (line 1665) | async function runConfigSet(key: string, value: string, name?: string) { function runConfigGet (line 1679) | async function runConfigGet(key: string, name?: string) { constant ENV_EXAMPLE_URL (line 1694) | const ENV_EXAMPLE_URL = function fetchEnvExample (line 1697) | async function fetchEnvExample(): Promise { function getEnvTemplate (line 1705) | async function getEnvTemplate(): Promise { constant LLM_PROVIDER_OPTIONS (line 1719) | const LLM_PROVIDER_OPTIONS = [ constant LLM_LINKS (line 1743) | const LLM_LINKS: Record = { constant DEFAULT_MODELS (line 1752) | const DEFAULT_MODELS: Record { function promptLlmCredentials (line 1894) | async function promptLlmCredentials( constant COMPOSE_URL (line 1931) | const COMPOSE_URL = function fetchDockerCompose (line 1934) | async function fetchDockerCompose(): Promise { function runDockerCommand (line 1948) | function runDockerCommand( function logPortConflictGuidance (line 1973) | function logPortConflictGuidance() { function readExistingDbPassword (line 1983) | function readExistingDbPassword(envFile: string): string | undefined { function checkContainersRunning (line 1989) | function checkContainersRunning(composeArgs: string[]): boolean { FILE: packages/cli/src/setup-aws.ts type AwsPrerequisites (line 17) | interface AwsPrerequisites { type GcloudPrerequisites (line 24) | interface GcloudPrerequisites { type AwsSetupOptions (line 30) | interface AwsSetupOptions { type SecretConfig (line 37) | interface SecretConfig { constant RDS_INSTANCE_OPTIONS (line 46) | const RDS_INSTANCE_OPTIONS = [ constant REDIS_INSTANCE_OPTIONS (line 69) | const REDIS_INSTANCE_OPTIONS = [ constant APP_NAME (line 87) | const APP_NAME = "inbox-zero"; constant SERVICE_NAME (line 88) | const SERVICE_NAME = "inbox-zero-ecs"; function runAwsSetup (line 94) | async function runAwsSetup(options: AwsSetupOptions) { function checkAwsPrerequisites (line 976) | function checkAwsPrerequisites(): AwsPrerequisites { function getRegionForProfile (line 1008) | function getRegionForProfile(profile: string): string | null { function checkGcloudPrerequisites (line 1022) | function checkGcloudPrerequisites(): GcloudPrerequisites { function validateAwsCredentials (line 1057) | function validateAwsCredentials(profile: string): boolean { function getAwsProfiles (line 1066) | function getAwsProfiles(): string[] { function cleanupInterruptedRun (line 1108) | function cleanupInterruptedRun(): void { function cleanupOrphanedEnvironment (line 1127) | function cleanupOrphanedEnvironment( function findCopilotRoot (line 1211) | function findCopilotRoot(): string | null { function getCopilotWorkspaceDir (line 1227) | function getCopilotWorkspaceDir(): string | null { function findAddonsPath (line 1233) | function findAddonsPath(): string | null { function updateAddonsParameters (line 1241) | function updateAddonsParameters(config: { function updateServiceManifestSecrets (line 1294) | function updateServiceManifestSecrets(config: { function updateServiceManifestVariables (line 1379) | function updateServiceManifestVariables(config: { function updateServiceManifestHttp (line 1403) | function updateServiceManifestHttp(config: { domain?: string }): void { function resetServiceManifestVariables (line 1428) | function resetServiceManifestVariables(): void { function setManifestVariable (line 1447) | function setManifestVariable( function getServiceUrl (line 1465) | function getServiceUrl(envName: string, env: NodeJS.ProcessEnv): string ... function initCopilotApp (line 1498) | function initCopilotApp( function initCopilotEnv (line 1523) | function initCopilotEnv( function deployCopilotEnv (line 1590) | function deployCopilotEnv( function initCopilotService (line 1649) | function initCopilotService(env: NodeJS.ProcessEnv): { function deployCopilotService (line 1683) | function deployCopilotService( function getEnvStackStatus (line 1703) | function getEnvStackStatus( function waitForEnvStackCompletion (line 1726) | function waitForEnvStackCompletion( function isEnvStackHealthy (line 1758) | function isEnvStackHealthy(status: string): boolean { function storeSecretInSsm (line 1762) | function storeSecretInSsm( function normalizeSecretReference (line 1787) | function normalizeSecretReference(content: string, secretName: string): ... function getSecretReference (line 1793) | function getSecretReference(secretName: string): string { function removeSecrets (line 1797) | function removeSecrets(content: string, secretNames: string[]): string { FILE: packages/cli/src/setup-google.ts type GcloudPrerequisites (line 9) | interface GcloudPrerequisites { type SetupResult (line 15) | interface SetupResult { type GoogleSetupOptions (line 20) | interface GoogleSetupOptions { function runGoogleSetup (line 31) | async function runGoogleSetup(options: GoogleSetupOptions) { function checkGcloudPrerequisites (line 333) | function checkGcloudPrerequisites(): GcloudPrerequisites { function enableGoogleApis (line 368) | function enableGoogleApis(projectId: string): SetupResult { function setupPubSubTopic (line 393) | function setupPubSubTopic(projectId: string, topicName: string): SetupRe... function setupPubSubSubscription (line 438) | function setupPubSubSubscription( function openBrowser (line 475) | function openBrowser(url: string): void { FILE: packages/cli/src/setup-ports.ts constant DEFAULT_PORTS (line 3) | const DEFAULT_PORTS = { type ResolvedPortChange (line 10) | type ResolvedPortChange = { type SetupPortConfig (line 17) | type SetupPortConfig = { function resolveSetupPorts (line 25) | async function resolveSetupPorts(options: { function formatPortConfigNote (line 90) | function formatPortConfigNote( function reserveAvailablePort (line 102) | async function reserveAvailablePort( function isPortAvailable (line 121) | function isPortAvailable(port: number): Promise { FILE: packages/cli/src/setup-terraform.ts constant DEFAULT_APP_NAME (line 6) | const DEFAULT_APP_NAME = "inbox-zero"; constant DEFAULT_ENVIRONMENT (line 7) | const DEFAULT_ENVIRONMENT = "production"; constant DEFAULT_REGION (line 8) | const DEFAULT_REGION = "us-east-1"; constant DEFAULT_OUTPUT_DIR_NAME (line 9) | const DEFAULT_OUTPUT_DIR_NAME = "terraform"; constant RDS_INSTANCE_OPTIONS (line 11) | const RDS_INSTANCE_OPTIONS = [ constant REDIS_INSTANCE_OPTIONS (line 34) | const REDIS_INSTANCE_OPTIONS = [ constant LLM_PROVIDER_OPTIONS (line 52) | const LLM_PROVIDER_OPTIONS = [ type TerraformSetupOptions (line 64) | interface TerraformSetupOptions { type TerraformVarsConfig (line 93) | interface TerraformVarsConfig { function runTerraformSetup (line 121) | async function runTerraformSetup(options: TerraformSetupOptions) { function resolveOutputDir (line 399) | function resolveOutputDir(outputDir?: string) { function ensureOutputDir (line 407) | async function ensureOutputDir(outputDir: string, nonInteractive: boolea... function getLlmSecrets (line 436) | async function getLlmSecrets(config: { function promptRequiredText (line 650) | async function promptRequiredText(config: { function promptOptionalText (line 668) | async function promptOptionalText(config: { function promptSelect (line 685) | async function promptSelect(config: { function validateLlmProvider (line 702) | function validateLlmProvider( function validateInstanceClass (line 720) | function validateInstanceClass( function promptConfirm (line 739) | async function promptConfirm(config: { function normalizeBaseUrl (line 754) | function normalizeBaseUrl(input: string) { function assertNonEmpty (line 773) | function assertNonEmpty(name: string, value: string) { function buildTerraformFiles (line 782) | function buildTerraformFiles(config: TerraformVarsConfig) { function renderTerraformTfvars (line 794) | function renderTerraformTfvars(config: TerraformVarsConfig) { function escapeTfValue (line 873) | function escapeTfValue(value: string) { function addOptionalTfVar (line 877) | function addOptionalTfVar(lines: string[], key: string, value?: string) { function findRepoRoot (line 882) | function findRepoRoot(): string | null { constant TERRAFORM_VERSIONS_TF (line 895) | const TERRAFORM_VERSIONS_TF = `terraform { constant TERRAFORM_MAIN_TF (line 911) | const TERRAFORM_MAIN_TF = `provider "aws" { constant TERRAFORM_VARIABLES_TF (line 1398) | const TERRAFORM_VARIABLES_TF = `variable "app_name" { constant TERRAFORM_OUTPUTS_TF (line 1624) | const TERRAFORM_OUTPUTS_TF = `output "alb_dns_name" { constant TERRAFORM_README_MD (line 1649) | const TERRAFORM_README_MD = `# Inbox Zero Terraform (AWS) constant TERRAFORM_GITIGNORE (line 1682) | const TERRAFORM_GITIGNORE = `.terraform/ FILE: packages/cli/src/utils.ts type EnvConfig (line 4) | type EnvConfig = Record; function generateSecret (line 7) | function generateSecret(bytes: number): string { function generateEnvFile (line 11) | function generateEnvFile(config: { constant SENSITIVE_KEYS (line 158) | const SENSITIVE_KEYS = new Set([ function isSensitiveKey (line 182) | function isSensitiveKey(key: string): boolean { function parseEnvFile (line 190) | function parseEnvFile(content: string): Record { function updateEnvValue (line 210) | function updateEnvValue( function redactValue (line 234) | function redactValue(key: string, value: string): string { function parsePortConflict (line 251) | function parsePortConflict(stderr: string): string | null { FILE: packages/loops/src/loops.ts function getLoopsClient (line 4) | function getLoopsClient(): LoopsClient | undefined { function createContact (line 16) | async function createContact( function deleteContact (line 33) | async function deleteContact( function startedTrial (line 41) | async function startedTrial( function completedTrial (line 55) | async function completedTrial( function switchedPremiumPlan (line 69) | async function switchedPremiumPlan( function cancelledPremium (line 83) | async function cancelledPremium( function updateContactProperty (line 95) | async function updateContactProperty( function updateContactRole (line 108) | async function updateContactRole({ function updateContactCompanySize (line 118) | async function updateContactCompanySize({ FILE: packages/resend/emails/action-required.tsx type ActionRequiredEmailProps (line 16) | type ActionRequiredEmailProps = { type ActionRequiredEmailComponent (line 26) | type ActionRequiredEmailComponent = FC & { function Footer (line 118) | function Footer({ FILE: packages/resend/emails/cold-email-notification.tsx type ColdEmailNotificationProps (line 15) | type ColdEmailNotificationProps = { type ColdEmailNotificationComponent (line 19) | type ColdEmailNotificationComponent = FC & { FILE: packages/resend/emails/digest.tsx type DigestItem (line 15) | type DigestItem = { type NormalizedCategoryData (line 66) | type NormalizedCategoryData = { type DigestEmailProps (line 72) | type DigestEmailProps = { function DigestEmail (line 87) | function DigestEmail(props: DigestEmailProps) { function Footer (line 574) | function Footer({ FILE: packages/resend/emails/invitation.tsx type InvitationEmailProps (line 16) | type InvitationEmailProps = { type InvitationEmailComponent (line 24) | type InvitationEmailComponent = FC & { function Footer (line 99) | function Footer({ FILE: packages/resend/emails/meeting-briefing.tsx type GuestBriefing (line 13) | type GuestBriefing = { type InternalTeamMember (line 19) | type InternalTeamMember = { type BriefingContent (line 24) | type BriefingContent = { type MeetingBriefingEmailProps (line 29) | type MeetingBriefingEmailProps = { function renderGuestBriefings (line 40) | function renderGuestBriefings(guests: GuestBriefing[]) { function renderInternalTeamNote (line 60) | function renderInternalTeamNote(internalTeamMembers: InternalTeamMember[... function MeetingBriefingEmail (line 74) | function MeetingBriefingEmail({ function generateMeetingBriefingSubject (line 195) | function generateMeetingBriefingSubject( FILE: packages/resend/emails/reconnection.tsx type ReconnectionEmailProps (line 16) | type ReconnectionEmailProps = { type ReconnectionEmailComponent (line 22) | type ReconnectionEmailComponent = FC & { function Footer (line 107) | function Footer({ FILE: packages/resend/emails/summary.tsx type EmailItem (line 18) | type EmailItem = { type SummaryEmailProps (line 24) | interface SummaryEmailProps { function SummaryEmail (line 37) | function SummaryEmail(props: SummaryEmailProps) { function ReplyTracker (line 160) | function ReplyTracker({ function ColdEmails (line 251) | function ColdEmails({ function Footer (line 293) | function Footer({ function EmailCard (line 324) | function EmailCard({ email }: { email: EmailItem }) { function EmailList (line 342) | function EmailList({ FILE: packages/resend/src/contacts.ts function createContact (line 3) | async function createContact(options: { function deleteContact (line 16) | async function deleteContact(options: { FILE: packages/resend/src/send.tsx constant RESEND_NOT_CONFIGURED_MESSAGE (line 27) | const RESEND_NOT_CONFIGURED_MESSAGE = FILE: packages/tinybird-ai-analytics/src/delete.ts constant TINYBIRD_BASE_URL (line 1) | const TINYBIRD_BASE_URL = process.env.TINYBIRD_BASE_URL; constant TINYBIRD_TOKEN (line 2) | const TINYBIRD_TOKEN = process.env.TINYBIRD_TOKEN; function deleteFromDatasource (line 4) | async function deleteFromDatasource( function deleteTinybirdAiCalls (line 37) | async function deleteTinybirdAiCalls(options: { FILE: packages/tinybird-ai-analytics/src/publish.ts type TinybirdAiCall (line 21) | type TinybirdAiCall = z.infer; FILE: packages/tinybird-ai-analytics/src/query.ts function getAiGenerationCountByEmailAccounts (line 22) | async function getAiGenerationCountByEmailAccounts(options: { FILE: packages/tinybird/src/client.ts function isTinybirdEnabled (line 8) | function isTinybirdEnabled() { FILE: packages/tinybird/src/delete.ts constant TINYBIRD_BASE_URL (line 4) | const TINYBIRD_BASE_URL = process.env.TINYBIRD_BASE_URL; constant TINYBIRD_TOKEN (line 5) | const TINYBIRD_TOKEN = process.env.TINYBIRD_TOKEN; function deleteFromDatasource (line 7) | async function deleteFromDatasource( function _deleteFromDatasourceWithRetry (line 38) | async function _deleteFromDatasourceWithRetry( FILE: packages/tinybird/src/publish.ts type TinybirdEmailAction (line 12) | type TinybirdEmailAction = z.infer; function publishEmailAction (line 19) | async function publishEmailAction( FILE: packages/tinybird/src/query.ts type ZodPeriod (line 5) | type ZodPeriod = z.infer; type EmailActionsByDay (line 13) | type EmailActionsByDay = z.infer; function getEmailActionsByDay (line 23) | async function getEmailActionsByDay(params: {