@mherod/get-cookie 4.3.2 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.claude/settings.local.json +3 -0
  2. package/.dependency-cruiser.js +277 -0
  3. package/.husky/commit-msg +0 -1
  4. package/.husky/pre-commit +0 -1
  5. package/.husky/pre-push +0 -0
  6. package/README.md +106 -48
  7. package/biome.json +39 -16
  8. package/dist/cli.cjs +76 -3
  9. package/dist/cli.cjs.map +1 -1
  10. package/dist/index.cjs +76 -2
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +660 -283
  13. package/dist/index.d.ts +660 -283
  14. package/dist/index.js +76 -2
  15. package/dist/index.js.map +1 -1
  16. package/dist/tsconfig.tsbuildinfo +1 -1
  17. package/eslint.config.js +23 -2
  18. package/examples/auth-tokens.ts +143 -0
  19. package/examples/chrome-cookies-demo.sh +117 -0
  20. package/examples/chrome-profile-demo.sh +126 -0
  21. package/examples/cli-examples.sh +0 -0
  22. package/examples/comprehensive-demo.ts +202 -0
  23. package/examples/curl-demo.sh +102 -0
  24. package/examples/curl-integration.sh +276 -0
  25. package/examples/curl-with-url.sh +136 -0
  26. package/examples/deduplication-demo.sh +110 -0
  27. package/examples/final-chrome-demo.sh +115 -0
  28. package/examples/github-api.sh +101 -0
  29. package/examples/github-private-access.sh +118 -0
  30. package/examples/list-profiles-demo.sh +120 -0
  31. package/examples/proper-curl-usage.sh +120 -0
  32. package/examples/simple-curl.sh +95 -0
  33. package/examples/test-expired-filtering.sh +68 -0
  34. package/examples/test-github-access.sh +245 -0
  35. package/examples/test-github-auth-improved.sh +136 -0
  36. package/examples/working-curl.sh +117 -0
  37. package/examples/working-github-auth.sh +87 -0
  38. package/package.json +72 -50
  39. package/tsconfig.cli.json +5 -1
  40. package/tsup.cli.ts +31 -1
  41. package/tsup.lib.ts +11 -1
package/dist/index.cjs CHANGED
@@ -1,3 +1,77 @@
1
- "use strict";var Ke=Object.create;var A=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var Xe=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,er=Object.prototype.hasOwnProperty;var rr=(t,e)=>{for(var r in e)A(t,r,{get:e[r],enumerable:!0})},ie=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Xe(e))!er.call(t,s)&&s!==r&&A(t,s,{get:()=>e[s],enumerable:!(o=Je(e,s))||o.enumerable});return t};var v=(t,e,r)=>(r=t!=null?Ke(Ye(t)):{},ie(e||!t||!t.__esModule?A(r,"default",{value:t,enumerable:!0}):r,t)),or=t=>ie(A({},"__esModule",{value:!0}),t);var Or={};rr(Or,{ChromeCookieQueryStrategy:()=>B,ChromiumCookieQueryStrategy:()=>J,CompositeCookieQueryStrategy:()=>X,FirefoxCookieQueryStrategy:()=>R,SafariCookieQueryStrategy:()=>L,getCookie:()=>ze});module.exports=or(Or);var ae=require("consola");var se=require("os"),ne=require("dotenv"),D=require("zod");(0,ne.config)();var tr=D.z.object({LOG_LEVEL:D.z.enum(["debug","info","warn","error"]).default("info"),HOME:D.z.string().optional().transform(t=>t??process.env.USERPROFILE??"").pipe(D.z.string().min(1))}),Y=tr.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:(0,se.homedir)()});var ir=(0,ae.createConsola)({fancy:!0,formatOptions:{showLogLevel:!1,colors:!0,date:!1,compact:!0,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:Y.LOG_LEVEL==="debug"?5:2}),Tr=Y.LOG_LEVEL==="debug",sr=ir,C=sr;function N(t){if(t==null||typeof t!="number"||Number.isNaN(t))return;if(t<=0)return"Infinity";let e=t/1e6-11644473600;return e<0||e>3250368e4?"Infinity":new Date(e*1e3)}function fe(t,e,r){e?C.success(`${t} succeeded`,r):C.error(`${t} failed`,r)}function w(t,e,r){let o=e instanceof Error?e.message:String(e);C.error(t,{...r,error:o})}function P(t,e,r){C.warn(`[${t}] ${e}`,r)}function m(t){return C.withTag(t)}var nr={info:()=>{},warn:()=>{},error:()=>{},debug:()=>{},success:()=>{},fatal:()=>{},log:()=>{}},d=class{constructor(e,r){this.browserName=r;let o=m(e);this.logger=o||nr}async queryCookies(e,r,o,s){try{return this.logger.info("Querying cookies",{name:e,domain:r,store:o,force:s}),await this.executeQuery(e,r,o,s)}catch(i){return i instanceof Error?this.logger.error("Failed to query cookies",{error:i.message,browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:o,force:s}):this.logger.error("Failed to query cookies",{error:String(i),browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:o,force:s}),[]}}};var ue=require("fs"),q=require("path"),le=v(require("fast-glob"),1);var ce=v(require("better-sqlite3"),1);var F=m("QuerySqliteThenTransform");function ar(t){return new Promise(e=>setTimeout(e,t))}function fr(t){if(t instanceof Error){let e=t.message.toLowerCase();return e.includes("database is locked")||e.includes("database locked")||e.includes("sqlite_busy")}return!1}function cr(t){try{let e=new ce.default(t,{readonly:!0,fileMustExist:!0});try{e.pragma("journal_mode = WAL"),F.debug("Set WAL mode for database",{file:t})}catch(r){let o=r instanceof Error?r.message:String(r);o.includes("readonly")||o.includes("write")?F.debug("Database is readonly, continuing with default journal mode",{file:t,error:o}):F.warn("Failed to set WAL mode, continuing with default",{file:t,error:o})}return e}catch(e){throw w("Database open failed",e,{file:t}),e}}function ur(t){try{return t.close(),Promise.resolve()}catch(e){return w("Database close failed",e),Promise.reject(e instanceof Error?e:new Error("Failed to close database: Unknown error"))}}async function lr(t){let{file:e,sql:r,params:o,rowFilter:s,rowTransform:i}=t,n;try{n=cr(e);let a=n.prepare(r).all(o),c=s?a.filter(s):a;return i?c.map(i):c}finally{n&&await ur(n)}}async function $(t){let{file:e,sql:r,retryAttempts:o=3}=t,s=[100,500,1e3],i;for(let n=0;n<o;n++)try{let f=await lr(t);return n>0&&F.info("Database query succeeded after retry",{file:e,attempt:n+1,totalAttempts:o}),f}catch(f){if(i=f,fr(f)&&n<o-1){let a=s[n]||1e3;F.warn("Database locked, retrying after delay",{file:e,attempt:n+1,totalAttempts:o,delay:a,error:f instanceof Error?f.message:String(f)}),await ar(a);continue}throw w("Database query failed",f,{file:e,sql:r,attempt:n+1}),f}throw i}var T=require("os"),U=require("path"),b=(()=>{let t=(0,T.homedir)();if(!t)throw new Error("Unable to determine user home directory");switch((0,T.platform)()){case"darwin":return(0,U.join)(t,"Library","Application Support","Google","Chrome");case"win32":return(0,U.join)(t,"AppData","Local","Google","Chrome","User Data");case"linux":return(0,U.join)(t,".config","google-chrome");default:throw new Error(`Platform ${(0,T.platform)()} is not supported`)}})();var I=m("getEncryptedChromeCookie");function pr(t){if(typeof t!="string")return!1;let e=t.trim();return e.length===0?!1:(0,ue.existsSync)(e)}async function mr(){let t=[(0,q.join)(b,"Default/Cookies"),(0,q.join)(b,"Profile */Cookies"),(0,q.join)(b,"Profile Default/Cookies")],e=[];for(let r of t){let o=await(0,le.default)(r);e.push(...o)}return I.debug("ChromeCookies","Found cookie files",{count:e.length,files:e}),e}function gr(t,e){let r=t==="%",o=r?"SELECT name, encrypted_value, host_key, expires_utc FROM cookies WHERE host_key LIKE ?":"SELECT name, encrypted_value, host_key, expires_utc FROM cookies WHERE name = ? AND host_key LIKE ?",s=r?[`%${e}%`]:[t,`%${e}%`];return{sql:o,params:s}}async function dr(t,e,r){try{let{sql:o,params:s}=gr(e,r);I.debug("ChromeCookies","Executing query",{sql:o,params:s});let i=await $({file:t,sql:o,params:s,rowTransform:n=>({name:n.name,domain:n.host_key,value:n.encrypted_value,expiry:n.expires_utc})});return fe("QueryCookies",!0,{file:t,count:i.length}),i}catch(o){return w("Failed to read cookie file",o,{file:t}),[]}}async function M({name:t,domain:e,file:r}){let o=typeof r=="string"&&r.length>0?[r]:await mr();if(o.length===0)return I.debug("ChromeCookies","No cookie files found"),[];let s=[];for(let i of o){if(!pr(i)){I.debug("ChromeCookies","Cookie file missing or invalid",{file:i});continue}let n=await dr(i,t,e);s.push(...n)}return I.debug("ChromeCookies","Query complete",{totalCookies:s.length}),s}var hr=require("fs"),yr=require("path"),pe=v(require("fast-glob"),1);var Cr=m("listChromeProfiles");function me(){let t=pe.default.sync("./**/Cookies",{cwd:b,absolute:!0});return Cr.debug("Found cookie files:",t),t}var Q=require("crypto"),ee=require("os");var ge=require("crypto");function de(t,e){let r=Buffer.from("v10");if(!t.subarray(0,3).equals(r))throw new Error("Not a v10 encrypted cookie");let o=t.subarray(3),s=12,i=16;if(o.length<s+i)throw new Error("Invalid v10 cookie: too short");let n=o.subarray(0,s),f=o.subarray(s,o.length-i),a=o.subarray(o.length-i),c=(0,ge.createDecipheriv)("aes-256-gcm",e,n);return c.setAuthTag(a),Buffer.concat([c.update(f),c.final()]).toString("utf8")}function he(t){let e=Buffer.from("v10");return t.length>=3&&t.subarray(0,3).equals(e)}function ye(t,e){let r=new Map;return o=>{let s=e?e(o):o.toString("hex");if(r.has(s)){let n=r.get(s);if(n!==void 0)return n}let i=t(o);return r.set(s,i),i}}var wr=ye(t=>t.length>=3&&t[0]===118&&t[1]===49&&t[2]===48?t.slice(3):t,t=>t.toString("hex")),br=ye(t=>{let e=t[t.length-1];return e&&e<=16?t.slice(0,-e):t},t=>t.toString("hex"));function kr(t){let e=t.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e)return e[1];let r=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/(\d{3}-\d{7}-\d{7})$/];for(let s of r){let i=t.match(s);if(i)return i[1]}let o=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-\.]+)$/];for(let s of o){let n=t.match(s)?.[1]??"";if(n.length>0)return n}return t}async function z(t,e,r){if((0,ee.platform)()==="win32"&&he(t)&&t.length>=31&&Buffer.isBuffer(e))return de(t,e);if((0,ee.platform)()==="darwin"&&!t.slice(0,3).toString().match(/^v\d\d$/))return Promise.resolve(t.toString("utf8"));if(typeof e!="string")throw new Error("password must be a string");if(!Buffer.isBuffer(t))throw new Error("encryptedData must be a Buffer");return new Promise((o,s)=>{(0,Q.pbkdf2)(e,"saltysalt",1003,16,"sha1",(i,n)=>{try{if(i){s(new Error(`Failed to derive key: ${i.message}`));return}let f=wr(t);if(f.length%16!==0){s(new Error("Encrypted data length is not a multiple of 16"));return}let a=Buffer.alloc(16," "),c=(0,Q.createDecipheriv)("aes-128-cbc",n,a);c.setAutoPadding(!1);let l=c.update(f);try{c.final()}catch(Ze){s(new Error(`Failed to finalize decryption: ${Ze.message}`));return}l=br(l);let Ge=((r||0)>=24&&l.length>32?l.slice(32):l).toString("utf8");o(kr(Ge))}catch(f){s(new Error(`Decryption failed: ${f.message}`))}})})}var oe=require("os");var Ce=require("child_process"),we=require("util");var xr=(0,we.promisify)(Ce.exec),re=class extends Error{constructor(r,o,s){super(r);this.command=o;this.originalError=s;this.name="CommandExecutionError"}};async function k(t,e){try{let r=await xr(t,{...e,encoding:"utf8"});return{stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw w("Command execution failed",r,{command:t}),new re(r instanceof Error?r.message:String(r),t,r instanceof Error?r:void 0)}}async function be(){try{let r=(await k("secret-tool lookup application chrome-libsecret-password-v2 || secret-tool lookup application chrome")).stdout.trim();if(r)return r}catch{}try{let r=(await k(`python3 -c "import keyring; print(keyring.get_password('Chrome Safe Storage', 'Chrome'))"`)).stdout.trim();if(r&&r!=="None")return r}catch{}try{let r=(await k('kwallet-query kdewallet -f "Chrome Safe Storage" -r Chrome')).stdout.trim();if(r)return r}catch{}return"peanuts"}async function ke(){return(await k('security find-generic-password -w -s "Chrome Safe Storage"')).stdout.trim()}var xe=require("fs"),Se=require("path");function Sr(encryptedKey){let DPAPI_PREFIX=Buffer.from("DPAPI");if(!encryptedKey.subarray(0,5).equals(DPAPI_PREFIX))throw new Error("Invalid DPAPI key prefix");let encryptedData=encryptedKey.subarray(5);if(process.platform==="win32")try{let moduleName="@primno/dpapi",dpapi=eval(`require("${moduleName}")`);if(dpapi&&typeof dpapi.unprotectData=="function")return dpapi.unprotectData(encryptedData)}catch(t){process.env.VERBOSE&&console.warn("DPAPI module not available:",t)}throw new Error("Windows DPAPI decryption requires native bindings. Install @primno/dpapi package for Windows support.")}function Ee(){try{let t=(0,Se.join)(b,"Local State"),e=(0,xe.readFileSync)(t,"utf8"),r=JSON.parse(e);if(!r.os_crypt?.encrypted_key)throw new Error("No encrypted key found in Chrome Local State");let o=Buffer.from(r.os_crypt.encrypted_key,"base64");return Sr(o).toString("latin1")}catch(t){throw new Error(`Failed to retrieve Chrome password on Windows: ${t instanceof Error?t.message:String(t)}`)}}async function V(){switch((0,oe.platform)()){case"darwin":return await ke();case"win32":return Ee();case"linux":return await be();default:throw new Error(`Platform ${(0,oe.platform)()} is not supported`)}}function ve(t,e,r,o,s,i){return{domain:t,name:e,value:r,expiry:N(o),meta:{file:s,browser:"Chrome",decrypted:i}}}var B=class extends d{constructor(){super("ChromeCookieQueryStrategy","Chrome")}async executeQuery(e,r,o,s){let i=["darwin","win32","linux"];if(!i.includes(process.platform))return this.logger.warn("Platform not supported",{platform:process.platform,supportedPlatforms:i}),[];let n=o??me(),f=Array.isArray(n)?n:[n];if(f.length===0)return this.logger.warn("No Chrome cookie files found"),[];let a=await V();return(await Promise.all(f.map(l=>this.processFile(l,e,r,a)))).flat()}async processFile(e,r,o,s){try{let i=await M({name:r,domain:o,file:e}),n=0;try{let c=await import("better-sqlite3"),l=new c.default(e,{readonly:!0});try{let g=l.prepare("SELECT value FROM meta WHERE key = ?").get("version");n=g?Number.parseInt(g.value,10):0}finally{l.close()}}catch(c){this.logger.debug("Could not retrieve meta version, defaulting to 0",{error:c})}let f={file:e,password:s,metaVersion:n};return(await Promise.allSettled(i.map(c=>this.processCookie(c,f)))).map(c=>c.status==="fulfilled"?c.value:null).filter(c=>c!==null)}catch(i){return i instanceof Error?this.logger.error("Failed to process cookie file",{error:i.message,file:e,name:r,domain:o}):this.logger.error("Failed to process cookie file",{error:String(i),file:e,name:r,domain:o}),[]}}async processCookie(e,r){try{let o=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),s=await z(o,r.password,r.metaVersion);return ve(e.domain,e.name,s,e.expiry,r.file,!0)}catch(o){return o instanceof Error?this.logger.warn("Failed to decrypt cookie",{error:o}):this.logger.warn("Failed to decrypt cookie",{error:String(o)}),ve(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,!1)}}};var Oe=require("os"),te=require("path"),Le=v(require("fast-glob"),1);var Pe=m("ProcessDetector");function Er(t,e){let r=t.trim().split(/\s+/);if(r.length<2)return null;let o=Number.parseInt(r[1],10);return Number.isNaN(o)?null:{pid:o,command:r.slice(10).join(" ")||e,details:t.trim()}}async function Be(){try{let t="ps aux | grep -i firefox | grep -v grep",{stdout:e}=await k(t);if(!e||e.trim()==="")return[];let r=[],o=e.split(`
2
- `).filter(s=>s.trim()!=="");for(let s of o){let i=Er(s,"firefox");i&&r.push(i)}return Pe.debug("Firefox process detection completed",{processCount:r.length,processes:r.map(s=>({pid:s.pid,command:s.command}))}),r}catch(t){return Pe.warn("Failed to detect Firefox processes",{error:t instanceof Error?t.message:String(t)}),[]}}function Re(t,e){if(e.length===0)return"";let r=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);return`${o} is currently running (${r} process${r>1?"es":""} detected). For reliable cookie access, consider closing ${o} and trying again. Alternatively, use the --force flag to attempt access despite the lock.`}function vr(t){let e=(0,Oe.homedir)();if(!e)return t.warn("Failed to get home directory"),[];let r=[(0,te.join)(e,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"),(0,te.join)(e,".mozilla/firefox/*/cookies.sqlite")],o=[];for(let s of r){let i=Le.default.sync(s);o.push(...i)}return t.debug("Found Firefox cookie files",{files:o}),o}var R=class extends d{constructor(){super("FirefoxCookieQueryStrategy","Firefox")}async handleDatabaseLockError(e,r){if(e instanceof Error&&e.message.toLowerCase().includes("database is locked"))try{let o=await Be();if(o.length>0){let s=Re("firefox",o);this.logger.warn("Firefox process conflict detected",{file:r,processCount:o.length,advice:s})}else this.logger.warn("Database locked but no Firefox processes detected",{file:r,suggestion:"Another process may be accessing the database"})}catch(o){this.logger.debug("Failed to check Firefox processes",{error:o instanceof Error?o.message:String(o)})}}async executeQuery(e,r,o,s){let i=o??vr(this.logger),n=Array.isArray(i)?i:[i],f=[];for(let a of n)try{let c=await $({file:a,sql:"SELECT name, value, host as domain, expiry FROM moz_cookies WHERE name = ? AND host LIKE ?",params:[e,`%${r}%`],rowTransform:l=>({name:l.name,value:l.value,domain:l.domain,expiry:l.expiry>0?new Date(l.expiry*1e3):"Infinity",meta:{file:a,browser:"Firefox",decrypted:!1}})});f.push(...c)}catch(c){await this.handleDatabaseLockError(c,a),c instanceof Error?this.logger.warn(`Error reading Firefox cookie file ${a}`,{error:c.message,file:a,name:e,domain:r}):this.logger.warn(`Error reading Firefox cookie file ${a}`,{error:String(c),file:a,name:e,domain:r})}return f}};var qe=require("os"),Me=require("path");var _e=require("buffer"),Ae=require("fs"),Ne=require("os"),$e=require("path");var _=require("buffer");var De=v(require("destr"),1),u=require("zod"),H=u.z.string().trim().min(1,"Domain cannot be empty").refine(t=>/^\.?[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(t),"Invalid domain format"),W=u.z.string().trim().min(1,"Cookie name cannot be empty").refine(t=>t==="%"||/^[!#$%&'()*+\-.:0-9A-Z \^_`a-z|~]+$/.test(t),"Invalid cookie name format - must contain only valid characters (letters, numbers, and certain symbols) or be '%' for wildcard"),Fe=u.z.string().trim().min(1,"Path cannot be empty").refine(t=>t.startsWith("/"),"Path must start with /").refine(t=>/^\/[!#$%&'()*+,\-./:=@\w~]*$/.test(t),"Invalid path format - must contain only valid URL path characters").default("/"),Te=u.z.string().trim().transform(t=>(0,De.default)(t)).pipe(u.z.any()),Ie=u.z.object({name:W,value:Te,domain:H,path:Fe,expiry:u.z.number().int(),creation:u.z.number().int(),flags:u.z.number().optional(),version:u.z.number().int().optional(),port:u.z.number().int().optional(),comment:u.z.string().optional(),commentURL:u.z.string().optional()}),Bo=u.z.object({name:W,domain:H}).strict(),Pr=u.z.object({file:u.z.string().trim().min(1,"File path cannot be empty").optional(),browser:u.z.string().trim().optional(),decrypted:u.z.boolean().optional(),secure:u.z.boolean().optional(),httpOnly:u.z.boolean().optional(),path:Fe.optional()}).catchall(u.z.unknown()).strict(),Br=u.z.object({domain:H,name:W,value:Te,expiry:u.z.union([u.z.literal("Infinity"),u.z.date(),u.z.number().int().positive("Expiry must be a positive number")]).optional(),meta:Pr.optional()}).strict(),Ro=u.z.object({expiry:u.z.number().int().optional(),domain:H,name:W,value:u.z.union([u.z.string(),u.z.instanceof(Buffer)])}).strict(),Oo=u.z.object({format:u.z.enum(["merged","grouped"]).optional(),separator:u.z.string().optional(),showFilePaths:u.z.boolean().optional()}).strict(),Rr=u.z.enum(["Chrome","Firefox","Safari","internal","unknown"]),Lo=u.z.object({browserName:Rr,queryCookies:u.z.function().args(u.z.string(),u.z.string(),u.z.string().optional(),u.z.boolean().optional()).returns(u.z.promise(u.z.array(Br)))}).strict();var x=m("BinaryCodableCookie"),j=class{constructor(e){this.version=0;this.url="";this.name="";this.path="";this.value="";this.flags={isSecure:!1,isHTTPOnly:!1,unknown1:!1,unknown2:!1};this.expiration=0;this.creation=0;let r={offset:0,buffer:e};this.decode(r)}decodeUrlValue(e){let r=e,o;do{o=r;try{r=decodeURIComponent(r)}catch{return o}}while(r!==o&&r.includes("%"));return r}decodeJwtPayload(e){let r=e.split(".");if(r.length!==3)return null;try{let o=_.Buffer.from(r[1],"base64").toString("utf8"),s=JSON.parse(o);return JSON.stringify(s)}catch{return null}}parseJsonValue(e){try{let r=JSON.parse(e);return JSON.stringify(r)}catch{return null}}processValue(e){if(e===null)return"null";if(e===void 0)return"undefined";if(_.Buffer.isBuffer(e))return e.toString();if(typeof e!="string")return String(e);let r=this.decodeUrlValue(e);if(r.match(/^ey[A-Za-z0-9_-]+\.ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/)){let o=this.decodeJwtPayload(r);if(typeof o=="string"&&o.length>0)return o}if(r.startsWith("{")||r.startsWith("[")){let o=this.parseJsonValue(r);if(typeof o=="string"&&o.length>0)return o}return r}convertMacTimestamp(e){return e<=0?e:e>=0&&e<=1e9&&Number.isFinite(e)?e+978307200:0}toCookieRow(){try{let e=this.convertFlags(),r=this.url.replace(/^https?:\/\//,"").replace(/\/.*$/,"")||"uk",o=this.convertMacTimestamp(this.expiration),s=this.convertMacTimestamp(this.creation);return Ie.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:o,creation:s,flags:e,version:this.version,port:this.port,comment:this.comment,commentURL:this.commentURL})}catch{return null}}readNullTerminatedString(e,r){let o=r;for(;o<e.buffer.length&&e.buffer[o]!==0;)o++;return e.buffer.toString("utf8",r,o)||""}readHeader(e){let r=e.buffer.readUInt32LE(e.offset);x.debug("Cookie size:",r),e.offset+=4;let o=e.buffer.readUInt32LE(e.offset);x.debug("Cookie version:",o),e.offset+=4;let s=e.buffer.readUInt32LE(e.offset);x.debug("Cookie flags:",s.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(s&1)!==0,isHTTPOnly:(s&4)!==0,unknown1:(s&8)!==0,unknown2:(s&16)!==0};let i=e.buffer.readUInt32LE(e.offset);x.debug("Has port:",i),e.offset+=4;let n={urlOffset:e.buffer.readUInt32LE(e.offset),nameOffset:e.buffer.readUInt32LE(e.offset+4),pathOffset:e.buffer.readUInt32LE(e.offset+8),valueOffset:e.buffer.readUInt32LE(e.offset+12),commentOffset:e.buffer.readUInt32LE(e.offset+16),commentURLOffset:e.buffer.readUInt32LE(e.offset+20)};return x.debug("String offsets:",n),{size:r,hasPort:i,offsets:n}}readTimestamps(e){let r=_.Buffer.alloc(8);for(let n=0;n<8;n++)r[n]=e.buffer[e.offset+n];let o=r.readDoubleLE(0);e.offset+=8;let s=_.Buffer.alloc(8);for(let n=0;n<8;n++)s[n]=e.buffer[e.offset+n];let i=s.readDoubleLE(0);e.offset+=8,this.expiration=o,this.creation=i}readStrings(e,r,o){x.debug("Reading strings from cookie buffer of size:",r);let i=[{field:"url",offset:o.urlOffset},{field:"name",offset:o.nameOffset},{field:"path",offset:o.pathOffset},{field:"value",offset:o.valueOffset},{field:"comment",offset:o.commentOffset}].filter(n=>n.offset>0).sort((n,f)=>n.offset-f.offset);x.debug("Reading strings in order:",i.map(n=>n.field));for(let n=0;n<i.length;n++){let{field:f,offset:a}=i[n],l=(n<i.length-1?i[n+1].offset:r)-a,g=0+a;for(;g<0+a+l&&e.buffer[g]!==0;)g++;let E=e.buffer.toString("utf8",0+a,g);switch(x.debug(`Read ${f}:`,E),f){case"url":this.url=E;break;case"name":this.name=E;break;case"path":this.path=E;break;case"value":this.value=E;break;case"comment":this.comment=E;break}}}decode(e){let{size:r,hasPort:o,offsets:s}=this.readHeader(e),i=e.offset;e.offset=i+24,this.readTimestamps(e),o>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=i,this.readStrings(e,r,s)}convertFlags(){return(this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var h=m("BinaryCodablePage"),O=class O{constructor(e){this.cookies=[];let r={offset:0,buffer:e};this.decode(r)}toCookieRows(){let e=[];for(let r of this.cookies)try{let o=r.toCookieRow();o!==null&&e.push(o)}catch(o){let s=o instanceof Error?o.message:String(o);P("BinaryCookies","Error converting cookie",{error:s})}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if(h.debug("Page header:",r.toString(16)),e.offset+=4,r!==O.HEADER)throw new Error("Invalid page header");let o=e.buffer.readUInt32LE(e.offset);h.debug("Cookie count:",o),e.offset+=4;let s=e.offset-8;h.debug("Page start offset:",s);let i=[];for(let f=0;f<o;f++){let a=e.buffer.readUInt32LE(e.offset);i.push(a),h.debug(`Cookie ${f} offset:`,a),e.offset+=4}let n=e.buffer.readUInt32BE(e.offset);if(h.debug("Page footer:",n.toString(16)),e.offset+=4,n!==O.FOOTER)throw new Error("Invalid page footer");for(let f=0;f<o;f++)try{let a=i[f];h.debug(`Reading cookie ${f} at offset:`,a);let c=e.buffer.readUInt32LE(a);if(h.debug(`Cookie ${f} size:`,c),c<48){h.warn(`Invalid cookie size ${c} at index ${f}`);continue}if(a+c>e.buffer.length){h.warn(`Cookie size ${c} at index ${f} would exceed buffer length ${e.buffer.length}`);continue}let l=e.buffer.subarray(a,a+c),g=new j(l);this.cookies.push(g)}catch(a){h.warn("Invalid cookie data",{error:a instanceof Error?a.message:String(a)})}}};O.HEADER=256,O.FOOTER=0;var G=O;var S=m("BinaryCodableCookies"),y=class y{constructor(e){let r={offset:0,buffer:e};this.pages=[],this.metadata={},this.decode(r)}static fromFile(e){let r=(0,Ae.readFileSync)(e);return new y(r)}static fromDefaultPath(){return y.fromFile(y.DEFAULT_COOKIE_PATH)}toCookieRows(){let e=[];for(let r of this.pages)try{let o=r.toCookieRows();Array.isArray(o)&&e.push(...o)}catch(o){let s=o instanceof Error?o.message:String(o);P("BinaryCookies","Error converting page cookies",{error:s})}return e}decode(e){try{let r=e.buffer.subarray(e.offset,e.offset+4);if(e.offset+=4,S.debug("Magic bytes:",r.toString()),!r.equals(y.MAGIC))throw new Error("Missing magic value");let o=e.buffer.readUInt32BE(e.offset);S.debug("Page count:",o),e.offset+=4;let s=[];for(let c=0;c<o;c++){let l=e.buffer.readUInt32BE(e.offset);s.push(l),S.debug(`Page ${c} size:`,l),e.offset+=4}let i=e.offset;S.debug("Starting page data at offset:",i);for(let c of s)try{S.debug("Reading page at offset:",i,"with size:",c);let l=e.buffer.subarray(i,i+c),g=new G(l);this.pages.push(g),i+=c}catch(l){let g=l instanceof Error?l.message:String(l);S.warn("Error decoding page:",{error:g}),i+=c}e.offset=i;let n=e.buffer.readUInt32BE(e.offset);S.debug("Checksum:",n.toString(16)),e.offset+=4;let f=e.buffer.readBigUInt64BE(e.offset);S.debug("Footer:",f.toString(16)),e.offset+=8,f!==y.FOOTER&&P("BinaryCookies","Invalid cookie file format: wrong footer");let a=e.buffer.subarray(e.offset);this.metadata={}}catch(r){let o=r instanceof Error?r.message:String(r);throw P("BinaryCookies","Error decoding binary cookies file",{error:o}),r}}};y.MAGIC=_e.Buffer.from("cook","utf8"),y.FOOTER=BigInt("0x071720050000004b"),y.DEFAULT_COOKIE_PATH=(0,$e.join)((0,Ne.homedir)(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var Z=y;function Ue(t){return Z.fromFile(t).toCookieRows()}var L=class extends d{constructor(){super("SafariCookieQueryStrategy","Safari")}getCookieDbPath(e){return(0,Me.join)(e,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies")}formatDomain(e){return e.startsWith(".")?e.slice(1):e}formatExpiry(e){return e==null?void 0:typeof e!="number"||Number.isNaN(e)||e<=0?"Infinity":e<0||e>4102444800?(this.logger.warn("Invalid expiry timestamp, treating as session cookie",{expiry:e}),"Infinity"):new Date(e*1e3)}isFlagSet(e,r){return typeof e!="number"||Number.isNaN(e)||e<=0?!1:(e&r)===r}formatCreation(e){if(typeof e!="number"||Number.isNaN(e)||e<=0)return;if(e<0||e>4102444800){this.logger.warn("Invalid creation timestamp, ignoring",{creation:e});return}return e*1e3}processValue(e){return e===null?"null":e===void 0?"undefined":Buffer.isBuffer(e)?e.toString():String(e)}decodeCookies(e,r,o){try{return Ue(e).filter(i=>(r==="%"||i.name===r)&&(o==="%"||this.formatDomain(i.domain).includes(o))).map(i=>({domain:this.formatDomain(i.domain),name:i.name,value:this.processValue(i.value),expiry:this.formatExpiry(i.expiry),meta:{file:e,browser:"Safari",decrypted:!1,secure:this.isFlagSet(i.flags,1),httpOnly:this.isFlagSet(i.flags,4),path:i.path,version:i.version,comment:i.comment,commentURL:i.commentURL,port:i.port,creation:this.formatCreation(i.creation)}}))}catch(s){let i=s instanceof Error?s.message:String(s);return i.includes("EPERM")||i.includes("operation not permitted")||i.includes("Permission denied")?this.logger.debug(`Permission denied accessing Safari cookies at ${e}`,{error:i,file:e,name:r,domain:o}):s instanceof Error?this.logger.error(`Error decoding ${e}`,{error:s.message,file:e,name:r,domain:o}):this.logger.error(`Error decoding ${e}`,{error:String(s),file:e,name:r,domain:o}),[]}}executeQuery(e,r,o,s){try{this.logger.info("Querying cookies",{name:e,domain:r,store:o});let i=(0,qe.homedir)();if(typeof i!="string"||i.length===0)return this.logger.error("Failed to get home directory"),Promise.resolve([]);let n=o??this.getCookieDbPath(i);return Promise.resolve(this.decodeCookies(n,e||"%",r||"%"))}catch(i){return i instanceof Error?this.logger.error("Failed to query cookies",{error:i.message,name:e,domain:r}):this.logger.error("Failed to query cookies",{error:String(i),name:e,domain:r}),Promise.resolve([])}}};async function Qe(t){if(!t.name||!t.domain)return[];let{name:e,domain:r}=t;if(typeof e!="string"||typeof r!="string")return[];let o=[new B,new R,new L];return(await Promise.allSettled(o.map(i=>i.queryCookies(e,r)))).filter(i=>i.status==="fulfilled").flatMap(i=>i.value)}async function ze(t){try{return await Qe(t)}catch(e){return C.warn("Error querying cookies:",e instanceof Error?e.message:String(e)),[]}}var We=v(require("fast-glob"),1);var K=require("os"),p=require("path");function Ve(t){let e=(0,K.homedir)();if(!e)throw new Error("Unable to determine user home directory");let r=(0,K.platform)(),s={chrome:{windows:(0,p.join)(e,"AppData","Local","Google","Chrome","User Data"),macos:(0,p.join)(e,"Library","Application Support","Google","Chrome"),linux:(0,p.join)(e,".config","google-chrome")},chromium:{windows:(0,p.join)(e,"AppData","Local","Chromium","User Data"),macos:(0,p.join)(e,"Library","Application Support","Chromium"),linux:(0,p.join)(e,".config","chromium")},brave:{windows:(0,p.join)(e,"AppData","Local","BraveSoftware","Brave-Browser","User Data"),macos:(0,p.join)(e,"Library","Application Support","BraveSoftware","Brave-Browser"),linux:(0,p.join)(e,".config","BraveSoftware","Brave-Browser")},edge:{windows:(0,p.join)(e,"AppData","Local","Microsoft","Edge","User Data"),macos:(0,p.join)(e,"Library","Application Support","Microsoft Edge"),linux:(0,p.join)(e,".config","microsoft-edge")},opera:{windows:(0,p.join)(e,"AppData","Roaming","Opera Software","Opera Stable"),macos:(0,p.join)(e,"Library","Application Support","com.operasoftware.Opera"),linux:(0,p.join)(e,".config","opera")},vivaldi:{windows:(0,p.join)(e,"AppData","Local","Vivaldi","User Data"),macos:(0,p.join)(e,"Library","Application Support","Vivaldi"),linux:(0,p.join)(e,".config","vivaldi")},whale:{windows:(0,p.join)(e,"AppData","Local","Naver","Naver Whale","User Data"),macos:(0,p.join)(e,"Library","Application Support","Naver","Whale"),linux:(0,p.join)(e,".config","naver-whale")}}[t];if(!s)throw new Error(`Unknown browser: ${t}`);switch(r){case"win32":return s.windows;case"darwin":return s.macos;case"linux":return s.linux;default:throw new Error(`Platform ${r} is not supported`)}}function He(t,e,r,o,s,i,n){return{domain:t,name:e,value:r,expiry:N(o),meta:{file:s,browser:i.charAt(0).toUpperCase()+i.slice(1),decrypted:n}}}var J=class extends d{constructor(e="chrome"){let r=e.charAt(0).toUpperCase()+e.slice(1);super(`${r}CookieQueryStrategy`,"Chrome"),this.browser=e}listBrowserCookiePaths(){try{let e=Ve(this.browser),r=We.default.sync("./**/Cookies",{cwd:e,absolute:!0});return this.logger.debug(`Found ${r.length} cookie files for ${this.browser}`),r}catch(e){return this.logger.warn(`Failed to find ${this.browser} cookie files`,{error:e}),[]}}async executeQuery(e,r,o,s){let i=["darwin","win32","linux"];if(!i.includes(process.platform))return this.logger.warn("Platform not supported",{platform:process.platform,supportedPlatforms:i}),[];let n=o??this.listBrowserCookiePaths(),f=Array.isArray(n)?n:[n];if(f.length===0)return this.logger.warn(`No ${this.browser} cookie files found`),[];try{let a=await V();return(await Promise.all(f.map(l=>this.processFile(l,e,r,a)))).flat()}catch(a){return this.logger.error(`Failed to get ${this.browser} password`,{error:a}),[]}}async processFile(e,r,o,s){try{let i=await M({name:r,domain:o,file:e}),n={file:e,password:s,browser:this.browser};return(await Promise.allSettled(i.map(a=>this.processCookie(a,n)))).map(a=>a.status==="fulfilled"?a.value:null).filter(a=>a!==null)}catch(i){return this.logger.error(`Failed to process ${this.browser} cookie file`,{error:i instanceof Error?i.message:String(i),file:e,name:r,domain:o}),[]}}async processCookie(e,r){try{let o=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),s=await z(o,r.password);return He(e.domain,e.name,s,e.expiry,r.file,r.browser,!0)}catch(o){return this.logger.warn(`Failed to decrypt ${this.browser} cookie`,{error:o instanceof Error?o.message:String(o)}),He(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,!1)}}};async function je(t,e,r=[]){return t.length===0?r:(await Promise.all(t.map(async s=>{try{return await e(s)}catch{return r}}))).flat()}var X=class{constructor(e){this.strategies=e;this.logger=m("CompositeCookieQueryStrategy");this.browserName="internal"}handleStrategyError(e,r){e instanceof Error?this.logger.error("Strategy failed",{error:e,strategy:r}):this.logger.error("Strategy failed with unknown error",{error:String(e),strategy:r})}async queryCookies(e,r,o,s){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:o,force:s,strategyCount:this.strategies.length}),await je(this.strategies,async i=>{try{return await i.queryCookies(e,r,o,s)}catch(n){return this.handleStrategyError(n,i),[]}},[])}catch(i){return i instanceof Error?this.logger.error("Failed to query cookies",{error:i}):this.logger.error("Failed to query cookies with unknown error",{error:String(i)}),[]}}};0&&(module.exports={ChromeCookieQueryStrategy,ChromiumCookieQueryStrategy,CompositeCookieQueryStrategy,FirefoxCookieQueryStrategy,SafariCookieQueryStrategy,getCookie});
1
+ 'use strict';var os=require('os'),dotenv=require('dotenv'),zod=require('zod'),consola=require('consola'),child_process=require('child_process'),util=require('util'),path=require('path'),fs=require('fs'),kr=require('readline'),crypto=require('crypto'),events=require('events'),Pt=require('better-sqlite3'),Bt=require('fast-glob'),buffer=require('buffer'),Qt=require('destr');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var kr__default=/*#__PURE__*/_interopDefault(kr);var Pt__default=/*#__PURE__*/_interopDefault(Pt);var Bt__default=/*#__PURE__*/_interopDefault(Bt);var Qt__default=/*#__PURE__*/_interopDefault(Qt);var Br=Object.defineProperty;var Ge=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var T=(o,e)=>()=>(o&&(e=o(o=0)),e);var we=(o,e)=>{for(var r in e)Br(o,r,{get:e[r],enumerable:true});};var Dr,Ce,Je=T(()=>{dotenv.config();Dr=zod.z.object({LOG_LEVEL:zod.z.enum(["debug","info","warn","error"]).default("info"),HOME:zod.z.string().optional().transform(o=>o??process.env.USERPROFILE??"").pipe(zod.z.string().min(1))}),Ce=Dr.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:os.homedir()});});var Nr,Fr,y,H=T(()=>{Je();Nr=consola.createConsola({formatOptions:{showLogLevel:false,colors:true,date:false,compact:true,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:Ce.LOG_LEVEL==="debug"?5:2}),Ce.LOG_LEVEL==="debug",Fr=Nr,y=Fr;});function Y(o,e,r){let t=e instanceof Error?e.message:String(e);y.error(o,{...r,error:t});}function U(o,e,r){y.warn(`[${o}] ${e}`,r);}function g(o){return y.withTag(o)}var k=T(()=>{H();H();});function h(){return Ke??(Ke=os.platform()),Ke}function N(){return h()==="darwin"}function P(){return h()==="win32"}function ke(){let o=h();return o==="darwin"||o==="win32"||o==="linux"}function z(){if(!ke())throw new Error(`Unsupported platform: ${h()}. Supported platforms are: darwin, win32, linux`)}var Ke,x=T(()=>{});async function F(o,e){try{let r=await Ir(o,{...e,encoding:"utf8"});return {stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw Y("Command execution failed",r,{command:o}),new xe(r instanceof Error?r.message:String(r),o,r instanceof Error?r:void 0)}}var Ir,xe,ie=T(()=>{k();Ir=util.promisify(child_process.exec),xe=class extends Error{constructor(r,t,i){super(r);this.command=t;this.originalError=i;this.name="CommandExecutionError";}};});var ce,Ne=T(()=>{x();ce=(()=>{let o=os.homedir();if(!o)throw new Error("Unable to determine user home directory");switch(z(),h()){case "darwin":return path.join(o,"Library","Application Support","Google","Chrome");case "win32":return path.join(o,"AppData","Local","Google","Chrome","User Data");case "linux":return path.join(o,".config","google-chrome");default:throw new Error(`Platform ${h()} is not supported`)}})();});var mr={};we(mr,{getChromePassword:()=>yt});async function ht(o){let e=Buffer.from("DPAPI");if(!o.subarray(0,5).equals(e))throw new Error("Invalid DPAPI key prefix");let r=o.subarray(5);if(P())try{let i=await import('@primno/dpapi');if(typeof i.unprotectData=="function")return i.unprotectData(r)}catch(t){process.env.VERBOSE!==void 0&&process.env.VERBOSE!==""&&console.warn("DPAPI module not available:",t);}throw new Error("Windows DPAPI decryption requires native bindings. Install @primno/dpapi package for Windows support.")}async function yt(){try{let o=path.join(ce,"Local State"),e=fs.readFileSync(o,"utf8"),r=JSON.parse(e);if(!r.os_crypt.encrypted_key)throw new Error("No encrypted key found in Chrome Local State");let t=Buffer.from(r.os_crypt.encrypted_key,"base64");return (await ht(t)).toString("latin1")}catch(o){throw new Error(`Failed to retrieve Chrome password on Windows: ${o instanceof Error?o.message:String(o)}`)}}var pr=T(()=>{x();Ne();});var dr={};we(dr,{getChromePassword:()=>wt});async function wt(){try{let r=(await F("secret-tool lookup application chrome-libsecret-password-v2 || secret-tool lookup application chrome")).stdout.trim();if(r)return r}catch{}try{let r=(await F(`python3 -c "import keyring; print(keyring.get_password('Chrome Safe Storage', 'Chrome'))"`)).stdout.trim();if(r&&r!=="None")return r}catch{}try{let r=(await F('kwallet-query kdewallet -f "Chrome Safe Storage" -r Chrome')).stdout.trim();if(r)return r}catch{}return "peanuts"}var gr=T(()=>{ie();});var yr={};we(yr,{CookieQueryBuilder:()=>A,createQueryBuilder:()=>St,isSqlBrowser:()=>Et});function St(o){return new A(o)}function Et(o){return o in hr}var hr,A,$e=T(()=>{hr={chrome:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},chromium:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},edge:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},opera:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},brave:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},arc:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},firefox:{tableName:"moz_cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host",expiryColumn:"expiry",pathColumn:"path",secureColumn:"isSecure",httpOnlyColumn:"isHttpOnly"}},A=class{constructor(e){if(this.browser=e,this.schema=hr[e],!this.schema)throw new Error(`Unsupported browser type: ${e}`)}buildSelectQuery(e){let{name:r,domain:t,exactDomain:i,limit:n,includeExpired:s}=e,a=this.schema,c=this.buildSelectColumns(),{whereClause:l,params:f}=this.buildWhereClause(r,t,i,s),m=`SELECT ${c} FROM ${a.tableName}`;return l&&(m+=` WHERE ${l}`),m+=` ORDER BY ${a.expiryColumn} DESC`,n&&n>0&&(m+=` LIMIT ${n}`),{sql:m,params:f,description:`Query ${this.browser} cookies: name=${r}, domain=${t}`}}buildBatchSelectQuery(e){if(e.length===0)throw new Error("At least one spec is required for batch query");let r=this.schema,t=this.buildSelectColumns(),i=[],n=[];for(let l of e){let{whereClause:f,params:m}=this.buildWhereClause(l.name,l.domain,l.exactDomain,l.includeExpired);f&&(i.push(`(${f})`),n.push(...m));}let s=i.join(" OR "),a=`SELECT ${t} FROM ${r.tableName}`;s&&(a+=` WHERE ${s}`),a+=` ORDER BY ${r.expiryColumn} DESC`;let c=e.reduce((l,f)=>f.limit&&f.limit>0?l?Math.min(l,f.limit):f.limit:l,void 0);return c&&c>0&&(a+=` LIMIT ${c*e.length}`),{sql:a,params:n,description:`Batch query ${this.browser} cookies for ${e.length} specs`}}buildMetaQuery(e){if(this.browser==="firefox")throw new Error("Firefox does not have a meta table");return {sql:"SELECT value FROM meta WHERE key = ?",params:[e],description:`Get metadata: ${e}`}}buildTableExistsQuery(){return {sql:"SELECT name FROM sqlite_master WHERE type='table' AND name=?",params:[this.schema.tableName],description:`Check if ${this.schema.tableName} table exists`}}buildSelectColumns(){let e=this.schema,r=[e.nameColumn,e.domainColumn,e.expiryColumn];return e.encryptedValueColumn&&this.browser!=="firefox"?r.push(e.encryptedValueColumn):r.push(e.valueColumn),e.pathColumn&&r.push(e.pathColumn),e.secureColumn&&r.push(e.secureColumn),e.httpOnlyColumn&&r.push(e.httpOnlyColumn),r.map(t=>{switch(t){case e.domainColumn:return `${t} AS domain`;case e.expiryColumn:return `${t} AS expiry`;case e.encryptedValueColumn:return `${t} AS encrypted_value`;case e.valueColumn:return `${t} AS value`;case e.nameColumn:return `${t} AS name`;case e.pathColumn:return `${t} AS path`;case e.secureColumn:return `${t} AS is_secure`;case e.httpOnlyColumn:return `${t} AS is_httponly`;default:return t}}).join(", ")}buildWhereClause(e,r,t,i){let n=this.schema,s=[],a=[];if(e==="%"||(e.includes("%")||e.includes("_")?(s.push(`${n.nameColumn} LIKE ?`),a.push(e)):(s.push(`${n.nameColumn} = ?`),a.push(e))),r&&(t?(s.push(`${n.domainColumn} = ?`),a.push(r)):r.startsWith(".")?(s.push(`${n.domainColumn} LIKE ?`),a.push(`%${r}`)):(s.push(`(${n.domainColumn} = ? OR ${n.domainColumn} = ? OR ${n.domainColumn} LIKE ?)`),a.push(r,`.${r}`,`%.${r}`))),!i)if(this.browser==="firefox"){let c=Math.floor(Date.now()/1e3);s.push(`${n.expiryColumn} > ?`),a.push(c);}else s.push(`${n.expiryColumn} > 0`);return {whereClause:s.join(" AND "),params:a}}static validateQueryParams(e){let{name:r,domain:t,limit:i}=e;if(typeof r!="string"||r.length===0)throw new Error("Cookie name must be a non-empty string");if(typeof t!="string"||t.length===0)throw new Error("Domain must be a non-empty string");let n=["SELECT","INSERT","UPDATE","DELETE","DROP","CREATE","ALTER","--",";"],s=(a,c)=>{let l=a.toUpperCase();for(let f of n)if(l.includes(f))throw new Error(`Invalid ${c}: contains SQL keyword '${f}'`)};if(s(r,"name"),s(t,"domain"),i!==void 0&&(!Number.isInteger(i)||i<=0||i>1e4))throw new Error("Limit must be a positive integer between 1 and 10000")}getBrowserType(){return this.browser}getSchema(){return Object.freeze({...this.schema})}};});async function je(o,e,r=[]){return o.length===0?r:(await Promise.all(o.map(async i=>{try{return await e(i)}catch{return r}}))).flat()}k();var be=class{constructor(e){this.strategies=e;this.logger=g("CompositeCookieQueryStrategy");this.browserName="internal";}handleStrategyError(e,r){e instanceof Error?this.logger.error("Strategy failed",{error:e,strategy:r}):this.logger.error("Strategy failed with unknown error",{error:String(e),strategy:r});}async queryCookies(e,r,t,i){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:t,force:i,strategyCount:this.strategies.length}),await je(this.strategies,async n=>{try{return await n.queryCookies(e,r,t,i)}catch(s){return this.handleStrategyError(s,n),[]}},[])}catch(n){return n instanceof Error?this.logger.error("Failed to query cookies",{error:n}):this.logger.error("Failed to query cookies with unknown error",{error:String(n)}),[]}}};x();function w(o){return o instanceof Error?o.message:typeof o=="string"?o:o!=null&&typeof o=="object"&&"message"in o?String(o.message):String(o)}function Lr(o){let e=w(o);if(o instanceof Error){let r={message:e};return o.stack!==void 0&&(r.stack=o.stack),o.name!==void 0&&(r.name=o.name),"code"in o&&o.code!==void 0&&(r.code=String(o.code)),r}return {message:e}}function b(o,e){return w(o).toLowerCase().includes(e.toLowerCase())}var oe={locked:["database is locked","database locked","sqlite_busy"],busy:["busy"],permission:["eperm","permission denied","operation not permitted","eacces"],not_found:["enoent","no such file","not found"]};function ne(o,e){return e.some(r=>o.includes(r))}function Ye(o){let e=w(o).toLowerCase();return ne(e,oe.locked)?"locked":ne(e,oe.busy)?"busy":ne(e,oe.permission)?"permission":ne(e,oe.not_found)?"not_found":null}function W(o,e){let r=Lr(o);return {...e,error:r.message,errorName:r.name,errorCode:r.code,...process.env.NODE_ENV!=="production"&&r.stack!==void 0&&r.stack!==""?{errorStack:r.stack}:{}}}function V(o,e="An unknown error occurred"){if(o instanceof Error)return o;let r=w(o)||e,t=new Error(r);return "cause"in t&&(t.cause=o),t}ie();k();x();var Ze=g("ProcessDetector");function Qr(o,e){let r=o.trim().split(/\s+/);if(r.length<2)return null;let t=r[1];if(t===void 0||t==="")return null;let i=Number.parseInt(t,10);if(Number.isNaN(i))return null;let n=r.slice(10).join(" ");return {pid:i,command:n!==""?n:e,details:o.trim()}}function qr(o,e){let r=o.split(",").map(n=>n.replace(/"/g,"").trim());if(r.length<2)return null;let t=r[1];if(t===void 0||t==="")return null;let i=Number.parseInt(t,10);return Number.isNaN(i)?null:{pid:i,command:r[0]??e,details:o.trim()}}async function Se(o,e){try{let r;if(P()){let s={firefox:"firefox.exe",chrome:"chrome.exe","google chrome":"chrome.exe",chromium:"chromium.exe",safari:"safari.exe",edge:"msedge.exe"},a=s[o.toLowerCase()]??s[e.toLowerCase()]??`${o.toLowerCase()}.exe`;r=`tasklist /FI "IMAGENAME eq ${a}" /FO CSV | findstr /i "${a}"`;}else r=`ps aux | grep -i '${e}' | grep -v grep`;let{stdout:t}=await F(r);if(!t||t.trim()==="")return [];let i=[],n=t.split(`
2
+ `).filter(s=>s.trim()!=="");for(let s of n){let a=P()?qr(s,o.toLowerCase()):Qr(s,o.toLowerCase());a&&i.push(a);}return Ze.debug(`${o} process detection completed`,{processCount:i.length,processes:i.map(s=>({pid:s.pid,command:s.command})),platform:h()}),i}catch(r){return Ze.debug(`Failed to detect ${o} processes`,{error:w(r),platform:h()}),[]}}async function Xe(){return Se("Firefox","firefox")}async function er(){return Se("Chrome","google chrome\\|chromium")}async function rr(){return Se("Safari","/Applications/Safari.app/Contents/MacOS/Safari")}function tr(o,e){if(e.length===0)return "";let r=e.length,t=o.charAt(0).toUpperCase()+o.slice(1);return `${t} is currently running (${r} process${r>1?"es":""} detected). For reliable cookie access, consider closing ${t} and trying again. Alternatively, use the --force flag to attempt access despite the lock.`}function or(o){if(o==null||typeof o!="number"||Number.isNaN(o))return;if(o<=0)return "Infinity";let e=o/1e6-11644473600;return e<0||e>3250368e4?"Infinity":new Date(e*1e3)}k();var _r={info:()=>{},warn:()=>{},error:()=>{},debug:()=>{},success:()=>{},fatal:()=>{},log:()=>{}},$=class{constructor(e,r){this.browserName=r;let t=g(e);this.logger=t||_r;}async queryCookies(e,r,t,i){try{return this.logger.info("Querying cookies",{name:e,domain:r,store:t,force:i}),await this.executeQuery(e,r,t,i)}catch(n){return n instanceof Error?this.logger.error("Failed to query cookies",{error:n.message,browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:t,force:i}):this.logger.error("Failed to query cookies",{error:String(n),browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:t,force:i}),[]}}};k();x();var Ee=util.promisify(child_process.exec),C=g("BrowserControl");function Wr(){let o=process.env.CI==="true"||process.env.CI==="1",e=process.env.NODE_ENV==="test"||process.env.JEST_WORKER_ID!==void 0;return process.stdin.isTTY&&process.stdout.isTTY&&!o&&!e}var ve={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"};async function Pe(o){try{let e=ve[o];if(!e)return C.debug("Browser not supported for macOS control",{browserName:o}),!1;let r=`tell application "System Events" to (name of processes) contains "${e}"`,{stdout:t}=await Ee(`osascript -e '${r}'`);return t.trim()==="true"}catch(e){return C.debug("Failed to check if browser is running",{browserName:o,error:e}),false}}async function Vr(o){try{let e=ve[o];if(!e)return C.debug("Browser not supported for macOS control",{browserName:o}),!1;let r=`tell application "${e}" to quit`;return await Ee(`osascript -e '${r}'`),await new Promise(i=>setTimeout(i,2e3)),await Pe(o)?(C.warn("Browser did not quit gracefully",{browserName:o}),!1):(C.info("Browser quit successfully",{browserName:o}),!0)}catch(e){return C.error("Failed to quit browser",{browserName:o,error:e}),false}}async function Gr(o){try{let e=ve[o];if(!e){C.debug("Browser not supported for macOS control",{browserName:o});return}if(o==="Firefox"){let r=`
3
+ tell application "${e}"
4
+ activate
5
+ end tell
6
+ tell application "System Events"
7
+ keystroke "d" using {command down, shift down}
8
+ delay 0.5
9
+ key code 36
10
+ end tell
11
+ `;await Ee(`osascript -e '${r}'`),C.debug("Attempted to save Firefox session",{browserName:o});}else o==="Chrome"?C.debug("Chrome will restore tabs automatically",{browserName:o}):C.debug("Safari will restore tabs automatically",{browserName:o});}catch(e){C.debug("Failed to save browser session",{browserName:o,error:e});}}async function jr(o){if(!Wr())return C.debug("Non-interactive environment detected, skipping prompt",{browserName:o,CI:process.env.CI,NODE_ENV:process.env.NODE_ENV,JEST_WORKER_ID:process.env.JEST_WORKER_ID,stdin_tty:process.stdin.isTTY,stdout_tty:process.stdout.isTTY}),false;let e=kr__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{e.question(`
12
+ \u26A0\uFE0F ${o} is currently running and blocking cookie access.
13
+ Would you like to close ${o}? Your tabs will be restored when you reopen it. (y/N): `,t=>{e.close(),r(t.toLowerCase()==="y"||t.toLowerCase()==="yes");});})}async function nr(o,e={}){if(!N())return C.debug("Browser control only supported on macOS"),false;try{if(!await Pe(o))return C.debug("Browser is not running",{browserName:o}),!0;if(e.interactive===!0&&e.force!==!0&&!await jr(o))return C.info("User cancelled browser close",{browserName:o}),!1;await Gr(o);let t=await Vr(o);return t?C.success(`${o} closed successfully. Tabs will be restored on next launch.`):C.warn(`Failed to close ${o}. You may need to close it manually.`),t}catch(r){return C.error("Failed to control browser",{browserName:o,error:r}),false}}async function ir(o,e=1e4){if(!N())return false;let r=Date.now(),t=500;for(;Date.now()-r<e;){if(!await Pe(o))return true;await new Promise(n=>setTimeout(n,t));}return false}k();x();var se=util.promisify(child_process.execFile),S=g("FileHandleDetector");function Yr(o){let e=o.trim().split(/\s+/);if(e.length<2)return null;let r=e[1];if(r===void 0||r==="")return null;let t=Number.parseInt(r,10);if(Number.isNaN(t))return null;let i={pid:t,command:e[2]??"unknown"},n=e[0];n!==void 0&&n!==""&&(i.user=n);let s=e[3];return s!==void 0&&s!==""&&(i.mode=s),i}function Zr(o){return o!==null&&typeof o=="object"&&"ProcessId"in o&&"ProcessName"in o}function Xr(o){let e=[];try{let r=JSON.parse(o),t=Array.isArray(r)?r:[r];for(let i of t){if(!Zr(i))continue;let n=i.ProcessId,s=i.ProcessName;typeof n=="string"&&n!==""&&e.push({command:typeof s=="string"?s:"unknown",pid:Number.parseInt(n,10)});}}catch(r){S.debug("Failed to parse PowerShell output",{error:w(r)});}return e}async function et(o){try{let{stdout:e}=await se("lsof",[o],{encoding:"utf8"});if(!e||e.trim()==="")return [];let r=e.split(`
14
+ `).slice(1),t=[];for(let i of r){let n=i.trim().split(/\s+/),s=n[0],a=n[1],c=n[2],l=n[3];if(s!==void 0&&s!==""&&a!==void 0&&a!==""&&n.length>=4){let f=Number.parseInt(a,10);if(!Number.isNaN(f)){let m={command:s,pid:f};c!==void 0&&c!==""&&(m.user=c),l!==void 0&&l!==""&&(m.fd=l,m.mode=l.includes("w")?"write":"read"),t.push(m);}}}return S.debug("Detected file handles with lsof",{file:o,handleCount:t.length}),t}catch(e){let r=w(e);return b(e,"ENOENT")?S.debug("lsof not available on this system"):b(e,"No such file")?S.debug("File does not exist",{file:o}):S.debug("lsof detection failed",{error:r}),[]}}async function rt(o){try{let e=await se("fuser",["-v",o],{encoding:"utf8"}),r=e.stderr||e.stdout||"";if(r.trim()==="")return [];let t=[],i=r.split(`
15
+ `).slice(1);for(let n of i){let s=Yr(n);s&&t.push(s);}return S.debug("Detected file handles with fuser",{file:o,handleCount:t.length}),t}catch(e){let r=w(e);return b(e,"ENOENT")?S.debug("fuser not available on this system"):S.debug("fuser detection failed",{error:r}),[]}}async function tt(o){try{let e=o.replace(/'/g,"''"),r=`
16
+ $ErrorActionPreference = 'SilentlyContinue'
17
+ $handles = @()
18
+
19
+ # Try to find processes with the file open
20
+ Get-Process | ForEach-Object {
21
+ try {
22
+ $proc = $_
23
+ # Check if any modules match the file path
24
+ $modules = $proc.Modules | Where-Object { $_.FileName -eq '${e}' }
25
+ if ($modules) {
26
+ $handles += [PSCustomObject]@{
27
+ ProcessName = $proc.ProcessName
28
+ ProcessId = $proc.Id
29
+ }
30
+ }
31
+ } catch {
32
+ # Skip processes we can't access
33
+ }
34
+ }
35
+
36
+ # Also try using Get-CimInstance for better file handle detection
37
+ try {
38
+ $query = "SELECT * FROM CIM_DataFile WHERE Name='${e.replace(/\\/g,"\\\\")}'"
39
+ $file = Get-CimInstance -Query $query -ErrorAction SilentlyContinue
40
+ if ($file) {
41
+ $assoc = Get-CimAssociatedInstance -InputObject $file -ResultClassName Win32_Process
42
+ foreach ($proc in $assoc) {
43
+ $handles += [PSCustomObject]@{
44
+ ProcessName = $proc.Name
45
+ ProcessId = $proc.ProcessId
46
+ }
47
+ }
48
+ }
49
+ } catch {
50
+ # WMI query failed, ignore
51
+ }
52
+
53
+ $handles | ConvertTo-Json -Compress
54
+ `,{stdout:t}=await se("powershell",["-NoProfile","-NonInteractive","-Command",r],{encoding:"utf8",maxBuffer:1024*1024});if(!t||t.trim()===""||t.trim()==="null")return [];let i=Xr(t);return S.debug("Detected file handles with PowerShell",{file:o,handleCount:i.length}),i}catch(e){return S.debug("Windows handle detection failed",{error:w(e)}),[]}}async function ot(o){try{let{stdout:e}=await se("handle",["-nobanner",o],{encoding:"utf8"});if(!e||e.trim()==="")return [];let r=[],t=e.split(`
55
+ `);for(let i of t){let n=i.match(/^(.+?)\s+pid:\s+(\d+)\s+type:\s+(\w+)\s+.+:\s+(.+)$/i);if(n?.[1]!==void 0&&n?.[1]!==""&&n?.[2]!==void 0&&n?.[2]!==""){let s=Number.parseInt(n[2],10);if(!Number.isNaN(s)){let a={command:n[1],pid:s};n?.[3]!==void 0&&n[3]!==""&&(a.fd=n[3]),a.mode="unknown",r.push(a);}}}return S.debug("Detected file handles with handle.exe",{file:o,handleCount:r.length}),r}catch{return []}}async function Be(o){let e=h();if(S.debug("Detecting file handles",{file:o,platform:e}),P()){let t=await ot(o);return t.length>0?t:tt(o)}let r=await et(o);return r.length===0&&(r=await rt(o)),r.length>0&&S.info("File has open handles",{file:o,handleCount:r.length,processes:r.map(t=>({pid:t.pid,command:t.command,mode:t.mode}))}),r}async function sr(o){let e=await Be(o);if(e.length===0)return "File is not locked";let r=e.map(t=>`${t.command} (PID: ${t.pid}${t.user!==void 0&&t.user!==""?`, User: ${t.user}`:""}${t.mode!==void 0&&t.mode!==""?`, Mode: ${t.mode}`:""})`).join(", ");return `File is locked by ${e.length} process${e.length>1?"es":""}: ${r}`}x();var Z=util.promisify(child_process.execFile),G=class o{constructor(){this.browserExecutables=this.initializeBrowserExecutables();}isBrowserSupported(e){let r=this.browserExecutables[e];return !!(r&&r.length>0)}getBrowserExecutables(e){return this.browserExecutables[e]||[]}async isBrowserInstalled(e){let r=this.getBrowserExecutables(e);for(let t of r)try{let i=P()?"where":"which";return await Z(i,[t],{timeout:1e3}),!0}catch{}return false}async executeCommand(e,r=[]){try{await Z(e,r,{timeout:5e3,windowsHide:!0});}catch(t){this.isNodeError(t)&&t.code!=="ENOENT"&&console.debug(`Browser launch warning: ${o.getErrorMessage(t)}`);}}isNodeError(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"}static getErrorMessage(e){return e instanceof Error?e.message:typeof e=="string"?e:String(e)}},Oe=class extends G{initializeBrowserExecutables(){return {Firefox:["Firefox"],Chrome:["Google Chrome"],Safari:["Safari"]}}async launchBrowser(e){let t={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"}[e];if(!t)throw new Error(`${e} not supported on macOS`);await this.executeCommand("osascript",["-e",`tell application "${t}" to activate`]);}getPlatformName(){return "macOS"}},De=class extends G{initializeBrowserExecutables(){return {Firefox:["firefox.exe","Firefox"],Chrome:["chrome.exe","Google Chrome"],Safari:[]}}async launchBrowser(e){let r=this.getBrowserExecutables(e);if(r.length===0)throw new Error(`${e} not available on Windows`);for(let t of r)if(await this.tryLaunchExecutable(t))return;throw new Error(`Failed to launch ${e} on Windows`)}async tryLaunchExecutable(e){try{return await Z("cmd.exe",["/c","start","",e],{timeout:5e3,windowsHide:!0}),!0}catch{return false}}getPlatformName(){return "Windows"}},ae=class extends G{initializeBrowserExecutables(){return {Firefox:["firefox","firefox-bin"],Chrome:["google-chrome","google-chrome-stable","chromium","chromium-browser"],Safari:[]}}async launchBrowser(e){let r=this.getBrowserExecutables(e);if(r.length===0)throw new Error(`${e} not available on Linux`);await this.tryLaunchExecutables(r)||await this.tryXdgOpenFallback(e);}async tryLaunchExecutables(e){for(let r of e)try{return await Z(r,[],{timeout:5e3}),!0}catch{}return false}async tryXdgOpenFallback(e){try{await Z("xdg-open",["http://localhost"],{timeout:5e3});}catch(r){throw new Error(`Failed to launch ${e} on Linux: ${G.getErrorMessage(r)}`)}}getPlatformName(){return "Linux"}},Re=null;function ar(o){if(Re!==null&&o===void 0)return Re;let e=h(),r=st(e);return (Re=r),r}function st(o){switch(o){case "darwin":return new Oe;case "win32":return new De;case "linux":case "freebsd":case "openbsd":return new ae;default:return new ae}}var L=class{constructor(e,r,t){this.logger=e;this.browserName=r;this.platformControl=t??ar();}async handleBrowserConflict(e,r,t,i=false){return e instanceof Error?this.isLockError(e)?(await this.logFileHandleInfo(r,t),this.handleProcessConflict(r,t,i)):{resolved:false,shouldRelaunch:false}:{resolved:false,shouldRelaunch:false}}isLockError(e){let r=Ye(e);return r==="locked"||r==="permission"}async logFileHandleInfo(e,r){try{let t=await Be(e);if(t.length>0){let i=await sr(e);this.logger.debug("Database locked by specific processes",{file:e,lockInfo:i,handleCount:t.length,handles:t.map(n=>({pid:n.pid,command:n.command,mode:n.mode,user:n.user}))}),r.length===0&&this.logger.info("File is locked but no browser processes detected - another tool may be accessing the database",{lockingProcesses:t.map(n=>`${n.command} (PID: ${n.pid})`).join(", ")});}}catch(t){this.logger.debug("Could not detect file handles",{error:t instanceof Error?t.message:String(t)});}}async handleProcessConflict(e,r,t){try{if(r.length>0)return await this.handleBrowserProcesses(e,r,t);this.logger.debug("Database/file locked but no browser processes detected",{file:e,browserName:this.browserName,suggestion:"Another process may be accessing the file"});}catch(i){this.logger.debug("Failed to check browser processes",{error:i instanceof Error?i.message:String(i)});}return {resolved:false,shouldRelaunch:false}}async handleBrowserProcesses(e,r,t){let i=r.map(s=>({...s,details:`PID: ${s.pid}, Command: ${s.command}`})),n=tr(this.browserName.toLowerCase(),i);return this.logger.debug(`${this.browserName} process conflict detected`,{file:e,processCount:r.length,advice:n}),t?this.attemptBrowserClose():Promise.resolve({resolved:false,shouldRelaunch:false})}async attemptBrowserClose(){return this.logger.info(`Attempting to close ${this.browserName} gracefully...`),await nr(this.browserName,{interactive:true,force:false})?(await ir(this.browserName,5e3),{resolved:true,shouldRelaunch:true}):{resolved:false,shouldRelaunch:false}}async relaunchBrowser(){this.logger.info(`Relaunching ${this.browserName}...`);try{if(!this.platformControl.isBrowserSupported(this.browserName)){this.logger.debug(`${this.browserName} is not available on ${this.platformControl.getPlatformName()}`);return}await this.platformControl.launchBrowser(this.browserName),this.logger.success(`${this.browserName} has been relaunched with your tabs restored`);}catch(e){this.logger.debug(`Could not relaunch ${this.browserName} automatically`,{error:w(e),platform:this.platformControl.getPlatformName()});}}};x();function cr(o,e){let r=Buffer.from("v10");if(!o.subarray(0,3).equals(r))throw new Error("Not a v10 encrypted cookie");let t=o.subarray(3),i=12,n=16;if(t.length<i+n)throw new Error("Invalid v10 cookie: too short");let s=t.subarray(0,i),a=t.subarray(i,t.length-n),c=t.subarray(t.length-n),l=crypto.createDecipheriv("aes-256-gcm",e,s);return l.setAuthTag(c),Buffer.concat([l.update(a),l.final()]).toString("utf8")}function lr(o){let e=Buffer.from("v10");return o.length>=3&&o.subarray(0,3).equals(e)}function ur(o,e){let r=new Map;return t=>{let i=e?e(t):t.toString("hex");if(r.has(i)){let s=r.get(i);if(s!==void 0)return s}let n=o(t);return r.set(i,n),n}}var ut=ur(o=>o.length>=3&&o[0]===118&&o[1]===49&&o[2]===48?o.slice(3):o,o=>o.toString("hex")),ft=ur(o=>{let e=o[o.length-1];return e&&e<=16?o.slice(0,-e):o},o=>o.toString("hex"));function mt(o){let e=o.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e?.[1])return e[1];let r=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/(\d{3}-\d{7}-\d{7})$/];for(let i of r){let n=o.match(i);if(n?.[1])return n[1]}let t=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let i of t){let s=o.match(i)?.[1]??"";if(s.length>0)return s}return o}async function fr(o,e,r){if(P()&&lr(o)&&o.length>=31&&Buffer.isBuffer(e))return cr(o,e);if(N()&&!o.slice(0,3).toString().match(/^v\d\d$/))return Promise.resolve(o.toString("utf8"));if(typeof e!="string")throw new Error("password must be a string");if(!Buffer.isBuffer(o))throw new Error("encryptedData must be a Buffer");return new Promise((t,i)=>{crypto.pbkdf2(e,"saltysalt",1003,16,"sha1",(n,s)=>{try{if(n){i(new Error(`Failed to derive key: ${n.message}`));return}let a=ut(o);if(a.length%16!==0){i(new Error("Encrypted data length is not a multiple of 16"));return}let c=Buffer.alloc(16," "),l=crypto.createDecipheriv("aes-128-cbc",s,c);l.setAutoPadding(!1);let f=l.update(a);try{l.final();}catch(ye){i(new Error(`Failed to finalize decryption: ${ye.message}`));return}f=ft(f);let p=((r??0)>=24&&f.length>32?f.slice(32):f).toString("utf8");t(mt(p));}catch(a){i(new Error(`Decryption failed: ${a.message}`));}});})}x();ie();var Ct={chrome:"Chrome Safe Storage",chromium:"Chromium Safe Storage",brave:"Brave Safe Storage",edge:"Microsoft Edge Safe Storage",arc:"Arc Safe Storage",opera:"Opera Safe Storage","opera-gx":"Opera Safe Storage",vivaldi:"Vivaldi Safe Storage",whale:"Whale Safe Storage"};async function bt(o){let e=Ct[o];if(!e)throw new Error(`Unknown browser type: ${o}`);try{let r=`security find-generic-password -w -s "${e}"`;return (await F(r)).stdout.trim()}catch(r){if(o!=="chrome"){let t='security find-generic-password -w -s "Chrome Safe Storage"';try{return (await F(t)).stdout.trim()}catch{}}throw new Error(`Failed to get ${o} password from keychain: ${r}`)}}async function kt(){let{getChromePassword:o}=await Promise.resolve().then(()=>(pr(),mr));return o()}async function xt(){let{getChromePassword:o}=await Promise.resolve().then(()=>(gr(),dr));return o()}async function Fe(o="chrome"){switch(z(),h()){case "darwin":return bt(o);case "win32":return kt();case "linux":return xt();default:throw new Error(`Platform ${h()} is not supported`)}}$e();k();var B=g("DatabaseConnectionManager"),Ae=class extends events.EventEmitter{constructor(e={}){super(),this.connections=new Map,this.queryMetrics=[],this.totalQueries=0,this.cacheHits=0,this.connectionReuses=0,this.lastCleanupTime=Date.now(),this.config={maxConnections:e.maxConnections??5,connectionTimeout:e.connectionTimeout??5e3,idleTimeout:e.idleTimeout??3e4,enableMonitoring:e.enableMonitoring??true,retryAttempts:e.retryAttempts??3,retryDelay:e.retryDelay??100,queryTimeout:e.queryTimeout??3e3};}async getConnection(e){let r=Date.now();r-this.lastCleanupTime>3e4&&(this.cleanupIdleConnections(),this.lastCleanupTime=r);let t=this.connections.get(e);return t&&!t.inUse?(t.inUse=true,t.lastAccessed=Date.now(),this.connectionReuses++,B.debug("Reusing existing connection",{filepath:e,queryCount:t.queryCount}),t.database):(this.connections.size>=this.config.maxConnections&&await this.evictLeastRecentlyUsed(),this.createConnection(e))}async createConnection(e){let r=Date.now(),t;for(let i=0;i<this.config.retryAttempts;i++)try{let n=new Pt__default.default(e,{readonly:!0,fileMustExist:!0});n.pragma(`busy_timeout = ${this.config.queryTimeout}`);let s={database:n,filepath:e,inUse:!0,lastAccessed:Date.now(),queryCount:0,totalQueryTime:0,created:Date.now()};this.connections.set(e,s);let a=Date.now()-r;return B.debug("Created new connection",{filepath:e,connectionTime:a,attempt:i+1}),this.emit("connection:created",{filepath:e,connectionTime:a}),n}catch(n){if(t=n,this.isDatabaseLocked(n)){B.warn("Database locked, retrying",{filepath:e,attempt:i+1,maxAttempts:this.config.retryAttempts}),await this.delay(this.config.retryDelay*2**i);continue}throw n}throw t||new Error(`Failed to connect to database: ${e}`)}async executeQuery(e,r,t){let i=Date.now(),n=await this.getConnection(e),s=this.connections.get(e);try{let a=r(n),c=Date.now()-i;if(s&&(s.queryCount++,s.totalQueryTime+=c),this.totalQueries++,this.cacheHits++,c>100&&B.debug("Slow query detected",{query:t||"Unknown query",duration:c,filepath:e}),this.config.enableMonitoring){let l={query:t||"Unknown query",duration:c,rowCount:Array.isArray(a)?a.length:1,filepath:e,timestamp:Date.now(),success:!0};this.recordMetrics(l);}return a}catch(a){let c=Date.now()-i;if(this.totalQueries++,this.config.enableMonitoring){let l={query:t||"Unknown query",duration:c,rowCount:0,filepath:e,timestamp:Date.now(),success:false,error:a.message};this.recordMetrics(l);}throw a}finally{s&&(s.inUse=false,s.lastAccessed=Date.now());}}releaseConnection(e){let r=this.connections.get(e);r&&(r.inUse=false,r.lastAccessed=Date.now(),B.debug("Released connection",{filepath:e}));}closeConnection(e){let r=this.connections.get(e);if(r)try{r.database.close(),this.connections.delete(e),B.debug("Closed connection",{filepath:e,queryCount:r.queryCount,lifetime:Date.now()-r.created}),this.emit("connection:closed",{filepath:e});}catch(t){Y("Failed to close connection",t,{filepath:e});}}closeAll(){for(let[e,r]of this.connections)try{r.database.close(),B.debug("Closed connection",{filepath:e});}catch(t){Y("Failed to close connection",t,{filepath:e});}this.connections.clear(),B.info("Closed all connections",{totalQueries:this.totalQueries,connectionReuses:this.connectionReuses});}getStatistics(){let e=0,r=0,t=0;for(let i of this.connections.values())e+=i.totalQueryTime,r+=i.queryCount,i.inUse&&t++;return {totalConnections:this.connections.size,activeConnections:t,idleConnections:this.connections.size-t,totalQueries:this.totalQueries,averageQueryTime:r>0?e/r:0,cacheHitRate:this.totalQueries>0?this.cacheHits/this.totalQueries:0,connectionReuse:this.connectionReuses}}getQueryMetrics(e=100){return this.queryMetrics.slice(-e)}clearMetrics(){this.queryMetrics.length=0;}cleanupIdleConnections(){let e=Date.now(),r=[];for(let[t,i]of this.connections)!i.inUse&&e-i.lastAccessed>this.config.idleTimeout&&r.push(t);for(let t of r)this.closeConnection(t);r.length>0&&B.debug("Cleaned up idle connections",{count:r.length});}async evictLeastRecentlyUsed(){let e=null,r=Date.now();for(let[t,i]of this.connections)!i.inUse&&i.lastAccessed<r&&(e=t,r=i.lastAccessed);e?(this.closeConnection(e),B.debug("Evicted LRU connection",{filepath:e})):await this.delay(100);}recordMetrics(e){this.queryMetrics.push(e),this.queryMetrics.length>1e3&&this.queryMetrics.splice(0,this.queryMetrics.length-1e3),this.emit("query:executed",e);}isDatabaseLocked(e){if(e instanceof Error){let r=e.message.toLowerCase();return r.includes("database is locked")||r.includes("database locked")||r.includes("sqlite_busy")}return false}async delay(e){return new Promise(r=>setTimeout(r,e))}},X=null,Le=null;function j(o){return X||(X=new Ae(o),Le||(Le=()=>{X&&X.closeAll();},process.on("exit",Le))),X}k();var Me=g("QueryMonitor"),Qe=class{constructor(e={}){this.options={slowQueryThreshold:e.slowQueryThreshold??100,verbose:e.verbose??false,trackHistory:e.trackHistory??true,maxHistorySize:e.maxHistorySize??1e3},this.queryHistory=[],this.totalQueries=0,this.totalDuration=0,this.slowQueries=0,this.errors=0;}executeQuery(e,r,t=[],i){let n={sql:r,params:t,startTime:Date.now()};i!==void 0&&(n.filepath=i);try{let a=e.prepare(r).all(...t);return n.endTime=Date.now(),n.duration=n.endTime-n.startTime,n.rowCount=a.length,this.recordExecution(n),a}catch(s){throw n.endTime=Date.now(),n.duration=n.endTime-n.startTime,n.error=s,this.recordExecution(n),s}}executeGet(e,r,t=[],i){let n={sql:r,params:t,startTime:Date.now()};i!==void 0&&(n.filepath=i);try{let a=e.prepare(r).get(...t);return n.endTime=Date.now(),n.duration=n.endTime-n.startTime,n.rowCount=a?1:0,this.recordExecution(n),a}catch(s){throw n.endTime=Date.now(),n.duration=n.endTime-n.startTime,n.error=s,this.recordExecution(n),s}}prepareStatement(e,r,t){let i=e.prepare(r);return new qe(i,r,this,t)}recordExecution(e){this.totalQueries++,e.duration!==void 0&&(this.totalDuration+=e.duration,e.duration>this.options.slowQueryThreshold&&(this.slowQueries++,Me.debug("Slow query detected",{sql:e.sql,duration:e.duration,rowCount:e.rowCount,filepath:e.filepath}))),e.error?(this.errors++,this.options.verbose&&Me.error("Query failed",{sql:e.sql,error:e.error.message,filepath:e.filepath})):this.options.verbose&&Me.debug("Query executed",{sql:e.sql,duration:e.duration,rowCount:e.rowCount}),this.options.trackHistory&&(this.queryHistory.push(e),this.queryHistory.length>this.options.maxHistorySize&&this.queryHistory.splice(0,this.queryHistory.length-this.options.maxHistorySize));}getStatistics(){return {totalQueries:this.totalQueries,averageDuration:this.totalQueries>0?this.totalDuration/this.totalQueries:0,slowQueries:this.slowQueries,slowQueryRate:this.totalQueries>0?this.slowQueries/this.totalQueries:0,errors:this.errors,errorRate:this.totalQueries>0?this.errors/this.totalQueries:0,historySize:this.queryHistory.length}}getHistory(e){return e?this.queryHistory.slice(-e):[...this.queryHistory]}clearHistory(){this.queryHistory.length=0;}reset(){this.clearHistory(),this.totalQueries=0,this.totalDuration=0,this.slowQueries=0,this.errors=0;}},qe=class{constructor(e,r,t,i){this.statement=e;this.sql=r;this.monitor=t;this.filepath=i;}all(...e){return this.monitor.executeQuery({prepare:()=>this.statement},this.sql,e,this.filepath)}get(...e){return this.monitor.executeGet({prepare:()=>this.statement},this.sql,e,this.filepath)}getStatement(){return this.statement}},Ie=null;function ee(o){return Ie||(Ie=new Qe(o)),Ie}function wr(o,e,r,t,i,n,s){return {domain:o,name:e,value:r,expiry:or(t),meta:{file:i,browser:n,decrypted:s}}}var J=class extends ${constructor(e,r,t="chrome"){super(e,"Chrome"),this.browserDisplayName=r,this.browserType=t,this.lockHandler=new L(this.logger,"Chrome");}async batchQueryCookies(e){if(!this.isPlatformSupported())return [];let r=this.getCookieFiles();if(r.length===0)return this.logger.debug(`No ${this.browserDisplayName} cookie files found`),[];try{let t=await Fe(this.browserType),i=[];for(let n of r){let s=await this.processBatchFile(n,e,t);i.push(...s);}return i}catch(t){return this.logger.error(`Failed to get ${this.browserDisplayName} password for batch query`,{error:this.getErrorMessage(t)}),[]}}async processBatchFile(e,r,t){try{let i=j(),n=ee(),s=new A("chrome"),a=r.map(p=>({name:p.name,domain:p.domain,browser:"chrome"})),c=s.buildBatchSelectQuery(a),l=await i.executeQuery(e,p=>n.executeQuery(p,c.sql,c.params,e).map(D=>({name:D.name,domain:D.domain,value:D.encrypted_value,expiry:D.expiry})),c.description||c.sql),f=await this.getMetaVersion(e),m={file:e,password:t,browser:this.browserDisplayName,metaVersion:f};return (await Promise.allSettled(l.map(async p=>this.processCookie(p,m)))).filter(p=>p.status==="fulfilled").map(p=>p.value)}catch(i){return this.logger.warn(`Error batch processing ${this.browserDisplayName} cookie file ${e}`,{error:this.getErrorMessage(i),file:e,specsCount:r.length}),[]}}getBrowserName(){return this.browserDisplayName}async executeQuery(e,r,t,i){if(!this.isPlatformSupported())return [];let n=this.getCookieFiles(t);if(n.length===0)return this.logger.debug(`No ${this.browserDisplayName} cookie files found`),[];try{let s=await Fe(this.browserType),a=[];for(let c of n){let l=await this.processFileWithRetry(c,e,r,s,i);a.push(...l);}return a}catch(s){return this.logger.error(`Failed to get ${this.browserDisplayName} password`,{error:this.getErrorMessage(s)}),[]}}isPlatformSupported(){return ke()?true:(this.logger.warn("Platform not supported",{platform:h(),supportedPlatforms:["darwin","win32","linux"]}),false)}getCookieFiles(e){let r=e??this.getCookieFilePaths();return Array.isArray(r)?r:[r]}getErrorMessage(e){return e instanceof Error?e.message:String(e)}async processFileWithRetry(e,r,t,i,n){try{return await this.processFile(e,r,t,i)}catch(s){let a=await this.handleFileError(s,e,r,t,n);return a.resolved?this.retryAfterBrowserClose(e,r,t,i,a.shouldRelaunch):[]}}async handleFileError(e,r,t,i,n){let s=await er(),a=await this.lockHandler.handleBrowserConflict(e,r,s,n!==true);return a.resolved||this.logger.warn(`Error reading ${this.browserDisplayName} cookie file ${r}`,{error:this.getErrorMessage(e),file:r,name:t,domain:i}),a}async retryAfterBrowserClose(e,r,t,i,n){try{this.logger.info(`Retrying ${this.browserDisplayName} cookie extraction after browser close...`);let s=await this.processFile(e,r,t,i);return this.logger.success(`Successfully extracted cookies after closing ${this.browserDisplayName}`),n&&await this.lockHandler.relaunchBrowser(),s}catch(s){return this.logger.error(`Failed to extract cookies even after closing ${this.browserDisplayName}`,{error:this.getErrorMessage(s),file:e}),n&&await this.lockHandler.relaunchBrowser(),[]}}async processFile(e,r,t,i){try{let n=j(),s=ee(),c=new A("chrome").buildSelectQuery({name:r,domain:t,browser:"chrome"}),l=await n.executeQuery(e,p=>s.executeQuery(p,c.sql,c.params,e).map(D=>({name:D.name,domain:D.domain,value:D.encrypted_value,expiry:D.expiry})),c.sql),f=await this.getMetaVersion(e),m={file:e,password:i,browser:this.browserDisplayName,metaVersion:f};return (await Promise.allSettled(l.map(async p=>this.processCookie(p,m)))).map(p=>p.status==="fulfilled"?p.value:null).filter(p=>p!==null)}catch(n){return this.logger.error(`Failed to process ${this.browserDisplayName} cookie file`,{error:this.getErrorMessage(n),file:e,name:r,domain:t}),[]}}async getMetaVersion(e){try{let r=j(),i=new A("chrome").buildMetaQuery("version"),n=await r.executeQuery(e,s=>s.prepare(i.sql).get(...i.params),"Get meta version");return n?Number.parseInt(n.value,10):0}catch(r){return this.logger.debug("Could not retrieve meta version, defaulting to 0",{error:this.getErrorMessage(r)}),0}}async processCookie(e,r){try{let t=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),i=await fr(t,r.password,r.metaVersion);return wr(e.domain,e.name,i,e.expiry,r.file,r.browser,!0)}catch(t){return this.logger.warn(`Failed to decrypt ${r.browser} cookie`,{error:this.getErrorMessage(t)}),wr(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,false)}}};k();Ne();var Rt=g("listChromeProfiles");function Cr(){let o=Bt__default.default.sync("./**/Cookies",{cwd:ce,absolute:true});return Rt.debug("Found cookie files:",o),o}var Q=class extends J{constructor(e){super("ChromeCookieQueryStrategy","Chrome"),e!==void 0&&(this.profileName=e);}getCookieFilePaths(e){if(e!==void 0&&e!=="")return [e];let r=Cr();if(this.profileName)try{let t=Ge("fs"),i=Ge("path");if(r.length===0)return this.logger.warn("No Chrome cookie files found"),[];let n=r[0];if(!n)return [];let s=path.dirname(path.dirname(n)),a=i.join(s,"Local State");if(t.existsSync(a)){let l=JSON.parse(t.readFileSync(a,"utf8")).profile?.info_cache||{},f;for(let[m,E]of Object.entries(l))if(E.name?.toLowerCase()===this.profileName.toLowerCase()){f=m;break}if(!f){for(let m of Object.keys(l))if(m.toLowerCase()===this.profileName.toLowerCase()){f=m;break}}if(f)r=r.filter(m=>path.dirname(m).endsWith(f)),r.length===0?this.logger.warn(`No cookie files found for profile: ${this.profileName} (directory: ${f})`):this.logger.debug(`Found ${r.length} cookie file(s) for profile: ${this.profileName}`);else return this.logger.debug("Profile not found in Chrome Local State",{requestedProfile:this.profileName,availableProfiles:Object.entries(l).map(([m,E])=>({directory:m,name:E.name}))}),[]}}catch(t){this.logger.warn(`Failed to read Chrome profile info: ${t}`);}return Array.isArray(r)?r:[r]}};x();function br(o){let e=os.homedir();if(!e)throw new Error("Unable to determine user home directory");z();let r=h(),i={chrome:{windows:path.join(e,"AppData","Local","Google","Chrome","User Data"),macos:path.join(e,"Library","Application Support","Google","Chrome"),linux:path.join(e,".config","google-chrome")},chromium:{windows:path.join(e,"AppData","Local","Chromium","User Data"),macos:path.join(e,"Library","Application Support","Chromium"),linux:path.join(e,".config","chromium")},brave:{windows:path.join(e,"AppData","Local","BraveSoftware","Brave-Browser","User Data"),macos:path.join(e,"Library","Application Support","BraveSoftware","Brave-Browser"),linux:path.join(e,".config","BraveSoftware","Brave-Browser")},edge:{windows:path.join(e,"AppData","Local","Microsoft","Edge","User Data"),macos:path.join(e,"Library","Application Support","Microsoft Edge"),linux:path.join(e,".config","microsoft-edge")},arc:{windows:path.join(e,"AppData","Local","Arc","User Data"),macos:path.join(e,"Library","Application Support","Arc","User Data"),linux:path.join(e,".config","arc")},opera:{windows:path.join(e,"AppData","Roaming","Opera Software","Opera Stable"),macos:path.join(e,"Library","Application Support","com.operasoftware.Opera"),linux:path.join(e,".config","opera")},"opera-gx":{windows:path.join(e,"AppData","Roaming","Opera Software","Opera GX Stable"),macos:path.join(e,"Library","Application Support","com.operasoftware.OperaGX"),linux:path.join(e,".config","opera-gx")},vivaldi:{windows:path.join(e,"AppData","Local","Vivaldi","User Data"),macos:path.join(e,"Library","Application Support","Vivaldi"),linux:path.join(e,".config","vivaldi")},whale:{windows:path.join(e,"AppData","Local","Naver","Naver Whale","User Data"),macos:path.join(e,"Library","Application Support","Naver","Whale"),linux:path.join(e,".config","naver-whale")}}[o];switch(r){case "win32":return i.windows;case "darwin":return i.macos;case "linux":return i.linux;default:throw new Error(`Platform ${r} is not supported`)}}var He=class extends J{constructor(e="chrome"){let r=e.charAt(0).toUpperCase()+e.slice(1);super(`${r}CookieQueryStrategy`,r,e),this.browser=e;}getCookieFilePaths(e){if(e!==void 0&&e!=="")return [e];try{let r=br(this.browser),t=Bt__default.default.sync("./**/Cookies",{cwd:r,absolute:!0});return this.logger.debug(`Found ${t.length} cookie files for ${this.browser}`),t}catch(r){return this.logger.warn(`Failed to find ${this.browser} cookie files`,{error:this.getErrorMessage(r)}),[]}}};x();function Ft(o){let e=os.homedir();if(!e)return o.warn("Failed to get home directory"),[];let r=h(),t=[],i=[];switch(r){case "darwin":t.push(path.join(e,"Library/Application Support/Firefox")),i.push(path.join(e,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"));break;case "win32":{t.push(path.join(e,"AppData","Roaming","Mozilla","Firefox")),i.push(path.join(e,"AppData","Roaming","Mozilla","Firefox","Profiles","*","cookies.sqlite"));let a=path.join(e,"AppData","Roaming","Mozilla","Firefox Developer Edition");fs.existsSync(a)&&(t.push(a),i.push(path.join(a,"Profiles","*","cookies.sqlite")));let c=path.join(e,"AppData","Roaming","Mozilla","Firefox ESR");fs.existsSync(c)&&(t.push(c),i.push(path.join(c,"Profiles","*","cookies.sqlite")));let l=path.join(e,"AppData","Local","Mozilla","Firefox");fs.existsSync(l)&&(t.push(l),i.push(path.join(l,"Profiles","*","cookies.sqlite")));break}case "linux":t.push(path.join(e,".mozilla/firefox")),i.push(path.join(e,".mozilla/firefox/*/cookies.sqlite"));break;default:return o.debug("Unsupported platform for Firefox cookie extraction",{platform:r}),[]}if(t.filter(a=>fs.existsSync(a)).length===0)return o.debug("No Firefox profile directories found - Firefox may not be installed",{checked:t,platform:r}),[];let s=[];for(let a of i){let c=Bt__default.default.sync(a);s.push(...c);}return o.debug("Found Firefox cookie files",{files:s}),s}var q=class extends ${constructor(){super("FirefoxCookieQueryStrategy","Firefox"),this.lockHandler=new L(this.logger,"Firefox");}async createCookieQueryConfig(e,r,t){let{CookieQueryBuilder:i}=await Promise.resolve().then(()=>($e(),yr)),s=new i("firefox").buildSelectQuery({name:e,domain:r,browser:"firefox"});return {file:t,sql:s.sql,params:s.params,rowTransform:a=>({name:a.name,value:a.value,domain:a.domain,expiry:a.expiry>0?new Date(a.expiry*1e3):"Infinity",meta:{file:t,browser:"Firefox",decrypted:false}})}}async handleCookieExtractionError(e,r,t,i,n){let s=await Xe(),a=await this.lockHandler.handleBrowserConflict(e,r,s,t!==true);return a.resolved?{retryAfterClose:true,shouldRelaunch:a.shouldRelaunch}:(this.logExtractError(e,r,i,n),{retryAfterClose:false,shouldRelaunch:false})}logExtractError(e,r,t,i){let n=e instanceof Error?e.message:String(e);this.logger.debug(`Error reading Firefox cookie file ${r}`,{error:n,file:r,name:t,domain:i});}async performRetryAfterClose(e,r){this.logger.info("Retrying Firefox cookie extraction after browser close...");try{let t=await this.executeQueryWithNewUtilities(e);return this.logger.success("Successfully extracted cookies after closing Firefox"),r&&await this.lockHandler.relaunchBrowser(),t}catch(t){return this.logger.error("Failed to extract cookies even after closing Firefox",{error:t instanceof Error?t.message:String(t),file:e.file}),r&&await this.lockHandler.relaunchBrowser(),[]}}async processCookieFile(e,r,t,i){let n=await this.createCookieQueryConfig(r,t,e);try{return await this.executeQueryWithNewUtilities(n)}catch(s){let a=await this.handleCookieExtractionError(s,e,i,r,t);return a.retryAfterClose?this.performRetryAfterClose(n,a.shouldRelaunch):[]}}async executeQueryWithNewUtilities(e){let r=j({retryAttempts:1,retryDelay:0,queryTimeout:100,enableMonitoring:true}),t=ee();return r.executeQuery(e.file,i=>t.executeQuery(i,e.sql,e.params,e.file).map(e.rowTransform),e.sql)}async executeQuery(e,r,t,i){let n=t??Ft(this.logger),s=Array.isArray(n)?n:[n];if(s.length===0)return this.logger.debug("No Firefox cookie files to query"),[];let a=[];for(let c of s){let l=await this.processCookieFile(c,e,r,i);a.push(...l);}return a}};x();k();x();var Ue=util.promisify(child_process.exec),re=g("SystemPermissions");async function At(){try{await Ue('open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"'),re.info("Opened System Settings > Privacy & Security > Full Disk Access");}catch{try{await Ue('open "x-apple.systempreferences:com.apple.preference.security?Privacy"'),re.info("Opened System Settings > Privacy & Security");}catch{await Ue("open -b com.apple.systempreferences"),re.info("Opened System Settings");}}}function Mt(){let o=process.env.TERM_PROGRAM;return o==="iTerm.app"?"iTerm":o==="Apple_Terminal"?"Terminal":o==="vscode"?"Visual Studio Code":o??"your terminal application"}async function It(o,e){let r=kr__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{console.log(`
56
+ \u26A0\uFE0F ${e} cookie access is blocked by macOS security.
57
+
58
+ To grant access, ${o} needs permission to read ${e} data.
59
+
60
+ Would you like to:
61
+ 1. Open System Settings to grant permission (recommended)
62
+ 2. Skip ${e} cookies for now
63
+ 3. Exit
64
+
65
+ Please enter your choice (1/2/3): `),r.question("",i=>{r.close(),t(i.trim()==="1");});})}async function ze(o,e){if(!N()||!(b(o,"eperm")||b(o,"operation not permitted")||b(o,"permission denied")||b(o,"authorization denied")))return false;let t=e.appName||Mt();if(re.warn(`${e.browserName} cookie access denied by macOS`,{app:t,error:w(o)}),e.interactive!==false){if(await It(t,e.browserName)){await At(),console.log(`
66
+ \u2705 System Settings opened to Privacy & Security
67
+
68
+ Please follow these steps:
69
+ 1. Look for "${t}" in the list
70
+ 2. If not present, click the "+" button and add it
71
+ 3. Enable the toggle next to "${t}"
72
+ 4. You may need to restart ${t} after granting permission
73
+ 5. Then run this command again
74
+
75
+ Press Enter when you've completed these steps...`);let n=kr__default.default.createInterface({input:process.stdin,output:process.stdout});return await new Promise(s=>{n.question("",()=>{n.close(),s();});}),true}}else re.info(`To grant ${e.browserName} access, add ${t} to System Settings > Privacy & Security > Full Disk Access`);return false}async function We(o){try{let{exec:e}=await import('child_process'),{promisify:r}=await import('util');return await r(e)(`cat "${o}" > /dev/null 2>&1`),!0}catch{return false}}k();k();var ue=zod.z.string().trim().min(1,"Domain cannot be empty").refine(o=>/^\.?[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(o),"Invalid domain format"),fe=zod.z.string().trim().min(1,"Cookie name cannot be empty").refine(o=>o==="%"||/^[!#$%&'()*+\-.:0-9A-Z ^_`a-z|~]+$/.test(o),"Invalid cookie name format - must contain only valid characters (letters, numbers, and certain symbols) or be '%' for wildcard"),xr=zod.z.string().trim().min(1,"Path cannot be empty").refine(o=>o.startsWith("/"),"Path must start with /").refine(o=>/^\/[!#$%&'()*+,\-./:=@\w~]*$/.test(o),"Invalid path format - must contain only valid URL path characters").default("/"),Sr=zod.z.string().trim().transform(o=>Qt__default.default(o)).pipe(zod.z.any()),Er=zod.z.object({name:fe,value:Sr,domain:ue,path:xr,expiry:zod.z.number().int(),creation:zod.z.number().int(),flags:zod.z.number().optional(),version:zod.z.number().int().optional(),port:zod.z.number().int().optional(),comment:zod.z.string().optional(),commentURL:zod.z.string().optional()}),qt=zod.z.object({name:fe,domain:ue}).strict(),_t=zod.z.object({file:zod.z.string().trim().min(1,"File path cannot be empty").optional(),browser:zod.z.string().trim().optional(),decrypted:zod.z.boolean().optional(),secure:zod.z.boolean().optional(),httpOnly:zod.z.boolean().optional(),path:xr.optional()}).catchall(zod.z.unknown());zod.z.object({domain:ue,name:fe,value:Sr,expiry:zod.z.union([zod.z.literal("Infinity"),zod.z.date(),zod.z.number().int().positive("Expiry must be a positive number")]).optional(),meta:_t.optional()}).strict();zod.z.object({expiry:zod.z.number().int().optional(),domain:ue,name:fe,value:zod.z.union([zod.z.string(),zod.z.instanceof(Buffer)])}).strict();zod.z.object({format:zod.z.enum(["merged","grouped"]).optional(),separator:zod.z.string().optional(),showFilePaths:zod.z.boolean().optional()}).strict();var Ht=zod.z.enum(["Chrome","Firefox","Safari","internal","unknown"]),Ut=zod.z.object({browserName:Ht,queryCookies:zod.z.function()}).strict(),zt=zod.z.object({limit:zod.z.number().int().positive().optional(),removeExpired:zod.z.boolean().optional(),includeExpired:zod.z.boolean().optional(),store:zod.z.string().optional(),force:zod.z.boolean().optional()});zt.extend({strategy:Ut.optional()});var Wt=zod.z.enum(["chrome","chromium","edge","firefox","opera","brave","arc"]);qt.extend({browser:Wt,exactDomain:zod.z.boolean().optional(),caseSensitive:zod.z.boolean().optional(),limit:zod.z.number().int().positive().optional(),includeExpired:zod.z.boolean().optional()});k();var M=g("BinaryCodableCookie"),pe=class{constructor(e){this.version=0;this.url="";this.name="";this.path="";this.value="";this.flags={isSecure:false,isHTTPOnly:false,unknown1:false,unknown2:false};this.expiration=0;this.creation=0;let r={offset:0,buffer:e};this.decode(r);}decodeUrlValue(e){let r=e,t;do{t=r;try{r=decodeURIComponent(r);}catch{return t}}while(r!==t&&r.includes("%"));return r}decodeJwtPayload(e){let r=e.split(".");if(r.length!==3)return null;try{let t=r[1];if(!t)return null;let i=buffer.Buffer.from(t,"base64").toString("utf8"),n=JSON.parse(i);return JSON.stringify(n)}catch{return null}}parseJsonValue(e){try{let r=JSON.parse(e);return JSON.stringify(r)}catch{return null}}processValue(e){let r=this.handlePrimitiveValues(e);if(r!==null)return r;let t=e,i=this.decodeUrlValue(t);return this.trySpecializedDecoding(i)}handlePrimitiveValues(e){return e===null?"null":e===void 0?"undefined":buffer.Buffer.isBuffer(e)?e.toString():typeof e!="string"?this.safeStringify(e):null}trySpecializedDecoding(e){let r=this.tryJwtDecoding(e);if(r!==null)return r;let t=this.tryJsonDecoding(e);return t!==null?t:e}tryJwtDecoding(e){if(e.match(/^ey[A-Za-z0-9_-]+\.ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/)){let r=this.decodeJwtPayload(e);if(typeof r=="string"&&r.length>0)return r}return null}tryJsonDecoding(e){if(e.startsWith("{")||e.startsWith("[")){let r=this.parseJsonValue(e);if(typeof r=="string"&&r.length>0)return r}return null}safeStringify(e){try{return typeof e=="object"&&e!==null?JSON.stringify(e):String(e)}catch{return String(e)}}convertMacTimestamp(e){return e<=0?e:e>=0&&e<=1e9&&Number.isFinite(e)?e+978307200:0}toCookieRow(){try{let e=this.convertFlags(),r=this.url.replace(/^https?:\/\//,"").replace(/\/.*$/,"")||"uk",t=this.convertMacTimestamp(this.expiration),i=this.convertMacTimestamp(this.creation);return Er.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:t,creation:i,flags:e,version:this.version,port:this.port,comment:this.comment,commentURL:this.commentURL})}catch{return null}}readHeader(e){let r=e.buffer.readUInt32LE(e.offset);M.debug("Cookie size:",r),e.offset+=4;let t=e.buffer.readUInt32LE(e.offset);M.debug("Cookie version:",t),e.offset+=4;let i=e.buffer.readUInt32LE(e.offset);M.debug("Cookie flags:",i.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(i&1)!==0,isHTTPOnly:(i&4)!==0,unknown1:(i&8)!==0,unknown2:(i&16)!==0};let n=e.buffer.readUInt32LE(e.offset);M.debug("Has port:",n),e.offset+=4;let s={urlOffset:e.buffer.readUInt32LE(e.offset),nameOffset:e.buffer.readUInt32LE(e.offset+4),pathOffset:e.buffer.readUInt32LE(e.offset+8),valueOffset:e.buffer.readUInt32LE(e.offset+12),commentOffset:e.buffer.readUInt32LE(e.offset+16),commentURLOffset:e.buffer.readUInt32LE(e.offset+20)};return M.debug("String offsets:",s),{size:r,hasPort:n,offsets:s}}readTimestamps(e){let r=buffer.Buffer.alloc(8);for(let s=0;s<8;s++)r[s]=e.buffer[e.offset+s];let t=r.readDoubleLE(0);e.offset+=8;let i=buffer.Buffer.alloc(8);for(let s=0;s<8;s++)i[s]=e.buffer[e.offset+s];let n=i.readDoubleLE(0);e.offset+=8,this.expiration=t,this.creation=n;}readStrings(e,r,t){M.debug("Reading strings from cookie buffer of size:",r);let n=[{field:"url",offset:t.urlOffset},{field:"name",offset:t.nameOffset},{field:"path",offset:t.pathOffset},{field:"value",offset:t.valueOffset},{field:"comment",offset:t.commentOffset}].filter(s=>s.offset>0).sort((s,a)=>s.offset-a.offset);M.debug("Reading strings in order:",n.map(s=>s.field));for(let s=0;s<n.length;s++){let a=n[s],{field:c,offset:l}=a,m=(s<n.length-1?n[s+1].offset:r)-l,E=0+l;for(;E<0+l+m&&e.buffer[E]!==0;)E++;let p=e.buffer.toString("utf8",0+l,E);switch(M.debug(`Read ${c}:`,p),c){case "url":this.url=p;break;case "name":this.name=p;break;case "path":this.path=p;break;case "value":this.value=p;break;case "comment":this.comment=p;break}}}decode(e){let{size:r,hasPort:t,offsets:i}=this.readHeader(e),n=e.offset;e.offset=n+24,this.readTimestamps(e),t>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=n,this.readStrings(e,r,i);}convertFlags(){return (this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var R=g("BinaryCodablePage"),K=class K{constructor(e){this.cookies=[];let r={offset:0,buffer:e};this.decode(r);}toCookieRows(){let e=[];for(let r of this.cookies)try{let t=r.toCookieRow();t!==null&&e.push(t);}catch(t){let i=t instanceof Error?t.message:String(t);U("BinaryCookies","Error converting cookie",{error:i});}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if(R.debug("Page header:",r.toString(16)),e.offset+=4,r!==K.HEADER)throw new Error("Invalid page header");let t=e.buffer.readUInt32LE(e.offset);R.debug("Cookie count:",t),e.offset+=4;let i=e.offset-8;R.debug("Page start offset:",i);let n=[];for(let a=0;a<t;a++){let c=e.buffer.readUInt32LE(e.offset);n.push(c),R.debug(`Cookie ${a} offset:`,c),e.offset+=4;}let s=e.buffer.readUInt32BE(e.offset);if(R.debug("Page footer:",s.toString(16)),e.offset+=4,s!==K.FOOTER)throw new Error("Invalid page footer");for(let a=0;a<t;a++)try{let c=n[a];R.debug(`Reading cookie ${a} at offset:`,c);let l=e.buffer.readUInt32LE(c);if(R.debug(`Cookie ${a} size:`,l),l<48){R.warn(`Invalid cookie size ${l} at index ${a}`);continue}if(c+l>e.buffer.length){R.warn(`Cookie size ${l} at index ${a} would exceed buffer length ${e.buffer.length}`);continue}let f=e.buffer.subarray(c,c+l),m=new pe(f);this.cookies.push(m);}catch(c){R.warn("Invalid cookie data",{error:c instanceof Error?c.message:String(c)});}}};K.HEADER=256,K.FOOTER=0;var de=K;var I=g("BinaryCodableCookies"),O=class O{constructor(e){let r={offset:0,buffer:e};this.pages=[],this.metadata={},this.decode(r);}static fromFile(e){let r=fs.readFileSync(e);return new O(r)}static fromDefaultPath(){return O.fromFile(O.DEFAULT_COOKIE_PATH)}toCookieRows(){let e=[];for(let r of this.pages)try{let t=r.toCookieRows();Array.isArray(t)&&e.push(...t);}catch(t){let i=t instanceof Error?t.message:String(t);U("BinaryCookies","Error converting page cookies",{error:i});}return e}decode(e){try{let r=e.buffer.subarray(e.offset,e.offset+4);if(e.offset+=4,I.debug("Magic bytes:",r.toString()),!r.equals(O.MAGIC))throw new Error("Missing magic value");let t=e.buffer.readUInt32BE(e.offset);I.debug("Page count:",t),e.offset+=4;let i=[];for(let c=0;c<t;c++){let l=e.buffer.readUInt32BE(e.offset);i.push(l),I.debug(`Page ${c} size:`,l),e.offset+=4;}let n=e.offset;I.debug("Starting page data at offset:",n);for(let c of i)try{I.debug("Reading page at offset:",n,"with size:",c);let l=e.buffer.subarray(n,n+c),f=new de(l);this.pages.push(f),n+=c;}catch(l){let f=l instanceof Error?l.message:String(l);I.warn("Error decoding page:",{error:f}),n+=c;}e.offset=n;let s=e.buffer.readUInt32BE(e.offset);I.debug("Checksum:",s.toString(16)),e.offset+=4;let a=e.buffer.readBigUInt64BE(e.offset);I.debug("Footer:",a.toString(16)),e.offset+=8,a!==O.FOOTER&&U("BinaryCookies","Invalid cookie file format: wrong footer"),this.metadata={};}catch(r){let t=r instanceof Error?r.message:String(r);throw U("BinaryCookies","Error decoding binary cookies file",{error:t}),r}}};O.MAGIC=buffer.Buffer.from("cook","utf8"),O.FOOTER=BigInt("0x071720050000004b"),O.DEFAULT_COOKIE_PATH=path.join(os.homedir(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var ge=O;function vr(o){return ge.fromFile(o).toCookieRows()}var _=class extends ${constructor(){super("SafariCookieQueryStrategy","Safari"),this.lockHandler=new L(this.logger,"Safari");}getCookieDbPath(e){return path.join(e,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies")}formatDomain(e){return e==null||typeof e!="string"?"":e.startsWith(".")?e.slice(1):e}formatExpiry(e){return e==null?void 0:typeof e!="number"||Number.isNaN(e)||e<=0?"Infinity":e<0||e>4102444800?(this.logger.warn("Invalid expiry timestamp, treating as session cookie",{expiry:e}),"Infinity"):new Date(e*1e3)}isFlagSet(e,r){return typeof e!="number"||Number.isNaN(e)||e<=0?false:(e&r)===r}formatCreation(e){if(typeof e!="number"||Number.isNaN(e)||e<=0)return;if(e<0||e>4102444800){this.logger.warn("Invalid creation timestamp, ignoring",{creation:e});return}return e*1e3}processValue(e){if(e===null)return "null";if(e===void 0)return "undefined";if(Buffer.isBuffer(e))return e.toString();if(typeof e=="object")try{return JSON.stringify(e)}catch{return "[object]"}return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):"[unknown value]"}async decodeCookies(e,r,t,i){try{if(!await this.checkAndHandlePermissions(e,i))return [];let s=vr(e);return this.processCookies(s,r,t,e)}catch(n){return this.handleDecodingError(n,e,r,t,i)}}async checkAndHandlePermissions(e,r){return await We(e)?true:(this.logger.warn("Cannot access Safari cookies due to macOS permissions",{file:e,suggestion:"Terminal application needs Full Disk Access permission"}),await ze(new Error("EPERM: operation not permitted"),{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:r!==true})?await We(e)?true:(this.logger.error("Still cannot access Safari cookies after permission attempt",{file:e,advice:"Please restart your terminal application after granting Full Disk Access"}),false):false)}processCookies(e,r,t,i){return e.filter(n=>this.matchesCriteria(n,r,t)).map(n=>this.mapToExportedCookie(n,i))}matchesCriteria(e,r,t){if(!this.isCookieObject(e))return false;let i=this.formatDomain(e.domain);if(i==="")return false;let n=r==="%"||e.name===r,s=t==="%"||i.includes(t);return n&&s}isCookieObject(e){return typeof e=="object"&&e!==null&&"name"in e&&typeof e.name=="string"}mapToExportedCookie(e,r){let t=e;return {domain:this.formatDomain(t.domain),name:t.name,value:this.processValue(t.value),expiry:this.formatExpiry(t.expiry),meta:{file:r,browser:"Safari",decrypted:false,secure:this.isFlagSet(t.flags,1),httpOnly:this.isFlagSet(t.flags,4),path:t.path??void 0,version:t.version===void 0?void 0:t.version,comment:t.comment??void 0,commentURL:t.commentURL??void 0,port:t.port===void 0?void 0:t.port,creation:this.formatCreation(t.creation)}}}async handleDecodingError(e,r,t,i,n){return b(e,"EPERM")||b(e,"operation not permitted")||b(e,"Permission denied")?await this.handlePermissionError(e,r,t,i,n):this.logDecodingError(e,r,t,i),[]}async handlePermissionError(e,r,t,i,n){await ze(e,{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:n!==true})?this.logger.info("Permission flow completed. Please run the command again after granting access."):this.logger.warn(`Permission denied accessing Safari cookies at ${r}`,W(e,{file:r,name:t,domain:i,advice:"Grant Full Disk Access to your terminal in System Settings > Privacy & Security"}));}logDecodingError(e,r,t,i){this.logger.error(`Error decoding ${r}`,W(e,{file:r,name:t,domain:i}));}async executeQuery(e,r,t,i){if(!N())return this.logger.debug("Safari strategy skipped on non-macOS platform"),[];try{this.logger.info("Querying cookies",{name:e,domain:r,store:t});let n=os.homedir();if(!this.isValidHomeDirectory(n))return [];let s=t??this.getCookieDbPath(n),a=e||"%",c=r||"%",l=await this.attemptDecodeWithLockHandling(s,a,c,i);return l.success?l.cookies:l.shouldRetry?this.retryAfterBrowserClose(s,a,c,i,l.shouldRelaunch):[]}catch(n){return this.logQueryError(n,e,r),[]}}isValidHomeDirectory(e){return typeof e!="string"||e.length===0?(this.logger.error("Failed to get home directory"),false):true}async attemptDecodeWithLockHandling(e,r,t,i){try{return {success:!0,cookies:await this.decodeCookies(e,r,t,i),shouldRetry:!1,shouldRelaunch:!1}}catch(n){return this.handleLockConflict(n,e,i)}}async handleLockConflict(e,r,t){if(!this.isLockError(e))throw e;let i=await rr(),n=await this.lockHandler.handleBrowserConflict(e,r,i,t!==true);return n.resolved?{success:false,cookies:[],shouldRetry:true,shouldRelaunch:n.shouldRelaunch}:(this.logger.warn("Safari cookie file locked",W(e,{file:r,advice:"Safari may be accessing the cookie file. Try closing Safari and running again."})),{success:false,cookies:[],shouldRetry:false,shouldRelaunch:false})}isLockError(e){return b(e,"EPERM")||b(e,"operation not permitted")||b(e,"Permission denied")||b(e,"EBUSY")}async retryAfterBrowserClose(e,r,t,i,n){try{this.logger.info("Retrying Safari cookie extraction after browser close...");let s=await this.decodeCookies(e,r,t,i);return this.logger.success("Successfully extracted cookies after closing Safari"),n===!0&&await this.lockHandler.relaunchBrowser(),s}catch(s){return this.handleRetryFailure(s,e,n)}}async handleRetryFailure(e,r,t){return this.logger.error("Failed to extract cookies even after closing Safari",W(e,{file:r})),t===true&&await this.lockHandler.relaunchBrowser(),[]}logQueryError(e,r,t){this.logger.error("Failed to query cookies",W(e,{name:r,domain:t}));}};H();async function Pr(o){if(!o.name||!o.domain)return [];let{name:e,domain:r}=o;if(typeof e!="string"||typeof r!="string")return [];let t=[new Q,new q,new _];return (await Promise.allSettled(t.map(async n=>n.queryCookies(e,r)))).filter(n=>n.status==="fulfilled").flatMap(n=>n.value)}async function he(o){try{let e=await Pr(o);return y.debug("Cookies retrieved:",e),e}catch(e){return y.warn("Error querying cookies:",e instanceof Error?e.message:String(e)),[]}}H();H();function Zt(o){return o.filter(e=>!!e.name&&!!e.domain&&typeof e.name=="string"&&typeof e.domain=="string")}function Xt(o){return "batchQueryCookies"in o&&typeof o.batchQueryCookies=="function"}function eo(o,e){let r=[],t=[];for(let i of o)if(i.status==="fulfilled")r.push(...i.value);else if(e)t.push(V(i.reason,"Query failed"));else throw i.reason;return {cookies:r,errors:t}}async function ro(o,e,r){let t=[],i=[];try{if(Xt(o)){let n=await o.batchQueryCookies(e);t.push(...n);}else {let n=await Promise.allSettled(e.map(async a=>o.queryCookies(a.name,a.domain))),s=eo(n,r);t.push(...s.cookies),i.push(...s.errors);}}catch(n){let s=V(n,`Failed to query ${o.constructor.name}`);if(!r)throw s;i.push(s),y.warn(`Strategy ${o.constructor.name} failed`,{error:w(s)});}return {cookies:t,errors:i}}async function Ve(o,e=true){let r=Zt(o);if(r.length===0)return [];y.debug(`Batch querying ${r.length} cookie specs`);let t=[new Q,new q,new _],i=[],n=[];for(let s of t){let{cookies:a,errors:c}=await ro(s,r,e);i.push(...a),n.push(...c);}return n.length>0&&y.debug(`${n.length} errors occurred during batch query`),i}async function to(o,e={}){let{deduplicate:r=true,concurrency:t=10,continueOnError:i=true}=e;y.debug(`Batch fetching ${o.length} cookie specs`,{deduplicate:r,concurrency:t,continueOnError:i});let n;try{n=await Ve(o,i),y.debug(`Batch query returned ${n.length} cookies`);}catch(s){if(!i)throw s;y.warn("Batch query failed, falling back to individual queries",{error:w(s)}),n=await ao(o,t,i);}if(r&&n.length>0){let s=co(n);return y.debug(`Deduplicated ${n.length} to ${s.length}`),s}return n}function oo(o,e){return o.map(r=>{let t=e.filter(i=>i.name===r.name&&i.domain===r.domain);return {spec:r,cookies:t}})}async function no(o,e){let r=o.map(async t=>{try{let i=await he(t);return {spec:t,cookies:i}}catch(i){let n=V(i,"Failed to fetch cookies");if(!e)throw n;return y.warn("Failed to fetch cookies for spec",{spec:t,error:w(n)}),{spec:t,cookies:[],error:n}}});return Promise.all(r)}async function io(o,e={}){let{concurrency:r=10,continueOnError:t=true}=e;y.debug(`Batch fetching ${o.length} cookie specs with results`,{concurrency:r,continueOnError:t});try{let i=await Ve(o,t);return oo(o,i)}catch(i){y.warn("Batch query failed, falling back to individual queries",{error:w(i)});let n=[];for(let s=0;s<o.length;s+=r){let a=o.slice(s,s+r),c=await no(a,t);n.push(...c);}return n}}async function so(o,e){let r=[],t=[],i=o.map(async s=>{try{let a=await he(s);return {spec:s,cookies:a,error:void 0}}catch(a){let c=V(a,"Failed to fetch cookies");if(!e)throw c;return y.warn("Failed to fetch cookies for spec",{spec:s,error:w(c)}),{spec:s,cookies:[],error:c}}}),n=await Promise.all(i);for(let s of n)s.error?t.push({spec:s.spec,error:s.error}):r.push(...s.cookies);return {cookies:r,errors:t}}async function ao(o,e,r){let t=[],i=[];for(let n=0;n<o.length;n+=e){let s=o.slice(n,n+e),{cookies:a,errors:c}=await so(s,r);t.push(...a),i.push(...c);}return i.length>0&&y.warn(`${i.length} specs failed during batch retrieval`,{failedSpecs:i.map(n=>n.spec)}),t}function co(o){let e=new Map;for(let r of o){let t=`${r.name}:${r.domain}`,i=e.get(t),n=i?.value.length??0,s=r.value.length;(!i||s>n)&&e.set(t,r);}return Array.from(e.values())}
76
+ exports.ChromeCookieQueryStrategy=Q;exports.ChromiumCookieQueryStrategy=He;exports.CompositeCookieQueryStrategy=be;exports.FirefoxCookieQueryStrategy=q;exports.SafariCookieQueryStrategy=_;exports.batchGetCookies=to;exports.batchGetCookiesWithResults=io;exports.getCookie=he;//# sourceMappingURL=index.cjs.map
3
77
  //# sourceMappingURL=index.cjs.map