@@ -14,6 +14,7 @@ import { BoardMemberService } from '@/services/board-member.service';
1414import { DomainService } from '@/services/domain.service' ;
1515import { EmailDraftService } from '@/services/email-draft.service' ;
1616import { GmailAccountService } from '@/services/gmail-account.service' ;
17+ import { GmailAttachmentService } from '@/services/gmail-attachment.service' ;
1718import { htmlToText } from '@/utils/email' ;
1819import { ENV } from '@/utils/env' ;
1920import { reportError } from '@/utils/error-tracking' ;
@@ -52,6 +53,7 @@ const AGENT_CATEGORIZATION = {
5253- {{categories}}
5354
5455Only output one of the above categories without any explanation.` ,
56+ model : ENV . LLM_FAST_MODEL ,
5557} ;
5658
5759export class EmailMessageService {
@@ -198,7 +200,10 @@ export class EmailMessageService {
198200 // Collect EmailMessages and Attachments
199201 let lastExternalHistoryId : string | undefined ;
200202 // Return type from parseEmailMessage
201- const emailMessagesDescByThreadId : Record < string , ReturnType < typeof EmailMessageService . parseEmailMessage > [ ] > = { } ;
203+ const emailMessagesDescByThreadId : Record <
204+ string ,
205+ Awaited < ReturnType < typeof EmailMessageService . parseEmailMessage > > [ ]
206+ > = { } ;
202207 const domainNames = new Set < string > ( ) ;
203208 const processedMessageIds = new Set < string > ( ) ;
204209
@@ -208,7 +213,7 @@ export class EmailMessageService {
208213 const messageData = await GmailApi . getMessage ( gmail , message . id ) ;
209214 if ( messageData . labelIds ?. includes ( LABEL . DRAFT ) ) continue ; // Skip drafts
210215
211- const emailMessage = EmailMessageService . parseEmailMessage ( { gmailAccount, messageData } ) ;
216+ const emailMessage = await EmailMessageService . parseEmailMessage ( { gmailAccount, messageData } ) ;
212217 ( emailMessagesDescByThreadId [ emailMessage . externalThreadId ] ??= [ ] ) . push ( emailMessage ) ;
213218 domainNames . add ( emailMessage . loadedDomain . name ) ;
214219 processedMessageIds . add ( message . id ) ;
@@ -232,7 +237,7 @@ export class EmailMessageService {
232237 if ( messageData . labelIds ?. includes ( LABEL . DRAFT ) ) continue ; // Skip drafts
233238
234239 console . log ( `[GMAIL] Processing ${ gmailAccount . email } thread message ${ messageData . id } ...` ) ;
235- const emailMessage = EmailMessageService . parseEmailMessage ( { gmailAccount, messageData } ) ;
240+ const emailMessage = await EmailMessageService . parseEmailMessage ( { gmailAccount, messageData } ) ;
236241 ( emailMessagesDescByThreadId [ emailMessage . externalThreadId ] ??= [ ] ) . push ( emailMessage ) ;
237242 domainNames . add ( emailMessage . loadedDomain . name ) ;
238243 processedMessageIds . add ( messageData . id ) ;
@@ -343,7 +348,7 @@ export class EmailMessageService {
343348 return participant ;
344349 }
345350
346- static parseEmailMessage ( {
351+ static async parseEmailMessage ( {
347352 gmailAccount,
348353 messageData,
349354 } : {
@@ -416,6 +421,17 @@ export class EmailMessageService {
416421 size : attachmentData . size ,
417422 contentId : attachmentData . contentId ,
418423 } ) ;
424+
425+ if ( ! labels . includes ( LABEL . SPAM ) && ! labels . includes ( LABEL . TRASH ) ) {
426+ const data = await GmailAttachmentService . getAttachmentDataBuffer ( attachment ) ;
427+ const summary = await AgentService . generateAttachmentSummary ( {
428+ filename : attachment . filename ,
429+ mimeType : attachment . llmMimeType ,
430+ data,
431+ } ) ;
432+ attachment . setSummary ( summary ) ;
433+ }
434+
419435 attachments . push ( attachment ) ;
420436 }
421437
@@ -523,7 +539,7 @@ export class EmailMessageService {
523539 continue ; // Skip drafts
524540 }
525541
526- const emailMessage = EmailMessageService . parseEmailMessage ( { gmailAccount, messageData } ) ;
542+ const emailMessage = await EmailMessageService . parseEmailMessage ( { gmailAccount, messageData } ) ;
527543 const boardCard = boardCardByThreadId [ externalThreadId ] ;
528544
529545 if ( ! boardCard && ! EmailMessageService . boardAccountToSyncWhenNoBoardCard ( { emailMessage, gmailAccount } ) ) {
@@ -779,7 +795,7 @@ export class EmailMessageService {
779795 instructions : renderTemplate ( AGENT_CATEGORIZATION . instructionsTemplate , { categories : categories . join ( '\n- ' ) } ) ,
780796 } ) ;
781797
782- let category = CATEGORIES . OTHER ;
798+ let category = categories [ 0 ] ! ;
783799 if (
784800 ! emailMessages . some (
785801 ( emailMessage ) => emailMessage . labels . includes ( LABEL . SPAM ) || emailMessage . labels . includes ( LABEL . TRASH ) ,
0 commit comments