exports.id=6624,exports.ids=[6624],exports.modules={25037:(e,o,r)=>{"use strict";r.d(o,{_:()=>s});var t=r(70762);let s=t.z.object({NODE_ENV:t.z.enum(["development","test","production"]).default("development"),DATABASE_URL:t.z.string().url(),NEWSDB_URL:t.z.string().regex(/^postgresql:\/\//,"Must be a valid PostgreSQL URL"),NEWS_API_URL:t.z.string().url(),KEYCLOAK_CLIENT_ID:t.z.string(),KEYCLOAK_CLIENT_SECRET:t.z.string(),KEYCLOAK_REALM:t.z.string(),KEYCLOAK_ISSUER:t.z.string().url(),LEANTIME_TOKEN:t.z.string(),LEANTIME_API_URL:t.z.string().url(),ROCKET_CHAT_TOKEN:t.z.string(),ROCKET_CHAT_USER_ID:t.z.string()}).parse(process.env)},26690:(e,o,r)=>{"use strict";r.d(o,{N:()=>c});var t=r(1926),s=r(10591);function n(e){let o=process.env[e];if(!o)throw Error(`Missing required environment variable: ${e}`);return o}async function a(e){try{let o=await fetch(`${process.env.KEYCLOAK_ISSUER}/protocol/openid-connect/token`,{headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({client_id:process.env.KEYCLOAK_CLIENT_ID,client_secret:process.env.KEYCLOAK_CLIENT_SECRET,grant_type:"refresh_token",refresh_token:e.refreshToken||""}),method:"POST"}),r=await o.json();if(!o.ok){if("invalid_grant"===r.error||r.error_description?.includes("Session not active")||r.error_description?.includes("Token is not active"))return console.log("Keycloak session invalidated (likely logged out from iframe), marking token for removal"),{...e,error:"SessionNotActive"};throw r}return{...e,accessToken:r.access_token,refreshToken:r.refresh_token??e.refreshToken,idToken:e.idToken,accessTokenExpires:Date.now()+1e3*r.expires_in}}catch(o){if(console.error("Error refreshing access token:",o),o?.error==="invalid_grant"||o?.error_description?.includes("Session not active")||o?.error_description?.includes("Token is not active"))return{...e,error:"SessionNotActive"};return{...e,error:"RefreshAccessTokenError"}}}let c={providers:[(0,t.A)({clientId:n("KEYCLOAK_CLIENT_ID"),clientSecret:n("KEYCLOAK_CLIENT_SECRET"),issuer:n("KEYCLOAK_ISSUER"),authorization:{params:{scope:"openid profile email roles"}},profile(e){console.log("Keycloak profile callback:",{rawProfile:e,rawRoles:e.roles,realmAccess:e.realm_access,groups:e.groups});let o=e.realm_access?.roles||[];console.log("Profile callback raw roles:",o);let r=o.map(e=>e.replace(/^ROLE_/,"").toLowerCase());return console.log("Profile callback cleaned roles:",r),{id:e.sub,name:e.name??e.preferred_username,email:e.email,first_name:e.given_name??"",last_name:e.family_name??"",username:e.preferred_username??e.email?.split("@")[0]??"",role:r}}})],session:{strategy:"jwt",maxAge:2592e3},callbacks:{async jwt({token:e,account:o,profile:r}){if(o&&r){let t=(r.realm_access?.roles||[]).map(e=>e.replace(/^ROLE_/,"").toLowerCase());e.accessToken=o.access_token??"",e.refreshToken=o.refresh_token??"",e.idToken=o.id_token??"",e.accessTokenExpires=o.expires_at??0,e.sub=r.sub,e.role=t,e.username=r.preferred_username??"",e.first_name=r.given_name??"",e.last_name=r.family_name??""}else if(e.accessToken)try{let o=(0,s.s)(e.accessToken);o.realm_access?.roles&&(e.role=o.realm_access.roles.map(e=>e.replace(/^ROLE_/,"").toLowerCase()))}catch(e){console.error("Error decoding token:",e)}let t=e.accessTokenExpires;if(t&&Date.now(){"use strict";r.d(o,{GW:()=>u,J1:()=>h,oK:()=>f});var t=r(94612);let s=process.env.MICROSOFT_TENANT_ID||"common",n=`https://login.microsoftonline.com/${s}/oauth2/v2.0/authorize`,a=`https://login.microsoftonline.com/${s}/oauth2/v2.0/token`,c=process.env.MICROSOFT_CLIENT_ID,i=process.env.MICROSOFT_CLIENT_SECRET,l=process.env.MICROSOFT_REDIRECT_URI;console.log("Microsoft OAuth Configuration:",{tenantId:s,authorizeUrl:n,tokenUrl:a,clientIdFirstChars:c?c.substring(0,5)+"...":"undefined",redirectUri:l});let d="offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send";function u(e){let o=new URLSearchParams({client_id:c,response_type:"code",redirect_uri:l,scope:d,state:e,response_mode:"query"});return`${n}?${o.toString()}`}async function f(e){let o=new URLSearchParams({client_id:c,client_secret:i,code:e,redirect_uri:l,grant_type:"authorization_code"});try{console.log(`Exchanging code for tokens. URL: ${a}`);let e=await t.A.post(a,o.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}});return console.log("Token exchange successful!"),{access_token:e.data.access_token,refresh_token:e.data.refresh_token,expires_in:e.data.expires_in}}catch(e){if(console.error("Error exchanging code for tokens:",e),e.response){console.error("Response data:",e.response.data),console.error("Response status:",e.response.status),console.error("Response headers:",e.response.headers);let o=e.response.data;if(o&&o.error_description)throw Error(`Token exchange failed: ${o.error_description}`)}throw Error("Failed to exchange authorization code for tokens")}}async function h(e){let o=new URLSearchParams({client_id:c,client_secret:i,refresh_token:e,grant_type:"refresh_token",scope:d});try{console.log(`Refreshing access token. URL: ${a}`);let e=await t.A.post(a,o.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}});return console.log("Token refresh successful!"),{access_token:e.data.access_token,refresh_token:e.data.refresh_token,expires_in:e.data.expires_in}}catch(e){if(console.error("Error refreshing token:",e),e.response){console.error("Response data:",e.response.data),console.error("Response status:",e.response.status),console.error("Response headers:",e.response.headers);let o=e.response.data;if(o&&o.error_description)throw Error(`Token refresh failed: ${o.error_description}`)}throw Error("Failed to refresh access token")}}},78335:()=>{},79464:(e,o,r)=>{"use strict";r.d(o,{z:()=>n});var t=r(96330),s=r(25037);let n=globalThis.prisma||new t.PrismaClient({datasources:{db:{url:s._.DATABASE_URL}},log:["query"]})},87795:(e,o,r)=>{"use strict";r.d(o,{uu:()=>R,Yg:()=>b,cE:()=>A,IF:()=>w,nJ:()=>x,QM:()=>T,e9:()=>v,tE:()=>E,ZM:()=>O,vC:()=>C,Nw:()=>I});var t=r(67218);r(79130);var s=r(12461),n=r(49526),a=r(79464),c=r(29908),i=r(36781),l=r(42873);async function d(e,o){try{console.log(`Checking if token refresh is needed for ${o}`);let r=(0,i.nr)(),t=i.Rk.CREDENTIALS(e,o),s=await r.get(t),n=null;if(s)n=JSON.parse(s);else{console.log(`No credentials found in Redis for ${o}, checking Prisma database...`);let s=await a.z.mailCredentials.findFirst({where:{userId:e,email:o,use_oauth:!0}});if(!s||!s.refresh_token)return console.log(`No OAuth credentials found in database for ${o}`),{accessToken:"",success:!1};n={useOAuth:!0,refreshToken:s.refresh_token,accessToken:s.access_token||null,tokenExpiry:s.token_expiry?s.token_expiry.getTime():null,email:s.email,host:s.host,port:s.port,secure:s.secure},await r.set(t,JSON.stringify(n),"EX",86400),console.log(`Recovered credentials from Prisma and cached in Redis for ${o}`)}if(!n.useOAuth||!n.refreshToken)return console.log(`Account ${o} is not using OAuth or missing refresh token`),{accessToken:"",success:!1};if(n.tokenExpiry&&n.accessToken&&n.tokenExpiry>Date.now()+3e5)return console.log(`Token for ${o} is still valid, no refresh needed`),{accessToken:n.accessToken,success:!0};console.log(`Refreshing token for ${o}`);let c=await (0,l.J1)(n.refreshToken);n.accessToken=c.access_token,c.refresh_token&&(n.refreshToken=c.refresh_token),n.tokenExpiry=Date.now()+1e3*c.expires_in,await r.set(t,JSON.stringify(n),"EX",86400),console.log(`Token for ${o} refreshed and cached in Redis`);try{let r=await a.z.mailCredentials.findFirst({where:{userId:e,email:o}});r?(await a.z.mailCredentials.update({where:{id:r.id},data:{access_token:c.access_token,refresh_token:c.refresh_token||r.refresh_token,token_expiry:new Date(Date.now()+1e3*c.expires_in),use_oauth:!0}}),console.log(`Token for ${o} persisted to Prisma database`)):console.warn(`Account ${o} not found in Prisma, cannot persist tokens`)}catch(e){console.error(`Error persisting tokens to database for ${o}:`,e)}return{accessToken:c.access_token,success:!0}}catch(e){return console.error(`Error refreshing token for ${o}:`,e),{accessToken:"",success:!1}}}var u=r(17478);let f={},h=0,m=0,g=0,p=0,k=Date.now();async function w(e,o){let r=Date.now();if(h++,console.log(`Getting IMAP connection for user ${e}${o?` account ${o}`:""}`),!o||"default"===o){console.log(`No specific account provided or 'default' requested, trying to find first account for user ${e}`);let r=await (0,i.mX)(e);if(r&&r.defaultAccountId)o=r.defaultAccountId,console.log(`Using cached default account ID: ${o}`);else{let t=await a.z.mailCredentials.findMany({where:{userId:e},orderBy:{createdAt:"asc"},take:1});if(t&&t.length>0){let s=t[0];console.log(`Using first available account: ${s.id} (${s.email})`),o=s.id,r?await (0,i.Kb)(e,{...r,defaultAccountId:o,lastActive:Date.now()}):await (0,i.Kb)(e,{lastActive:Date.now(),defaultAccountId:o})}else throw p++,Error("No email accounts configured for this user")}}let t=`${e}:${o}`;if(f[t]){let s=f[t];if(s.isConnecting&&s.connectionPromise){console.log(`Connection in progress for ${t}, waiting for existing connection`);try{let e=await s.connectionPromise;return s.lastUsed=Date.now(),g++,console.log(`[IMAP] Reused pending connection for ${t} in ${Date.now()-r}ms`),e}catch(e){console.error(`Error waiting for connection for ${t}:`,e)}}try{if(s.client&&s.client.usable)return s.lastUsed=Date.now(),console.log(`Reusing existing IMAP connection for ${t}`),await $(e,o),g++,console.log(`[IMAP] Successfully reused connection for ${t} in ${Date.now()-r}ms`),s.client;console.log(`Existing connection for ${t} not usable, recreating`)}catch(e){console.warn(`Error checking existing connection for ${t}:`,e)}}console.log(`Creating new IMAP connection for ${t}`);let s=await (0,i.Po)(e,o);if(console.log(`Retrieved credentials from Redis cache for ${e}:${o}:`,s?{email:s.email,hasPassword:!!s.password,useOAuth:!!s.useOAuth,hasAccessToken:!!s.accessToken,hasRefreshToken:!!s.refreshToken}:"No credentials found in cache"),!s){console.log(`Credentials not found in cache for ${e}${o?` account ${o}`:""}, attempting database lookup`);let r=await a.z.mailCredentials.findFirst({where:{AND:[{userId:e},o?{id:o}:{}]}});if(!r)throw console.error(`No credentials found for user ${e}${o?` account ${o}`:""}`),p++,Error("Email account credentials not found");console.log(`Database lookup returned credentials for ${r.email}:`,{email:r.email,hasPassword:!!r.password,fields:Object.keys(r)}),s={email:r.email,password:r.password||"",host:r.host,port:r.port,secure:r.secure,smtp_host:r.smtp_host||void 0,smtp_port:r.smtp_port||void 0,smtp_secure:r.smtp_secure??!1,display_name:r.display_name||void 0,color:r.color||void 0,useOAuth:r.use_oauth||!1,accessToken:r.access_token||void 0,refreshToken:r.refresh_token||void 0,tokenExpiry:r.token_expiry?r.token_expiry.getTime():void 0}}let n=s;if("outlook.office365.com"===n.host&&(console.log(`Microsoft account detected (${n.email}), setting useOAuth=true`),n.useOAuth=!0,!n.password&&!n.accessToken))try{let r=await (0,i.Po)(e,o);r&&r.refreshToken?(console.log(`Found refresh token in Redis for ${n.email}, will use it`),n.refreshToken=r.refreshToken,n.accessToken=r.accessToken,n.tokenExpiry=r.tokenExpiry,await (0,i.pz)(e,o,n)):console.warn(`No refresh token found for ${n.email} in Redis cache`)}catch(e){console.error(`Error retrieving cached credentials for ${n.email}:`,e)}if(n.useOAuth){console.log("Account is configured to use OAuth"),n.accessToken||console.error(`OAuth is enabled but no access token for account ${n.email}`);try{console.log(`Ensuring fresh token for OAuth account ${n.email}`);let{accessToken:o,success:r}=await d(e,n.email);r&&o?(n.accessToken=o,console.log(`Successfully refreshed token for ${n.email}`)):console.error(`Failed to refresh token for ${n.email}`)}catch(e){console.error(`Error refreshing token for ${n.email}:`,e)}}f[t]={client:null,lastUsed:Date.now(),isConnecting:!0,connectionAttempts:(f[t]?.connectionAttempts||0)+1};let c=setTimeout(()=>{console.error(`[IMAP] Connection for ${t} timed out after 60 seconds`),f[t]?.isConnecting&&(delete f[t],p++)},6e4),l=_(n,t).then(s=>(f[t].client=s,f[t].isConnecting=!1,f[t].lastUsed=Date.now(),c&&(clearTimeout(c),c=null),$(e,o).catch(e=>{console.error(`Failed to update session data: ${e.message}`)}),m++,console.log(`[IMAP] Created new connection for ${t} in ${Date.now()-r}ms (attempt #${f[t].connectionAttempts})`),s)).catch(e=>{throw c&&(clearTimeout(c),c=null),console.error(`Failed to create IMAP connection for ${t}:`,e),delete f[t],p++,e});return f[t].connectionPromise=l,l}async function _(e,o){let r;if(console.log("Creating IMAP connection with credentials:",{email:e.email,host:e.host,port:e.port,hasPassword:!!e.password,useOAuth:!!e.useOAuth,hasAccessToken:!!e.accessToken,hasRefreshToken:!!e.refreshToken,hasTokenExpiry:!!e.tokenExpiry}),e.useOAuth&&e.accessToken)console.log(`Using XOAUTH2 authentication for ${o} (OAuth enabled)`),r={user:e.email,accessToken:e.accessToken},console.log(`XOAUTH2 auth configured for ${o}`);else if(e.password)console.log(`Using password authentication for ${o} (OAuth not enabled or no token)`),r={user:e.email,pass:e.password};else throw console.error(`No authentication method found for ${o}:`,{hasPassword:!!e.password,useOAuth:!!e.useOAuth,hasAccessToken:!!e.accessToken}),Error(`No authentication method available for ${o} - need either password or OAuth token`);console.log(`Creating ImapFlow client for ${o} with authentication type: ${e.useOAuth?"OAuth":"Password"}`);let t=new s._({host:e.host,port:e.port,secure:e.secure??!0,auth:r,logger:!1,emitLogs:!1,tls:{rejectUnauthorized:!1},disableAutoIdle:!1});try{console.log(`Connecting to IMAP server: ${e.host}:${e.port}`),await t.connect(),console.log(`Successfully connected to IMAP server for ${o}`)}catch(e){throw console.error(`Failed to connect to IMAP server for ${o}:`,e),e}return t.on("error",e=>{console.error(`IMAP connection error for ${o}:`,e),f[o]&&delete f[o]}),t}async function $(e,o){let r=await (0,i.mX)(e);r?await (0,i.Kb)(e,{...r,lastActive:Date.now(),...o&&{defaultAccountId:o}}):await (0,i.Kb)(e,{lastActive:Date.now(),...o&&{defaultAccountId:o}})}async function T(e,o){let r=await a.z.mailCredentials.findFirst({where:{AND:[{userId:e},o?{id:o}:{}]}});return r?{email:r.email,password:r.password,host:r.host,port:r.port,secure:r.secure,smtp_host:r.smtp_host||void 0,smtp_port:r.smtp_port||void 0,smtp_secure:r.smtp_secure??!1,display_name:r.display_name||void 0,color:r.color||void 0}:null}async function E(e,o,r){if(console.log("Saving credentials for user:",e,"account:",o),!r)throw Error("No credentials provided");let t={useOAuth:r.useOAuth,accessToken:r.accessToken,refreshToken:r.refreshToken,tokenExpiry:r.tokenExpiry},s={email:r.email,password:r.password??"",host:r.host,port:r.port,secure:r.secure??!0,smtp_host:r.smtp_host||null,smtp_port:r.smtp_port||null,smtp_secure:r.smtp_secure??!1,display_name:r.display_name||null,color:r.color||null,use_oauth:t.useOAuth||!1,refresh_token:t.refreshToken||null,access_token:t.accessToken||null,token_expiry:t.tokenExpiry?new Date(t.tokenExpiry):null};try{console.log("Saving credentials to database:",{...s,password:s.password?"***":null}),console.log("OAuth data will be saved to both Prisma and Redis:",{hasOAuth:!!t.useOAuth,hasAccessToken:!!t.accessToken,hasRefreshToken:!!t.refreshToken,tokenExpiry:t.tokenExpiry?new Date(t.tokenExpiry).toISOString():null}),await a.z.mailCredentials.upsert({where:{id:await a.z.mailCredentials.findFirst({where:{AND:[{userId:e},{email:o}]},select:{id:!0}}).then(e=>e?.id??"")},update:s,create:{userId:e,...s}});let r={...s,...t};await (0,i.pz)(e,o,r),console.log("Successfully saved credentials to database and cached full data with OAuth tokens")}catch(e){throw console.error("Error saving credentials:",e),e}}async function A(e,o,r=1,t=20,s,n=!1){console.log(`[getEmails] Processing request for folder: ${o}, normalized to ${o}, account: ${s||"default"}, checkOnly: ${n}`);try{let a=await w(e,s),c=s||"default";try{let s=await a.mailboxOpen(o);console.log(`Opened mailbox ${o} with ${s.exists} messages`);let l=await x(a,c),d=s.exists||0,u=Math.ceil(d/t);if(0===d){let s={emails:[],totalEmails:0,page:r,perPage:t,totalPages:0,folder:o,mailboxes:l,newestEmailId:0};return n||await (0,i.dF)(e,c,o,r,t,s),s}if(n){console.log("[getEmails] checkOnly mode: fetching only the most recent email ID");let e=d.toString();console.log(`[getEmails] Fetching latest message with sequence: ${e}`);let s=await a.fetch(e,{uid:!0}),n=0;for await(let e of s)n=e.uid;return console.log(`[getEmails] Latest email UID: ${n}`),{emails:[],totalEmails:d,page:r,perPage:t,totalPages:u,folder:o,mailboxes:l,newestEmailId:n}}let f=Math.max(1,d-r*t+1),h=Math.max(1,d-(r-1)*t);console.log(`Fetching messages ${f}:${h} from ${o} for account ${c}`);let m=await a.fetch(`${f}:${h}`,{envelope:!0,flags:!0,bodyStructure:!0,uid:!0}),g=[],p=0;for await(let e of m){e.uid>p&&(p=e.uid);let r={id:e.uid.toString(),from:e.envelope.from?.map(e=>({name:e.name||"",address:e.address||""}))||[],to:e.envelope.to?.map(e=>({name:e.name||"",address:e.address||""}))||[],subject:e.envelope.subject||"",date:e.envelope.date||new Date,flags:{seen:e.flags.has("\\Seen"),flagged:e.flags.has("\\Flagged"),answered:e.flags.has("\\Answered"),draft:e.flags.has("\\Draft"),deleted:e.flags.has("\\Deleted")},size:e.size||0,hasAttachments:e.bodyStructure?.childNodes?.some(e=>"attachment"===e.disposition)||!1,folder:o,contentFetched:!1,accountId:c,content:{text:"",html:"",isHtml:!1,direction:"ltr"}};g.push(r)}let k={emails:g,totalEmails:d,page:r,perPage:t,totalPages:Math.ceil(d/t),folder:o,mailboxes:l,newestEmailId:p};return n||await (0,i.dF)(e,c,o,r,t,k),k}catch(e){throw console.error("Error fetching emails:",e),e}}catch(e){throw console.error("Error fetching emails:",e),e}}function y(e){return e&&Array.isArray(e)?e.map(e=>({name:e.name||e.address||"",address:e.address||""})):[]}async function b(e,o,r="INBOX",t){if(!e||!o||!r)throw Error("Missing required parameters");if(!/^\d+$/.test(o))throw Error("Invalid email ID format: must be a numeric UID");let s=parseInt(o,10);if(isNaN(s))throw Error("Email ID must be a number");let n=(r.includes(":")?r.split(":")[0]:t)||t||"default",a=r.includes(":")?r.split(":")[1]:r;console.log(`[getEmailContent] Fetching email ${o} from folder ${a}, account ${n}`);let l=await (0,i.Ij)(e,n,o);if(l)return console.log(`Using cached email content for ${e}:${n}:${o}`),l;console.log(`Cache miss for email content ${e}:${n}:${o}, fetching from IMAP`);let d=await w(e,n);try{let r,t;await d.mailboxOpen(a),console.log(`[DEBUG] Fetching email ${o} from folder ${a} for account ${n}`);let l=await d.mailboxOpen(a);if(!l||"boolean"==typeof l)throw Error(`Failed to open mailbox: ${a} for account ${n}`);console.log(`[DEBUG] Mailbox ${a} opened for account ${n}, total messages: ${l.exists}`);let u=l.uidValidity,f=l.uidNext;if(console.log(`[DEBUG] Mailbox UIDVALIDITY: ${u}, UIDNEXT: ${f} for account ${n}`),s>=f)throw Error(`Email ID ${s} is greater than or equal to the highest UID in mailbox (${f}) for account ${n}`);let h=await d.search({uid:s.toString()});if(!h||0===h.length)throw Error(`Email with UID ${s} not found in folder ${a} for account ${n}`);let m=h[0];console.log(`[DEBUG] Found sequence number ${m} for UID ${s} in account ${n}`);try{r=await d.fetchOne(m.toString(),{source:!0,envelope:!0,flags:!0,size:!0})}catch(e){throw console.error(`Error fetching message with sequence ${m}:`,e),Error(`Failed to fetch email: ${e instanceof Error?e.message:"Unknown error"}`)}if(!r)throw Error(`Email not found with sequence number ${m} in folder ${a} for account ${n}`);if(!r.source||!r.envelope)throw Error("Invalid email data received: missing source or envelope data");let{source:g,envelope:p,flags:k,size:w}=r;if(!p)throw Error("Email envelope data is missing");try{t=await (0,c.simpleParser)(g.toString(),{skipHtmlToText:!0,keepCidLinks:!0})}catch(e){throw console.error(`Error parsing email content for ${o}:`,e),Error(`Failed to parse email content: ${e instanceof Error?e.message:"Unknown error"}`)}let _=Array.from(k),$=t.html||"",T={id:o,messageId:p.messageId,subject:p.subject||"(No Subject)",from:y(p.from),to:y(p.to),cc:y(p.cc),bcc:y(p.bcc),date:p.date||new Date,flags:{seen:_.includes("\\Seen"),flagged:_.includes("\\Flagged"),answered:_.includes("\\Answered"),deleted:_.includes("\\Deleted"),draft:_.includes("\\Draft")},hasAttachments:t.attachments?.length>0,attachments:t.attachments?.map(e=>({filename:e.filename||"attachment",contentType:e.contentType,size:e.size||0})),content:{text:t.text||"",html:$||"",isHtml:!!$,direction:"ltr"},folder:a,contentFetched:!0,size:w||0,accountId:n};return await (0,i.wp)(e,n,o,T),T}catch(r){throw console.error("[ERROR] Email fetch failed:",{userId:e,emailId:o,folder:a,accountId:n,error:r instanceof Error?r.message:"Unknown error",details:r instanceof Error?r.stack:void 0}),r}finally{try{await d.mailboxClose()}catch(e){console.error("Error closing mailbox:",e)}}}async function v(e,o,r,t="INBOX",s){let n=(t.includes(":")?t.split(":")[0]:s)||s||"default",a=t.includes(":")?t.split(":")[1]:t;console.log(`[markEmailReadStatus] Marking email ${o} as ${r?"read":"unread"} in folder ${a}, account ${n}`);let c=await w(e,n);try{return await c.mailboxOpen(a),r?await c.messageFlagsAdd(o,["\\Seen"]):await c.messageFlagsRemove(o,["\\Seen"]),await (0,i.nV)(e,n,o),await (0,i.gU)(e,n,a),!0}catch(e){return console.error(`Error marking email ${o} as ${r?"read":"unread"} in folder ${a}, account ${n}:`,e),!1}finally{try{await c.mailboxClose()}catch(e){console.error("Error closing mailbox:",e)}}}async function I(e,o,r,t="INBOX",s){let n=(t.includes(":")?t.split(":")[0]:s)||s||"default",a=t.includes(":")?t.split(":")[1]:t;console.log(`[toggleEmailFlag] Marking email ${o} as ${r?"flagged":"unflagged"} in folder ${a}, account ${n}`);let c=await w(e,n);try{return await c.mailboxOpen(a),r?await c.messageFlagsAdd(o,["\\Flagged"]):await c.messageFlagsRemove(o,["\\Flagged"]),await (0,i.nV)(e,n,o),!0}catch(e){return console.error(`Error toggling flag for email ${o} in folder ${a}, account ${n}:`,e),!1}finally{try{await c.mailboxClose()}catch(e){console.error("Error closing mailbox:",e)}}}async function O(e,o){let r=await T(e);if(!r)return{success:!1,error:"No email credentials found"};let t=r.useOAuth&&r.accessToken?{type:"OAuth2",user:r.email,accessToken:r.accessToken}:{user:r.email,pass:r.password},s=n.createTransport({host:r.smtp_host||"smtp.infomaniak.com",port:r.smtp_port||587,secure:r.smtp_secure||!1,auth:t,tls:{rejectUnauthorized:!1}});try{let e=await s.sendMail({from:r.email,to:o.to,cc:o.cc,bcc:o.bcc,subject:o.subject,text:o.body,html:o.body,attachments:o.attachments?.map(e=>({filename:e.name,content:e.content,contentType:e.type}))});return{success:!0,messageId:e.messageId}}catch(e){return console.error("Failed to send email:",e),{success:!1,error:e instanceof Error?e.message:"Unknown error"}}}async function x(e,o){try{let r=await e.list();if(o)return r.map(e=>`${o}:${e.path}`);return r.map(e=>e.path)}catch(e){return console.error("Error fetching mailboxes:",e),[]}}async function C(e){console.log("Testing connection with:",{...e,password:e.password?"***":void 0,accessToken:e.accessToken?"***":void 0,refreshToken:e.refreshToken?"***":void 0});try{let o;console.log(`Testing IMAP connection to ${e.host}:${e.port} for ${e.email}`),e.useOAuth&&e.accessToken?(console.log("Using XOAUTH2 authentication mechanism"),o={user:e.email,accessToken:e.accessToken},console.log(`Access token available (length: ${e.accessToken.length})`)):(console.log("Using password authentication mechanism"),o={user:e.email,pass:e.password});let r=new s._({host:e.host,port:e.port,secure:e.secure??!0,auth:o,logger:!1,tls:{rejectUnauthorized:!1}});console.log("Attempting to connect to IMAP server..."),await r.connect(),console.log("IMAP connection successful! Getting mailboxes...");let t=await x(r);await r.logout(),console.log(`IMAP connection successful for ${e.email}`),console.log(`Found ${t.length} folders:`,t);let a=!1;if(e.smtp_host&&e.smtp_port)try{console.log(`Testing SMTP connection to ${e.smtp_host}:${e.smtp_port}`);let o=e.useOAuth&&e.accessToken?{type:"OAuth2",user:e.email,accessToken:e.accessToken}:{user:e.email,pass:e.password},r=n.createTransport({host:e.smtp_host,port:e.smtp_port,secure:e.smtp_secure??!1,auth:o,tls:{rejectUnauthorized:!1}});await r.verify(),console.log(`SMTP connection successful for ${e.email}`),a=!0}catch(o){return console.error(`SMTP connection failed for ${e.email}:`,o),{imap:!0,smtp:!1,error:`SMTP connection failed: ${o instanceof Error?o.message:"Unknown error"}`,folders:t}}return{imap:!0,smtp:a,folders:t}}catch(o){return console.error(`IMAP connection failed for ${e.email}:`,o),{imap:!1,error:`IMAP connection failed: ${o instanceof Error?o.message:"Unknown error"}`}}}async function R(e){try{let o=await a.z.mailCredentials.findMany({where:{userId:e}});if(!o||0===o.length)return console.log(`No email accounts found for user ${e}`),!1;for(let r of o){let o={host:r.host,port:r.port,email:r.email,password:r.password||void 0,secure:r.secure,smtp_host:r.smtp_host||void 0,smtp_port:r.smtp_port||void 0,smtp_secure:r.smtp_secure||void 0,display_name:r.display_name||void 0,color:r.color||void 0};await (0,i.pz)(e,r.id,o),console.log(`Recached credentials for user ${e}, account ${r.id}`),await (0,i.gU)(e,r.id,"*"),await (0,i.nV)(e,r.id,"*")}return!0}catch(o){return console.error(`Error recaching credentials for user ${e}:`,o),!1}}setInterval(()=>{let e=Date.now(),o=Object.keys(f);e-k>36e5&&(console.log(`[IMAP METRICS] Total requests: ${h}, New connections: ${m}, Reused: ${g}, Errors: ${p}, Success rate: ${((g+m)/h*100).toFixed(2)}%`),h=0,m=0,g=0,p=0,k=e);let r={};o.forEach(e=>{let o=e.split(":")[0];r[o]||(r[o]=[]),r[o].push(e)}),Object.entries(r).forEach(([o,r])=>{let t=r.map(e=>({key:e,lastUsed:f[e].lastUsed})).sort((e,o)=>e.lastUsed-o.lastUsed),s=new Set(t.slice(-2).map(e=>e.key));t.forEach(({key:o,lastUsed:r})=>{if(!s.has(o)&&!f[o].isConnecting&&e-r>18e5){console.log(`Closing idle IMAP connection for ${o} (idle for ${Math.round((e-r)/1e3)}s)`);try{f[o].client.usable&&f[o].client.logout().catch(e=>{console.error(`Error closing idle connection for ${o}:`,e)})}catch(e){console.error(`Error checking connection status for ${o}:`,e)}finally{delete f[o],console.log(`Removed idle connection for ${o} from pool (pool size: ${Object.keys(f).length})`)}}})});let t=o.filter(e=>{let o=f[e];return!o.isConnecting&&(o.client?.usable||!1)}).length,s=o.filter(e=>f[e].isConnecting).length;console.log(`[IMAP POOL] Size: ${o.length}, Active: ${t}, Connecting: ${s}, Max: 20`)},6e4),(0,u.D)([w,T,E,A,b,v,I,O,x,C,R]),(0,t.A)(w,"6092b43564b136264f47b6839f2d73d16b93f0c144",null),(0,t.A)(T,"60301dd4c97b25a22f52a1b2ed0345927c7009f42a",null),(0,t.A)(E,"70947927b21002dafca76b076ccfddf03253e7eb74",null),(0,t.A)(A,"7e6e570fb277cfaffa51dd4472fb1c179f100a8f64",null),(0,t.A)(b,"78b69d87b0e79f11066ba9300fd1a70693d2c10285",null),(0,t.A)(v,"7c77f9d2d4c8842439e682f54cfa5bc3173f505232",null),(0,t.A)(I,"7c4795a4c07f98f5945bac30357610c05c6e402ec1",null),(0,t.A)(O,"605c77ef308e7aab8c30ce77cbd91d7851d438cd06",null),(0,t.A)(x,"60942df3263695c44a36c3b274f620e2859980e1c0",null),(0,t.A)(C,"409083e64f5fe82bb580397645258675cdecd4aedb",null),(0,t.A)(R,"40aaa3ff37ac0b9242a82825b209b3f3998b2827ea",null)},96487:()=>{}};