@mherod/get-cookie 4.4.2 → 4.5.0
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.
- package/README.md +26 -5
- package/dist/bun.cjs +77 -0
- package/dist/bun.cjs.map +1 -0
- package/dist/bun.d.cts +3 -0
- package/dist/bun.d.ts +3 -0
- package/dist/bun.js +77 -0
- package/dist/bun.js.map +1 -0
- package/dist/cli.cjs +14 -11
- package/dist/cli.cjs.map +1 -1
- package/dist/index.cjs +11 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +103 -37
- package/dist/index.d.ts +103 -37
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/node.cjs +77 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +3 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.js +77 -0
- package/dist/node.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -14
- package/.claude/settings.local.json +0 -3
- package/.dependency-cruiser.js +0 -277
- package/.env.example +0 -5
- package/.husky/commit-msg +0 -19
- package/.husky/pre-commit +0 -29
- package/.husky/pre-push +0 -21
- package/.idea/codeStyles/Project.xml +0 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/get-cookie.iml +0 -13
- package/.idea/git_toolbox_prj.xml +0 -15
- package/.idea/jsLibraryMappings.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -9
- package/.idea/runConfigurations/build.xml +0 -12
- package/.idea/vcs.xml +0 -6
- package/.nvmrc +0 -1
- package/biome.json +0 -117
- package/commitlint.config.js +0 -12
- package/eslint.config.js +0 -255
- package/examples/README.md +0 -71
- package/examples/advanced-usage.ts +0 -56
- package/examples/auth-tokens.ts +0 -143
- package/examples/basic-usage.ts +0 -43
- package/examples/cli-examples.sh +0 -51
- package/examples/comprehensive-demo.ts +0 -202
- package/examples/curl-integration.sh +0 -311
- package/examples/features-demo.sh +0 -260
- package/examples/github-auth.sh +0 -295
- package/examples/quick-start.sh +0 -115
- package/jest.setup.js +0 -34
- package/tsconfig.build.json +0 -9
- package/tsconfig.cli.json +0 -16
- package/tsconfig.tsup.json +0 -12
- package/tsup.cli.ts +0 -59
- package/tsup.lib.ts +0 -46
- package/typedoc.json +0 -17
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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'),_t=require('better-sqlite3'),Ar=require('readline'),crypto=require('crypto'),events=require('events'),zt=require('fast-glob'),buffer=require('buffer'),to=require('destr');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var _t__default=/*#__PURE__*/_interopDefault(_t);var Ar__default=/*#__PURE__*/_interopDefault(Ar);var zt__default=/*#__PURE__*/_interopDefault(zt);var to__default=/*#__PURE__*/_interopDefault(to);var xe=Object.defineProperty;var Hr=Object.getOwnPropertyDescriptor;var Ur=Object.getOwnPropertyNames;var zr=Object.prototype.hasOwnProperty;var Se=(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 P=(o,e)=>()=>(o&&(e=o(o=0)),e);var X=(o,e)=>{for(var r in e)xe(o,r,{get:e[r],enumerable:true});},Wr=(o,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ur(e))!zr.call(o,n)&&n!==r&&xe(o,n,{get:()=>e[n],enumerable:!(t=Hr(e,n))||t.enumerable});return o};var rr=o=>Wr(xe({},"__esModule",{value:true}),o);function f(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 U(o){let e=f(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 k(o,e){return f(o).toLowerCase().includes(e.toLowerCase())}function se(o,e){return e.some(r=>o.includes(r))}function tr(o){let e=f(o).toLowerCase();return se(e,ie.locked)?"locked":se(e,ie.busy)?"busy":se(e,ie.permission)?"permission":se(e,ie.not_found)?"not_found":null}function z(o,e){let r=U(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 ae(o){return o instanceof Error}function W(o,e="An unknown error occurred"){if(o instanceof Error)return o;let r=f(o)||e,t=new Error(r);return "cause"in t&&(t.cause=o),t}var ie,b=P(()=>{ie={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"]};});var jr,Ee,nr=P(()=>{dotenv.config();jr=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))}),Ee=jr.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:os.homedir()});});var Kr,Yr,w,V=P(()=>{nr();Kr=consola.createConsola({formatOptions:{showLogLevel:false,colors:true,date:false,compact:true,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:Ee.LOG_LEVEL==="debug"?5:2}),Ee.LOG_LEVEL==="debug",Yr=Kr,w=Yr;});function ee(o,e,r){let t=f(e);w.error(o,{...r,error:t});}function G(o,e,r){w.warn(`[${o}] ${e}`,r);}function h(o){return w.withTag(o)}var x=P(()=>{b();V();V();});function y(){return ir??(ir=os.platform()),ir}function $(){return y()==="darwin"}function R(){return y()==="win32"}function Pe(){let o=y();return o==="darwin"||o==="win32"||o==="linux"}function j(){if(!Pe())throw new Error(`Unsupported platform: ${y()}. Supported platforms are: darwin, win32, linux`)}var ir,S=P(()=>{});async function F(o,e){try{let r=await rt(o,{...e,encoding:"utf8"});return {stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw ee("Command execution failed",r,{command:o}),new Be(f(r),o,ae(r)?r:void 0)}}var rt,Be,le=P(()=>{b();x();rt=util.promisify(child_process.exec),Be=class extends Error{constructor(r,t,n){super(r);this.command=t;this.originalError=n;this.name="CommandExecutionError";}};});var me,Le=P(()=>{S();me=(()=>{let o=os.homedir();if(!o)throw new Error("Unable to determine user home directory");switch(j(),y()){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 ${y()} is not supported`)}})();});var Cr={};X(Cr,{getChromePassword:()=>Ft});async function $t(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(R())try{let n=await import('@primno/dpapi');if(typeof n.unprotectData=="function")return n.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 Ft(){try{let o=path.join(me,"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 $t(t)).toString("latin1")}catch(o){throw new Error(`Failed to retrieve Chrome password on Windows: ${f(o)}`)}}var kr=P(()=>{b();S();Le();});var xr={};X(xr,{getChromePassword:()=>qt});async function qt(){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 Sr=P(()=>{le();});var Pr={};X(Pr,{CookieQueryBuilder:()=>L,createQueryBuilder:()=>Qt,isSqlBrowser:()=>vr});function Qt(o){return new L(o)}function vr(o){return o in Er}var Er,L,Ie=P(()=>{Er={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"}},L=class{constructor(e){if(this.browser=e,!vr(e))throw new Error(`Unsupported browser type: ${e}`);this.schema=Er[e];}buildSelectQuery(e){let{name:r,domain:t,exactDomain:n,limit:i,includeExpired:s}=e,a=this.schema,c=this.buildSelectColumns(),{whereClause:l,params:m}=this.buildWhereClause(r,t,n,s),p=`SELECT ${c} FROM ${a.tableName}`;return l&&(p+=` WHERE ${l}`),p+=` ORDER BY ${a.expiryColumn} DESC`,i!==void 0&&i>0&&(p+=` LIMIT ${i}`),{sql:p,params:m,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(),n=[],i=[];for(let l of e){let{whereClause:m,params:p}=this.buildWhereClause(l.name,l.domain,l.exactDomain,l.includeExpired);m&&(n.push(`(${m})`),i.push(...p));}let s=n.join(" OR "),a=`SELECT ${t} FROM ${r.tableName}`;s&&(a+=` WHERE ${s}`),a+=` ORDER BY ${r.expiryColumn} DESC`;let c=e.reduce((l,m)=>m.limit!==void 0&&m.limit>0?l!==void 0?Math.min(l,m.limit):m.limit:l,void 0);return c!==void 0&&c>0&&(a+=` LIMIT ${c*e.length}`),{sql:a,params:i,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!==void 0&&this.browser!=="firefox"?r.push(e.encryptedValueColumn):r.push(e.valueColumn),e.pathColumn!==void 0&&r.push(e.pathColumn),e.secureColumn!==void 0&&r.push(e.secureColumn),e.httpOnlyColumn!==void 0&&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(", ")}addDomainCondition(e,r,t,n,i){if(i===true){e.push(`${t} = ?`),r.push(n);return}n.startsWith(".")?(e.push(`${t} LIKE ?`),r.push(`%${n}`)):(e.push(`(${t} = ? OR ${t} = ? OR ${t} LIKE ?)`),r.push(n,`.${n}`,`%.${n}`));}buildWhereClause(e,r,t,n){let i=this.schema,s=[],a=[];if(e==="%"||(e.includes("%")||e.includes("_")?(s.push(`${i.nameColumn} LIKE ?`),a.push(e)):(s.push(`${i.nameColumn} = ?`),a.push(e))),r!==""&&this.addDomainCondition(s,a,i.domainColumn,r,t),n!==true)if(this.browser==="firefox"){let c=Math.floor(Date.now()/1e3);s.push(`${i.expiryColumn} > ?`),a.push(c);}else s.push(`${i.expiryColumn} > 0`);return {whereClause:s.join(" AND "),params:a}}static validateQueryParams(e){let{name:r,domain:t,limit:n}=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 i=["SELECT","INSERT","UPDATE","DELETE","DROP","CREATE","ALTER","--",";"],s=(a,c)=>{let l=a.toUpperCase();for(let m of i)if(l.includes(m))throw new Error(`Invalid ${c}: contains SQL keyword '${m}'`)};if(s(r,"name"),s(t,"domain"),n!==void 0&&(!Number.isInteger(n)||n<=0||n>1e4))throw new Error("Limit must be a positive integer between 1 and 10000")}getBrowserType(){return this.browser}getSchema(){return Object.freeze({...this.schema})}};});var Br={};X(Br,{BunSqliteAdapter:()=>_e});var Qe,_e,Rr=P(()=>{Qe=class{constructor(e){this.statement=e;}all(...e){return this.statement.all(...e)}get(...e){return this.statement.get(...e)}run(...e){this.statement.run(...e);}},_e=class{constructor(e,r={}){if(typeof globalThis.Bun>"u")throw new Error("BunSqliteAdapter can only be used in a Bun runtime environment");let{Database:t}=Se("bun:sqlite"),n={readonly:r.readonly??false,...r.fileMustExist?{create:false}:{}};this.db=new t(e,n),this.readonly=r.readonly??false;}prepare(e){let r=this.db.prepare(e);return new Qe(r)}pragma(e){let r=`PRAGMA ${e}`;this.db.exec(r);}close(){this.db.close();}};});var Dr={};X(Dr,{BetterSqlite3Adapter:()=>Ue});var He,Ue,Or=P(()=>{He=class{constructor(e){this.statement=e;}all(...e){return this.statement.all(...e)}get(...e){return this.statement.get(...e)}run(...e){this.statement.run(...e);}},Ue=class{constructor(e,r={}){this.db=new _t__default.default(e,{readonly:r.readonly??false,fileMustExist:r.fileMustExist??false}),this.readonly=r.readonly??false;}prepare(e){let r=this.db.prepare(e);return new He(r)}pragma(e){return this.db.pragma(e)}close(){this.db.close();}};});b();async function or(o,e,r=[]){return o.length===0?r:(await Promise.all(o.map(async n=>{try{return await e(n)}catch{return r}}))).flat()}x();var ve=class{constructor(e){this.strategies=e;this.logger=h("CompositeCookieQueryStrategy");this.browserName="internal";}handleStrategyError(e,r){this.logger.error("Strategy failed",{...U(e),strategy:r});}async queryCookies(e,r,t,n){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:t,force:n,strategyCount:this.strategies.length}),await or(this.strategies,async i=>{try{return await i.queryCookies(e,r,t,n)}catch(s){return this.handleStrategyError(s,i),[]}},[])}catch(i){return this.logger.error("Failed to query cookies",{...U(i)}),[]}}};b();S();b();le();x();S();var sr=h("ProcessDetector");function tt(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 n=Number.parseInt(t,10);if(Number.isNaN(n))return null;let i=r.slice(10).join(" ");return {pid:n,command:i!==""?i:e,details:o.trim()}}function ot(o,e){let r=o.split(",").map(i=>i.replace(/"/g,"").trim());if(r.length<2)return null;let t=r[1];if(t===void 0||t==="")return null;let n=Number.parseInt(t,10);return Number.isNaN(n)?null:{pid:n,command:r[0]??e,details:o.trim()}}async function Re(o,e){try{let r;if(R()){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 n=[],i=t.split(`
|
|
2
|
-
`).filter(s=>s.trim()!=="");for(let s of i){let a=
|
|
1
|
+
'use strict';var os=require('os'),dotenv=require('dotenv'),zod=require('zod'),consola=require('consola'),fs=require('fs'),child_process=require('child_process'),util=require('util'),path=require('path'),So=require('better-sqlite3'),Po=require('fast-glob'),nt=require('readline'),crypto=require('crypto'),events=require('events'),promises=require('fs/promises'),buffer=require('buffer'),Wo=require('destr');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var So__default=/*#__PURE__*/_interopDefault(So);var Po__default=/*#__PURE__*/_interopDefault(Po);var nt__default=/*#__PURE__*/_interopDefault(nt);var Wo__default=/*#__PURE__*/_interopDefault(Wo);var Ae=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var gt=Object.prototype.hasOwnProperty;var ht=(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 A=(o,e)=>()=>(o&&(e=o(o=0)),e);var X=(o,e)=>{for(var r in e)Ae(o,r,{get:e[r],enumerable:true});},yt=(o,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of dt(e))!gt.call(o,n)&&n!==r&&Ae(o,n,{get:()=>e[n],enumerable:!(t=mt(e,n))||t.enumerable});return o};var Re=o=>yt(Ae({},"__esModule",{value:true}),o);function d(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 J(o){let e=d(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 S(o,e){return d(o).toLowerCase().includes(e.toLowerCase())}function de(o,e){return e.some(r=>o.includes(r))}function fr(o){let e=d(o).toLowerCase();return de(e,me.locked)?"locked":de(e,me.busy)?"busy":de(e,me.permission)?"permission":de(e,me.not_found)?"not_found":null}function K(o,e){let r=J(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 ge(o){return o instanceof Error}function z(o,e="An unknown error occurred"){if(o instanceof Error)return o;let r=d(o)||e,t=new Error(r);return "cause"in t&&(t.cause=o),t}var me,x=A(()=>{me={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"]};});var Ct,Oe,mr=A(()=>{dotenv.config();Ct=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))}),Oe=Ct.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:os.homedir()});});var kt,St,C,Y=A(()=>{mr();kt=consola.createConsola({formatOptions:{showLogLevel:false,colors:true,date:false,compact:true,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:Oe.LOG_LEVEL==="debug"?5:2}),Oe.LOG_LEVEL==="debug",St=kt,C=St;});function ne(o,e,r){let t=d(e);C.error(o,{...r,error:t});}function Z(o,e,r){C.warn(`[${o}] ${e}`,r);}function h(o){return C.withTag(o)}var E=A(()=>{x();Y();Y();});function b(){return dr??(dr=os.platform()),dr}function T(){return b()==="darwin"}function D(){return b()==="win32"}function Te(){let o=b();return o==="darwin"||o==="win32"||o==="linux"}function ee(){if(!Te())throw new Error(`Unsupported platform: ${b()}. Supported platforms are: darwin, win32, linux`)}var dr,B=A(()=>{});var wr={};X(wr,{createNodeFileSystemAdapter:()=>Dt});function Dt(){return {fileExists(o){return fs.existsSync(o)},getFileModificationTime(o){try{return fs.statSync(o).mtimeMs}catch(e){yr.debug("Failed to read file modification time",{path:o,error:e});return}},readFile(o){return fs.readFileSync(o)},readTextFile(o){return fs.readFileSync(o,"utf8")},readLeadingBytes(o,e){let r;try{r=fs.openSync(o,"r");let t=Buffer.alloc(e),n=fs.readSync(r,t,0,e,0);return n<e?t.subarray(0,n):t}catch(t){return yr.debug("Failed to read leading bytes",{path:o,length:e,error:t}),null}finally{r!==void 0&&fs.closeSync(r);}}}}var yr,br=A(()=>{E();yr=h("NodeFileSystemAdapter");});function ye(){if(Fe!==void 0)return Fe;let{createNodeFileSystemAdapter:o}=(br(),Re(wr)),e=o();return Fe=e,e}function v(o){return ye().fileExists(o)}function Cr(o){return ye().readFile(o)}function F(o){return ye().readTextFile(o)}var Fe,N=A(()=>{});async function L(o,e){try{let r=await Nt(o,{...e,encoding:"utf8"});return {stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw ne("Command execution failed",r,{command:o}),new Ne(d(r),o,ge(r)?r:void 0)}}var Nt,Ne,ie=A(()=>{x();E();Nt=util.promisify(child_process.exec),Ne=class extends Error{constructor(r,t,n){super(r);this.command=t;this.originalError=n;this.name="CommandExecutionError";}};});var Mr,$r=A(()=>{B();Mr=(()=>{let o=os.homedir();if(!o)throw new Error("Unable to determine user home directory");switch(ee(),b()){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 ${b()} is not supported`)}})();});var Ir={};X(Ir,{getChromePassword:()=>go});async function mo(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(D())try{let n=await import('@primno/dpapi');if(typeof n.unprotectData=="function")return n.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 go(){try{let o=path.join(Mr,"Local State"),e=F(o),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 mo(t)).toString("latin1")}catch(o){throw new Error(`Failed to retrieve Chrome password on Windows: ${d(o)}`)}}var qr=A(()=>{x();B();N();$r();});var _r={};X(_r,{getChromePassword:()=>ho});async function ho(){try{let r=(await L("secret-tool lookup application chrome-libsecret-password-v2 || secret-tool lookup application chrome")).stdout.trim();if(r)return r}catch{}try{let r=(await L(`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 L('kwallet-query kdewallet -f "Chrome Safe Storage" -r Chrome')).stdout.trim();if(r)return r}catch{}return "peanuts"}var Qr=A(()=>{ie();});var Gr={};X(Gr,{CookieQueryBuilder:()=>H,createQueryBuilder:()=>ko,isSqlBrowser:()=>Ce});function ko(o){return new H(o)}function Ce(o){return o in Hr}var Hr,H,je=A(()=>{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"},"opera-gx":{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"},vivaldi:{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"}},H=class{constructor(e){if(this.browser=e,!Ce(e))throw new Error(`Unsupported browser type: ${e}`);this.schema=Hr[e];}buildSelectQuery(e){let{name:r,domain:t,exactDomain:n,limit:i,includeExpired:s,container:a}=e,c=this.schema,l=this.buildSelectColumns(),{whereClause:u,params:g}=this.buildWhereClause(r,t,n,s,a),R=`SELECT ${l} FROM ${c.tableName}`;return u&&(R+=` WHERE ${u}`),R+=` ORDER BY ${c.expiryColumn} DESC`,i!==void 0&&i>0&&(R+=` LIMIT ${i}`),{sql:R,params:g,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(),n=[],i=[];for(let l of e){let{whereClause:u,params:g}=this.buildWhereClause(l.name,l.domain,l.exactDomain,l.includeExpired,l.container);u&&(n.push(`(${u})`),i.push(...g));}let s=n.join(" OR "),a=`SELECT ${t} FROM ${r.tableName}`;s&&(a+=` WHERE ${s}`),a+=` ORDER BY ${r.expiryColumn} DESC`;let c=e.reduce((l,u)=>u.limit!==void 0&&u.limit>0?l!==void 0?Math.min(l,u.limit):u.limit:l,void 0);return c!==void 0&&c>0&&(a+=` LIMIT ${c*e.length}`),{sql:a,params:i,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!==void 0&&this.browser!=="firefox"?r.push(e.encryptedValueColumn):r.push(e.valueColumn),e.pathColumn!==void 0&&r.push(e.pathColumn),e.secureColumn!==void 0&&r.push(e.secureColumn),e.httpOnlyColumn!==void 0&&r.push(e.httpOnlyColumn),this.browser==="firefox"&&r.push("originAttributes"),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(", ")}addDomainCondition(e,r,t,n,i){if(i===true){e.push(`${t} = ?`),r.push(n);return}n.startsWith(".")?(e.push(`${t} LIKE ?`),r.push(`%${n}`)):(e.push(`(${t} = ? OR ${t} = ? OR ${t} LIKE ?)`),r.push(n,`.${n}`,`%.${n}`));}buildWhereClause(e,r,t,n,i){let s=this.schema,a=[],c=[];if(e==="%"||(e.includes("%")||e.includes("_")?(a.push(`${s.nameColumn} LIKE ?`),c.push(e)):(a.push(`${s.nameColumn} = ?`),c.push(e))),r!==""&&this.addDomainCondition(a,c,s.domainColumn,r,t),n!==true)if(this.browser==="firefox"){let l=Math.floor(Date.now()/1e3);a.push(`${s.expiryColumn} > ?`),c.push(l);}else a.push(`${s.expiryColumn} > 0`);if(this.browser==="firefox"&&i!==void 0)if(String(i).toLowerCase()==="none")a.push("(originAttributes IS NULL OR originAttributes NOT LIKE '%userContextId=%')");else {let l=typeof i=="number"?i:Number.parseInt(String(i),10);Number.isNaN(l)||(a.push("(originAttributes LIKE ? OR originAttributes LIKE ?)"),c.push(`%userContextId=${l}`,`%userContextId=${l}&%`));}return {whereClause:a.join(" AND "),params:c}}static validateQueryParams(e){let{name:r,domain:t,limit:n}=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 i=["SELECT","INSERT","UPDATE","DELETE","DROP","CREATE","ALTER","--",";"],s=(a,c)=>{let l=a.toUpperCase();for(let u of i)if(l.includes(u))throw new Error(`Invalid ${c}: contains SQL keyword '${u}'`)};if(s(r,"name"),s(t,"domain"),n!==void 0&&(!Number.isInteger(n)||n<=0||n>1e4))throw new Error("Limit must be a positive integer between 1 and 10000")}getBrowserType(){return this.browser}getSchema(){return Object.freeze({...this.schema})}};});var Ur={};X(Ur,{BunSqliteAdapter:()=>Je});var Xe,Je,zr=A(()=>{Xe=class{constructor(e){this.statement=e;}all(...e){return this.statement.all(...e)}get(...e){return this.statement.get(...e)}run(...e){this.statement.run(...e);}},Je=class{constructor(e,r={}){if(typeof globalThis.Bun>"u")throw new Error("BunSqliteAdapter can only be used in a Bun runtime environment");let{Database:t}=ht("bun:sqlite"),n={readonly:r.readonly??false,...r.fileMustExist?{create:false}:{}};this.db=new t(e,n),this.readonly=r.readonly??false;}prepare(e){let r=this.db.prepare(e);return new Xe(r)}pragma(e){let r=`PRAGMA ${e}`;this.db.exec(r);}close(){this.db.close();}};});var Vr={};X(Vr,{BetterSqlite3Adapter:()=>Ye});var Ke,Ye,Wr=A(()=>{Ke=class{constructor(e){this.statement=e;}all(...e){return this.statement.all(...e)}get(...e){return this.statement.get(...e)}run(...e){this.statement.run(...e);}},Ye=class{constructor(e,r={}){this.db=new So__default.default(e,{readonly:r.readonly??false,fileMustExist:r.fileMustExist??false}),this.readonly=r.readonly??false;}prepare(e){let r=this.db.prepare(e);return new Ke(r)}pragma(e){return this.db.pragma(e)}close(){this.db.close();}};});x();async function pr(o,e,r=[]){return o.length===0?r:(await Promise.all(o.map(async n=>{try{return await e(n)}catch{return r}}))).flat()}E();var De=class{constructor(e){this.strategies=e;this.logger=h("CompositeCookieQueryStrategy");this.browserName="internal";}handleStrategyError(e,r){this.logger.error("Strategy failed",{...J(e),strategy:r});}async queryCookies(e,r,t,n){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:t,force:n,strategyCount:this.strategies.length}),await pr(this.strategies,async i=>{try{return await i.queryCookies(e,r,t,n)}catch(s){return this.handleStrategyError(s,i),[]}},[])}catch(i){return this.logger.error("Failed to query cookies",{...J(i)}),[]}}};B();function gr(o){let e=os.homedir();if(!e)throw new Error("Unable to determine user home directory");ee();let r=b(),n={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 n.windows;case "darwin":return n.macos;case "linux":return n.linux;default:throw new Error(`Platform ${r} is not supported`)}}N();x();B();x();ie();E();B();var xr=h("ProcessDetector");function Lt(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 n=Number.parseInt(t,10);if(Number.isNaN(n))return null;let i=r.slice(10).join(" ");return {pid:n,command:i!==""?i:e,details:o.trim()}}function Mt(o,e){let r=o.split(",").map(i=>i.replace(/"/g,"").trim());if(r.length<2)return null;let t=r[1];if(t===void 0||t==="")return null;let n=Number.parseInt(t,10);return Number.isNaN(n)?null:{pid:n,command:r[0]??e,details:o.trim()}}async function Le(o,e){try{let r;if(D()){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 L(r);if(!t||t.trim()==="")return [];let n=[],i=t.split(`
|
|
2
|
+
`).filter(s=>s.trim()!=="");for(let s of i){let a=D()?Mt(s,o.toLowerCase()):Lt(s,o.toLowerCase());a&&n.push(a);}return xr.debug(`${o} process detection completed`,{processCount:n.length,processes:n.map(s=>({pid:s.pid,command:s.command})),platform:b()}),n}catch(r){return xr.debug(`Failed to detect ${o} processes`,{error:d(r),platform:b()}),[]}}async function kr(){return Le("Firefox","firefox")}async function Sr(){return Le("Chrome","google chrome\\|chromium")}async function vr(){return Le("Safari","/Applications/Safari.app/Contents/MacOS/Safari")}function Er(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 Br(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)}x();E();var $t={info:()=>{},warn:()=>{},error:()=>{},debug:()=>{},success:()=>{},fatal:()=>{},log:()=>{}},_=class{constructor(e,r){this.browserName=r;let t=h(e);this.logger=t||$t;}async queryCookies(e,r,t,n){try{return this.logger.info("Querying cookies",{name:e,domain:r,store:t,force:n}),await this.executeQuery(e,r,t,n)}catch(i){let s=J(i);return this.logger.error("Failed to query cookies",{...s,browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:t,force:n}),[]}}};E();B();var Me=util.promisify(child_process.exec),k=h("BrowserControl");function Qt(){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 $e={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"};async function Ie(o){try{let e=$e[o];if(!e)return k.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 Me(`osascript -e '${r}'`);return t.trim()==="true"}catch(e){return k.debug("Failed to check if browser is running",{browserName:o,error:e}),false}}async function Ht(o){try{let e=$e[o];if(!e)return k.debug("Browser not supported for macOS control",{browserName:o}),!1;let r=`tell application "${e}" to quit`;return await Me(`osascript -e '${r}'`),await new Promise(n=>setTimeout(n,2e3)),await Ie(o)?(k.warn("Browser did not quit gracefully",{browserName:o}),!1):(k.info("Browser quit successfully",{browserName:o}),!0)}catch(e){return k.error("Failed to quit browser",{browserName:o,error:e}),false}}async function Gt(o){try{let e=$e[o];if(!e){k.debug("Browser not supported for macOS control",{browserName:o});return}if(o==="Firefox"){let r=`
|
|
3
3
|
tell application "${e}"
|
|
4
4
|
activate
|
|
5
5
|
end tell
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
delay 0.5
|
|
9
9
|
key code 36
|
|
10
10
|
end tell
|
|
11
|
-
`;await
|
|
11
|
+
`;await Me(`osascript -e '${r}'`),k.debug("Attempted to save Firefox session",{browserName:o});}else o==="Chrome"?k.debug("Chrome will restore tabs automatically",{browserName:o}):k.debug("Safari will restore tabs automatically",{browserName:o});}catch(e){k.debug("Failed to save browser session",{browserName:o,error:e});}}async function Ut(o){if(!Qt())return k.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=nt__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{e.question(`
|
|
12
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
|
|
14
|
-
`).slice(1),t=[];for(let n of r){let i=n.trim().split(/\s+/),s=i[0],a=i[1],c=i[2],l=i[3];if(s!==void 0&&s!==""&&a!==void 0&&a!==""&&i.length>=4){let
|
|
15
|
-
`).slice(1);for(let i of n){let s=
|
|
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 Pr(o,e={}){if(!T())return k.debug("Browser control only supported on macOS"),false;try{if(!await Ie(o))return k.debug("Browser is not running",{browserName:o}),!0;if(e.interactive===!0&&e.force!==!0&&!await Ut(o))return k.info("User cancelled browser close",{browserName:o}),!1;await Gt(o);let t=await Ht(o);return t?k.success(`${o} closed successfully. Tabs will be restored on next launch.`):k.warn(`Failed to close ${o}. You may need to close it manually.`),t}catch(r){return k.error("Failed to control browser",{browserName:o,error:r}),false}}async function Ar(o,e=1e4){if(!T())return false;let r=Date.now(),t=500;for(;Date.now()-r<e;){if(!await Ie(o))return true;await new Promise(i=>setTimeout(i,t));}return false}x();x();E();B();var we=util.promisify(child_process.execFile),O=h("FileHandleDetector");function Wt(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 n={pid:t,command:e[2]??"unknown"},i=e[0];i!==void 0&&i!==""&&(n.user=i);let s=e[3];return s!==void 0&&s!==""&&(n.mode=s),n}function jt(o){return o!==null&&typeof o=="object"&&"ProcessId"in o&&"ProcessName"in o}function Xt(o){let e=[];try{let r=JSON.parse(o),t=Array.isArray(r)?r:[r];for(let n of t){if(!jt(n))continue;let i=n.ProcessId,s=n.ProcessName;typeof i=="string"&&i!==""&&e.push({command:typeof s=="string"?s:"unknown",pid:Number.parseInt(i,10)});}}catch(r){O.debug("Failed to parse PowerShell output",{error:d(r)});}return e}async function Jt(o){try{let{stdout:e}=await we("lsof",[o],{encoding:"utf8"});if(!e||e.trim()==="")return [];let r=e.split(`
|
|
14
|
+
`).slice(1),t=[];for(let n of r){let i=n.trim().split(/\s+/),s=i[0],a=i[1],c=i[2],l=i[3];if(s!==void 0&&s!==""&&a!==void 0&&a!==""&&i.length>=4){let u=Number.parseInt(a,10);if(!Number.isNaN(u)){let g={command:s,pid:u};c!==void 0&&c!==""&&(g.user=c),l!==void 0&&l!==""&&(g.fd=l,g.mode=l.includes("w")?"write":"read"),t.push(g);}}}return O.debug("Detected file handles with lsof",{file:o,handleCount:t.length}),t}catch(e){let r=d(e);return S(e,"ENOENT")?O.debug("lsof not available on this system"):S(e,"No such file")?O.debug("File does not exist",{file:o}):O.debug("lsof detection failed",{error:r}),[]}}async function Kt(o){try{let e=await we("fuser",["-v",o],{encoding:"utf8"}),r=e.stderr||e.stdout||"";if(r.trim()==="")return [];let t=[],n=r.split(`
|
|
15
|
+
`).slice(1);for(let i of n){let s=Wt(i);s&&t.push(s);}return O.debug("Detected file handles with fuser",{file:o,handleCount:t.length}),t}catch(e){let r=d(e);return S(e,"ENOENT")?O.debug("fuser not available on this system"):O.debug("fuser detection failed",{error:r}),[]}}async function Yt(o){try{let e=o.replace(/'/g,"''"),r=`
|
|
16
16
|
$ErrorActionPreference = 'SilentlyContinue'
|
|
17
17
|
$handles = @()
|
|
18
18
|
|
|
@@ -51,8 +51,8 @@ Would you like to close ${o}? Your tabs will be restored when you reopen it. (y/
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
$handles | ConvertTo-Json -Compress
|
|
54
|
-
`,{stdout:t}=await
|
|
55
|
-
`);for(let n of t){let i=n.match(/^(.+?)\s+pid:\s+(\d+)\s+type:\s+(\w+)\s+.+:\s+(.+)$/i);if(i?.[1]!==void 0&&i?.[1]!==""&&i?.[2]!==void 0&&i?.[2]!==""){let s=Number.parseInt(i[2],10);if(!Number.isNaN(s)){let a={command:i[1],pid:s};i?.[3]!==void 0&&i[3]!==""&&(a.fd=i[3]),a.mode="unknown",r.push(a);}}}return E.debug("Detected file handles with handle.exe",{file:o,handleCount:r.length}),r}catch{return []}}async function Ne(o){let e=y();if(E.debug("Detecting file handles",{file:o,platform:e}),R()){let t=await Ct(o);return t.length>0?t:bt(o)}let r=await yt(o);return r.length===0&&(r=await wt(o)),r.length>0&&E.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 dr(o){let e=await Ne(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}`}S();var re=util.promisify(child_process.execFile),J=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 n=R()?"where":"which";return await re(n,[t],{timeout:1e3}),!0}catch{}return false}async executeCommand(e,r=[]){try{await re(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)}},Fe=class extends J{initializeBrowserExecutables(){return {Firefox:["Firefox"],Chrome:["Google Chrome"],Safari:["Safari"]}}async launchBrowser(e){let t={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"}[e];if(t===void 0||t==="")throw new Error(`${e} not supported on macOS`);await this.executeCommand("osascript",["-e",`tell application "${t}" to activate`]);}getPlatformName(){return "macOS"}},qe=class extends J{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 re("cmd.exe",["/c","start","",e],{timeout:5e3,windowsHide:!0}),!0}catch{return false}}getPlatformName(){return "Windows"}},fe=class extends J{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 re(r,[],{timeout:5e3}),!0}catch{}return false}async tryXdgOpenFallback(e){try{await re("xdg-open",["http://localhost"],{timeout:5e3});}catch(r){throw new Error(`Failed to launch ${e} on Linux: ${J.getErrorMessage(r)}`)}}getPlatformName(){return "Linux"}},$e=null;function gr(o){if($e!==null&&o===void 0)return $e;let e=y(),r=St(e);return ($e=r),r}function St(o){switch(o){case "darwin":return new Fe;case "win32":return new qe;case "linux":case "freebsd":case "openbsd":return new fe;default:return new fe}}var A=class{constructor(e,r,t){this.logger=e;this.browserName=r;this.platformControl=t??gr();}async handleBrowserConflict(e,r,t,n=false){return ae(e)?this.isLockError(e)?(await this.logFileHandleInfo(r,t),this.handleProcessConflict(r,t,n)):{resolved:false,shouldRelaunch:false}:{resolved:false,shouldRelaunch:false}}isLockError(e){let r=tr(e);return r==="locked"||r==="permission"}async logFileHandleInfo(e,r){try{let t=await Ne(e);if(t.length>0){let n=await dr(e);this.logger.debug("Database locked by specific processes",{file:e,lockInfo:n,handleCount:t.length,handles:t.map(i=>({pid:i.pid,command:i.command,mode:i.mode,user:i.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(i=>`${i.command} (PID: ${i.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(n){this.logger.debug("Failed to check browser processes",{error:n instanceof Error?n.message:String(n)});}return {resolved:false,shouldRelaunch:false}}async handleBrowserProcesses(e,r,t){let n=r.map(s=>({...s,details:`PID: ${s.pid}, Command: ${s.command}`})),i=ur(this.browserName.toLowerCase(),n);return this.logger.debug(`${this.browserName} process conflict detected`,{file:e,processCount:r.length,advice:i}),t?this.attemptBrowserClose():Promise.resolve({resolved:false,shouldRelaunch:false})}async attemptBrowserClose(){return this.logger.info(`Attempting to close ${this.browserName} gracefully...`),await mr(this.browserName,{interactive:true,force:false})?(await pr(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:f(e),platform:this.platformControl.getPlatformName()});}}};S();function hr(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),n=12,i=16;if(t.length<n+i)throw new Error("Invalid v10 cookie: too short");let s=t.subarray(0,n),a=t.subarray(n,t.length-i),c=t.subarray(t.length-i),l=crypto.createDecipheriv("aes-256-gcm",e,s);return l.setAuthTag(c),Buffer.concat([l.update(a),l.final()]).toString("utf8")}function yr(o){let e=Buffer.from("v10");return o.length>=3&&o.subarray(0,3).equals(e)}function wr(o,e){let r=new Map;return t=>{let n=e?e(t):t.toString("hex");if(r.has(n)){let s=r.get(n);if(s!==void 0)return s}let i=o(t);return r.set(n,i),i}}var Bt=wr(o=>o.length>=3&&o[0]===118&&o[1]===49&&o[2]===48?o.slice(3):o,o=>o.toString("hex")),Rt=wr(o=>{let e=o[o.length-1];return e&&e<=16?o.slice(0,-e):o},o=>o.toString("hex"));function Dt(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 n of r){let i=o.match(n);if(i?.[1])return i[1]}let t=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let n of t){let s=o.match(n)?.[1]??"";if(s.length>0)return s}return o}async function br(o,e,r){if(R()&&yr(o)&&o.length>=31&&Buffer.isBuffer(e))return hr(o,e);if($()&&!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,n)=>{crypto.pbkdf2(e,"saltysalt",1003,16,"sha1",(i,s)=>{try{if(i){n(new Error(`Failed to derive key: ${i.message}`));return}let a=Bt(o);if(a.length%16!==0){n(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 m=l.update(a);try{l.final();}catch(ke){n(new Error(`Failed to finalize decryption: ${ke.message}`));return}m=Rt(m);let d=((r??0)>=24&&m.length>32?m.slice(32):m).toString("utf8");t(Dt(d));}catch(a){n(new Error(`Decryption failed: ${a.message}`));}});})}S();le();var At={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 Lt(o){let e=At[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 Mt(){let{getChromePassword:o}=await Promise.resolve().then(()=>(kr(),Cr));return o()}async function It(){let{getChromePassword:o}=await Promise.resolve().then(()=>(Sr(),xr));return o()}async function Me(o="chrome"){switch(j(),y()){case "darwin":return Lt(o);case "win32":return Mt();case "linux":return It();default:throw new Error(`Platform ${y()} is not supported`)}}Ie();function Ht(){return typeof globalThis.Bun<"u"?"bun":"node"}function Tr(o,e={}){if(Ht()==="bun")try{let n=(Rr(),rr(Br)).BunSqliteAdapter;return new n(o,e)}catch{}let t=(Or(),rr(Dr)).BetterSqlite3Adapter;return new t(o,e)}b();x();var D=h("DatabaseConnectionManager"),We=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++,D.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 n=0;n<this.config.retryAttempts;n++)try{let i=Tr(e,{readonly:!0,fileMustExist:!0});i.pragma(`busy_timeout = ${this.config.queryTimeout}`);let s={database:i,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 D.debug("Created new connection",{filepath:e,connectionTime:a,attempt:n+1}),this.emit("connection:created",{filepath:e,connectionTime:a}),i}catch(i){if(t=i,this.isDatabaseLocked(i)){D.warn("Database locked, retrying",{filepath:e,attempt:n+1,maxAttempts:this.config.retryAttempts}),await this.delay(this.config.retryDelay*2**n);continue}throw i}throw t||new Error(`Failed to connect to database: ${e}`)}async executeQuery(e,r,t){let n=Date.now(),i=await this.getConnection(e),s=this.connections.get(e);try{let a=r(i),c=Date.now()-n;if(s&&(s.queryCount++,s.totalQueryTime+=c),this.totalQueries++,this.cacheHits++,c>100&&D.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()-n;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(),D.debug("Released connection",{filepath:e}));}closeConnection(e){let r=this.connections.get(e);if(r)try{r.database.close(),this.connections.delete(e),D.debug("Closed connection",{filepath:e,queryCount:r.queryCount,lifetime:Date.now()-r.created}),this.emit("connection:closed",{filepath:e});}catch(t){ee("Failed to close connection",t,{filepath:e});}}closeAll(){for(let[e,r]of this.connections)try{r.database.close(),D.debug("Closed connection",{filepath:e});}catch(t){ee("Failed to close connection",t,{filepath:e});}this.connections.clear(),D.info("Closed all connections",{totalQueries:this.totalQueries,connectionReuses:this.connectionReuses});}getStatistics(){let e=0,r=0,t=0;for(let n of this.connections.values())e+=n.totalQueryTime,r+=n.queryCount,n.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,n]of this.connections)!n.inUse&&e-n.lastAccessed>this.config.idleTimeout&&r.push(t);for(let t of r)this.closeConnection(t);r.length>0&&D.debug("Cleaned up idle connections",{count:r.length});}async evictLeastRecentlyUsed(){let e=null,r=Date.now();for(let[t,n]of this.connections)!n.inUse&&n.lastAccessed<r&&(e=t,r=n.lastAccessed);e!==null?(this.closeConnection(e),D.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){let r=f(e).toLowerCase();return r.includes("database is locked")||r.includes("database locked")||r.includes("sqlite_busy")}async delay(e){return new Promise(r=>setTimeout(r,e))}},te=null,ze=null;function K(o){return te||(te=new We(o),ze||(ze=()=>{te&&te.closeAll();},process.on("exit",ze))),te}x();var Ve=h("QueryMonitor"),Ge=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=[],n){let i={sql:r,params:t,startTime:Date.now()};n!==void 0&&(i.filepath=n);try{let a=e.prepare(r).all(...t);return i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.rowCount=a.length,this.recordExecution(i),a}catch(s){throw i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.error=s,this.recordExecution(i),s}}executeGet(e,r,t=[],n){let i={sql:r,params:t,startTime:Date.now()};n!==void 0&&(i.filepath=n);try{let a=e.prepare(r).get(...t);return i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.rowCount=a!==void 0?1:0,this.recordExecution(i),a}catch(s){throw i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.error=s,this.recordExecution(i),s}}prepareStatement(e,r,t){let n=e.prepare(r);return new je(n,r,this,t)}recordExecution(e){this.totalQueries++,e.duration!==void 0&&(this.totalDuration+=e.duration,e.duration>this.options.slowQueryThreshold&&(this.slowQueries++,Ve.debug("Slow query detected",{sql:e.sql,duration:e.duration,rowCount:e.rowCount,filepath:e.filepath}))),e.error?(this.errors++,this.options.verbose&&Ve.error("Query failed",{sql:e.sql,error:e.error.message,filepath:e.filepath})):this.options.verbose&&Ve.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!==void 0&&e>0?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;}},je=class{constructor(e,r,t,n){this.statement=e;this.sql=r;this.monitor=t;this.filepath=n;}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}},Nr=null;function oe(o){return Nr??(Nr=new Ge(o)),Nr}function $r(o,e,r,t,n,i,s){return {domain:o,name:e,value:r,expiry:fr(t),meta:{file:n,browser:i,decrypted:s}}}var Y=class extends q{constructor(e,r,t="chrome"){super(e,"Chrome"),this.browserDisplayName=r,this.browserType=t,this.lockHandler=new A(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 Me(this.browserType),n=[];for(let i of r){let s=await this.processBatchFile(i,e,t);n.push(...s);}return n}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 n=K(),i=oe(),s=new L("chrome"),a=r.map(d=>({name:d.name,domain:d.domain,browser:"chrome"})),c=s.buildBatchSelectQuery(a),l=await n.executeQuery(e,d=>i.executeQuery(d,c.sql,c.params,e).map(N=>({name:N.name,domain:N.domain,value:N.encrypted_value,expiry:N.expiry})),c.description||c.sql),m=await this.getMetaVersion(e),p={file:e,password:t,browser:this.browserDisplayName,metaVersion:m};return (await Promise.allSettled(l.map(async d=>this.processCookie(d,p)))).filter(d=>d.status==="fulfilled").map(d=>d.value)}catch(n){return this.logger.warn(`Error batch processing ${this.browserDisplayName} cookie file ${e}`,{error:this.getErrorMessage(n),file:e,specsCount:r.length}),[]}}getBrowserName(){return this.browserDisplayName}async executeQuery(e,r,t,n){if(!this.isPlatformSupported())return [];let i=this.getCookieFiles(t);if(i.length===0)return this.logger.debug(`No ${this.browserDisplayName} cookie files found`),[];try{let s=await Me(this.browserType),a=[];for(let c of i){let l=await this.processFileWithRetry(c,e,r,s,n);a.push(...l);}return a}catch(s){return this.logger.error(`Failed to get ${this.browserDisplayName} password`,{error:this.getErrorMessage(s)}),[]}}isPlatformSupported(){return Pe()?true:(this.logger.warn("Platform not supported",{platform:y(),supportedPlatforms:["darwin","win32","linux"]}),false)}getCookieFiles(e){let r=e??this.getCookieFilePaths();return Array.isArray(r)?r:[r]}getErrorMessage(e){return f(e)}async processFileWithRetry(e,r,t,n,i){try{return await this.processFile(e,r,t,n)}catch(s){let a=await this.handleFileError(s,e,r,t,i);return a.resolved?this.retryAfterBrowserClose(e,r,t,n,a.shouldRelaunch):[]}}async handleFileError(e,r,t,n,i){let s=await cr(),a=await this.lockHandler.handleBrowserConflict(e,r,s,i!==true);return a.resolved||this.logger.warn(`Error reading ${this.browserDisplayName} cookie file ${r}`,{error:this.getErrorMessage(e),file:r,name:t,domain:n}),a}async retryAfterBrowserClose(e,r,t,n,i){try{this.logger.info(`Retrying ${this.browserDisplayName} cookie extraction after browser close...`);let s=await this.processFile(e,r,t,n);return this.logger.success(`Successfully extracted cookies after closing ${this.browserDisplayName}`),i&&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}),i&&await this.lockHandler.relaunchBrowser(),[]}}async processFile(e,r,t,n){try{let i=K(),s=oe(),c=new L("chrome").buildSelectQuery({name:r,domain:t,browser:"chrome"}),l=await i.executeQuery(e,d=>s.executeQuery(d,c.sql,c.params,e).map(N=>({name:N.name,domain:N.domain,value:N.encrypted_value,expiry:N.expiry})),c.sql),m=await this.getMetaVersion(e),p={file:e,password:n,browser:this.browserDisplayName,metaVersion:m};return (await Promise.allSettled(l.map(async d=>this.processCookie(d,p)))).map(d=>d.status==="fulfilled"?d.value:null).filter(d=>d!==null)}catch(i){return this.logger.error(`Failed to process ${this.browserDisplayName} cookie file`,{error:this.getErrorMessage(i),file:e,name:r,domain:t}),[]}}async getMetaVersion(e){try{let r=K(),n=new L("chrome").buildMetaQuery("version"),i=await r.executeQuery(e,s=>s.prepare(n.sql).get(...n.params),"Get meta version");return i?Number.parseInt(i.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)),n=await br(t,r.password,r.metaVersion);return $r(e.domain,e.name,n,e.expiry,r.file,r.browser,!0)}catch(t){return this.logger.warn(`Failed to decrypt ${r.browser} cookie`,{error:this.getErrorMessage(t)}),$r(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,false)}}};x();Le();var Wt=h("listChromeProfiles");function Fr(){let o=zt__default.default.sync("./**/Cookies",{cwd:me,absolute:true});return Wt.debug("Found cookie files:",o),o}var Q=class extends Y{constructor(e){super("ChromeCookieQueryStrategy","Chrome"),e!==void 0&&(this.profileName=e);}getCookieFilePaths(e){if(e!==void 0&&e!=="")return [e];let r=Fr();if(this.profileName)try{let t=Se("fs"),n=Se("path");if(r.length===0)return this.logger.warn("No Chrome cookie files found"),[];let i=r[0];if(!i)return [];let s=path.dirname(path.dirname(i)),a=n.join(s,"Local State");if(t.existsSync(a)){let l=JSON.parse(t.readFileSync(a,"utf8")).profile?.info_cache||{},m;for(let[p,v]of Object.entries(l))if(v.name?.toLowerCase()===this.profileName.toLowerCase()){m=p;break}if(!m){for(let p of Object.keys(l))if(p.toLowerCase()===this.profileName.toLowerCase()){m=p;break}}if(m)r=r.filter(p=>path.dirname(p).endsWith(m)),r.length===0?this.logger.warn(`No cookie files found for profile: ${this.profileName} (directory: ${m})`):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(([p,v])=>({directory:p,name:v.name}))}),[]}}catch(t){this.logger.warn(`Failed to read Chrome profile info: ${t}`);}return Array.isArray(r)?r:[r]}};S();function qr(o){let e=os.homedir();if(!e)throw new Error("Unable to determine user home directory");j();let r=y(),n={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 n.windows;case "darwin":return n.macos;case "linux":return n.linux;default:throw new Error(`Platform ${r} is not supported`)}}var Ke=class extends Y{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=qr(this.browser),t=zt__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)}),[]}}};b();S();function Kt(o){let e=os.homedir();if(!e)return o.warn("Failed to get home directory"),[];let r=y(),t=[],n=[];switch(r){case "darwin":t.push(path.join(e,"Library/Application Support/Firefox")),n.push(path.join(e,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"));break;case "win32":{t.push(path.join(e,"AppData","Roaming","Mozilla","Firefox")),n.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),n.push(path.join(a,"Profiles","*","cookies.sqlite")));let c=path.join(e,"AppData","Roaming","Mozilla","Firefox ESR");fs.existsSync(c)&&(t.push(c),n.push(path.join(c,"Profiles","*","cookies.sqlite")));let l=path.join(e,"AppData","Local","Mozilla","Firefox");fs.existsSync(l)&&(t.push(l),n.push(path.join(l,"Profiles","*","cookies.sqlite")));break}case "linux":t.push(path.join(e,".mozilla/firefox")),n.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 n){let c=zt__default.default.sync(a);s.push(...c);}return o.debug("Found Firefox cookie files",{files:s}),s}var _=class extends q{constructor(){super("FirefoxCookieQueryStrategy","Firefox"),this.lockHandler=new A(this.logger,"Firefox");}async createCookieQueryConfig(e,r,t){let{CookieQueryBuilder:n}=await Promise.resolve().then(()=>(Ie(),Pr)),s=new n("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,n,i){let s=await ar(),a=await this.lockHandler.handleBrowserConflict(e,r,s,t!==true);return a.resolved?{retryAfterClose:true,shouldRelaunch:a.shouldRelaunch}:(this.logExtractError(e,r,n,i),{retryAfterClose:false,shouldRelaunch:false})}logExtractError(e,r,t,n){this.logger.debug(`Error reading Firefox cookie file ${r}`,{error:f(e),file:r,name:t,domain:n});}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,n){let i=await this.createCookieQueryConfig(r,t,e);try{return await this.executeQueryWithNewUtilities(i)}catch(s){let a=await this.handleCookieExtractionError(s,e,n,r,t);return a.retryAfterClose?this.performRetryAfterClose(i,a.shouldRelaunch):[]}}async executeQueryWithNewUtilities(e){let r=K({retryAttempts:1,retryDelay:0,queryTimeout:100,enableMonitoring:true}),t=oe();return r.executeQuery(e.file,n=>t.executeQuery(n,e.sql,e.params,e.file).map(e.rowTransform),e.sql)}async executeQuery(e,r,t,n){let i=t??Kt(this.logger),s=Array.isArray(i)?i:[i];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,n);a.push(...l);}return a}};b();S();b();x();S();var Ye=util.promisify(child_process.exec),ne=h("SystemPermissions");async function Xt(){try{await Ye('open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"'),ne.info("Opened System Settings > Privacy & Security > Full Disk Access");}catch{try{await Ye('open "x-apple.systempreferences:com.apple.preference.security?Privacy"'),ne.info("Opened System Settings > Privacy & Security");}catch{await Ye("open -b com.apple.systempreferences"),ne.info("Opened System Settings");}}}function eo(){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 ro(o,e){let r=Ar__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{console.log(`
|
|
54
|
+
`,{stdout:t}=await we("powershell",["-NoProfile","-NonInteractive","-Command",r],{encoding:"utf8",maxBuffer:1024*1024});if(!t||t.trim()===""||t.trim()==="null")return [];let n=Xt(t);return O.debug("Detected file handles with PowerShell",{file:o,handleCount:n.length}),n}catch(e){return O.debug("Windows handle detection failed",{error:d(e)}),[]}}async function Zt(o){try{let{stdout:e}=await we("handle",["-nobanner",o],{encoding:"utf8"});if(!e||e.trim()==="")return [];let r=[],t=e.split(`
|
|
55
|
+
`);for(let n of t){let i=n.match(/^(.+?)\s+pid:\s+(\d+)\s+type:\s+(\w+)\s+.+:\s+(.+)$/i);if(i?.[1]!==void 0&&i?.[1]!==""&&i?.[2]!==void 0&&i?.[2]!==""){let s=Number.parseInt(i[2],10);if(!Number.isNaN(s)){let a={command:i[1],pid:s};i?.[3]!==void 0&&i[3]!==""&&(a.fd=i[3]),a.mode="unknown",r.push(a);}}}return O.debug("Detected file handles with handle.exe",{file:o,handleCount:r.length}),r}catch{return []}}async function qe(o){let e=b();if(O.debug("Detecting file handles",{file:o,platform:e}),D()){let t=await Zt(o);return t.length>0?t:Yt(o)}let r=await Jt(o);return r.length===0&&(r=await Kt(o)),r.length>0&&O.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 Rr(o){let e=await qe(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}`}B();var se=util.promisify(child_process.execFile),re=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 n=D()?"where":"which";return await se(n,[t],{timeout:1e3}),!0}catch{}return false}async executeCommand(e,r=[]){try{await se(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)}},Qe=class extends re{initializeBrowserExecutables(){return {Firefox:["Firefox"],Chrome:["Google Chrome"],Safari:["Safari"]}}async launchBrowser(e){let t={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"}[e];if(t===void 0||t==="")throw new Error(`${e} not supported on macOS`);await this.executeCommand("osascript",["-e",`tell application "${t}" to activate`]);}getPlatformName(){return "macOS"}},He=class extends re{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 se("cmd.exe",["/c","start","",e],{timeout:5e3,windowsHide:!0}),!0}catch{return false}}getPlatformName(){return "Windows"}},be=class extends re{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 se(r,[],{timeout:5e3}),!0}catch{}return false}async tryXdgOpenFallback(e){try{await se("xdg-open",["http://localhost"],{timeout:5e3});}catch(r){throw new Error(`Failed to launch ${e} on Linux: ${re.getErrorMessage(r)}`)}}getPlatformName(){return "Linux"}},_e=null;function Or(o){if(_e!==null&&o===void 0)return _e;let e=b(),r=to(e);return (_e=r),r}function to(o){switch(o){case "darwin":return new Qe;case "win32":return new He;case "linux":case "freebsd":case "openbsd":return new be;default:return new be}}var Q=class{constructor(e,r,t){this.logger=e;this.browserName=r;this.platformControl=t??Or();}async handleBrowserConflict(e,r,t,n=false){return ge(e)?this.isLockError(e)?(await this.logFileHandleInfo(r,t),this.handleProcessConflict(r,t,n)):{resolved:false,shouldRelaunch:false}:{resolved:false,shouldRelaunch:false}}isLockError(e){let r=fr(e);return r==="locked"||r==="permission"}async logFileHandleInfo(e,r){try{let t=await qe(e);if(t.length>0){let n=await Rr(e);this.logger.debug("Database locked by specific processes",{file:e,lockInfo:n,handleCount:t.length,handles:t.map(i=>({pid:i.pid,command:i.command,mode:i.mode,user:i.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(i=>`${i.command} (PID: ${i.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(n){this.logger.debug("Failed to check browser processes",{error:n instanceof Error?n.message:String(n)});}return {resolved:false,shouldRelaunch:false}}async handleBrowserProcesses(e,r,t){let n=r.map(s=>({...s,details:`PID: ${s.pid}, Command: ${s.command}`})),i=Er(this.browserName.toLowerCase(),n);return this.logger.debug(`${this.browserName} process conflict detected`,{file:e,processCount:r.length,advice:i}),t?this.attemptBrowserClose():Promise.resolve({resolved:false,shouldRelaunch:false})}async attemptBrowserClose(){return this.logger.info(`Attempting to close ${this.browserName} gracefully...`),await Pr(this.browserName,{interactive:true,force:false})?(await Ar(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:d(e),platform:this.platformControl.getPlatformName()});}}};B();var Ge=24,ae=32,Dr=32;function Tr(o,e,r){let t=Buffer.from("v10");if(!o.subarray(0,3).equals(t))throw new Error("Not a v10 encrypted cookie");let n=o.subarray(3),i=12,s=16;if(n.length<i+s)throw new Error("Invalid v10 cookie: too short");let a=n.subarray(0,i),c=n.subarray(i,n.length-s),l=n.subarray(n.length-s),u=crypto.createDecipheriv("aes-256-gcm",e,a);u.setAuthTag(l);let g=Buffer.concat([u.update(c),u.final()]);return (r??0)>=Ge&&g.length>=ae?g.subarray(ae).toString("utf8"):g.toString("utf8")}function Fr(o){let e=Buffer.from("v10");return o.length>=3&&o.subarray(0,3).equals(e)}function Nr(o,e){let r=new Map;return t=>{let n=e?e(t):t.toString("hex");if(r.has(n)){let s=r.get(n);if(s!==void 0)return s}let i=o(t);return r.set(n,i),i}}var so=Nr(o=>o.length>=3&&o[0]===118&&o[1]===49&&o[2]===48?o.slice(3):o,o=>o.toString("hex")),ao=Nr(o=>{let e=o[o.length-1];return e&&e<=16?o.slice(0,-e):o},o=>o.toString("hex"));function co(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 n of r){let i=o.match(n);if(i?.[1])return i[1]}let t=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let n of t){let s=o.match(n)?.[1]??"";if(s.length>0)return s}return o}var Ue=new Map;async function lo(o){let e=Ue.get(o);if(e!==void 0)return e;let r=new Promise((t,n)=>{crypto.pbkdf2(o,"saltysalt",1003,16,"sha1",(i,s)=>{if(i){n(new Error(`Failed to derive key: ${i.message}`));return}t(s);});}).catch(t=>{throw Ue.delete(o),t});return Ue.set(o,r),r}function uo(o){return Buffer.isBuffer(o)?o:typeof o!="string"?null:Buffer.from(o,"latin1")}async function Lr(o,e,r){if(D()&&Fr(o)&&o.length>=31){let i=uo(e);if(i?.length===Dr)return Tr(o,i,r)}if(T()&&!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");let t=await lo(e),n=so(o);if(n.length%16!==0)throw new Error("Encrypted data length is not a multiple of 16");try{let i=Buffer.alloc(16," "),s=crypto.createDecipheriv("aes-128-cbc",t,i);s.setAutoPadding(!1);let a=s.update(n);try{s.final();}catch(g){throw new Error(`Failed to finalize decryption: ${g.message}`)}a=ao(a);let u=((r??0)>=Ge&&a.length>=ae?a.slice(ae):a).toString("utf8");return co(u)}catch(i){throw i instanceof Error&&i.message.startsWith("Failed to finalize decryption")?i:new Error(`Decryption failed: ${i.message}`)}}B();ie();var yo={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 wo(o){let e=yo[o];if(!e)throw new Error(`Unknown browser type: ${o}`);try{let r=`security find-generic-password -w -s "${e}"`;return (await L(r)).stdout.trim()}catch(r){if(o!=="chrome"){let t='security find-generic-password -w -s "Chrome Safe Storage"';try{return (await L(t)).stdout.trim()}catch{}}throw new Error(`Failed to get ${o} password from keychain: ${r}`)}}async function bo(){let{getChromePassword:o}=await Promise.resolve().then(()=>(qr(),Ir));return o()}async function Co(){let{getChromePassword:o}=await Promise.resolve().then(()=>(Qr(),_r));return o()}async function xo(o){switch(ee(),b()){case "darwin":return wo(o);case "win32":return bo();case "linux":return Co();default:throw new Error(`Platform ${b()} is not supported`)}}var Ve=new Map;function We(o="chrome"){let e=Ve.get(o);if(e!==void 0)return e;let r=xo(o).catch(t=>{throw Ve.delete(o),t});return Ve.set(o,r),r}je();x();E();function vo(){return typeof globalThis.Bun<"u"?"bun":"node"}function Xr(o,e={}){if(vo()==="bun")try{let n=(zr(),Re(Ur)).BunSqliteAdapter;return new n(o,e)}catch{}let t=(Wr(),Re(Vr)).BetterSqlite3Adapter;return new t(o,e)}var M=h("DatabaseConnectionManager"),er=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++,M.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 n=0;n<this.config.retryAttempts;n++)try{let i=Xr(e,{readonly:!0,fileMustExist:!0});i.pragma(`busy_timeout = ${this.config.queryTimeout}`);let s={database:i,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 M.debug("Created new connection",{filepath:e,connectionTime:a,attempt:n+1}),this.emit("connection:created",{filepath:e,connectionTime:a}),i}catch(i){if(t=i,this.isDatabaseLocked(i)){M.warn("Database locked, retrying",{filepath:e,attempt:n+1,maxAttempts:this.config.retryAttempts}),await this.delay(this.config.retryDelay*2**n);continue}throw i}throw t||new Error(`Failed to connect to database: ${e}`)}async executeQuery(e,r,t){let n=Date.now(),i=await this.getConnection(e),s=this.connections.get(e);try{let a=r(i),c=Date.now()-n;if(s&&(s.queryCount++,s.totalQueryTime+=c),this.totalQueries++,this.cacheHits++,c>100&&M.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()-n;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(),M.debug("Released connection",{filepath:e}));}closeConnection(e){let r=this.connections.get(e);if(r)try{r.database.close(),this.connections.delete(e),M.debug("Closed connection",{filepath:e,queryCount:r.queryCount,lifetime:Date.now()-r.created}),this.emit("connection:closed",{filepath:e});}catch(t){ne("Failed to close connection",t,{filepath:e});}}closeAll(){for(let[e,r]of this.connections)try{r.database.close(),M.debug("Closed connection",{filepath:e});}catch(t){ne("Failed to close connection",t,{filepath:e});}this.connections.clear(),M.info("Closed all connections",{totalQueries:this.totalQueries,connectionReuses:this.connectionReuses});}getStatistics(){let e=0,r=0,t=0;for(let n of this.connections.values())e+=n.totalQueryTime,r+=n.queryCount,n.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,n]of this.connections)!n.inUse&&e-n.lastAccessed>this.config.idleTimeout&&r.push(t);for(let t of r)this.closeConnection(t);r.length>0&&M.debug("Cleaned up idle connections",{count:r.length});}async evictLeastRecentlyUsed(){let e=null,r=Date.now();for(let[t,n]of this.connections)!n.inUse&&n.lastAccessed<r&&(e=t,r=n.lastAccessed);e!==null?(this.closeConnection(e),M.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){let r=d(e).toLowerCase();return r.includes("database is locked")||r.includes("database locked")||r.includes("sqlite_busy")}async delay(e){return new Promise(r=>setTimeout(r,e))}},ce=null,Ze=null;function te(o){return ce||(ce=new er(o),Ze||(Ze=()=>{ce&&ce.closeAll();},process.on("exit",Ze))),ce}E();var rr=h("QueryMonitor"),tr=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=[],n){let i={sql:r,params:t,startTime:Date.now()};n!==void 0&&(i.filepath=n);try{let a=e.prepare(r).all(...t);return i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.rowCount=a.length,this.recordExecution(i),a}catch(s){throw i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.error=s,this.recordExecution(i),s}}executeGet(e,r,t=[],n){let i={sql:r,params:t,startTime:Date.now()};n!==void 0&&(i.filepath=n);try{let a=e.prepare(r).get(...t);return i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.rowCount=a!==void 0?1:0,this.recordExecution(i),a}catch(s){throw i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.error=s,this.recordExecution(i),s}}prepareStatement(e,r,t){let n=e.prepare(r);return new or(n,r,this,t)}recordExecution(e){this.totalQueries++,e.duration!==void 0&&(this.totalDuration+=e.duration,e.duration>this.options.slowQueryThreshold&&(this.slowQueries++,rr.debug("Slow query detected",{sql:e.sql,duration:e.duration,rowCount:e.rowCount,filepath:e.filepath}))),e.error?(this.errors++,this.options.verbose&&rr.error("Query failed",{sql:e.sql,error:e.error.message,filepath:e.filepath})):this.options.verbose&&rr.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!==void 0&&e>0?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;}},or=class{constructor(e,r,t,n){this.statement=e;this.sql=r;this.monitor=t;this.filepath=n;}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}},Jr=null;function le(o){return Jr??(Jr=new tr(o)),Jr}function Kr(o,e,r,t,n,i,s){return {domain:o,name:e,value:r,expiry:Br(t),meta:{file:n,browser:i,decrypted:s}}}var ue=class ue extends _{constructor(e,r,t="chrome"){super(e,"Chrome"),this.browserDisplayName=r,this.browserType=t,this.lockHandler=new Q(this.logger,"Chrome");}get sqlBrowserType(){return Ce(this.browserType)?this.browserType:"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 We(this.browserType),n=[];for(let i=0;i<r.length;i+=ue.MAX_CONCURRENT_PROFILE_READS){let s=r.slice(i,i+ue.MAX_CONCURRENT_PROFILE_READS),a=await Promise.allSettled(s.map(async c=>this.processBatchFile(c,e,t)));for(let c of a)c.status==="fulfilled"&&n.push(...c.value);}return n}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 n=te(),i=le(),s=new H(this.sqlBrowserType),a=r.map(w=>({name:w.name,domain:w.domain,browser:this.sqlBrowserType})),c=s.buildBatchSelectQuery(a),l=await n.executeQuery(e,w=>i.executeQuery(w,c.sql,c.params,e).map(q=>({name:q.name,domain:q.domain,value:q.encrypted_value,expiry:q.expiry})),c.description||c.sql),u=await this.getMetaVersion(e),g={file:e,password:t,browser:this.browserDisplayName,metaVersion:u};return (await Promise.allSettled(l.map(async w=>this.processCookie(w,g)))).filter(w=>w.status==="fulfilled").map(w=>w.value)}catch(n){return this.logger.warn(`Error batch processing ${this.browserDisplayName} cookie file ${e}`,{error:this.getErrorMessage(n),file:e,specsCount:r.length}),[]}}getBrowserName(){return this.browserDisplayName}async executeQuery(e,r,t,n){if(!this.isPlatformSupported())return [];let i=this.getCookieFiles(t);if(i.length===0)return this.logger.debug(`No ${this.browserDisplayName} cookie files found`),[];try{let s=await We(this.browserType),a=[];for(let c of i){let l=await this.processFileWithRetry(c,e,r,s,n);a.push(...l);}return a}catch(s){return this.logger.error(`Failed to get ${this.browserDisplayName} password`,{error:this.getErrorMessage(s)}),[]}}isPlatformSupported(){return Te()?true:(this.logger.warn("Platform not supported",{platform:b(),supportedPlatforms:["darwin","win32","linux"]}),false)}getCookieFiles(e){let r=e??this.getCookieFilePaths();return Array.isArray(r)?r:[r]}getErrorMessage(e){return d(e)}async processFileWithRetry(e,r,t,n,i){try{return await this.processFile(e,r,t,n)}catch(s){let a=await this.handleFileError(s,e,r,t,i);return a.resolved?this.retryAfterBrowserClose(e,r,t,n,a.shouldRelaunch):[]}}async handleFileError(e,r,t,n,i){let s=await Sr(),a=await this.lockHandler.handleBrowserConflict(e,r,s,i!==true);return a.resolved||this.logger.warn(`Error reading ${this.browserDisplayName} cookie file ${r}`,{error:this.getErrorMessage(e),file:r,name:t,domain:n}),a}async retryAfterBrowserClose(e,r,t,n,i){try{this.logger.info(`Retrying ${this.browserDisplayName} cookie extraction after browser close...`);let s=await this.processFile(e,r,t,n);return this.logger.success(`Successfully extracted cookies after closing ${this.browserDisplayName}`),i&&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}),i&&await this.lockHandler.relaunchBrowser(),[]}}async processFile(e,r,t,n){try{let i=te(),s=le(),c=new H(this.sqlBrowserType).buildSelectQuery({name:r,domain:t,browser:this.sqlBrowserType}),l=await i.executeQuery(e,w=>s.executeQuery(w,c.sql,c.params,e).map(q=>({name:q.name,domain:q.domain,value:q.encrypted_value,expiry:q.expiry})),c.sql),u=await this.getMetaVersion(e),g={file:e,password:n,browser:this.browserDisplayName,metaVersion:u};return (await Promise.allSettled(l.map(async w=>this.processCookie(w,g)))).map(w=>w.status==="fulfilled"?w.value:null).filter(w=>w!==null)}catch(i){return this.logger.error(`Failed to process ${this.browserDisplayName} cookie file`,{error:this.getErrorMessage(i),file:e,name:r,domain:t}),[]}}async getMetaVersion(e){try{let r=te(),n=new H(this.sqlBrowserType).buildMetaQuery("version"),i=await r.executeQuery(e,s=>s.prepare(n.sql).get(...n.params),"Get meta version");return i?Number.parseInt(i.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)),n=await Lr(t,r.password,r.metaVersion);return Kr(e.domain,e.name,n,e.expiry,r.file,r.browser,!0)}catch(t){return this.logger.warn(`Failed to decrypt ${r.browser} cookie`,{error:this.getErrorMessage(t)}),Kr(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,false)}}};ue.MAX_CONCURRENT_PROFILE_READS=5;var xe=ue;var fe=class extends xe{constructor(e="chrome",r){let t=e.charAt(0).toUpperCase()+e.slice(1);super(`${t}CookieQueryStrategy`,t,e),this.browser=e,r!==void 0&&(this.profileName=r);}getCookieFilePaths(e){if(e!==void 0&&e!=="")return [e];let r;try{let t=gr(this.browser);r=Po__default.default.sync("./**/Cookies",{cwd:t,absolute:!0}),this.logger.debug(`Found ${r.length} cookie files for ${this.browser}`);}catch(t){return this.logger.warn(`Failed to find ${this.browser} cookie files`,{error:this.getErrorMessage(t)}),[]}return this.profileName?this.filterByProfileName(r):r}filterByProfileName(e){try{if(e.length===0)return this.logger.warn(`No ${this.browser} cookie files found`),[];let r=e[0];if(!r)return [];let t=path.dirname(path.dirname(r)),n=path.join(t,"Local State");if(!v(n))return e;let s=JSON.parse(F(n)).profile?.info_cache||{},a;for(let[u,g]of Object.entries(s))if(g.name?.toLowerCase()===this.profileName?.toLowerCase()){a=u;break}if(!a){for(let u of Object.keys(s))if(u.toLowerCase()===this.profileName?.toLowerCase()){a=u;break}}if(a){let u=e.filter(g=>path.dirname(g).endsWith(a));return u.length===0?this.logger.warn(`No cookie files found for profile: ${this.profileName} (directory: ${a})`):this.logger.debug(`Found ${u.length} cookie file(s) for profile: ${this.profileName}`),u}let c=Object.entries(s).map(([,u])=>u.name).filter(Boolean),l=c.length>0?` Available profiles: ${c.join(", ")}`:"";return this.logger.warn(`No ${this.browser} profile matching "${this.profileName}" found.${l}`),[]}catch(r){return this.logger.warn(`Failed to read ${this.browser} profile info: ${r}`),e}}};var V=class extends fe{constructor(e){super("chrome",e);}};ie();E();B();E();N();h("BrowserDetector");N();h("BrowserAvailability");({darwin:{chrome:["/Applications/Google Chrome.app",`${os.homedir()}/Applications/Google Chrome.app`,`${os.homedir()}/Library/Application Support/Google/Chrome`],firefox:["/Applications/Firefox.app",`${os.homedir()}/Applications/Firefox.app`,`${os.homedir()}/Library/Application Support/Firefox`],safari:["/Applications/Safari.app",`${os.homedir()}/Library/Safari`,`${os.homedir()}/Library/Cookies`],edge:["/Applications/Microsoft Edge.app",`${os.homedir()}/Applications/Microsoft Edge.app`,`${os.homedir()}/Library/Application Support/Microsoft Edge`],arc:["/Applications/Arc.app",`${os.homedir()}/Applications/Arc.app`,`${os.homedir()}/Library/Application Support/Arc`],opera:["/Applications/Opera.app",`${os.homedir()}/Applications/Opera.app`,`${os.homedir()}/Library/Application Support/com.operasoftware.Opera`],"opera-gx":["/Applications/Opera GX.app",`${os.homedir()}/Applications/Opera GX.app`,`${os.homedir()}/Library/Application Support/com.operasoftware.OperaGX`],brave:["/Applications/Brave Browser.app",`${os.homedir()}/Applications/Brave Browser.app`,`${os.homedir()}/Library/Application Support/BraveSoftware/Brave-Browser`],vivaldi:["/Applications/Vivaldi.app",`${os.homedir()}/Applications/Vivaldi.app`,`${os.homedir()}/Library/Application Support/Vivaldi`]},win32:{chrome:[path.join(process.env.LOCALAPPDATA??"","Google","Chrome"),path.join(process.env.PROGRAMFILES??"","Google","Chrome"),path.join(process.env["PROGRAMFILES(X86)"]??"","Google","Chrome")],firefox:[path.join(process.env.APPDATA??"","Mozilla","Firefox"),path.join(process.env.PROGRAMFILES??"","Mozilla Firefox"),path.join(process.env["PROGRAMFILES(X86)"]??"","Mozilla Firefox")],edge:[path.join(process.env.LOCALAPPDATA??"","Microsoft","Edge"),path.join(process.env.PROGRAMFILES??"","Microsoft","Edge"),path.join(process.env["PROGRAMFILES(X86)"]??"","Microsoft","Edge")],opera:[path.join(process.env.APPDATA??"","Opera Software","Opera Stable"),path.join(process.env.PROGRAMFILES??"","Opera"),path.join(process.env["PROGRAMFILES(X86)"]??"","Opera")],"opera-gx":[path.join(process.env.APPDATA??"","Opera Software","Opera GX Stable"),path.join(process.env.PROGRAMFILES??"","Opera GX"),path.join(process.env["PROGRAMFILES(X86)"]??"","Opera GX")],brave:[path.join(process.env.LOCALAPPDATA??"","BraveSoftware","Brave-Browser"),path.join(process.env.PROGRAMFILES??"","BraveSoftware","Brave-Browser")],vivaldi:[path.join(process.env.LOCALAPPDATA??"","Vivaldi","Application"),path.join(process.env.PROGRAMFILES??"","Vivaldi","Application")]},linux:{chrome:[`${os.homedir()}/.config/google-chrome`,"/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/opt/google/chrome"],firefox:[`${os.homedir()}/.mozilla/firefox`,`${os.homedir()}/.config/mozilla/firefox`,"/usr/bin/firefox","/usr/lib/firefox","/snap/firefox"],edge:[`${os.homedir()}/.config/microsoft-edge`,"/usr/bin/microsoft-edge","/opt/microsoft/msedge"],brave:[`${os.homedir()}/.config/BraveSoftware/Brave-Browser`,"/usr/bin/brave-browser","/usr/bin/brave-browser-stable","/opt/brave.com/brave"],opera:[`${os.homedir()}/.config/opera`,"/usr/bin/opera","/usr/lib/opera"],"opera-gx":[`${os.homedir()}/.config/opera-gx`,"/usr/bin/opera-gx"],vivaldi:[`${os.homedir()}/.config/vivaldi`,"/usr/bin/vivaldi","/usr/bin/vivaldi-stable","/opt/vivaldi"]}});var Yr={darwin:{chrome:path.join(os.homedir(),"Library","Application Support","Google","Chrome"),edge:path.join(os.homedir(),"Library","Application Support","Microsoft Edge"),arc:path.join(os.homedir(),"Library","Application Support","Arc"),opera:path.join(os.homedir(),"Library","Application Support","com.operasoftware.Opera"),"opera-gx":path.join(os.homedir(),"Library","Application Support","com.operasoftware.OperaGX"),brave:path.join(os.homedir(),"Library","Application Support","BraveSoftware","Brave-Browser"),vivaldi:path.join(os.homedir(),"Library","Application Support","Vivaldi")},win32:{chrome:path.join(process.env.LOCALAPPDATA??"","Google","Chrome","User Data"),edge:path.join(process.env.LOCALAPPDATA??"","Microsoft","Edge","User Data"),opera:path.join(process.env.APPDATA??"","Opera Software","Opera Stable"),"opera-gx":path.join(process.env.APPDATA??"","Opera Software","Opera GX Stable"),arc:path.join(process.env.LOCALAPPDATA??"","Packages","TheBrowserCompany.Arc_ttt1ap7aabd4t","LocalCache"),brave:path.join(process.env.LOCALAPPDATA??"","BraveSoftware","Brave-Browser","User Data"),vivaldi:path.join(process.env.LOCALAPPDATA??"","Vivaldi","User Data")},linux:{chrome:path.join(os.homedir(),".config","google-chrome"),edge:path.join(os.homedir(),".config","microsoft-edge"),opera:path.join(os.homedir(),".config","opera"),"opera-gx":path.join(os.homedir(),".config","opera-gx"),brave:path.join(os.homedir(),".config","BraveSoftware","Brave-Browser"),vivaldi:path.join(os.homedir(),".config","vivaldi")}},Ao=process.env.XDG_CONFIG_HOME&&process.env.XDG_CONFIG_HOME.trim()!==""?process.env.XDG_CONFIG_HOME:path.join(os.homedir(),".config");(()=>{let o=["Firefox","Firefox Developer Edition","Firefox ESR"],e=new Set,r=n=>{for(let i of o)e.add(path.join(n,i));};r(path.join(os.homedir(),"AppData","Roaming","Mozilla"));let t=process.env.APPDATA&&process.env.APPDATA.trim()!==""?process.env.APPDATA:null;return t!==null&&r(path.join(t,"Mozilla")),[...e]})();var Zr={darwin:[path.join(os.homedir(),"Library","Application Support","Firefox")],linux:[path.join(os.homedir(),".mozilla","firefox"),path.join(Ao,"mozilla","firefox"),path.join(os.homedir(),"snap","firefox","common",".mozilla","firefox"),path.join(os.homedir(),".var","app","org.mozilla.firefox",".mozilla","firefox")]};N();function ir(o,e){let r=path.join(e,"Local State");if(!v(r))return [];try{let t=F(r),i=JSON.parse(t).profile?.info_cache??{},s=[];for(let[a,c]of Object.entries(i)){if(!c||typeof c!="object")continue;let l=c.name||a;s.push({name:l,directory:a,path:path.join(e,a),...c.user_name&&{userName:c.user_name},browser:o});}return s}catch{return []}}function Oo(o){let e=process.platform,r=Yr[e]??{};if(o){let n=o.toLowerCase(),i=r[n];return i?ir(o,i):v(path.join(o,"Local State"))?ir("chromium",o):[]}let t=[];for(let[n,i]of Object.entries(r))if(i){let s=ir(n,i);t.push(...s);}return t}x();B();N();N();function et(o){if(!o)return;let e=o.match(/userContextId=(\d+)/);if(e?.[1])return Number.parseInt(e[1],10)}function Fo(o){let e=new Map;if(!v(o))return e;try{let r=F(o),t=JSON.parse(r);if(Array.isArray(t.containers))for(let n of t.containers)typeof n.name=="string"&&typeof n.userContextId=="number"&&e.set(n.name.toLowerCase(),n.userContextId);}catch{}return e}function rt(o,e){if(typeof o=="number")return o;let r=String(o).trim();if(r.toLowerCase()==="none")return "none";if(/^\d+$/.test(r))return Number.parseInt(r,10);if(e){let t=path.join(path.dirname(e),"containers.json"),i=Fo(t).get(r.toLowerCase());if(i!==void 0)return i}throw new Error(`Unknown Firefox container: '${o}'`)}function Mo(o,e){let r=os.homedir();if(!r)return o.warn("Failed to get home directory"),[];let t=b(),n=[],i=[];switch(t){case "darwin":n.push(path.join(r,"Library/Application Support/Firefox")),i.push(path.join(r,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"));break;case "win32":{n.push(path.join(r,"AppData","Roaming","Mozilla","Firefox")),i.push(path.join(r,"AppData","Roaming","Mozilla","Firefox","Profiles","*","cookies.sqlite"));let c=path.join(r,"AppData","Roaming","Mozilla","Firefox Developer Edition");v(c)&&(n.push(c),i.push(path.join(c,"Profiles","*","cookies.sqlite")));let l=path.join(r,"AppData","Roaming","Mozilla","Firefox ESR");v(l)&&(n.push(l),i.push(path.join(l,"Profiles","*","cookies.sqlite")));let u=path.join(r,"AppData","Local","Mozilla","Firefox");v(u)&&(n.push(u),i.push(path.join(u,"Profiles","*","cookies.sqlite")));break}case "linux":{let c=Zr.linux??[];for(let l of c)n.push(l),i.push(path.join(l,"*","cookies.sqlite"));break}default:return o.debug("Unsupported platform for Firefox cookie extraction",{platform:t}),[]}let s=n.filter(c=>v(c));if(s.length===0)return o.debug("No Firefox profile directories found - Firefox may not be installed",{checked:n,platform:t}),[];let a=[];for(let c of i){let l=Po__default.default.sync(c);a.push(...l);}return o.debug("Found Firefox cookie files",{files:a}),e!==void 0&&a.length>0?$o(a,e,s,o):a}function ot(o){try{let r=F(o).split(/\r?\n/),t=[],n,i,s=!0;for(let a of r){let c=a.trim();if(c.startsWith("[")){n!==void 0&&i!==void 0&&t.push({name:n,path:i,isRelative:s}),n=void 0,i=void 0,s=!0;continue}let l=c.indexOf("=");if(l===-1)continue;let u=c.slice(0,l).trim(),g=c.slice(l+1).trim();u==="Name"?n=g:u==="Path"?i=g:u==="IsRelative"&&(s=g==="1");}return n!==void 0&&i!==void 0&&t.push({name:n,path:i,isRelative:s}),t}catch{return []}}function $o(o,e,r,t){let n=new Set;for(let s of r){let a=path.join(s,"profiles.ini");if(!v(a))continue;let c=ot(a);for(let l of c)if(l.name.toLowerCase()===e.toLowerCase()){let u=l.isRelative?path.join(s,l.path):l.path;n.add(path.basename(u));}}if(n.size===0){let s=new Set;for(let c of r){let l=path.join(c,"profiles.ini");if(v(l))for(let u of ot(l))s.add(u.name);}let a=s.size>0?` Available profiles: ${[...s].join(", ")}`:"";return t.warn(`No Firefox profile matching "${e}" found.${a}`),[]}let i=o.filter(s=>{let a=path.basename(path.join(s,".."));return n.has(a)});return i.length===0?t.warn(`No cookie files found for Firefox profile: ${e}`):t.debug(`Found ${i.length} cookie file(s) for Firefox profile: ${e}`),i}function Io(o,e){return o===null||!(o>0)?"Infinity":new Date(e>=16?o:o*1e3)}function qo(o,e,r=Date.now()){if(o===null)return false;let t=e>=16?r:Math.floor(r/1e3);return o>t}var W=class extends _{constructor(e,r){super("FirefoxCookieQueryStrategy","Firefox"),this.lockHandler=new Q(this.logger,"Firefox"),e!==void 0&&(this.profileName=e),r!==void 0&&(this.container=r);}async createCookieQueryConfig(e,r,t){let{CookieQueryBuilder:n}=await Promise.resolve().then(()=>(je(),Gr)),i=new n("firefox"),s;this.container!==void 0&&(s=rt(this.container,t));let a=i.buildSelectQuery({name:e,domain:r,browser:"firefox",includeExpired:true,...s!==void 0&&{container:s}});return {file:t,sql:a.sql,params:a.params,rowTransform:(c,l)=>{let u=et(c.originAttributes);return {name:c.name,value:c.value,domain:c.domain,expiry:Io(c.expiry,l),meta:{file:t,browser:"Firefox",decrypted:false,...u!==void 0&&{containerId:u}}}}}}async handleCookieExtractionError(e,r,t,n,i){let s=await kr(),a=await this.lockHandler.handleBrowserConflict(e,r,s,t!==true);return a.resolved?{retryAfterClose:true,shouldRelaunch:a.shouldRelaunch}:(this.logExtractError(e,r,n,i),{retryAfterClose:false,shouldRelaunch:false})}logExtractError(e,r,t,n){this.logger.debug(`Error reading Firefox cookie file ${r}`,{error:d(e),file:r,name:t,domain:n});}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,n){let i=await this.createCookieQueryConfig(r,t,e);try{return await this.executeQueryWithNewUtilities(i)}catch(s){let a=await this.handleCookieExtractionError(s,e,n,r,t);return a.retryAfterClose?this.performRetryAfterClose(i,a.shouldRelaunch):[]}}async executeQueryWithNewUtilities(e){let r=te({retryAttempts:1,retryDelay:0,queryTimeout:100,enableMonitoring:true}),t=le();return r.executeQuery(e.file,n=>{let s=n.prepare("PRAGMA user_version").get()?.user_version??0,a=t.executeQuery(n,e.sql,e.params,e.file),c=Date.now();return a.filter(l=>qo(l.expiry,s,c)).map(l=>e.rowTransform(l,s))},e.sql)}async executeQuery(e,r,t,n){let i=t??Mo(this.logger,this.profileName),s=Array.isArray(i)?i:[i];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,n);a.push(...l);}return a}};x();B();x();E();B();var ar=util.promisify(child_process.exec),pe=h("SystemPermissions");async function Uo(){try{await ar('open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"'),pe.info("Opened System Settings > Privacy & Security > Full Disk Access");}catch{try{await ar('open "x-apple.systempreferences:com.apple.preference.security?Privacy"'),pe.info("Opened System Settings > Privacy & Security");}catch{await ar("open -b com.apple.systempreferences"),pe.info("Opened System Settings");}}}function zo(){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 Vo(o,e){let r=nt__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{console.log(`
|
|
56
56
|
\u26A0\uFE0F ${e} cookie access is blocked by macOS security.
|
|
57
57
|
|
|
58
58
|
To grant access, ${o} needs permission to read ${e} data.
|
|
@@ -62,7 +62,7 @@ Would you like to:
|
|
|
62
62
|
2. Skip ${e} cookies for now
|
|
63
63
|
3. Exit
|
|
64
64
|
|
|
65
|
-
Please enter your choice (1/2/3): `),r.question("",n=>{r.close(),t(n.trim()==="1");});})}async function
|
|
65
|
+
Please enter your choice (1/2/3): `),r.question("",n=>{r.close(),t(n.trim()==="1");});})}async function cr(o,e){if(!T()||!(S(o,"eperm")||S(o,"operation not permitted")||S(o,"permission denied")||S(o,"authorization denied")))return false;let t=e.appName||zo();if(pe.warn(`${e.browserName} cookie access denied by macOS`,{app:t,error:d(o)}),e.interactive!==false){if(await Vo(t,e.browserName)){await Uo(),console.log(`
|
|
66
66
|
\u2705 System Settings opened to Privacy & Security
|
|
67
67
|
|
|
68
68
|
Please follow these steps:
|
|
@@ -72,6 +72,6 @@ Please follow these steps:
|
|
|
72
72
|
4. You may need to restart ${t} after granting permission
|
|
73
73
|
5. Then run this command again
|
|
74
74
|
|
|
75
|
-
Press Enter when you've completed these steps...`);let i=Ar__default.default.createInterface({input:process.stdin,output:process.stdout});return await new Promise(s=>{i.question("",()=>{i.close(),s();});}),true}}else ne.info(`To grant ${e.browserName} access, add ${t} to System Settings > Privacy & Security > Full Disk Access`);return false}async function Xe(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}}b();x();b();x();var de=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"),ge=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"),Lr=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("/"),Mr=zod.z.string().trim().transform(o=>to__default.default(o)).pipe(zod.z.any()),Ir=zod.z.object({name:ge,value:Mr,domain:de,path:Lr,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()}),oo=zod.z.object({name:ge,domain:de}).strict(),no=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:Lr.optional()}).catchall(zod.z.unknown());zod.z.object({domain:de,name:ge,value:Mr,expiry:zod.z.union([zod.z.literal("Infinity"),zod.z.date(),zod.z.number().int().positive("Expiry must be a positive number")]).optional(),meta:no.optional()}).strict();zod.z.object({expiry:zod.z.number().int().optional(),domain:de,name:ge,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 io=zod.z.enum(["Chrome","Firefox","Safari","internal","unknown"]),so=zod.z.object({browserName:io,queryCookies:zod.z.function()}).strict(),ao=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()});ao.extend({strategy:so.optional()});var co=zod.z.enum(["chrome","chromium","edge","firefox","opera","brave","arc"]);oo.extend({browser:co,exactDomain:zod.z.boolean().optional(),caseSensitive:zod.z.boolean().optional(),limit:zod.z.number().int().positive().optional(),includeExpired:zod.z.boolean().optional()});x();var M=h("BinaryCodableCookie"),ye=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 n=buffer.Buffer.from(t,"base64").toString("utf8"),i=JSON.parse(n);return JSON.stringify(i)}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,n=this.decodeUrlValue(t);return this.trySpecializedDecoding(n)}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),n=this.convertMacTimestamp(this.creation);return Ir.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:t,creation:n,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 n=e.buffer.readUInt32LE(e.offset);M.debug("Cookie flags:",n.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(n&1)!==0,isHTTPOnly:(n&4)!==0,unknown1:(n&8)!==0,unknown2:(n&16)!==0};let i=e.buffer.readUInt32LE(e.offset);M.debug("Has port:",i),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:i,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 n=buffer.Buffer.alloc(8);for(let s=0;s<8;s++)n[s]=e.buffer[e.offset+s];let i=n.readDoubleLE(0);e.offset+=8,this.expiration=t,this.creation=i;}readStrings(e,r,t){M.debug("Reading strings from cookie buffer of size:",r);let i=[{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:",i.map(s=>s.field));for(let s=0;s<i.length;s++){let a=i[s],{field:c,offset:l}=a,p=(s<i.length-1?i[s+1].offset:r)-l,v=0+l;for(;v<0+l+p&&e.buffer[v]!==0;)v++;let d=e.buffer.toString("utf8",0+l,v);switch(M.debug(`Read ${c}:`,d),c){case "url":this.url=d;break;case "name":this.name=d;break;case "path":this.path=d;break;case "value":this.value=d;break;case "comment":this.comment=d;break}}}decode(e){let{size:r,hasPort:t,offsets:n}=this.readHeader(e),i=e.offset;e.offset=i+24,this.readTimestamps(e),t>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=i,this.readStrings(e,r,n);}convertFlags(){return (this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var O=h("BinaryCodablePage"),Z=class Z{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){G("BinaryCookies","Error converting cookie",{error:f(t)});}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if(O.debug("Page header:",r.toString(16)),e.offset+=4,r!==Z.HEADER)throw new Error("Invalid page header");let t=e.buffer.readUInt32LE(e.offset);O.debug("Cookie count:",t),e.offset+=4;let n=e.offset-8;O.debug("Page start offset:",n);let i=[];for(let a=0;a<t;a++){let c=e.buffer.readUInt32LE(e.offset);i.push(c),O.debug(`Cookie ${a} offset:`,c),e.offset+=4;}let s=e.buffer.readUInt32BE(e.offset);if(O.debug("Page footer:",s.toString(16)),e.offset+=4,s!==Z.FOOTER)throw new Error("Invalid page footer");for(let a=0;a<t;a++)try{let c=i[a];O.debug(`Reading cookie ${a} at offset:`,c);let l=e.buffer.readUInt32LE(c);if(O.debug(`Cookie ${a} size:`,l),l<48){O.warn(`Invalid cookie size ${l} at index ${a}`);continue}if(c+l>e.buffer.length){O.warn(`Cookie size ${l} at index ${a} would exceed buffer length ${e.buffer.length}`);continue}let m=e.buffer.subarray(c,c+l),p=new ye(m);this.cookies.push(p);}catch(c){O.warn("Invalid cookie data",{error:f(c)});}}};Z.HEADER=256,Z.FOOTER=0;var we=Z;var I=h("BinaryCodableCookies"),T=class T{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 T(r)}static fromDefaultPath(){return T.fromFile(T.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){G("BinaryCookies","Error converting page cookies",{error:f(t)});}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(T.MAGIC))throw new Error("Missing magic value");let t=e.buffer.readUInt32BE(e.offset);I.debug("Page count:",t),e.offset+=4;let n=[];for(let c=0;c<t;c++){let l=e.buffer.readUInt32BE(e.offset);n.push(l),I.debug(`Page ${c} size:`,l),e.offset+=4;}let i=e.offset;I.debug("Starting page data at offset:",i);for(let c of n)try{I.debug("Reading page at offset:",i,"with size:",c);let l=e.buffer.subarray(i,i+c),m=new we(l);this.pages.push(m),i+=c;}catch(l){I.warn("Error decoding page:",{error:f(l)}),i+=c;}e.offset=i;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!==T.FOOTER&&G("BinaryCookies","Invalid cookie file format: wrong footer"),this.metadata={};}catch(r){throw G("BinaryCookies","Error decoding binary cookies file",{error:f(r)}),r}}};T.MAGIC=buffer.Buffer.from("cook","utf8"),T.FOOTER=BigInt("0x071720050000004b"),T.DEFAULT_COOKIE_PATH=path.join(os.homedir(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var be=T;function Qr(o){return be.fromFile(o).toCookieRows()}var H=class extends q{constructor(){super("SafariCookieQueryStrategy","Safari"),this.lockHandler=new A(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,n){try{if(!await this.checkAndHandlePermissions(e,n))return [];let s=Qr(e);return this.processCookies(s,r,t,e)}catch(i){return this.handleDecodingError(i,e,r,t,n)}}async checkAndHandlePermissions(e,r){return await Xe(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 Xe(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,n){return e.filter(i=>this.matchesCriteria(i,r,t)).map(i=>this.mapToExportedCookie(i,n))}matchesCriteria(e,r,t){if(!this.isCookieObject(e))return false;let n=this.formatDomain(e.domain);if(n==="")return false;let i=r==="%"||e.name===r,s=t==="%"||n.includes(t);return i&&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,n,i){return k(e,"EPERM")||k(e,"operation not permitted")||k(e,"Permission denied")?await this.handlePermissionError(e,r,t,n,i):this.logDecodingError(e,r,t,n),[]}async handlePermissionError(e,r,t,n,i){await Ze(e,{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:i!==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}`,z(e,{file:r,name:t,domain:n,advice:"Grant Full Disk Access to your terminal in System Settings > Privacy & Security"}));}logDecodingError(e,r,t,n){this.logger.error(`Error decoding ${r}`,z(e,{file:r,name:t,domain:n}));}async executeQuery(e,r,t,n){if(!$())return this.logger.debug("Safari strategy skipped on non-macOS platform"),[];try{this.logger.info("Querying cookies",{name:e,domain:r,store:t});let i=os.homedir();if(!this.isValidHomeDirectory(i))return [];let s=t??this.getCookieDbPath(i),a=e||"%",c=r||"%",l=await this.attemptDecodeWithLockHandling(s,a,c,n);return l.success?l.cookies:l.shouldRetry?this.retryAfterBrowserClose(s,a,c,n,l.shouldRelaunch):[]}catch(i){return this.logQueryError(i,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,n){try{return {success:!0,cookies:await this.decodeCookies(e,r,t,n),shouldRetry:!1,shouldRelaunch:!1}}catch(i){return this.handleLockConflict(i,e,n)}}async handleLockConflict(e,r,t){if(!this.isLockError(e))throw e;let n=await lr(),i=await this.lockHandler.handleBrowserConflict(e,r,n,t!==true);return i.resolved?{success:false,cookies:[],shouldRetry:true,shouldRelaunch:i.shouldRelaunch}:(this.logger.warn("Safari cookie file locked",z(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 k(e,"EPERM")||k(e,"operation not permitted")||k(e,"Permission denied")||k(e,"EBUSY")}async retryAfterBrowserClose(e,r,t,n,i){try{this.logger.info("Retrying Safari cookie extraction after browser close...");let s=await this.decodeCookies(e,r,t,n);return this.logger.success("Successfully extracted cookies after closing Safari"),i===!0&&await this.lockHandler.relaunchBrowser(),s}catch(s){return this.handleRetryFailure(s,e,i)}}async handleRetryFailure(e,r,t){return this.logger.error("Failed to extract cookies even after closing Safari",z(e,{file:r})),t===true&&await this.lockHandler.relaunchBrowser(),[]}logQueryError(e,r,t){this.logger.error("Failed to query cookies",z(e,{name:r,domain:t}));}};b();V();async function _r(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 _,new H];return (await Promise.allSettled(t.map(async i=>i.queryCookies(e,r)))).filter(i=>i.status==="fulfilled").flatMap(i=>i.value)}async function Ce(o){try{let e=await _r(o);return w.debug("Cookies retrieved:",e),e}catch(e){return w.warn("Error querying cookies:",f(e)),[]}}b();V();b();V();function ho(o){return o.filter(e=>!!e.name&&!!e.domain&&typeof e.name=="string"&&typeof e.domain=="string")}function yo(o){return "batchQueryCookies"in o&&typeof o.batchQueryCookies=="function"}function wo(o,e){let r=[],t=[];for(let n of o)if(n.status==="fulfilled")r.push(...n.value);else if(e)t.push(W(n.reason,"Query failed"));else throw n.reason;return {cookies:r,errors:t}}async function bo(o,e,r){let t=[],n=[];try{if(yo(o)){let i=await o.batchQueryCookies(e);t.push(...i);}else {let i=await Promise.allSettled(e.map(async a=>o.queryCookies(a.name,a.domain))),s=wo(i,r);t.push(...s.cookies),n.push(...s.errors);}}catch(i){let s=W(i,`Failed to query ${o.constructor.name}`);if(!r)throw s;n.push(s),w.warn(`Strategy ${o.constructor.name} failed`,{error:f(s)});}return {cookies:t,errors:n}}async function er(o,e=true){let r=ho(o);if(r.length===0)return [];w.debug(`Batch querying ${r.length} cookie specs`);let t=[new Q,new _,new H],n=[],i=[];for(let s of t){let{cookies:a,errors:c}=await bo(s,r,e);n.push(...a),i.push(...c);}return i.length>0&&w.debug(`${i.length} errors occurred during batch query`),n}async function Co(o,e={}){let{deduplicate:r=true,concurrency:t=10,continueOnError:n=true}=e;w.debug(`Batch fetching ${o.length} cookie specs`,{deduplicate:r,concurrency:t,continueOnError:n});let i;try{i=await er(o,n),w.debug(`Batch query returned ${i.length} cookies`);}catch(s){if(!n)throw s;w.warn("Batch query failed, falling back to individual queries",{error:f(s)}),i=await vo(o,t,n);}if(r&&i.length>0){let s=Po(i);return w.debug(`Deduplicated ${i.length} to ${s.length}`),s}return i}function ko(o,e){return o.map(r=>{let t=e.filter(n=>n.name===r.name&&n.domain===r.domain);return {spec:r,cookies:t}})}async function xo(o,e){let r=o.map(async t=>{try{let n=await Ce(t);return {spec:t,cookies:n}}catch(n){let i=W(n,"Failed to fetch cookies");if(!e)throw i;return w.warn("Failed to fetch cookies for spec",{spec:t,error:f(i)}),{spec:t,cookies:[],error:i}}});return Promise.all(r)}async function So(o,e={}){let{concurrency:r=10,continueOnError:t=true}=e;w.debug(`Batch fetching ${o.length} cookie specs with results`,{concurrency:r,continueOnError:t});try{let n=await er(o,t);return ko(o,n)}catch(n){w.warn("Batch query failed, falling back to individual queries",{error:f(n)});let i=[];for(let s=0;s<o.length;s+=r){let a=o.slice(s,s+r),c=await xo(a,t);i.push(...c);}return i}}async function Eo(o,e){let r=[],t=[],n=o.map(async s=>{try{let a=await Ce(s);return {spec:s,cookies:a,error:void 0}}catch(a){let c=W(a,"Failed to fetch cookies");if(!e)throw c;return w.warn("Failed to fetch cookies for spec",{spec:s,error:f(c)}),{spec:s,cookies:[],error:c}}}),i=await Promise.all(n);for(let s of i)s.error?t.push({spec:s.spec,error:s.error}):r.push(...s.cookies);return {cookies:r,errors:t}}async function vo(o,e,r){let t=[],n=[];for(let i=0;i<o.length;i+=e){let s=o.slice(i,i+e),{cookies:a,errors:c}=await Eo(s,r);t.push(...a),n.push(...c);}return n.length>0&&w.warn(`${n.length} specs failed during batch retrieval`,{failedSpecs:n.map(i=>i.spec)}),t}function Po(o){let e=new Map;for(let r of o){let t=`${r.name}:${r.domain}`,n=e.get(t),i=n?.value.length??0,s=r.value.length;(!n||s>i)&&e.set(t,r);}return Array.from(e.values())}
|
|
76
|
-
exports.ChromeCookieQueryStrategy=
|
|
75
|
+
Press Enter when you've completed these steps...`);let i=nt__default.default.createInterface({input:process.stdin,output:process.stdout});return await new Promise(s=>{i.question("",()=>{i.close(),s();});}),true}}else pe.info(`To grant ${e.browserName} access, add ${t} to System Settings > Privacy & Security > Full Disk Access`);return false}async function lr(o){try{return await promises.access(o,promises.constants.R_OK),!0}catch{return false}}N();x();E();N();x();E();var ke=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"),Se=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"),it=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("/"),st=zod.z.string().trim().transform(o=>Wo__default.default(o)).pipe(zod.z.any()),at=zod.z.object({name:Se,value:st,domain:ke,path:it,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()}),jo=zod.z.object({name:Se,domain:ke}).strict(),Xo=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:it.optional(),containerId:zod.z.number().int().optional()}).catchall(zod.z.unknown());zod.z.object({domain:ke,name:Se,value:st,expiry:zod.z.union([zod.z.literal("Infinity"),zod.z.date(),zod.z.number().int().positive("Expiry must be a positive number")]).optional(),meta:Xo.optional()}).strict();zod.z.object({expiry:zod.z.number().int().optional(),domain:ke,name:Se,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 Jo=zod.z.enum(["Chrome","Firefox","Safari","internal","unknown"]),Ko=zod.z.object({browserName:Jo,queryCookies:zod.z.function()}).strict(),Yo=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(),container:zod.z.union([zod.z.string(),zod.z.number()]).optional()});Yo.extend({strategy:Ko.optional()});var Zo=zod.z.enum(["chrome","chromium","edge","firefox","opera","opera-gx","brave","arc","vivaldi"]);jo.extend({browser:Zo,exactDomain:zod.z.boolean().optional(),caseSensitive:zod.z.boolean().optional(),limit:zod.z.number().int().positive().optional(),includeExpired:zod.z.boolean().optional(),container:zod.z.union([zod.z.string(),zod.z.number()]).optional()});E();var G=h("BinaryCodableCookie"),ve=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 n=buffer.Buffer.from(t,"base64").toString("utf8"),i=JSON.parse(n);return JSON.stringify(i)}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,n=this.decodeUrlValue(t);return this.trySpecializedDecoding(n)}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),n=this.convertMacTimestamp(this.creation);return at.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:t,creation:n,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);G.debug("Cookie size:",r),e.offset+=4;let t=e.buffer.readUInt32LE(e.offset);G.debug("Cookie version:",t),e.offset+=4;let n=e.buffer.readUInt32LE(e.offset);G.debug("Cookie flags:",n.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(n&1)!==0,isHTTPOnly:(n&4)!==0,unknown1:(n&8)!==0,unknown2:(n&16)!==0};let i=e.buffer.readUInt32LE(e.offset);G.debug("Has port:",i),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 G.debug("String offsets:",s),{size:r,hasPort:i,offsets:s}}readTimestamps(e){let r=e.buffer.readDoubleLE(e.offset);e.offset+=8;let t=e.buffer.readDoubleLE(e.offset);e.offset+=8,this.expiration=r,this.creation=t;}readStrings(e,r,t){G.debug("Reading strings from cookie buffer of size:",r);let i=[{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);G.debug("Reading strings in order:",i.map(s=>s.field));for(let s=0;s<i.length;s++){let a=i[s],{field:c,offset:l}=a,g=(s<i.length-1?i[s+1].offset:r)-l,R=0+l;for(;R<0+l+g&&e.buffer[R]!==0;)R++;let w=e.buffer.toString("utf8",0+l,R);switch(G.debug(`Read ${c}:`,w),c){case "url":this.url=w;break;case "name":this.name=w;break;case "path":this.path=w;break;case "value":this.value=w;break;case "comment":this.comment=w;break}}}decode(e){let{size:r,hasPort:t,offsets:n}=this.readHeader(e),i=e.offset;e.offset=i+24,this.readTimestamps(e),t>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=i,this.readStrings(e,r,n);}convertFlags(){return (this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var $=h("BinaryCodablePage"),oe=class oe{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){Z("BinaryCookies","Error converting cookie",{error:d(t)});}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if($.debug("Page header:",r.toString(16)),e.offset+=4,r!==oe.HEADER)throw new Error("Invalid page header");let t=e.buffer.readUInt32LE(e.offset);$.debug("Cookie count:",t),e.offset+=4;let n=e.offset-8;$.debug("Page start offset:",n);let i=[];for(let a=0;a<t;a++){let c=e.buffer.readUInt32LE(e.offset);i.push(c),$.debug(`Cookie ${a} offset:`,c),e.offset+=4;}let s=e.buffer.readUInt32BE(e.offset);if($.debug("Page footer:",s.toString(16)),e.offset+=4,s!==oe.FOOTER)throw new Error("Invalid page footer");for(let a=0;a<t;a++)try{let c=i[a];$.debug(`Reading cookie ${a} at offset:`,c);let l=e.buffer.readUInt32LE(c);if($.debug(`Cookie ${a} size:`,l),l<48){$.warn(`Invalid cookie size ${l} at index ${a}`);continue}if(c+l>e.buffer.length){$.warn(`Cookie size ${l} at index ${a} would exceed buffer length ${e.buffer.length}`);continue}let u=e.buffer.subarray(c,c+l),g=new ve(u);this.cookies.push(g);}catch(c){$.warn("Invalid cookie data",{error:d(c)});}}};oe.HEADER=256,oe.FOOTER=0;var Ee=oe;var U=h("BinaryCodableCookies"),I=class I{constructor(e){let r={offset:0,buffer:e};this.pages=[],this.metadata={},this.decode(r);}static fromFile(e){let r=Cr(e);return new I(r)}static fromDefaultPath(){return I.fromFile(I.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){Z("BinaryCookies","Error converting page cookies",{error:d(t)});}return e}decode(e){try{let r=e.buffer.subarray(e.offset,e.offset+4);if(e.offset+=4,U.debug("Magic bytes:",r.toString()),!r.equals(I.MAGIC))throw new Error("Missing magic value");let t=e.buffer.readUInt32BE(e.offset);U.debug("Page count:",t),e.offset+=4;let n=[];for(let c=0;c<t;c++){let l=e.buffer.readUInt32BE(e.offset);n.push(l),U.debug(`Page ${c} size:`,l),e.offset+=4;}let i=e.offset;U.debug("Starting page data at offset:",i);for(let c of n)try{U.debug("Reading page at offset:",i,"with size:",c);let l=e.buffer.subarray(i,i+c),u=new Ee(l);this.pages.push(u),i+=c;}catch(l){U.warn("Error decoding page:",{error:d(l)}),i+=c;}e.offset=i;let s=e.buffer.readUInt32BE(e.offset);U.debug("Checksum:",s.toString(16)),e.offset+=4;let a=e.buffer.readBigUInt64BE(e.offset);U.debug("Footer:",a.toString(16)),e.offset+=8,a!==I.FOOTER&&Z("BinaryCookies","Invalid cookie file format: wrong footer"),this.metadata={};}catch(r){throw Z("BinaryCookies","Error decoding binary cookies file",{error:d(r)}),r}}};I.MAGIC=buffer.Buffer.from("cook","utf8"),I.FOOTER=BigInt("0x071720050000004b"),I.DEFAULT_COOKIE_PATH=path.join(os.homedir(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var Be=I;function lt(o){return Be.fromFile(o).toCookieRows()}function nn(o,e){let r=path.join(o,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies"),t=path.join(o,"Library","Cookies","Cookies.binarycookies"),n=e(r),i=e(t);return !n&&i?t:r}var j=class extends _{constructor(e){super("SafariCookieQueryStrategy","Safari"),this.lockHandler=new Q(this.logger,"Safari"),e!==void 0&&(this.profileName=e);}getCookieDbPath(e){return nn(e,v)}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,n){try{if(!await this.checkAndHandlePermissions(e,n))return [];let s=lt(e);return this.processCookies(s,r,t,e)}catch(i){return this.handleDecodingError(i,e,r,t,n)}}async checkAndHandlePermissions(e,r){return await lr(e)?true:(this.logger.warn("Cannot access Safari cookies due to macOS permissions",{file:e,suggestion:"Terminal application needs Full Disk Access permission"}),await cr(new Error("EPERM: operation not permitted"),{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:r!==true})?await lr(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,n){return e.filter(i=>this.matchesCriteria(i,r,t)).map(i=>this.mapToExportedCookie(i,n))}matchesCriteria(e,r,t){if(!this.isCookieObject(e))return false;let n=this.formatDomain(e.domain);if(n==="")return false;let i=r==="%"||e.name===r,s=t==="%"||n.includes(t);return i&&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,n,i){return S(e,"EPERM")||S(e,"operation not permitted")||S(e,"Permission denied")?await this.handlePermissionError(e,r,t,n,i):this.logDecodingError(e,r,t,n),[]}async handlePermissionError(e,r,t,n,i){await cr(e,{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:i!==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}`,K(e,{file:r,name:t,domain:n,advice:"Grant Full Disk Access to your terminal in System Settings > Privacy & Security"}));}logDecodingError(e,r,t,n){this.logger.error(`Error decoding ${r}`,K(e,{file:r,name:t,domain:n}));}async executeQuery(e,r,t,n){if(this.profileName!==void 0&&this.logger.warn(`Safari does not support profile filtering. --profile "${this.profileName}" will be ignored; all Safari cookies will be returned.`),!T())return this.logger.debug("Safari strategy skipped on non-macOS platform"),[];try{this.logger.info("Querying cookies",{name:e,domain:r,store:t});let i=os.homedir();if(!this.isValidHomeDirectory(i))return [];let s=t??this.getCookieDbPath(i),a=e||"%",c=r||"%",l=await this.attemptDecodeWithLockHandling(s,a,c,n);return l.success?l.cookies:l.shouldRetry?this.retryAfterBrowserClose(s,a,c,n,l.shouldRelaunch):[]}catch(i){return this.logQueryError(i,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,n){try{return {success:!0,cookies:await this.decodeCookies(e,r,t,n),shouldRetry:!1,shouldRelaunch:!1}}catch(i){return this.handleLockConflict(i,e,n)}}async handleLockConflict(e,r,t){if(!this.isLockError(e))throw e;let n=await vr(),i=await this.lockHandler.handleBrowserConflict(e,r,n,t!==true);return i.resolved?{success:false,cookies:[],shouldRetry:true,shouldRelaunch:i.shouldRelaunch}:(this.logger.warn("Safari cookie file locked",K(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 S(e,"EPERM")||S(e,"operation not permitted")||S(e,"Permission denied")||S(e,"EBUSY")}async retryAfterBrowserClose(e,r,t,n,i){try{this.logger.info("Retrying Safari cookie extraction after browser close...");let s=await this.decodeCookies(e,r,t,n);return this.logger.success("Successfully extracted cookies after closing Safari"),i===!0&&await this.lockHandler.relaunchBrowser(),s}catch(s){return this.handleRetryFailure(s,e,i)}}async handleRetryFailure(e,r,t){return this.logger.error("Failed to extract cookies even after closing Safari",K(e,{file:r})),t===true&&await this.lockHandler.relaunchBrowser(),[]}logQueryError(e,r,t){this.logger.error("Failed to query cookies",K(e,{name:r,domain:t}));}};x();Y();var sn=[new V,new W,new j];async function ft(o){if(!o.name||!o.domain)return [];let{name:e,domain:r}=o;if(typeof e!="string"||typeof r!="string")return [];let t=sn;return (await Promise.allSettled(t.map(async i=>i.queryCookies(e,r)))).filter(i=>i.status==="fulfilled").flatMap(i=>i.value)}async function Pe(o){try{let e=await ft(o);return C.debug("Cookies retrieved:",e),e}catch(e){return C.warn("Error querying cookies:",d(e)),[]}}x();Y();x();Y();var an=[new V,new W,new j];function cn(o){return o.filter(e=>!!e.name&&!!e.domain&&typeof e.name=="string"&&typeof e.domain=="string")}function ln(o){return "batchQueryCookies"in o&&typeof o.batchQueryCookies=="function"}function un(o,e){let r=[],t=[];for(let n of o)if(n.status==="fulfilled")r.push(...n.value);else if(e)t.push(z(n.reason,"Query failed"));else throw n.reason;return {cookies:r,errors:t}}async function fn(o,e,r){let t=[],n=[];try{if(ln(o)){let i=await o.batchQueryCookies(e);t.push(...i);}else {let i=await Promise.allSettled(e.map(async a=>o.queryCookies(a.name,a.domain))),s=un(i,r);t.push(...s.cookies),n.push(...s.errors);}}catch(i){let s=z(i,`Failed to query ${o.constructor.name}`);if(!r)throw s;n.push(s),C.warn(`Strategy ${o.constructor.name} failed`,{error:d(s)});}return {cookies:t,errors:n}}async function ur(o,e=true){let r=cn(o);if(r.length===0)return [];C.debug(`Batch querying ${r.length} cookie specs`);let t=an,n=[],i=[],s=await Promise.allSettled(t.map(async a=>fn(a,r,e)));for(let a of s)if(a.status==="fulfilled")n.push(...a.value.cookies),i.push(...a.value.errors);else if(e)i.push(z(a.reason,"Strategy query failed"));else throw a.reason;return i.length>0&&C.debug(`${i.length} errors occurred during batch query`),n}async function pn(o,e={}){let{deduplicate:r=true,concurrency:t=10,continueOnError:n=true}=e;C.debug(`Batch fetching ${o.length} cookie specs`,{deduplicate:r,concurrency:t,continueOnError:n});let i;try{i=await ur(o,n),C.debug(`Batch query returned ${i.length} cookies`);}catch(s){if(!n)throw s;C.warn("Batch query failed, falling back to individual queries",{error:d(s)}),i=await yn(o,t,n);}if(r&&i.length>0){let s=wn(i);return C.debug(`Deduplicated ${i.length} to ${s.length}`),s}return i}function mn(o,e){return o.map(r=>{let t=e.filter(n=>n.name===r.name&&n.domain===r.domain);return {spec:r,cookies:t}})}async function dn(o,e){let r=o.map(async t=>{try{let n=await Pe(t);return {spec:t,cookies:n}}catch(n){let i=z(n,"Failed to fetch cookies");if(!e)throw i;return C.warn("Failed to fetch cookies for spec",{spec:t,error:d(i)}),{spec:t,cookies:[],error:i}}});return Promise.all(r)}async function gn(o,e={}){let{concurrency:r=10,continueOnError:t=true}=e;C.debug(`Batch fetching ${o.length} cookie specs with results`,{concurrency:r,continueOnError:t});try{let n=await ur(o,t);return mn(o,n)}catch(n){C.warn("Batch query failed, falling back to individual queries",{error:d(n)});let i=[];for(let s=0;s<o.length;s+=r){let a=o.slice(s,s+r),c=await dn(a,t);i.push(...c);}return i}}async function hn(o,e){let r=[],t=[],n=o.map(async s=>{try{let a=await Pe(s);return {spec:s,cookies:a,error:void 0}}catch(a){let c=z(a,"Failed to fetch cookies");if(!e)throw c;return C.warn("Failed to fetch cookies for spec",{spec:s,error:d(c)}),{spec:s,cookies:[],error:c}}}),i=await Promise.all(n);for(let s of i)s.error?t.push({spec:s.spec,error:s.error}):r.push(...s.cookies);return {cookies:r,errors:t}}async function yn(o,e,r){let t=[],n=[];for(let i=0;i<o.length;i+=e){let s=o.slice(i,i+e),{cookies:a,errors:c}=await hn(s,r);t.push(...a),n.push(...c);}return n.length>0&&C.warn(`${n.length} specs failed during batch retrieval`,{failedSpecs:n.map(i=>i.spec)}),t}function wn(o){let e=new Map;for(let r of o){let t=`${r.name}:${r.domain}`,n=e.get(t),i=n?.value.length??0,s=r.value.length;(!n||s>i)&&e.set(t,r);}return Array.from(e.values())}
|
|
76
|
+
exports.ChromeCookieQueryStrategy=V;exports.ChromiumCookieQueryStrategy=fe;exports.CompositeCookieQueryStrategy=De;exports.FirefoxCookieQueryStrategy=W;exports.SafariCookieQueryStrategy=j;exports.batchGetCookies=pn;exports.batchGetCookiesWithResults=gn;exports.getChromiumProfiles=Oo;exports.getCookie=Pe;//# sourceMappingURL=index.cjs.map
|
|
77
77
|
//# sourceMappingURL=index.cjs.map
|