ilml-plugin-linkedin 1.3.1 → 1.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/dist/scout.mjs CHANGED
@@ -206,7 +206,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
206
206
  `),n}i.dependencies.size&&this.resolvePluginDependencies()}}orderPlugins(){Rg("orderPlugins:before",this.pluginNames);let e=this._plugins.filter(A=>A.requirements.has("runLast")).map(A=>A.name);for(let A of e){let r=this._plugins.findIndex(i=>i.name===A);this._plugins.push(this._plugins.splice(r,1)[0])}Rg("orderPlugins:after",this.pluginNames)}checkPluginRequirements(e={}){for(let A of this._plugins)for(let r of A.requirements)e.context==="launch"&&r==="headful"&&e.options.headless&&console.warn(`Warning: Plugin '${A.name}' is not supported in headless mode.`),e.context==="connect"&&r==="launch"&&console.warn(`Warning: Plugin '${A.name}' doesn't support puppeteer.connect().`)}async callPlugins(e,...A){for(let r of this.getPluginsByProp(e))await r[e].apply(r,A)}async callPluginsWithValue(e,A){for(let r of this.getPluginsByProp(e)){let i=await r[e](A);i&&(A=i)}return A}},HFe=new mE(...jFe()),JFe=t=>new mE(t);function jFe(){try{return[j("puppeteer"),void 0]}catch{}try{return[Y6(),void 0]}catch(t){return[void 0,t]}}_g.PuppeteerExtra=mE;_g.addExtra=JFe;_g.default=HFe;NN.exports=_g.default||{};Object.entries(_g).forEach(([t,e])=>{NN.exports[t]=e})});var X6=w((NUe,V6)=>{"use strict";V6.exports=function(e){if(!Array.isArray(e))throw new TypeError("arr-union expects the first argument to be an array.");for(var A=arguments.length,r=0;++r<A;){var i=arguments[r];if(i){Array.isArray(i)||(i=[i]);for(var n=0;n<i.length;n++){var s=i[n];e.indexOf(s)>=0||e.push(s)}}}return e}});var z6=w((LUe,Z6)=>{"use strict";function YFe(t){var e={},A=function(r,i){i=i||qFe(r),(process.env.UNLAZY==="true"||process.env.UNLAZY===!0||process.env.TRAVIS)&&(e[i]=t(r)),Object.defineProperty(A,i,{enumerable:!0,configurable:!0,get:n});function n(){return e.hasOwnProperty(i)?e[i]:e[i]=t(r)}return n};return A}function qFe(t){return t.length===1?t.toLowerCase():(t=t.replace(/^[\W_]+|[\W_]+$/g,"").toLowerCase(),t.replace(/[\W_]+(\w|$)/g,function(e,A){return A.toUpperCase()}))}Z6.exports=YFe});var eV=w((xUe,$6)=>{"use strict";$6.exports=function(e,A,r){for(var i in e)if(A.call(r,e[i],i,e)===!1)break}});var tV=w((GUe,AV)=>{"use strict";var WFe=eV(),VFe=Object.prototype.hasOwnProperty;AV.exports=function(e,A,r){WFe(e,function(i,n){if(VFe.call(e,n))return A.call(r,e[n],n,e)})}});var nV=w((UUe,iV)=>{"use strict";var rV=z6()(j),XFe=j;j=rV;j("is-plain-object","isObject");j("shallow-clone","clone");j("kind-of","typeOf");tV();j=XFe;iV.exports=rV});var oV=w((KUe,sV)=>{"use strict";var ID=nV();function LN(t,e){switch(ID.typeOf(t)){case"object":return ZFe(t,e);case"array":return zFe(t,e);default:return ID.clone(t)}}function ZFe(t,e){if(ID.isObject(t)){var A={};return ID.forOwn(t,function(r,i){this[i]=LN(r,e)},A),A}else return e?e(t):t}function zFe(t,e){for(var A=t.length,r=[],i=-1;++i<A;)r[i]=LN(t[i],e);return r}sV.exports=LN});var uV=w((TUe,gV)=>{gV.exports=function(t){return t!=null&&(aV(t)||$Fe(t)||!!t._isBuffer)};function aV(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function $Fe(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&aV(t.slice(0,0))}});var IV=w((OUe,cV)=>{var eve=uV(),Ave=Object.prototype.toString;cV.exports=function(e){if(typeof e>"u")return"undefined";if(e===null)return"null";if(e===!0||e===!1||e instanceof Boolean)return"boolean";if(typeof e=="string"||e instanceof String)return"string";if(typeof e=="number"||e instanceof Number)return"number";if(typeof e=="function"||e instanceof Function)return"function";if(typeof Array.isArray<"u"&&Array.isArray(e))return"array";if(e instanceof RegExp)return"regexp";if(e instanceof Date)return"date";var A=Ave.call(e);return A==="[object RegExp]"?"regexp":A==="[object Date]"?"date":A==="[object Arguments]"?"arguments":A==="[object Error]"?"error":eve(e)?"buffer":A==="[object Set]"?"set":A==="[object WeakSet]"?"weakset":A==="[object Map]"?"map":A==="[object WeakMap]"?"weakmap":A==="[object Symbol]"?"symbol":A==="[object Int8Array]"?"int8array":A==="[object Uint8Array]"?"uint8array":A==="[object Uint8ClampedArray]"?"uint8clampedarray":A==="[object Int16Array]"?"int16array":A==="[object Uint16Array]"?"uint16array":A==="[object Int32Array]"?"int32array":A==="[object Uint32Array]"?"uint32array":A==="[object Float32Array]"?"float32array":A==="[object Float64Array]"?"float64array":"object"}});var hV=w((HUe,BV)=>{"use strict";var tve=X6(),CV=oV(),lV=IV();BV.exports=function(e,A){!lD(e)&&!Array.isArray(e)&&(e={});for(var r=CV(e),i=arguments.length,n=0;++n<i;){var s=arguments[n];(lD(s)||Array.isArray(s))&&EV(r,s)}return r};function EV(t,e){for(var A in e)if(!(!ive(A)||!rve(e,A))){var r=e[A],i=t[A];lD(i)&&lD(r)?t[A]=EV(i,r):Array.isArray(i)?t[A]=tve([],i,r):t[A]=CV(r)}return t}function rve(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function lD(t){return lV(t)==="object"||lV(t)==="function"}function ive(t){return t!=="__proto__"&&t!=="constructor"&&t!=="prototype"}});var dV=w(GN=>{"use strict";Object.defineProperty(GN,"__esModule",{value:!0});function nve(t){return t&&typeof t=="object"&&"default"in t?t.default:t}var QV=nve(wt()),sve=hV(),xN=class{constructor(e){this._debugBase=QV(`puppeteer-extra-plugin:base:${this.name}`),this._childClassMembers=[],this._opts=sve(this.defaults,e||{}),this._debugBase("Initialized.")}get name(){throw new Error('Plugin must override "name"')}get defaults(){return{}}get requirements(){return new Set([])}get dependencies(){return new Set([])}get data(){return[]}get opts(){return this._opts}get debug(){return QV(`puppeteer-extra-plugin:${this.name}`)}async beforeLaunch(e){}async afterLaunch(e,A={options:{}}){}async beforeConnect(e){}async afterConnect(e,A={}){}async onBrowser(e,A){}async onTargetCreated(e){}async onPageCreated(e){}async onTargetChanged(e){}async onTargetDestroyed(e){}async onDisconnected(){}async onClose(){}async onPluginRegistered(){}getDataFromPlugins(e){return[]}_getMissingDependencies(e){let A=new Set(e.map(i=>i.name));return new Set(Array.from(this.dependencies.values()).filter(i=>!A.has(i)))}async _bindBrowserEvents(e,A={}){(this._hasChildClassMember("onTargetCreated")||this._hasChildClassMember("onPageCreated"))&&e.on("targetcreated",this._onTargetCreated.bind(this)),this._hasChildClassMember("onTargetChanged")&&this.onTargetChanged&&e.on("targetchanged",this.onTargetChanged.bind(this)),this._hasChildClassMember("onTargetDestroyed")&&this.onTargetDestroyed&&e.on("targetdestroyed",this.onTargetDestroyed.bind(this)),this._hasChildClassMember("onDisconnected")&&this.onDisconnected&&e.on("disconnected",this.onDisconnected.bind(this)),A.context==="launch"&&this._hasChildClassMember("onClose")&&this.onClose&&(process.on("exit",this.onClose.bind(this)),e.on("disconnected",this.onClose.bind(this)),A.options.handleSIGINT!==!1&&process.on("SIGINT",this.onClose.bind(this)),A.options.handleSIGTERM!==!1&&process.on("SIGTERM",this.onClose.bind(this)),A.options.handleSIGHUP!==!1&&process.on("SIGHUP",this.onClose.bind(this))),A.context==="launch"&&this.afterLaunch&&await this.afterLaunch(e,A),A.context==="connect"&&this.afterConnect&&await this.afterConnect(e,A),this.onBrowser&&await this.onBrowser(e,A)}async _onTargetCreated(e){if(this.onTargetCreated&&await this.onTargetCreated(e),e.type()==="page")try{let A=await e.page();if(!A)return;let r="isClosed"in A&&!A.isClosed();this.onPageCreated&&r&&await this.onPageCreated(A)}catch(A){console.error(A)}}_register(e){this._registerChildClassMembers(e),this.onPluginRegistered&&this.onPluginRegistered()}_registerChildClassMembers(e){this._childClassMembers=Object.getOwnPropertyNames(e)}_hasChildClassMember(e){return!!this._childClassMembers.includes(e)}get _isPuppeteerExtraPlugin(){return!0}};GN.PuppeteerExtraPlugin=xN});var pV=w((jUe,fV)=>{"use strict";var{PuppeteerExtraPlugin:ove}=dV(),UN=class extends ove{constructor(e={}){super(e)}get name(){return"stealth"}get defaults(){let e=new Set(["chrome.app","chrome.csi","chrome.loadTimes","chrome.runtime","defaultArgs","iframe.contentWindow","media.codecs","navigator.hardwareConcurrency","navigator.languages","navigator.permissions","navigator.plugins","navigator.webdriver","sourceurl","user-agent-override","webgl.vendor","window.outerdimensions"]);return{availableEvasions:e,enabledEvasions:new Set([...e])}}get dependencies(){return new Set([...this.opts.enabledEvasions].map(e=>`${this.name}/evasions/${e}`))}get availableEvasions(){return this.defaults.availableEvasions}get enabledEvasions(){return this.opts.enabledEvasions}set enabledEvasions(e){this.opts.enabledEvasions=e}async onBrowser(e){e&&e.setMaxListeners&&e.setMaxListeners(30)}},ave=t=>new UN(t);fV.exports=ave});var KV={};JE(KV,{getJobDecision:()=>Dve,getLastVisit:()=>yve,getScoutStats:()=>JN,loadCompanies:()=>PV,loadDiscoveredPeople:()=>TN,loadJobDecisions:()=>KN,loadScoutedJobs:()=>_E,loadVisitLog:()=>CD,recordVisit:()=>wve,resetCaches:()=>fve,saveCompany:()=>HN,saveDiscoveredPerson:()=>ON,saveScoutedJob:()=>PN,setJobDecision:()=>pve});import"dotenv/config";import*as Fn from"fs";import*as en from"path";import{fileURLToPath as hve}from"url";function kE(){Fn.existsSync(xg)||Fn.mkdirSync(xg,{recursive:!0})}function ME(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";Fn.writeFileSync(r,A);for(let i=0;i<3;i++)try{Fn.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function RE(t){try{if(Fn.existsSync(t))return JSON.parse(Fn.readFileSync(t,"utf-8"))}catch{}return null}function fve(){SE=null,bE=null,FE=null,vE=null,Lg=null}function _E(){return SE||(SE=RE(NV)||{},SE)}function PN(t,e){if(!t)return;kE();let A=_E(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{ME(NV,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function KN(){return bE||(bE=RE(UV)||{},bE)}function pve(t,e,A={}){if(!t||!e)return;kE();let r=KN(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{ME(UV,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function Dve(t){return KN()[t]||null}function TN(){return FE||(FE=RE(LV)||{},FE)}function ON(t,e){if(!t)return;kE();let A=TN(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{ME(LV,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function PV(){return vE||(vE=RE(GV)||{},vE)}function HN(t,e){if(!t)return;kE();let A=PV(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{ME(GV,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function CD(){return Lg||(Lg=RE(xV)||{visits:[]},Array.isArray(Lg.visits)||(Lg.visits=[]),Lg)}function wve(t,e={}){if(!t)return;kE();let A=CD();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{ME(xV,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function yve(t){let e=CD();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function JN(){let t=_E(),e=TN(),A=Object.values(t),r=Object.values(e),i={};for(let I of A)I.company&&(i[I.company]=(i[I.company]||0)+1);let n=Object.entries(i).sort((I,c)=>c[1]-I[1]).slice(0,5).map(([I,c])=>`${I} (${c})`),s={};for(let I of A)for(let c of I.techStack||[])s[c]=(s[c]||0)+1;let o=Object.entries(s).sort((I,c)=>c[1]-I[1]).slice(0,8).map(([I,c])=>`${I} (${c})`),g=CD(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(I=>I.date.startsWith(u)).length,l=new Set(g.visits.map(I=>I.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:l,todayVisited:a,lastScoutDate:A.length>0?A.sort((I,c)=>(c.scoutedAt||"").localeCompare(I.scoutedAt||""))[0]?.scoutedAt:null}}var Qve,dve,xg,NV,LV,xV,GV,UV,SE,bE,FE,vE,Lg,jN=HE(()=>{Qve=hve(import.meta.url),dve=en.dirname(en.dirname(Qve)),xg=process.env.DATA_DIR?en.resolve(process.env.DATA_DIR,"market-research"):en.join(dve,"market-research"),NV=en.join(xg,"scouted-jobs.json"),LV=en.join(xg,"discovered-people.json"),xV=en.join(xg,"visit-log.json"),GV=en.join(xg,"companies.json"),UV=en.join(xg,"job-decisions.json");SE=null;bE=null;FE=null;vE=null;Lg=null});var o9={};JE(o9,{addEncounter:()=>qV,canSendConnection:()=>ZV,commitDataSnapshot:()=>s9,default:()=>Rve,getAllApplications:()=>r9,getPersonStatus:()=>WV,getQuestionStats:()=>n9,getQuotaStatus:()=>zV,getRecentConnections:()=>QD,linkPersonToJob:()=>YV,loadApplicationQuestions:()=>$N,loadConversations:()=>HV,loadJobs:()=>RI,loadPeople:()=>ps,loadQuota:()=>hD,loadSyncState:()=>e9,logApplicationQuestions:()=>i9,migrateFromDailyFiles:()=>$V,recordConnectionSent:()=>XV,resetCaches:()=>Fve,saveConversations:()=>JV,saveJobs:()=>BD,savePeople:()=>Kg,saveQuota:()=>zN,saveSyncState:()=>A9,updateConnectionStatus:()=>VV,upsertJob:()=>jV,upsertPerson:()=>ZN});import"dotenv/config";import*as rt from"fs";import*as bt from"path";import{fileURLToPath as mve}from"url";import{execSync as YN}from"child_process";function Fve(){FI=null,vI=null,ro=null,Ug=null,kI=null,Gg=null}function tn(){rt.existsSync(An)||rt.mkdirSync(An,{recursive:!0})}function Pg(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";rt.writeFileSync(r,A);for(let i=0;i<3;i++)try{rt.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function xE(t,e){if(!rt.existsSync(t))return null;try{let A=JSON.parse(rt.readFileSync(t,"utf-8"));try{rt.copyFileSync(t,t+".backup")}catch{}return A}catch(A){console.error(`[!] ${e} is corrupted: ${A.message}`),console.error(` File: ${bt.resolve(t)}`);let r=t+".backup";if(rt.existsSync(r))try{let i=JSON.parse(rt.readFileSync(r,"utf-8"));console.error(` Restored from ${r}`);try{rt.copyFileSync(r,t)}catch{}return i}catch{console.error(" Backup also corrupted!")}console.error(` Starting with empty data. Old file preserved as ${t}.corrupted`);try{rt.copyFileSync(t,t+".corrupted")}catch{}return null}}function MI(){return new Date().toISOString().split("T")[0]}function ps(){return FI||(tn(),FI=xE(qN,"people.json")||{},FI)}function Kg(t){tn(),FI=t;try{Pg(qN,t)}catch(e){console.error(`[!] Failed to save people.json: ${e.message}`),console.error(` Path: ${bt.resolve(qN)}`)}}function RI(){return vI||(tn(),vI=xE(WN,"jobs.json")||{},vI)}function BD(t){tn(),vI=t;try{Pg(WN,t)}catch(e){console.error(`[!] Failed to save jobs.json: ${e.message}`),console.error(` Path: ${bt.resolve(WN)}`)}}function HV(){return Ug||(tn(),Ug=xE(ED,"conversations.json")||{},vve(Ug),Ug)}function vve(t){let e=0;for(let A of Object.values(t)){if(!(A.draftStatus!==void 0||A.draftPreparedAt!==void 0))continue;let i=(A.messages||[]).find(n=>n.status==="draft");i&&A.draftStatus&&A.draftStatus!=="pending"&&(i.status=A.draftStatus),delete A.draftStatus,delete A.draftPreparedAt,e++}if(e>0){console.log(` [migration] Moved draft state from conv to msg.status for ${e} conversations`);try{Pg(ED,t)}catch{}}}function JV(t){tn(),Ug=t;try{Pg(ED,t)}catch(e){console.error(`[!] Failed to save conversations.json: ${e.message}`),console.error(` Path: ${bt.resolve(ED)}`)}}function ZN(t,e={}){if(!t)return null;let A=ps(),r=MI(),i=new Date().toISOString(),n=A[t];if(n){n.seenCount=(n.seenCount||1)+1,n.lastSeen=r,n.lastUpdated=i,e.source&&!n.sources?.includes(e.source)&&(n.sources=n.sources||[],n.sources.push(e.source));for(let s of XN)e[s]!=null&&(n[s]=e[s])}else A[t]={name:e.name||null,title:e.title||null,location:e.location||null,company:e.company||null,connectionDegree:e.connectionDegree||null,connectionsCount:e.connectionsCount||null,mutualConnections:e.mutualConnections||null,photoUrl:e.photoUrl||null,hasVerifiedBadge:e.hasVerifiedBadge||!1,firstSeen:r,lastSeen:r,seenCount:1,sources:e.source?[e.source]:[],connectionStatus:null,connectionDate:null,connectionMethod:null,messageSent:null,jobIds:[],lastUpdated:i};return Kg(A),A[t]}function jV(t,e={}){if(!t)return null;let A=RI(),r=MI(),i=A[t];if(i){let n=["title","company","companyUrl","location","salary","url","applied","appliedDate","recruiterUrl","description","techStack","jobTags","seniority","employmentType","industries","jobFunction","postedTime","applicantCount","companySize","workplaceType","contractType","isEasyApply","applyType","scoutedAt","lastSeen"];for(let s of n)e[s]!=null&&(i[s]=e[s])}else A[t]={title:e.title||null,company:e.company||null,location:e.location||null,salary:e.salary||null,url:e.url||null,applied:e.applied||!1,appliedDate:e.appliedDate||r,recruiterUrl:e.recruiterUrl||null,firstSeen:r};return BD(A),A[t]}function YV(t,e){if(!t||!e)return;let A=ps(),r=A[t];r&&(r.jobIds||(r.jobIds=[]),r.jobIds.includes(e)||(r.jobIds.push(e),r.lastUpdated=new Date().toISOString(),Kg(A)))}function qV(t,e){if(!t||!e)return;let A=ps(),r=A[t];if(!r)return;r.encounters||(r.encounters=[]);let n={date:MI(),source:e.source||"unknown",action:e.action||"unknown"};e.jobId&&(n.jobId=String(e.jobId)),e.jobTitle&&(n.jobTitle=e.jobTitle),e.jobCompany&&(n.jobCompany=e.jobCompany),!r.encounters.some(o=>o.date===n.date&&o.source===n.source&&o.action===n.action&&(o.jobId||"")===(n.jobId||""))&&(r.encounters.push(n),r.lastUpdated=new Date().toISOString(),Kg(A))}function WV(t){return t&&ps()[t]?.connectionStatus||null}function VV(t,e,A={}){if(!t)return;let r=ps(),i=r[t];if(i||(ZN(t,A.profileInfo||{}),i=r[t]),!!i){if(i.connectionStatus=e,i.connectionDate=MI(),i.connectionMethod=A.method||i.connectionMethod,i.messageSent=A.messageSent||i.messageSent,i.lastUpdated=new Date().toISOString(),A.profileInfo)for(let n of XN)A.profileInfo[n]!=null&&(i[n]=A.profileInfo[n]);Kg(r)}}function hD(){return ro||(tn(),ro=xE(TV,"quota.json"),(!ro||!ro.connections)&&(ro={connections:[]}),ro)}function zN(t){tn(),ro=t;try{Pg(TV,t)}catch(e){console.error(`[!] Failed to save quota.json: ${e.message}`)}}function XV(t,e="unknown"){let A=hD(),r=new Date;A.connections.push({date:r.toISOString().split("T")[0],time:r.toTimeString().split(" ")[0],profileUrl:t,source:e}),zN(A)}function QD(){let t=hD(),e=new Date;e.setDate(e.getDate()-7);let A=e.toISOString().split("T")[0];return t.connections.filter(r=>r.date>=A)}function ZV(){let t=QD(),e=MI(),A=t.filter(g=>g.date===e).length,r=t.length,i=A>=NE,n=r>=LE,s=!i&&!n,o={allowed:s,daily:{sent:A,max:NE},weekly:{sent:r,max:LE}};return s||(o.reason=i?`Daily limit reached (${A}/${NE})`:`Weekly limit reached (${r}/${LE})`),o}function zV(){let t=QD(),e=MI(),A=t.filter(i=>i.date===e).length,r=t.length;return{daily:{sent:A,max:NE,remaining:NE-A},weekly:{sent:r,max:LE,remaining:LE-r}}}function kve(t){if(!t)return null;let e=t.match(/jobs\/view\/(\d+)/);return e?e[1]:null}function $V(){tn();let t=rt.readdirSync(An).filter(n=>n.endsWith(".json")&&n!=="people.json"&&n!=="jobs.json"&&n!=="quota.json");if(t.length===0)return console.log("No daily files found to migrate."),{people:0,jobs:0};console.log(`
207
207
  Migrating from ${t.length} daily files...
208
208
  `);let e=ps(),A=RI(),r=0,i=0;t.sort();for(let n of t){let s=bt.join(An,n),o;try{o=JSON.parse(rt.readFileSync(s,"utf-8"))}catch(a){console.log(` Skipping ${n}: ${a.message}`);continue}let g=o.date||n.match(/\d{4}-\d{2}-\d{2}/)?.[0]||null,u=o.source||n.split("-").slice(0,-1).join("-").replace(/-\d{4}$/,"")||"unknown";if(!o.profiles||!Array.isArray(o.profiles)){console.log(` Skipping ${n}: no profiles array`);continue}console.log(` ${n}: ${o.profiles.length} profiles`);for(let a of o.profiles){let l=a.profileUrl;if(!l)continue;let I=e[l];if(I){I.seenCount=(I.seenCount||1)+1,g&&(!I.lastSeen||g>I.lastSeen)&&(I.lastSeen=g),g&&(!I.firstSeen||g<I.firstSeen)&&(I.firstSeen=g),u&&!I.sources?.includes(u)&&(I.sources=I.sources||[],I.sources.push(u));for(let c of XN)a[c]!=null&&(I[c]=a[c]);a.status&&a.processed&&(I.connectionStatus=a.status,I.connectionDate=g,a.funnelResult&&(I.connectionMethod=a.funnelResult.method||I.connectionMethod,I.messageSent=a.funnelResult.message||I.messageSent)),I.lastUpdated=new Date().toISOString()}else e[l]={name:a.name||null,title:a.title||null,location:a.location||null,company:a.company||null,connectionDegree:a.connectionDegree||null,connectionsCount:a.connectionsCount||null,mutualConnections:a.mutualConnections||null,photoUrl:a.photoUrl||null,hasVerifiedBadge:a.hasVerifiedBadge||!1,firstSeen:g,lastSeen:g,seenCount:1,sources:u?[u]:[],connectionStatus:a.processed&&a.status||null,connectionDate:a.processed?g:null,connectionMethod:a.funnelResult?.method||null,messageSent:a.funnelResult?.message||null,jobIds:[],lastUpdated:new Date().toISOString()},r++;if(a.fromJob?.url){let c=kve(a.fromJob.url);c&&(e[l].jobIds||(e[l].jobIds=[]),e[l].jobIds.includes(c)||e[l].jobIds.push(c),A[c]?A[c].recruiterUrl||(A[c].recruiterUrl=l):(A[c]={title:a.fromJob.title||null,company:a.fromJob.company||null,location:null,salary:null,url:a.fromJob.url,applied:!0,appliedDate:g,recruiterUrl:l,firstSeen:g},i++))}}}return Kg(e),BD(A),console.log(`
209
- Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function e9(){return kI||(tn(),kI=xE(OV,"sync-state.json")||{},kI)}function A9(t){tn(),kI=t;try{Pg(OV,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function $N(){if(Gg)return Gg;tn();try{rt.existsSync(VN)&&(Gg=JSON.parse(rt.readFileSync(VN,"utf-8")))}catch{}return Gg||(Gg={}),Gg}function t9(t){return Array.isArray(t.applications)}function r9(){let t=$N();if(t9(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function i9(t){if(!t||!t.questions||t.questions.length===0)return;let e=$N(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=Mve?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),s})};t9(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{Pg(VN,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function n9(){let t=r9(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function s9(t){if(rt.existsSync(bt.join(An,".git")))try{let e={cwd:An,stdio:"pipe",timeout:1e4};YN("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{YN("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');YN(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var Sve,bve,An,qN,WN,TV,ED,OV,VN,NE,LE,FI,vI,ro,Ug,kI,Gg,XN,Mve,Rve,e1=HE(()=>{Sve=mve(import.meta.url),bve=bt.dirname(bt.dirname(Sve)),An=process.env.DATA_DIR?bt.resolve(process.env.DATA_DIR,"collected-profiles"):bt.join(bve,"collected-profiles"),qN=bt.join(An,"people.json"),WN=bt.join(An,"jobs.json"),TV=bt.join(An,"quota.json"),ED=bt.join(An,"conversations.json"),OV=bt.join(An,"sync-state.json"),VN=bt.join(An,"application-questions.json"),NE=20,LE=100,FI=null,vI=null,ro=null,Ug=null,kI=null,Gg=null;XN=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];Mve=50;Rve={loadPeople:ps,savePeople:Kg,loadJobs:RI,saveJobs:BD,loadConversations:HV,saveConversations:JV,upsertPerson:ZN,upsertJob:jV,linkPersonToJob:YV,addEncounter:qV,getPersonStatus:WV,updateConnectionStatus:VV,migrateFromDailyFiles:$V,loadQuota:hD,saveQuota:zN,recordConnectionSent:XV,canSendConnection:ZV,getRecentConnections:QD,getQuotaStatus:zV,loadSyncState:e9,saveSyncState:A9,commitDataSnapshot:s9,logApplicationQuestions:i9,getQuestionStats:n9}});var yV=a1(W6(),1),mV=a1(pV(),1);import Bve from"puppeteer";async function fs(t){let e=Math.floor(Math.random()*2001),A=t+e;return new Promise(r=>setTimeout(r,A))}import{getPluginConfig as gve}from"@ilivemylife/graph-sdk";var uve=await gve();for(let[t,e]of Object.entries(uve))process.env[t]===void 0&&(process.env[t]=e);var cve=process.env.LINKEDIN_NAME,Ng=Object.freeze({DRAFT:"draft",CONFIRMED:"confirmed",REJECTED:"rejected",NEEDS_REVIEW:"needs_review",SENT:"sent"}),WUe=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.NEEDS_REVIEW])),Ive=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.REJECTED,Ng.NEEDS_REVIEW]));import DV from"fs";import lve from"path";var Cve="cookies.json";function Eve(){let t=process.env.ILML_SCOPE_DIR;return t?lve.join(t,"plugins-state","linkedin","cookies.json"):Cve}function wV(){let t=Eve();if(!DV.existsSync(t))throw new Error(`Cookies not found at ${t}. Run: ilml linkedin login`);let e;try{e=DV.readFileSync(t,"utf-8")}catch(r){throw new Error(`Failed to read cookies at ${t}: ${r.message}. Run: ilml linkedin login`)}let A;try{A=JSON.parse(e)}catch{throw new Error(`Cookies file at ${t} is corrupted (invalid JSON). Run: ilml linkedin login`)}if(!Array.isArray(A)||A.length===0)throw new Error(`Cookies file at ${t} is empty or not an array. Run: ilml linkedin login`);return A}var SV=(0,yV.addExtra)(Bve);SV.use((0,mV.default)());async function bV(){let t=await SV.launch({headless:!1,defaultViewport:null,protocolTimeout:3e5}),e=async()=>{console.log(`
209
+ Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function e9(){return kI||(tn(),kI=xE(OV,"sync-state.json")||{},kI)}function A9(t){tn(),kI=t;try{Pg(OV,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function $N(){if(Gg)return Gg;tn();try{rt.existsSync(VN)&&(Gg=JSON.parse(rt.readFileSync(VN,"utf-8")))}catch{}return Gg||(Gg={}),Gg}function t9(t){return Array.isArray(t.applications)}function r9(){let t=$N();if(t9(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function i9(t){if(!t||!t.questions||t.questions.length===0)return;let e=$N(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=Mve?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),typeof n.isRequired=="boolean"&&(s.isRequired=n.isRequired),n.wasOptional&&(s.wasOptional=!0),s})};t9(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{Pg(VN,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function n9(){let t=r9(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function s9(t){if(rt.existsSync(bt.join(An,".git")))try{let e={cwd:An,stdio:"pipe",timeout:1e4};YN("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{YN("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');YN(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var Sve,bve,An,qN,WN,TV,ED,OV,VN,NE,LE,FI,vI,ro,Ug,kI,Gg,XN,Mve,Rve,e1=HE(()=>{Sve=mve(import.meta.url),bve=bt.dirname(bt.dirname(Sve)),An=process.env.DATA_DIR?bt.resolve(process.env.DATA_DIR,"collected-profiles"):bt.join(bve,"collected-profiles"),qN=bt.join(An,"people.json"),WN=bt.join(An,"jobs.json"),TV=bt.join(An,"quota.json"),ED=bt.join(An,"conversations.json"),OV=bt.join(An,"sync-state.json"),VN=bt.join(An,"application-questions.json"),NE=20,LE=100,FI=null,vI=null,ro=null,Ug=null,kI=null,Gg=null;XN=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];Mve=50;Rve={loadPeople:ps,savePeople:Kg,loadJobs:RI,saveJobs:BD,loadConversations:HV,saveConversations:JV,upsertPerson:ZN,upsertJob:jV,linkPersonToJob:YV,addEncounter:qV,getPersonStatus:WV,updateConnectionStatus:VV,migrateFromDailyFiles:$V,loadQuota:hD,saveQuota:zN,recordConnectionSent:XV,canSendConnection:ZV,getRecentConnections:QD,getQuotaStatus:zV,loadSyncState:e9,saveSyncState:A9,commitDataSnapshot:s9,logApplicationQuestions:i9,getQuestionStats:n9}});var yV=a1(W6(),1),mV=a1(pV(),1);import Bve from"puppeteer";async function fs(t){let e=Math.floor(Math.random()*2001),A=t+e;return new Promise(r=>setTimeout(r,A))}import{getPluginConfig as gve}from"@ilivemylife/graph-sdk";var uve=await gve();for(let[t,e]of Object.entries(uve))process.env[t]===void 0&&(process.env[t]=e);var cve=process.env.LINKEDIN_NAME,Ng=Object.freeze({DRAFT:"draft",CONFIRMED:"confirmed",REJECTED:"rejected",NEEDS_REVIEW:"needs_review",SENT:"sent"}),WUe=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.NEEDS_REVIEW])),Ive=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.REJECTED,Ng.NEEDS_REVIEW]));import DV from"fs";import lve from"path";var Cve="cookies.json";function Eve(){let t=process.env.ILML_SCOPE_DIR;return t?lve.join(t,"plugins-state","linkedin","cookies.json"):Cve}function wV(){let t=Eve();if(!DV.existsSync(t))throw new Error(`Cookies not found at ${t}. Run: ilml linkedin login`);let e;try{e=DV.readFileSync(t,"utf-8")}catch(r){throw new Error(`Failed to read cookies at ${t}: ${r.message}. Run: ilml linkedin login`)}let A;try{A=JSON.parse(e)}catch{throw new Error(`Cookies file at ${t} is corrupted (invalid JSON). Run: ilml linkedin login`)}if(!Array.isArray(A)||A.length===0)throw new Error(`Cookies file at ${t} is empty or not an array. Run: ilml linkedin login`);return A}var SV=(0,yV.addExtra)(Bve);SV.use((0,mV.default)());async function bV(){let t=await SV.launch({headless:!1,defaultViewport:null,protocolTimeout:3e5}),e=async()=>{console.log(`
210
210
  Closing browser...`);try{await t.close()}catch{}process.exit(0)};process.on("SIGINT",e),process.on("SIGTERM",e);let A=await t.newPage();await A.evaluateOnNewDocument(()=>{Object.defineProperty(navigator,"webdriver",{get:()=>{}})});try{let r=wV();await A.setCookie(...r),console.log(" Browser launched, cookies loaded.")}catch(r){console.error(`
211
211
  [!] ${r.message}
212
212
  `),await t.close(),process.exit(1)}return{browser:t,page:A}}async function FV(t){let e=[".jobs-search-results-list",".scaffold-layout__list-container",".jobs-search-two-pane__results","div.jobs-search-results-list"];return await t.evaluate(async r=>{let i=null,n=null;for(let l of r)if(i=document.querySelector(l),i){n=l;break}if(!i){let l=document.querySelector("li.scaffold-layout__list-item");if(l){let I=l.parentElement;for(;I&&I!==document.body;){if(I.scrollHeight>I.clientHeight){i=I,n="parent of li.scaffold-layout__list-item";break}I=I.parentElement}}}if(!i)return{found:!1,triedSelectors:r};let s=i.scrollTop,o=300,g=300,u=50,a=0;for(;a<u&&(i.scrollBy(0,o),await new Promise(l=>setTimeout(l,g)),!(i.scrollTop+i.clientHeight>=i.scrollHeight));)a++;return{found:!0,usedSelector:n,initialScroll:s,finalScroll:i.scrollTop,scrollHeight:i.scrollHeight,attempts:a}},e)}async function vV(t,{easyApplyOnly:e=!0}={}){let A=await t.evaluate(()=>{let r=document.querySelectorAll("li.scaffold-layout__list-item");return Array.from(r).map(i=>{let s=(i.querySelector(".job-card-list__footer-wrapper")?.innerText??"").includes("Easy Apply"),o=i.querySelector("a.job-card-container__link");if(o){let g=o.getAttribute("href").split("?")[0],u=i.querySelector(".job-card-list__title--link")?.getAttribute("aria-label")?.replace(/ with verification$/,""),a=i.querySelector(".artdeco-entity-lockup__subtitle")?.innerText.trim(),l=i.querySelector(".artdeco-entity-lockup__caption")?.innerText.trim(),I=i.querySelector(".artdeco-entity-lockup__metadata")?.innerText.trim();return{id:g,isEasyApply:s,applyType:s?"easy-apply":"external",dataId:o.getAttribute("data-control-id"),href:`https://linkedin.com${g}`,jobTitle:u,companyName:a,location:l,salary:I||null,jobLink:s?o.href:null}}return{isEasyApply:!1}})});return e?A.filter(r=>r.isEasyApply&&r.href):A.filter(r=>r.href)}async function kV(t){let e=await t.evaluate(()=>{let A=document.querySelector('button[aria-label="View next page"]')||document.querySelector(".jobs-search-pagination__button--next");if(A&&!A.disabled){let r=document.querySelector(".jobs-search-pagination__page-state")?.textContent?.trim();return A.click(),{success:!0,pageState:r}}return{success:!1,reason:"No next page button found"}});return console.log(" Pagination:",e.success?e.pageState:e.reason),e.success&&await fs(2e3),e.success}async function MV(t,e){let A=t.url();if(A.includes("/jobs/"))return!1;if(A.includes("/login")||A.includes("/authwall")||A.includes("/checkpoint"))throw new Error("Session expired \u2014 redirected to login. Run: npm run login");console.log(` Off-track: ${A.slice(0,80)}`),console.log(" Navigating back to job search..."),await t.goto(e,{waitUntil:"domcontentloaded",timeout:6e4}),await fs(3e3);let i=t.url();if(!i.includes("/jobs/"))throw new Error(`Could not return to job search. Current URL: ${i.slice(0,80)}`);return console.log(" Recovered to job search page"),!0}async function RV(t){return t.evaluate(()=>{let e=document.querySelector(".scaffold-layout__detail")||document.querySelector(".jobs-search__job-details")||document.querySelector(".jobs-details")||document.body,A=e.querySelector(".hirer-card__hirer-information");if(A){let s=A.querySelector('a[href*="/in/"]'),o=A.querySelector(".jobs-poster__name")||A.querySelector("strong")||A.querySelector('[class*="name"]');if(s)return{name:o?.textContent?.trim()||s.textContent?.trim(),profileUrl:s.href?.split("?")[0],source:"hiring_team"}}let r=e.querySelector(".jobs-poster__name");if(r){let s=r.closest('a[href*="/in/"]')||r.parentElement?.querySelector('a[href*="/in/"]')||r.parentElement?.parentElement?.querySelector('a[href*="/in/"]');if(s)return{name:r.textContent?.trim(),profileUrl:s.href?.split("?")[0],source:"poster_name"}}let i=e.querySelector(".job-details-people-who-can-help__section--two-pane")||e.querySelector('[class*="people-who-can-help"]');if(i){let s=i.querySelector('a[href*="/in/"]');if(s)return{name:(i.querySelector(".jobs-poster__name")||i.querySelector("strong"))?.textContent?.trim()||s.textContent?.trim(),profileUrl:s.href?.split("?")[0],source:"people_section"}}let n=e.querySelectorAll('a[href*="/in/"]');for(let s of n){let o=s.textContent?.trim();if(o&&o.length>3&&!["View","Connect","Follow","Message","Apply","Save"].includes(o))return{name:o,profileUrl:s.href?.split("?")[0],source:"details_link"}}return null})}async function _V(t){return t.evaluate(()=>{let e=document.querySelector(".scaffold-layout__detail")||document.querySelector(".jobs-search__job-details")||document.querySelector(".jobs-details")||document.body,r=(e.querySelector(".jobs-description__content")||e.querySelector(".jobs-box__html-content")||e.querySelector(".jobs-description"))?.innerText?.trim()||"",i={},n=e.querySelectorAll(".jobs-unified-top-card__job-insight, li.job-criteria__item");for(let Qe of n){let te=Qe.querySelector(".job-criteria__subheader")?.textContent?.trim(),De=Qe.querySelector(".job-criteria__text")?.textContent?.trim();te&&De&&(i[te.toLowerCase()]=De)}let s=["Java","Python","JavaScript","TypeScript","React","Angular","Vue","Node.js","C#",".NET","C\\+\\+","Go","Rust","Scala","Kotlin","AWS","Azure","GCP","Docker","Kubernetes","Terraform","SQL","PostgreSQL","MongoDB","Redis","Kafka","RabbitMQ","Spring","Django","Flask","Express","Next.js","CI/CD","Jenkins","GitHub Actions","GraphQL","REST","Microservices","Machine Learning","AI","Data Engineering","Spark","Hadoop","Snowflake","Databricks","Airflow","iOS","Android","React Native","Flutter","Agile","Scrum","DevOps","SRE"],o=[];for(let Qe of s)new RegExp("\\b"+Qe.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"\\b","i").test(r)&&o.push(Qe.replace(/\\\+/g,"+"));let u=e.querySelector('.jobs-company__box, [class*="jobs-company"], [class*="company-card"]')?.innerText?.trim()?.slice(0,1e3)||null,l=e.querySelector('a.jobs-apply-button[href], a[data-tracking-control-name="public_jobs_apply-link-offsite_sign-up"]')?.getAttribute("href")||null,I=e.querySelector(".job-details-jobs-unified-top-card__company-name, .jobs-unified-top-card__company-name"),c=I?.innerText?.trim()||null,B=(I?.querySelector('a[href*="/company/"]')||e.querySelector('a[href*="/company/"]'))?.getAttribute("href")?.split("?")[0]||null,h=e.querySelector(".job-details-jobs-unified-top-card__primary-description-container")?.innerText?.trim()||"",f=h.match(/(\d+\s+(?:hour|day|week|month)s?\s+ago|Reposted|Just now)/i)?.[0]||null,p=h.match(/(\d[\d,]*)\s+applicant/i),y=p?parseInt(p[1].replace(/,/g,"")):null,S=e.querySelectorAll(".job-details-jobs-unified-top-card__job-insight"),m=Array.from(S).map(Qe=>Qe.innerText?.trim()?.replace(/\s+/g," ")),b=m.join(" ").match(/([\d,]+-[\d,]+\s+employees|[\d,]+\+?\s+employees)/i)?.[0]||null,G=m.join(" ")+" "+h,T=/\bremote\b/i.test(G)?"remote":/\bhybrid\b/i.test(G)?"hybrid":/\bon-?site\b/i.test(G)?"onsite":null,x=/\bcontract\b/i.test(G)?"contract":/\bfull-?time\b/i.test(G)?"full-time":/\bpart-?time\b/i.test(G)?"part-time":/\bfreelance\b/i.test(G)?"freelance":/\btemporary\b/i.test(G)?"temporary":null,V=e.querySelector(".job-details-jobs-unified-top-card__job-title, .jobs-unified-top-card__job-title, h2.t-24")?.innerText?.trim()||"",ie=e.querySelector(".job-details-jobs-unified-top-card__primary-description-container, .jobs-unified-top-card__subtitle-primary-grouping")?.innerText?.trim()||"",Ae=(V+" "+r+" "+ie).toLowerCase(),we=V.toLowerCase(),W=[];/\bremote\b/.test(Ae)&&W.push("remote"),/\bhybrid\b/.test(Ae)&&W.push("hybrid"),/\bon-?site\b|\bin-?office\b/.test(Ae)&&W.push("onsite"),(W.length===0||!W.includes("remote")&&!W.includes("hybrid")&&!W.includes("onsite"))&&/remote/i.test(ie)&&W.push("remote"),/\b(manager|director|vp|vice president|head of|chief|cto|cio|lead.*team|managing)\b/i.test(we)&&W.push("managerial"),/\b(architect|principal|staff|distinguished)\b/i.test(we)&&W.push("senior-ic"),/\b(developer|engineer|programmer|analyst)\b/i.test(we)&&!W.includes("managerial")&&W.push("ic"),/\b(junior|jr\.?|entry)\b/i.test(we)?W.push("junior"):/\b(senior|sr\.?)\b/i.test(we)?W.push("senior"):/\b(staff|principal|distinguished)\b/i.test(we)?W.push("staff+"):/\b(director|vp|chief|cto|cio)\b/i.test(we)?W.push("executive"):/\b(lead|team lead)\b/i.test(we)&&W.push("lead"),/\b(backend|back-end|server-side|api)\b/i.test(Ae)&&W.push("backend"),/\b(frontend|front-end|ui|ux)\b/i.test(Ae)&&W.push("frontend"),/\b(full.?stack|fullstack)\b/i.test(Ae)&&W.push("fullstack"),/\b(devops|sre|infrastructure|platform)\b/i.test(Ae)&&W.push("devops"),/\b(data engineer|data science|machine learning|ml engineer)\b/i.test(Ae)&&W.push("data"),/\b(mobile|ios|android|react native|flutter)\b/i.test(Ae)&&W.push("mobile"),/\b(architect)\b/i.test(we)&&W.push("architect"),/\b(consultant|consulting)\b/i.test(we)&&W.push("consultant");let oe=(i["employment type"]||"").toLowerCase();return(/contract|freelance|temporary/i.test(oe)||/\bcontract\b/i.test(Ae))&&W.push("contract"),/full.?time|permanent/i.test(oe)&&W.push("permanent"),/\bcanada\b|toronto|vancouver|montreal|ontario|british columbia|quebec|alberta|calgary|ottawa/i.test(ie)&&W.push("canada"),/\bunited states\b|\busa\b|new york|california|texas|seattle|san francisco/i.test(ie)&&W.push("usa"),(e.querySelector(".jobs-unified-top-card__job-insight--highlight, .compensation__salary")?.innerText?.trim()||""||/\$[\d,]+/.test(r))&&W.push("has-salary"),{description:r.substring(0,5e3),externalApplyUrl:l,companyName:c,companyUrl:B?B.startsWith("/")?"https://www.linkedin.com"+B:B:null,aboutCompany:u,seniority:i["seniority level"]||null,employmentType:i["employment type"]||null,industries:i.industries||null,jobFunction:i["job function"]||null,postedTime:f,applicantCount:y,companySize:b,workplaceType:T,contractType:x,techStack:[...new Set(o)],jobTags:[...new Set(W)]}})}jN();e1();import"dotenv/config";import*as vn from"fs";import*as Da from"path";import{fileURLToPath as Uve}from"url";import"dotenv/config";import{createGraphClient as _ve,resolveToken as Nve}from"@ilivemylife/graph-sdk";import{config as Lve}from"dotenv";Lve();var a9=Nve()||process.env.TOKEN;a9||(console.error(`
package/dist/syncAll.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  var fX=Object.create;var nB=Object.defineProperty;var pX=Object.getOwnPropertyDescriptor;var DX=Object.getOwnPropertyNames;var wX=Object.getPrototypeOf,yX=Object.prototype.hasOwnProperty;var Y=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,A)=>(typeof require<"u"?require:e)[A]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var sB=(t,e)=>()=>(t&&(e=t(t=0)),e);var w=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),oB=(t,e)=>{for(var A in e)nB(t,A,{get:e[A],enumerable:!0})},U1=(t,e,A,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of DX(e))!yX.call(t,i)&&i!==A&&nB(t,i,{get:()=>e[i],enumerable:!(r=pX(e,i))||r.enumerable});return t};var G1=(t,e,A)=>(A=t!=null?fX(wX(t)):{},U1(e||!t||!t.__esModule?nB(A,"default",{value:t,enumerable:!0}):A,t)),nt=t=>U1(nB({},"__esModule",{value:!0}),t);var AL={};oB(AL,{addEncounter:()=>j1,canSendConnection:()=>X1,commitDataSnapshot:()=>eI,default:()=>_X,getAllApplications:()=>$1,getPersonStatus:()=>q1,getQuestionStats:()=>EB,getQuotaStatus:()=>IB,getRecentConnections:()=>lB,linkPersonToJob:()=>Y1,loadApplicationQuestions:()=>ww,loadConversations:()=>xa,loadJobs:()=>gB,loadPeople:()=>Ar,loadQuota:()=>cB,loadSyncState:()=>$l,logApplicationQuestions:()=>eL,migrateFromDailyFiles:()=>Z1,recordConnectionSent:()=>V1,resetCaches:()=>vX,saveConversations:()=>vs,saveJobs:()=>uB,savePeople:()=>Un,saveQuota:()=>Dw,saveSyncState:()=>CB,updateConnectionStatus:()=>W1,upsertJob:()=>J1,upsertPerson:()=>zl});import"dotenv/config";import*as tt from"fs";import*as yt from"path";import{fileURLToPath as SX}from"url";import{execSync as hw}from"child_process";function vX(){Au=null,tu=null,Fs=null,Na=null,ru=null,_a=null}function wi(){tt.existsSync(Di)||tt.mkdirSync(Di,{recursive:!0})}function La(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";tt.writeFileSync(r,A);for(let i=0;i<3;i++)try{tt.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function Zl(t,e){if(!tt.existsSync(t))return null;try{let A=JSON.parse(tt.readFileSync(t,"utf-8"));try{tt.copyFileSync(t,t+".backup")}catch{}return A}catch(A){console.error(`[!] ${e} is corrupted: ${A.message}`),console.error(` File: ${yt.resolve(t)}`);let r=t+".backup";if(tt.existsSync(r))try{let i=JSON.parse(tt.readFileSync(r,"utf-8"));console.error(` Restored from ${r}`);try{tt.copyFileSync(r,t)}catch{}return i}catch{console.error(" Backup also corrupted!")}console.error(` Starting with empty data. Old file preserved as ${t}.corrupted`);try{tt.copyFileSync(t,t+".corrupted")}catch{}return null}}function iu(){return new Date().toISOString().split("T")[0]}function Ar(){return Au||(wi(),Au=Zl(Qw,"people.json")||{},Au)}function Un(t){wi(),Au=t;try{La(Qw,t)}catch(e){console.error(`[!] Failed to save people.json: ${e.message}`),console.error(` Path: ${yt.resolve(Qw)}`)}}function gB(){return tu||(wi(),tu=Zl(dw,"jobs.json")||{},tu)}function uB(t){wi(),tu=t;try{La(dw,t)}catch(e){console.error(`[!] Failed to save jobs.json: ${e.message}`),console.error(` Path: ${yt.resolve(dw)}`)}}function xa(){return Na||(wi(),Na=Zl(aB,"conversations.json")||{},kX(Na),Na)}function kX(t){let e=0;for(let A of Object.values(t)){if(!(A.draftStatus!==void 0||A.draftPreparedAt!==void 0))continue;let i=(A.messages||[]).find(n=>n.status==="draft");i&&A.draftStatus&&A.draftStatus!=="pending"&&(i.status=A.draftStatus),delete A.draftStatus,delete A.draftPreparedAt,e++}if(e>0){console.log(` [migration] Moved draft state from conv to msg.status for ${e} conversations`);try{La(aB,t)}catch{}}}function vs(t){wi(),Na=t;try{La(aB,t)}catch(e){console.error(`[!] Failed to save conversations.json: ${e.message}`),console.error(` Path: ${yt.resolve(aB)}`)}}function zl(t,e={}){if(!t)return null;let A=Ar(),r=iu(),i=new Date().toISOString(),n=A[t];if(n){n.seenCount=(n.seenCount||1)+1,n.lastSeen=r,n.lastUpdated=i,e.source&&!n.sources?.includes(e.source)&&(n.sources=n.sources||[],n.sources.push(e.source));for(let s of pw)e[s]!=null&&(n[s]=e[s])}else A[t]={name:e.name||null,title:e.title||null,location:e.location||null,company:e.company||null,connectionDegree:e.connectionDegree||null,connectionsCount:e.connectionsCount||null,mutualConnections:e.mutualConnections||null,photoUrl:e.photoUrl||null,hasVerifiedBadge:e.hasVerifiedBadge||!1,firstSeen:r,lastSeen:r,seenCount:1,sources:e.source?[e.source]:[],connectionStatus:null,connectionDate:null,connectionMethod:null,messageSent:null,jobIds:[],lastUpdated:i};return Un(A),A[t]}function J1(t,e={}){if(!t)return null;let A=gB(),r=iu(),i=A[t];if(i){let n=["title","company","companyUrl","location","salary","url","applied","appliedDate","recruiterUrl","description","techStack","jobTags","seniority","employmentType","industries","jobFunction","postedTime","applicantCount","companySize","workplaceType","contractType","isEasyApply","applyType","scoutedAt","lastSeen"];for(let s of n)e[s]!=null&&(i[s]=e[s])}else A[t]={title:e.title||null,company:e.company||null,location:e.location||null,salary:e.salary||null,url:e.url||null,applied:e.applied||!1,appliedDate:e.appliedDate||r,recruiterUrl:e.recruiterUrl||null,firstSeen:r};return uB(A),A[t]}function Y1(t,e){if(!t||!e)return;let A=Ar(),r=A[t];r&&(r.jobIds||(r.jobIds=[]),r.jobIds.includes(e)||(r.jobIds.push(e),r.lastUpdated=new Date().toISOString(),Un(A)))}function j1(t,e){if(!t||!e)return;let A=Ar(),r=A[t];if(!r)return;r.encounters||(r.encounters=[]);let n={date:iu(),source:e.source||"unknown",action:e.action||"unknown"};e.jobId&&(n.jobId=String(e.jobId)),e.jobTitle&&(n.jobTitle=e.jobTitle),e.jobCompany&&(n.jobCompany=e.jobCompany),!r.encounters.some(o=>o.date===n.date&&o.source===n.source&&o.action===n.action&&(o.jobId||"")===(n.jobId||""))&&(r.encounters.push(n),r.lastUpdated=new Date().toISOString(),Un(A))}function q1(t){return t&&Ar()[t]?.connectionStatus||null}function W1(t,e,A={}){if(!t)return;let r=Ar(),i=r[t];if(i||(zl(t,A.profileInfo||{}),i=r[t]),!!i){if(i.connectionStatus=e,i.connectionDate=iu(),i.connectionMethod=A.method||i.connectionMethod,i.messageSent=A.messageSent||i.messageSent,i.lastUpdated=new Date().toISOString(),A.profileInfo)for(let n of pw)A.profileInfo[n]!=null&&(i[n]=A.profileInfo[n]);Un(r)}}function cB(){return Fs||(wi(),Fs=Zl(O1,"quota.json"),(!Fs||!Fs.connections)&&(Fs={connections:[]}),Fs)}function Dw(t){wi(),Fs=t;try{La(O1,t)}catch(e){console.error(`[!] Failed to save quota.json: ${e.message}`)}}function V1(t,e="unknown"){let A=cB(),r=new Date;A.connections.push({date:r.toISOString().split("T")[0],time:r.toTimeString().split(" ")[0],profileUrl:t,source:e}),Dw(A)}function lB(){let t=cB(),e=new Date;e.setDate(e.getDate()-7);let A=e.toISOString().split("T")[0];return t.connections.filter(r=>r.date>=A)}function X1(){let t=lB(),e=iu(),A=t.filter(g=>g.date===e).length,r=t.length,i=A>=Vl,n=r>=Xl,s=!i&&!n,o={allowed:s,daily:{sent:A,max:Vl},weekly:{sent:r,max:Xl}};return s||(o.reason=i?`Daily limit reached (${A}/${Vl})`:`Weekly limit reached (${r}/${Xl})`),o}function IB(){let t=lB(),e=iu(),A=t.filter(i=>i.date===e).length,r=t.length;return{daily:{sent:A,max:Vl,remaining:Vl-A},weekly:{sent:r,max:Xl,remaining:Xl-r}}}function MX(t){if(!t)return null;let e=t.match(/jobs\/view\/(\d+)/);return e?e[1]:null}function Z1(){wi();let t=tt.readdirSync(Di).filter(n=>n.endsWith(".json")&&n!=="people.json"&&n!=="jobs.json"&&n!=="quota.json");if(t.length===0)return console.log("No daily files found to migrate."),{people:0,jobs:0};console.log(`
2
2
  Migrating from ${t.length} daily files...
3
3
  `);let e=Ar(),A=gB(),r=0,i=0;t.sort();for(let n of t){let s=yt.join(Di,n),o;try{o=JSON.parse(tt.readFileSync(s,"utf-8"))}catch(a){console.log(` Skipping ${n}: ${a.message}`);continue}let g=o.date||n.match(/\d{4}-\d{2}-\d{2}/)?.[0]||null,u=o.source||n.split("-").slice(0,-1).join("-").replace(/-\d{4}$/,"")||"unknown";if(!o.profiles||!Array.isArray(o.profiles)){console.log(` Skipping ${n}: no profiles array`);continue}console.log(` ${n}: ${o.profiles.length} profiles`);for(let a of o.profiles){let I=a.profileUrl;if(!I)continue;let c=e[I];if(c){c.seenCount=(c.seenCount||1)+1,g&&(!c.lastSeen||g>c.lastSeen)&&(c.lastSeen=g),g&&(!c.firstSeen||g<c.firstSeen)&&(c.firstSeen=g),u&&!c.sources?.includes(u)&&(c.sources=c.sources||[],c.sources.push(u));for(let l of pw)a[l]!=null&&(c[l]=a[l]);a.status&&a.processed&&(c.connectionStatus=a.status,c.connectionDate=g,a.funnelResult&&(c.connectionMethod=a.funnelResult.method||c.connectionMethod,c.messageSent=a.funnelResult.message||c.messageSent)),c.lastUpdated=new Date().toISOString()}else e[I]={name:a.name||null,title:a.title||null,location:a.location||null,company:a.company||null,connectionDegree:a.connectionDegree||null,connectionsCount:a.connectionsCount||null,mutualConnections:a.mutualConnections||null,photoUrl:a.photoUrl||null,hasVerifiedBadge:a.hasVerifiedBadge||!1,firstSeen:g,lastSeen:g,seenCount:1,sources:u?[u]:[],connectionStatus:a.processed&&a.status||null,connectionDate:a.processed?g:null,connectionMethod:a.funnelResult?.method||null,messageSent:a.funnelResult?.message||null,jobIds:[],lastUpdated:new Date().toISOString()},r++;if(a.fromJob?.url){let l=MX(a.fromJob.url);l&&(e[I].jobIds||(e[I].jobIds=[]),e[I].jobIds.includes(l)||e[I].jobIds.push(l),A[l]?A[l].recruiterUrl||(A[l].recruiterUrl=I):(A[l]={title:a.fromJob.title||null,company:a.fromJob.company||null,location:null,salary:null,url:a.fromJob.url,applied:!0,appliedDate:g,recruiterUrl:I,firstSeen:g},i++))}}}return Un(e),uB(A),console.log(`
4
- Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function $l(){return ru||(wi(),ru=Zl(H1,"sync-state.json")||{},ru)}function CB(t){wi(),ru=t;try{La(H1,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function ww(){if(_a)return _a;wi();try{tt.existsSync(fw)&&(_a=JSON.parse(tt.readFileSync(fw,"utf-8")))}catch{}return _a||(_a={}),_a}function z1(t){return Array.isArray(t.applications)}function $1(){let t=ww();if(z1(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function eL(t){if(!t||!t.questions||t.questions.length===0)return;let e=ww(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=RX?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),s})};z1(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{La(fw,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function EB(){let t=$1(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function eI(t){if(tt.existsSync(yt.join(Di,".git")))try{let e={cwd:Di,stdio:"pipe",timeout:1e4};hw("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{hw("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');hw(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var bX,FX,Di,Qw,dw,O1,aB,H1,fw,Vl,Xl,Au,tu,Fs,Na,ru,_a,pw,RX,_X,BB=sB(()=>{bX=SX(import.meta.url),FX=yt.dirname(yt.dirname(bX)),Di=process.env.DATA_DIR?yt.resolve(process.env.DATA_DIR,"collected-profiles"):yt.join(FX,"collected-profiles"),Qw=yt.join(Di,"people.json"),dw=yt.join(Di,"jobs.json"),O1=yt.join(Di,"quota.json"),aB=yt.join(Di,"conversations.json"),H1=yt.join(Di,"sync-state.json"),fw=yt.join(Di,"application-questions.json"),Vl=20,Xl=100,Au=null,tu=null,Fs=null,Na=null,ru=null,_a=null;pw=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];RX=50;_X={loadPeople:Ar,savePeople:Un,loadJobs:gB,saveJobs:uB,loadConversations:xa,saveConversations:vs,upsertPerson:zl,upsertJob:J1,linkPersonToJob:Y1,addEncounter:j1,getPersonStatus:q1,updateConnectionStatus:W1,migrateFromDailyFiles:Z1,loadQuota:cB,saveQuota:Dw,recordConnectionSent:V1,canSendConnection:X1,getRecentConnections:lB,getQuotaStatus:IB,loadSyncState:$l,saveSyncState:CB,commitDataSnapshot:eI,logApplicationQuestions:eL,getQuestionStats:EB}});var aL={};oB(aL,{getJobDecision:()=>TX,getLastVisit:()=>JX,getScoutStats:()=>mw,loadCompanies:()=>oL,loadDiscoveredPeople:()=>yw,loadJobDecisions:()=>gI,loadScoutedJobs:()=>aI,loadVisitLog:()=>hB,recordVisit:()=>HX,resetCaches:()=>UX,saveCompany:()=>OX,saveDiscoveredPerson:()=>KX,saveScoutedJob:()=>GX,setJobDecision:()=>PX});import"dotenv/config";import*as ln from"fs";import*as yi from"path";import{fileURLToPath as NX}from"url";function nI(){ln.existsSync(Ga)||ln.mkdirSync(Ga,{recursive:!0})}function sI(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";ln.writeFileSync(r,A);for(let i=0;i<3;i++)try{ln.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function oI(t){try{if(ln.existsSync(t))return JSON.parse(ln.readFileSync(t,"utf-8"))}catch{}return null}function UX(){AI=null,tI=null,rI=null,iI=null,Ua=null}function aI(){return AI||(AI=oI(tL)||{},AI)}function GX(t,e){if(!t)return;nI();let A=aI(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{sI(tL,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function gI(){return tI||(tI=oI(sL)||{},tI)}function PX(t,e,A={}){if(!t||!e)return;nI();let r=gI(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{sI(sL,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function TX(t){return gI()[t]||null}function yw(){return rI||(rI=oI(rL)||{},rI)}function KX(t,e){if(!t)return;nI();let A=yw(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{sI(rL,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function oL(){return iI||(iI=oI(nL)||{},iI)}function OX(t,e){if(!t)return;nI();let A=oL(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{sI(nL,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function hB(){return Ua||(Ua=oI(iL)||{visits:[]},Array.isArray(Ua.visits)||(Ua.visits=[]),Ua)}function HX(t,e={}){if(!t)return;nI();let A=hB();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{sI(iL,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function JX(t){let e=hB();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function mw(){let t=aI(),e=yw(),A=Object.values(t),r=Object.values(e),i={};for(let c of A)c.company&&(i[c.company]=(i[c.company]||0)+1);let n=Object.entries(i).sort((c,l)=>l[1]-c[1]).slice(0,5).map(([c,l])=>`${c} (${l})`),s={};for(let c of A)for(let l of c.techStack||[])s[l]=(s[l]||0)+1;let o=Object.entries(s).sort((c,l)=>l[1]-c[1]).slice(0,8).map(([c,l])=>`${c} (${l})`),g=hB(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(c=>c.date.startsWith(u)).length,I=new Set(g.visits.map(c=>c.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:I,todayVisited:a,lastScoutDate:A.length>0?A.sort((c,l)=>(l.scoutedAt||"").localeCompare(c.scoutedAt||""))[0]?.scoutedAt:null}}var LX,xX,Ga,tL,rL,iL,nL,sL,AI,tI,rI,iI,Ua,QB=sB(()=>{LX=NX(import.meta.url),xX=yi.dirname(yi.dirname(LX)),Ga=process.env.DATA_DIR?yi.resolve(process.env.DATA_DIR,"market-research"):yi.join(xX,"market-research"),tL=yi.join(Ga,"scouted-jobs.json"),rL=yi.join(Ga,"discovered-people.json"),iL=yi.join(Ga,"visit-log.json"),nL=yi.join(Ga,"companies.json"),sL=yi.join(Ga,"job-decisions.json");AI=null;tI=null;rI=null;iI=null;Ua=null});var lL=w((_Me,cL)=>{var su=1e3,ou=su*60,au=ou*60,Pa=au*24,eZ=Pa*7,AZ=Pa*365.25;cL.exports=function(t,e){e=e||{};var A=typeof t;if(A==="string"&&t.length>0)return tZ(t);if(A==="number"&&isFinite(t))return e.long?iZ(t):rZ(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function tZ(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var A=parseFloat(e[1]),r=(e[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return A*AZ;case"weeks":case"week":case"w":return A*eZ;case"days":case"day":case"d":return A*Pa;case"hours":case"hour":case"hrs":case"hr":case"h":return A*au;case"minutes":case"minute":case"mins":case"min":case"m":return A*ou;case"seconds":case"second":case"secs":case"sec":case"s":return A*su;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return A;default:return}}}}function rZ(t){var e=Math.abs(t);return e>=Pa?Math.round(t/Pa)+"d":e>=au?Math.round(t/au)+"h":e>=ou?Math.round(t/ou)+"m":e>=su?Math.round(t/su)+"s":t+"ms"}function iZ(t){var e=Math.abs(t);return e>=Pa?dB(t,e,Pa,"day"):e>=au?dB(t,e,au,"hour"):e>=ou?dB(t,e,ou,"minute"):e>=su?dB(t,e,su,"second"):t+" ms"}function dB(t,e,A,r){var i=e>=A*1.5;return Math.round(t/A)+" "+r+(i?"s":"")}});var Sw=w((NMe,IL)=>{function nZ(t){A.debug=A,A.default=A,A.coerce=g,A.disable=n,A.enable=i,A.enabled=s,A.humanize=lL(),A.destroy=u,Object.keys(t).forEach(a=>{A[a]=t[a]}),A.names=[],A.skips=[],A.formatters={};function e(a){let I=0;for(let c=0;c<a.length;c++)I=(I<<5)-I+a.charCodeAt(c),I|=0;return A.colors[Math.abs(I)%A.colors.length]}A.selectColor=e;function A(a){let I,c=null,l,C;function B(...E){if(!B.enabled)return;let h=B,Q=Number(new Date),d=Q-(I||Q);h.diff=d,h.prev=I,h.curr=Q,I=Q,E[0]=A.coerce(E[0]),typeof E[0]!="string"&&E.unshift("%O");let f=0;E[0]=E[0].replace(/%([a-zA-Z%])/g,(b,m)=>{if(b==="%%")return"%";f++;let D=A.formatters[m];if(typeof D=="function"){let S=E[f];b=D.call(h,S),E.splice(f,1),f--}return b}),A.formatArgs.call(h,E),(h.log||A.log).apply(h,E)}return B.namespace=a,B.useColors=A.useColors(),B.color=A.selectColor(a),B.extend=r,B.destroy=A.destroy,Object.defineProperty(B,"enabled",{enumerable:!0,configurable:!1,get:()=>c!==null?c:(l!==A.namespaces&&(l=A.namespaces,C=A.enabled(a)),C),set:E=>{c=E}}),typeof A.init=="function"&&A.init(B),B}function r(a,I){let c=A(this.namespace+(typeof I>"u"?":":I)+a);return c.log=this.log,c}function i(a){A.save(a),A.namespaces=a,A.names=[],A.skips=[];let I,c=(typeof a=="string"?a:"").split(/[\s,]+/),l=c.length;for(I=0;I<l;I++)c[I]&&(a=c[I].replace(/\*/g,".*?"),a[0]==="-"?A.skips.push(new RegExp("^"+a.slice(1)+"$")):A.names.push(new RegExp("^"+a+"$")))}function n(){let a=[...A.names.map(o),...A.skips.map(o).map(I=>"-"+I)].join(",");return A.enable(""),a}function s(a){if(a[a.length-1]==="*")return!0;let I,c;for(I=0,c=A.skips.length;I<c;I++)if(A.skips[I].test(a))return!1;for(I=0,c=A.names.length;I<c;I++)if(A.names[I].test(a))return!0;return!1}function o(a){return a.toString().substring(2,a.toString().length-2).replace(/\.\*\?$/,"*")}function g(a){return a instanceof Error?a.stack||a.message:a}function u(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return A.enable(A.load()),A}IL.exports=nZ});var CL=w((ii,fB)=>{ii.formatArgs=oZ;ii.save=aZ;ii.load=gZ;ii.useColors=sZ;ii.storage=uZ();ii.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();ii.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function sZ(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function oZ(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+fB.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let A=0,r=0;t[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(A++,i==="%c"&&(r=A))}),t.splice(r,0,e)}ii.log=console.debug||console.log||(()=>{});function aZ(t){try{t?ii.storage.setItem("debug",t):ii.storage.removeItem("debug")}catch{}}function gZ(){let t;try{t=ii.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}function uZ(){try{return localStorage}catch{}}fB.exports=Sw()(ii);var{formatters:cZ}=fB.exports;cZ.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var BL=w((LMe,EL)=>{"use strict";EL.exports=(t,e)=>{e=e||process.argv;let A=t.startsWith("-")?"":t.length===1?"-":"--",r=e.indexOf(A+t),i=e.indexOf("--");return r!==-1&&(i===-1?!0:r<i)}});var QL=w((xMe,hL)=>{"use strict";var lZ=Y("os"),In=BL(),rr=process.env,gu;In("no-color")||In("no-colors")||In("color=false")?gu=!1:(In("color")||In("colors")||In("color=true")||In("color=always"))&&(gu=!0);"FORCE_COLOR"in rr&&(gu=rr.FORCE_COLOR.length===0||parseInt(rr.FORCE_COLOR,10)!==0);function IZ(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function CZ(t){if(gu===!1)return 0;if(In("color=16m")||In("color=full")||In("color=truecolor"))return 3;if(In("color=256"))return 2;if(t&&!t.isTTY&&gu!==!0)return 0;let e=gu?1:0;if(process.platform==="win32"){let A=lZ.release().split(".");return Number(process.versions.node.split(".")[0])>=8&&Number(A[0])>=10&&Number(A[2])>=10586?Number(A[2])>=14931?3:2:1}if("CI"in rr)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(A=>A in rr)||rr.CI_NAME==="codeship"?1:e;if("TEAMCITY_VERSION"in rr)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(rr.TEAMCITY_VERSION)?1:0;if(rr.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in rr){let A=parseInt((rr.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(rr.TERM_PROGRAM){case"iTerm.app":return A>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(rr.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(rr.TERM)||"COLORTERM"in rr?1:(rr.TERM==="dumb",e)}function bw(t){let e=CZ(t);return IZ(e)}hL.exports={supportsColor:bw,stdout:bw(process.stdout),stderr:bw(process.stderr)}});var fL=w((Mt,DB)=>{var EZ=Y("tty"),pB=Y("util");Mt.init=DZ;Mt.log=dZ;Mt.formatArgs=hZ;Mt.save=fZ;Mt.load=pZ;Mt.useColors=BZ;Mt.destroy=pB.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Mt.colors=[6,2,3,4,5,1];try{let t=QL();t&&(t.stderr||t).level>=2&&(Mt.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}Mt.inspectOpts=Object.keys(process.env).filter(t=>/^debug_/i.test(t)).reduce((t,e)=>{let A=e.substring(6).toLowerCase().replace(/_([a-z])/g,(i,n)=>n.toUpperCase()),r=process.env[e];return/^(yes|on|true|enabled)$/i.test(r)?r=!0:/^(no|off|false|disabled)$/i.test(r)?r=!1:r==="null"?r=null:r=Number(r),t[A]=r,t},{});function BZ(){return"colors"in Mt.inspectOpts?!!Mt.inspectOpts.colors:EZ.isatty(process.stderr.fd)}function hZ(t){let{namespace:e,useColors:A}=this;if(A){let r=this.color,i="\x1B[3"+(r<8?r:"8;5;"+r),n=` ${i};1m${e} \x1B[0m`;t[0]=n+t[0].split(`
4
+ Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function $l(){return ru||(wi(),ru=Zl(H1,"sync-state.json")||{},ru)}function CB(t){wi(),ru=t;try{La(H1,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function ww(){if(_a)return _a;wi();try{tt.existsSync(fw)&&(_a=JSON.parse(tt.readFileSync(fw,"utf-8")))}catch{}return _a||(_a={}),_a}function z1(t){return Array.isArray(t.applications)}function $1(){let t=ww();if(z1(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function eL(t){if(!t||!t.questions||t.questions.length===0)return;let e=ww(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=RX?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),typeof n.isRequired=="boolean"&&(s.isRequired=n.isRequired),n.wasOptional&&(s.wasOptional=!0),s})};z1(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{La(fw,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function EB(){let t=$1(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function eI(t){if(tt.existsSync(yt.join(Di,".git")))try{let e={cwd:Di,stdio:"pipe",timeout:1e4};hw("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{hw("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');hw(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var bX,FX,Di,Qw,dw,O1,aB,H1,fw,Vl,Xl,Au,tu,Fs,Na,ru,_a,pw,RX,_X,BB=sB(()=>{bX=SX(import.meta.url),FX=yt.dirname(yt.dirname(bX)),Di=process.env.DATA_DIR?yt.resolve(process.env.DATA_DIR,"collected-profiles"):yt.join(FX,"collected-profiles"),Qw=yt.join(Di,"people.json"),dw=yt.join(Di,"jobs.json"),O1=yt.join(Di,"quota.json"),aB=yt.join(Di,"conversations.json"),H1=yt.join(Di,"sync-state.json"),fw=yt.join(Di,"application-questions.json"),Vl=20,Xl=100,Au=null,tu=null,Fs=null,Na=null,ru=null,_a=null;pw=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];RX=50;_X={loadPeople:Ar,savePeople:Un,loadJobs:gB,saveJobs:uB,loadConversations:xa,saveConversations:vs,upsertPerson:zl,upsertJob:J1,linkPersonToJob:Y1,addEncounter:j1,getPersonStatus:q1,updateConnectionStatus:W1,migrateFromDailyFiles:Z1,loadQuota:cB,saveQuota:Dw,recordConnectionSent:V1,canSendConnection:X1,getRecentConnections:lB,getQuotaStatus:IB,loadSyncState:$l,saveSyncState:CB,commitDataSnapshot:eI,logApplicationQuestions:eL,getQuestionStats:EB}});var aL={};oB(aL,{getJobDecision:()=>TX,getLastVisit:()=>JX,getScoutStats:()=>mw,loadCompanies:()=>oL,loadDiscoveredPeople:()=>yw,loadJobDecisions:()=>gI,loadScoutedJobs:()=>aI,loadVisitLog:()=>hB,recordVisit:()=>HX,resetCaches:()=>UX,saveCompany:()=>OX,saveDiscoveredPerson:()=>KX,saveScoutedJob:()=>GX,setJobDecision:()=>PX});import"dotenv/config";import*as ln from"fs";import*as yi from"path";import{fileURLToPath as NX}from"url";function nI(){ln.existsSync(Ga)||ln.mkdirSync(Ga,{recursive:!0})}function sI(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";ln.writeFileSync(r,A);for(let i=0;i<3;i++)try{ln.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function oI(t){try{if(ln.existsSync(t))return JSON.parse(ln.readFileSync(t,"utf-8"))}catch{}return null}function UX(){AI=null,tI=null,rI=null,iI=null,Ua=null}function aI(){return AI||(AI=oI(tL)||{},AI)}function GX(t,e){if(!t)return;nI();let A=aI(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{sI(tL,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function gI(){return tI||(tI=oI(sL)||{},tI)}function PX(t,e,A={}){if(!t||!e)return;nI();let r=gI(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{sI(sL,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function TX(t){return gI()[t]||null}function yw(){return rI||(rI=oI(rL)||{},rI)}function KX(t,e){if(!t)return;nI();let A=yw(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{sI(rL,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function oL(){return iI||(iI=oI(nL)||{},iI)}function OX(t,e){if(!t)return;nI();let A=oL(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{sI(nL,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function hB(){return Ua||(Ua=oI(iL)||{visits:[]},Array.isArray(Ua.visits)||(Ua.visits=[]),Ua)}function HX(t,e={}){if(!t)return;nI();let A=hB();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{sI(iL,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function JX(t){let e=hB();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function mw(){let t=aI(),e=yw(),A=Object.values(t),r=Object.values(e),i={};for(let c of A)c.company&&(i[c.company]=(i[c.company]||0)+1);let n=Object.entries(i).sort((c,l)=>l[1]-c[1]).slice(0,5).map(([c,l])=>`${c} (${l})`),s={};for(let c of A)for(let l of c.techStack||[])s[l]=(s[l]||0)+1;let o=Object.entries(s).sort((c,l)=>l[1]-c[1]).slice(0,8).map(([c,l])=>`${c} (${l})`),g=hB(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(c=>c.date.startsWith(u)).length,I=new Set(g.visits.map(c=>c.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:I,todayVisited:a,lastScoutDate:A.length>0?A.sort((c,l)=>(l.scoutedAt||"").localeCompare(c.scoutedAt||""))[0]?.scoutedAt:null}}var LX,xX,Ga,tL,rL,iL,nL,sL,AI,tI,rI,iI,Ua,QB=sB(()=>{LX=NX(import.meta.url),xX=yi.dirname(yi.dirname(LX)),Ga=process.env.DATA_DIR?yi.resolve(process.env.DATA_DIR,"market-research"):yi.join(xX,"market-research"),tL=yi.join(Ga,"scouted-jobs.json"),rL=yi.join(Ga,"discovered-people.json"),iL=yi.join(Ga,"visit-log.json"),nL=yi.join(Ga,"companies.json"),sL=yi.join(Ga,"job-decisions.json");AI=null;tI=null;rI=null;iI=null;Ua=null});var lL=w((_Me,cL)=>{var su=1e3,ou=su*60,au=ou*60,Pa=au*24,eZ=Pa*7,AZ=Pa*365.25;cL.exports=function(t,e){e=e||{};var A=typeof t;if(A==="string"&&t.length>0)return tZ(t);if(A==="number"&&isFinite(t))return e.long?iZ(t):rZ(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function tZ(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var A=parseFloat(e[1]),r=(e[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return A*AZ;case"weeks":case"week":case"w":return A*eZ;case"days":case"day":case"d":return A*Pa;case"hours":case"hour":case"hrs":case"hr":case"h":return A*au;case"minutes":case"minute":case"mins":case"min":case"m":return A*ou;case"seconds":case"second":case"secs":case"sec":case"s":return A*su;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return A;default:return}}}}function rZ(t){var e=Math.abs(t);return e>=Pa?Math.round(t/Pa)+"d":e>=au?Math.round(t/au)+"h":e>=ou?Math.round(t/ou)+"m":e>=su?Math.round(t/su)+"s":t+"ms"}function iZ(t){var e=Math.abs(t);return e>=Pa?dB(t,e,Pa,"day"):e>=au?dB(t,e,au,"hour"):e>=ou?dB(t,e,ou,"minute"):e>=su?dB(t,e,su,"second"):t+" ms"}function dB(t,e,A,r){var i=e>=A*1.5;return Math.round(t/A)+" "+r+(i?"s":"")}});var Sw=w((NMe,IL)=>{function nZ(t){A.debug=A,A.default=A,A.coerce=g,A.disable=n,A.enable=i,A.enabled=s,A.humanize=lL(),A.destroy=u,Object.keys(t).forEach(a=>{A[a]=t[a]}),A.names=[],A.skips=[],A.formatters={};function e(a){let I=0;for(let c=0;c<a.length;c++)I=(I<<5)-I+a.charCodeAt(c),I|=0;return A.colors[Math.abs(I)%A.colors.length]}A.selectColor=e;function A(a){let I,c=null,l,C;function B(...E){if(!B.enabled)return;let h=B,Q=Number(new Date),d=Q-(I||Q);h.diff=d,h.prev=I,h.curr=Q,I=Q,E[0]=A.coerce(E[0]),typeof E[0]!="string"&&E.unshift("%O");let f=0;E[0]=E[0].replace(/%([a-zA-Z%])/g,(b,m)=>{if(b==="%%")return"%";f++;let D=A.formatters[m];if(typeof D=="function"){let S=E[f];b=D.call(h,S),E.splice(f,1),f--}return b}),A.formatArgs.call(h,E),(h.log||A.log).apply(h,E)}return B.namespace=a,B.useColors=A.useColors(),B.color=A.selectColor(a),B.extend=r,B.destroy=A.destroy,Object.defineProperty(B,"enabled",{enumerable:!0,configurable:!1,get:()=>c!==null?c:(l!==A.namespaces&&(l=A.namespaces,C=A.enabled(a)),C),set:E=>{c=E}}),typeof A.init=="function"&&A.init(B),B}function r(a,I){let c=A(this.namespace+(typeof I>"u"?":":I)+a);return c.log=this.log,c}function i(a){A.save(a),A.namespaces=a,A.names=[],A.skips=[];let I,c=(typeof a=="string"?a:"").split(/[\s,]+/),l=c.length;for(I=0;I<l;I++)c[I]&&(a=c[I].replace(/\*/g,".*?"),a[0]==="-"?A.skips.push(new RegExp("^"+a.slice(1)+"$")):A.names.push(new RegExp("^"+a+"$")))}function n(){let a=[...A.names.map(o),...A.skips.map(o).map(I=>"-"+I)].join(",");return A.enable(""),a}function s(a){if(a[a.length-1]==="*")return!0;let I,c;for(I=0,c=A.skips.length;I<c;I++)if(A.skips[I].test(a))return!1;for(I=0,c=A.names.length;I<c;I++)if(A.names[I].test(a))return!0;return!1}function o(a){return a.toString().substring(2,a.toString().length-2).replace(/\.\*\?$/,"*")}function g(a){return a instanceof Error?a.stack||a.message:a}function u(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return A.enable(A.load()),A}IL.exports=nZ});var CL=w((ii,fB)=>{ii.formatArgs=oZ;ii.save=aZ;ii.load=gZ;ii.useColors=sZ;ii.storage=uZ();ii.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();ii.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function sZ(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function oZ(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+fB.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let A=0,r=0;t[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(A++,i==="%c"&&(r=A))}),t.splice(r,0,e)}ii.log=console.debug||console.log||(()=>{});function aZ(t){try{t?ii.storage.setItem("debug",t):ii.storage.removeItem("debug")}catch{}}function gZ(){let t;try{t=ii.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}function uZ(){try{return localStorage}catch{}}fB.exports=Sw()(ii);var{formatters:cZ}=fB.exports;cZ.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var BL=w((LMe,EL)=>{"use strict";EL.exports=(t,e)=>{e=e||process.argv;let A=t.startsWith("-")?"":t.length===1?"-":"--",r=e.indexOf(A+t),i=e.indexOf("--");return r!==-1&&(i===-1?!0:r<i)}});var QL=w((xMe,hL)=>{"use strict";var lZ=Y("os"),In=BL(),rr=process.env,gu;In("no-color")||In("no-colors")||In("color=false")?gu=!1:(In("color")||In("colors")||In("color=true")||In("color=always"))&&(gu=!0);"FORCE_COLOR"in rr&&(gu=rr.FORCE_COLOR.length===0||parseInt(rr.FORCE_COLOR,10)!==0);function IZ(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function CZ(t){if(gu===!1)return 0;if(In("color=16m")||In("color=full")||In("color=truecolor"))return 3;if(In("color=256"))return 2;if(t&&!t.isTTY&&gu!==!0)return 0;let e=gu?1:0;if(process.platform==="win32"){let A=lZ.release().split(".");return Number(process.versions.node.split(".")[0])>=8&&Number(A[0])>=10&&Number(A[2])>=10586?Number(A[2])>=14931?3:2:1}if("CI"in rr)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(A=>A in rr)||rr.CI_NAME==="codeship"?1:e;if("TEAMCITY_VERSION"in rr)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(rr.TEAMCITY_VERSION)?1:0;if(rr.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in rr){let A=parseInt((rr.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(rr.TERM_PROGRAM){case"iTerm.app":return A>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(rr.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(rr.TERM)||"COLORTERM"in rr?1:(rr.TERM==="dumb",e)}function bw(t){let e=CZ(t);return IZ(e)}hL.exports={supportsColor:bw,stdout:bw(process.stdout),stderr:bw(process.stderr)}});var fL=w((Mt,DB)=>{var EZ=Y("tty"),pB=Y("util");Mt.init=DZ;Mt.log=dZ;Mt.formatArgs=hZ;Mt.save=fZ;Mt.load=pZ;Mt.useColors=BZ;Mt.destroy=pB.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Mt.colors=[6,2,3,4,5,1];try{let t=QL();t&&(t.stderr||t).level>=2&&(Mt.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}Mt.inspectOpts=Object.keys(process.env).filter(t=>/^debug_/i.test(t)).reduce((t,e)=>{let A=e.substring(6).toLowerCase().replace(/_([a-z])/g,(i,n)=>n.toUpperCase()),r=process.env[e];return/^(yes|on|true|enabled)$/i.test(r)?r=!0:/^(no|off|false|disabled)$/i.test(r)?r=!1:r==="null"?r=null:r=Number(r),t[A]=r,t},{});function BZ(){return"colors"in Mt.inspectOpts?!!Mt.inspectOpts.colors:EZ.isatty(process.stderr.fd)}function hZ(t){let{namespace:e,useColors:A}=this;if(A){let r=this.color,i="\x1B[3"+(r<8?r:"8;5;"+r),n=` ${i};1m${e} \x1B[0m`;t[0]=n+t[0].split(`
5
5
  `).join(`
6
6
  `+n),t.push(i+"m+"+DB.exports.humanize(this.diff)+"\x1B[0m")}else t[0]=QZ()+e+" "+t[0]}function QZ(){return Mt.inspectOpts.hideDate?"":new Date().toISOString()+" "}function dZ(...t){return process.stderr.write(pB.formatWithOptions(Mt.inspectOpts,...t)+`
7
7
  `)}function fZ(t){t?process.env.DEBUG=t:delete process.env.DEBUG}function pZ(){return process.env.DEBUG}function DZ(t){t.inspectOpts={};let e=Object.keys(Mt.inspectOpts);for(let A=0;A<e.length;A++)t.inspectOpts[e[A]]=Mt.inspectOpts[e[A]]}DB.exports=Sw()(Mt);var{formatters:dL}=DB.exports;dL.o=function(t){return this.inspectOpts.colors=this.useColors,pB.inspect(t,this.inspectOpts).split(`
package/dist/viewers.mjs CHANGED
@@ -206,7 +206,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
206
206
  `),n}i.dependencies.size&&this.resolvePluginDependencies()}}orderPlugins(){Rg("orderPlugins:before",this.pluginNames);let e=this._plugins.filter(A=>A.requirements.has("runLast")).map(A=>A.name);for(let A of e){let r=this._plugins.findIndex(i=>i.name===A);this._plugins.push(this._plugins.splice(r,1)[0])}Rg("orderPlugins:after",this.pluginNames)}checkPluginRequirements(e={}){for(let A of this._plugins)for(let r of A.requirements)e.context==="launch"&&r==="headful"&&e.options.headless&&console.warn(`Warning: Plugin '${A.name}' is not supported in headless mode.`),e.context==="connect"&&r==="launch"&&console.warn(`Warning: Plugin '${A.name}' doesn't support puppeteer.connect().`)}async callPlugins(e,...A){for(let r of this.getPluginsByProp(e))await r[e].apply(r,A)}async callPluginsWithValue(e,A){for(let r of this.getPluginsByProp(e)){let i=await r[e](A);i&&(A=i)}return A}},xbe=new SE(...Ube()),Gbe=t=>new SE(t);function Ube(){try{return[Y("puppeteer"),void 0]}catch{}try{return[H6(),void 0]}catch(t){return[void 0,t]}}_g.PuppeteerExtra=SE;_g.addExtra=Gbe;_g.default=xbe;LN.exports=_g.default||{};Object.entries(_g).forEach(([t,e])=>{LN.exports[t]=e})});var q6=w((_Ue,j6)=>{"use strict";j6.exports=function(e){if(!Array.isArray(e))throw new TypeError("arr-union expects the first argument to be an array.");for(var A=arguments.length,r=0;++r<A;){var i=arguments[r];if(i){Array.isArray(i)||(i=[i]);for(var n=0;n<i.length;n++){var s=i[n];e.indexOf(s)>=0||e.push(s)}}}return e}});var V6=w((NUe,W6)=>{"use strict";function Pbe(t){var e={},A=function(r,i){i=i||Kbe(r),(process.env.UNLAZY==="true"||process.env.UNLAZY===!0||process.env.TRAVIS)&&(e[i]=t(r)),Object.defineProperty(A,i,{enumerable:!0,configurable:!0,get:n});function n(){return e.hasOwnProperty(i)?e[i]:e[i]=t(r)}return n};return A}function Kbe(t){return t.length===1?t.toLowerCase():(t=t.replace(/^[\W_]+|[\W_]+$/g,"").toLowerCase(),t.replace(/[\W_]+(\w|$)/g,function(e,A){return A.toUpperCase()}))}W6.exports=Pbe});var Z6=w((LUe,X6)=>{"use strict";X6.exports=function(e,A,r){for(var i in e)if(A.call(r,e[i],i,e)===!1)break}});var $6=w((xUe,z6)=>{"use strict";var Tbe=Z6(),Obe=Object.prototype.hasOwnProperty;z6.exports=function(e,A,r){Tbe(e,function(i,n){if(Obe.call(e,n))return A.call(r,e[n],n,e)})}});var tV=w((GUe,AV)=>{"use strict";var eV=V6()(Y),Hbe=Y;Y=eV;Y("is-plain-object","isObject");Y("shallow-clone","clone");Y("kind-of","typeOf");$6();Y=Hbe;AV.exports=eV});var iV=w((PUe,rV)=>{"use strict";var I0=tV();function xN(t,e){switch(I0.typeOf(t)){case"object":return Jbe(t,e);case"array":return Ybe(t,e);default:return I0.clone(t)}}function Jbe(t,e){if(I0.isObject(t)){var A={};return I0.forOwn(t,function(r,i){this[i]=xN(r,e)},A),A}else return e?e(t):t}function Ybe(t,e){for(var A=t.length,r=[],i=-1;++i<A;)r[i]=xN(t[i],e);return r}rV.exports=xN});var oV=w((KUe,sV)=>{sV.exports=function(t){return t!=null&&(nV(t)||jbe(t)||!!t._isBuffer)};function nV(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function jbe(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&nV(t.slice(0,0))}});var gV=w((TUe,aV)=>{var qbe=oV(),Wbe=Object.prototype.toString;aV.exports=function(e){if(typeof e>"u")return"undefined";if(e===null)return"null";if(e===!0||e===!1||e instanceof Boolean)return"boolean";if(typeof e=="string"||e instanceof String)return"string";if(typeof e=="number"||e instanceof Number)return"number";if(typeof e=="function"||e instanceof Function)return"function";if(typeof Array.isArray<"u"&&Array.isArray(e))return"array";if(e instanceof RegExp)return"regexp";if(e instanceof Date)return"date";var A=Wbe.call(e);return A==="[object RegExp]"?"regexp":A==="[object Date]"?"date":A==="[object Arguments]"?"arguments":A==="[object Error]"?"error":qbe(e)?"buffer":A==="[object Set]"?"set":A==="[object WeakSet]"?"weakset":A==="[object Map]"?"map":A==="[object WeakMap]"?"weakmap":A==="[object Symbol]"?"symbol":A==="[object Int8Array]"?"int8array":A==="[object Uint8Array]"?"uint8array":A==="[object Uint8ClampedArray]"?"uint8clampedarray":A==="[object Int16Array]"?"int16array":A==="[object Uint16Array]"?"uint16array":A==="[object Int32Array]"?"int32array":A==="[object Uint32Array]"?"uint32array":A==="[object Float32Array]"?"float32array":A==="[object Float64Array]"?"float64array":"object"}});var lV=w((OUe,CV)=>{"use strict";var Vbe=q6(),cV=iV(),uV=gV();CV.exports=function(e,A){!C0(e)&&!Array.isArray(e)&&(e={});for(var r=cV(e),i=arguments.length,n=0;++n<i;){var s=arguments[n];(C0(s)||Array.isArray(s))&&IV(r,s)}return r};function IV(t,e){for(var A in e)if(!(!Zbe(A)||!Xbe(e,A))){var r=e[A],i=t[A];C0(i)&&C0(r)?t[A]=IV(i,r):Array.isArray(i)?t[A]=Vbe([],i,r):t[A]=cV(r)}return t}function Xbe(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function C0(t){return uV(t)==="object"||uV(t)==="function"}function Zbe(t){return t!=="__proto__"&&t!=="constructor"&&t!=="prototype"}});var BV=w(UN=>{"use strict";Object.defineProperty(UN,"__esModule",{value:!0});function zbe(t){return t&&typeof t=="object"&&"default"in t?t.default:t}var EV=zbe(wt()),$be=lV(),GN=class{constructor(e){this._debugBase=EV(`puppeteer-extra-plugin:base:${this.name}`),this._childClassMembers=[],this._opts=$be(this.defaults,e||{}),this._debugBase("Initialized.")}get name(){throw new Error('Plugin must override "name"')}get defaults(){return{}}get requirements(){return new Set([])}get dependencies(){return new Set([])}get data(){return[]}get opts(){return this._opts}get debug(){return EV(`puppeteer-extra-plugin:${this.name}`)}async beforeLaunch(e){}async afterLaunch(e,A={options:{}}){}async beforeConnect(e){}async afterConnect(e,A={}){}async onBrowser(e,A){}async onTargetCreated(e){}async onPageCreated(e){}async onTargetChanged(e){}async onTargetDestroyed(e){}async onDisconnected(){}async onClose(){}async onPluginRegistered(){}getDataFromPlugins(e){return[]}_getMissingDependencies(e){let A=new Set(e.map(i=>i.name));return new Set(Array.from(this.dependencies.values()).filter(i=>!A.has(i)))}async _bindBrowserEvents(e,A={}){(this._hasChildClassMember("onTargetCreated")||this._hasChildClassMember("onPageCreated"))&&e.on("targetcreated",this._onTargetCreated.bind(this)),this._hasChildClassMember("onTargetChanged")&&this.onTargetChanged&&e.on("targetchanged",this.onTargetChanged.bind(this)),this._hasChildClassMember("onTargetDestroyed")&&this.onTargetDestroyed&&e.on("targetdestroyed",this.onTargetDestroyed.bind(this)),this._hasChildClassMember("onDisconnected")&&this.onDisconnected&&e.on("disconnected",this.onDisconnected.bind(this)),A.context==="launch"&&this._hasChildClassMember("onClose")&&this.onClose&&(process.on("exit",this.onClose.bind(this)),e.on("disconnected",this.onClose.bind(this)),A.options.handleSIGINT!==!1&&process.on("SIGINT",this.onClose.bind(this)),A.options.handleSIGTERM!==!1&&process.on("SIGTERM",this.onClose.bind(this)),A.options.handleSIGHUP!==!1&&process.on("SIGHUP",this.onClose.bind(this))),A.context==="launch"&&this.afterLaunch&&await this.afterLaunch(e,A),A.context==="connect"&&this.afterConnect&&await this.afterConnect(e,A),this.onBrowser&&await this.onBrowser(e,A)}async _onTargetCreated(e){if(this.onTargetCreated&&await this.onTargetCreated(e),e.type()==="page")try{let A=await e.page();if(!A)return;let r="isClosed"in A&&!A.isClosed();this.onPageCreated&&r&&await this.onPageCreated(A)}catch(A){console.error(A)}}_register(e){this._registerChildClassMembers(e),this.onPluginRegistered&&this.onPluginRegistered()}_registerChildClassMembers(e){this._childClassMembers=Object.getOwnPropertyNames(e)}_hasChildClassMember(e){return!!this._childClassMembers.includes(e)}get _isPuppeteerExtraPlugin(){return!0}};UN.PuppeteerExtraPlugin=GN});var QV=w((JUe,hV)=>{"use strict";var{PuppeteerExtraPlugin:eve}=BV(),PN=class extends eve{constructor(e={}){super(e)}get name(){return"stealth"}get defaults(){let e=new Set(["chrome.app","chrome.csi","chrome.loadTimes","chrome.runtime","defaultArgs","iframe.contentWindow","media.codecs","navigator.hardwareConcurrency","navigator.languages","navigator.permissions","navigator.plugins","navigator.webdriver","sourceurl","user-agent-override","webgl.vendor","window.outerdimensions"]);return{availableEvasions:e,enabledEvasions:new Set([...e])}}get dependencies(){return new Set([...this.opts.enabledEvasions].map(e=>`${this.name}/evasions/${e}`))}get availableEvasions(){return this.defaults.availableEvasions}get enabledEvasions(){return this.opts.enabledEvasions}set enabledEvasions(e){this.opts.enabledEvasions=e}async onBrowser(e){e&&e.setMaxListeners&&e.setMaxListeners(30)}},Ave=t=>new PN(t);hV.exports=Ave});var YV={};JE(YV,{addEncounter:()=>MV,canSendConnection:()=>LV,commitDataSnapshot:()=>JV,default:()=>hve,getAllApplications:()=>TV,getPersonStatus:()=>RV,getQuestionStats:()=>HV,getQuotaStatus:()=>xV,getRecentConnections:()=>d0,linkPersonToJob:()=>kV,loadApplicationQuestions:()=>qN,loadConversations:()=>FV,loadJobs:()=>B0,loadPeople:()=>ps,loadQuota:()=>Q0,loadSyncState:()=>UV,logApplicationQuestions:()=>OV,migrateFromDailyFiles:()=>GV,recordConnectionSent:()=>NV,resetCaches:()=>Cve,saveConversations:()=>bV,saveJobs:()=>h0,savePeople:()=>Ug,saveQuota:()=>jN,saveSyncState:()=>PV,updateConnectionStatus:()=>_V,upsertJob:()=>vV,upsertPerson:()=>YN});import"dotenv/config";import*as rt from"fs";import*as Ft from"path";import{fileURLToPath as uve}from"url";import{execSync as KN}from"child_process";function Cve(){vI=null,kI=null,ro=null,xg=null,MI=null,Lg=null}function An(){rt.existsSync(en)||rt.mkdirSync(en,{recursive:!0})}function Gg(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";rt.writeFileSync(r,A);for(let i=0;i<3;i++)try{rt.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function vE(t,e){if(!rt.existsSync(t))return null;try{let A=JSON.parse(rt.readFileSync(t,"utf-8"));try{rt.copyFileSync(t,t+".backup")}catch{}return A}catch(A){console.error(`[!] ${e} is corrupted: ${A.message}`),console.error(` File: ${Ft.resolve(t)}`);let r=t+".backup";if(rt.existsSync(r))try{let i=JSON.parse(rt.readFileSync(r,"utf-8"));console.error(` Restored from ${r}`);try{rt.copyFileSync(r,t)}catch{}return i}catch{console.error(" Backup also corrupted!")}console.error(` Starting with empty data. Old file preserved as ${t}.corrupted`);try{rt.copyFileSync(t,t+".corrupted")}catch{}return null}}function RI(){return new Date().toISOString().split("T")[0]}function ps(){return vI||(An(),vI=vE(TN,"people.json")||{},vI)}function Ug(t){An(),vI=t;try{Gg(TN,t)}catch(e){console.error(`[!] Failed to save people.json: ${e.message}`),console.error(` Path: ${Ft.resolve(TN)}`)}}function B0(){return kI||(An(),kI=vE(ON,"jobs.json")||{},kI)}function h0(t){An(),kI=t;try{Gg(ON,t)}catch(e){console.error(`[!] Failed to save jobs.json: ${e.message}`),console.error(` Path: ${Ft.resolve(ON)}`)}}function FV(){return xg||(An(),xg=vE(E0,"conversations.json")||{},lve(xg),xg)}function lve(t){let e=0;for(let A of Object.values(t)){if(!(A.draftStatus!==void 0||A.draftPreparedAt!==void 0))continue;let i=(A.messages||[]).find(n=>n.status==="draft");i&&A.draftStatus&&A.draftStatus!=="pending"&&(i.status=A.draftStatus),delete A.draftStatus,delete A.draftPreparedAt,e++}if(e>0){console.log(` [migration] Moved draft state from conv to msg.status for ${e} conversations`);try{Gg(E0,t)}catch{}}}function bV(t){An(),xg=t;try{Gg(E0,t)}catch(e){console.error(`[!] Failed to save conversations.json: ${e.message}`),console.error(` Path: ${Ft.resolve(E0)}`)}}function YN(t,e={}){if(!t)return null;let A=ps(),r=RI(),i=new Date().toISOString(),n=A[t];if(n){n.seenCount=(n.seenCount||1)+1,n.lastSeen=r,n.lastUpdated=i,e.source&&!n.sources?.includes(e.source)&&(n.sources=n.sources||[],n.sources.push(e.source));for(let s of JN)e[s]!=null&&(n[s]=e[s])}else A[t]={name:e.name||null,title:e.title||null,location:e.location||null,company:e.company||null,connectionDegree:e.connectionDegree||null,connectionsCount:e.connectionsCount||null,mutualConnections:e.mutualConnections||null,photoUrl:e.photoUrl||null,hasVerifiedBadge:e.hasVerifiedBadge||!1,firstSeen:r,lastSeen:r,seenCount:1,sources:e.source?[e.source]:[],connectionStatus:null,connectionDate:null,connectionMethod:null,messageSent:null,jobIds:[],lastUpdated:i};return Ug(A),A[t]}function vV(t,e={}){if(!t)return null;let A=B0(),r=RI(),i=A[t];if(i){let n=["title","company","companyUrl","location","salary","url","applied","appliedDate","recruiterUrl","description","techStack","jobTags","seniority","employmentType","industries","jobFunction","postedTime","applicantCount","companySize","workplaceType","contractType","isEasyApply","applyType","scoutedAt","lastSeen"];for(let s of n)e[s]!=null&&(i[s]=e[s])}else A[t]={title:e.title||null,company:e.company||null,location:e.location||null,salary:e.salary||null,url:e.url||null,applied:e.applied||!1,appliedDate:e.appliedDate||r,recruiterUrl:e.recruiterUrl||null,firstSeen:r};return h0(A),A[t]}function kV(t,e){if(!t||!e)return;let A=ps(),r=A[t];r&&(r.jobIds||(r.jobIds=[]),r.jobIds.includes(e)||(r.jobIds.push(e),r.lastUpdated=new Date().toISOString(),Ug(A)))}function MV(t,e){if(!t||!e)return;let A=ps(),r=A[t];if(!r)return;r.encounters||(r.encounters=[]);let n={date:RI(),source:e.source||"unknown",action:e.action||"unknown"};e.jobId&&(n.jobId=String(e.jobId)),e.jobTitle&&(n.jobTitle=e.jobTitle),e.jobCompany&&(n.jobCompany=e.jobCompany),!r.encounters.some(o=>o.date===n.date&&o.source===n.source&&o.action===n.action&&(o.jobId||"")===(n.jobId||""))&&(r.encounters.push(n),r.lastUpdated=new Date().toISOString(),Ug(A))}function RV(t){return t&&ps()[t]?.connectionStatus||null}function _V(t,e,A={}){if(!t)return;let r=ps(),i=r[t];if(i||(YN(t,A.profileInfo||{}),i=r[t]),!!i){if(i.connectionStatus=e,i.connectionDate=RI(),i.connectionMethod=A.method||i.connectionMethod,i.messageSent=A.messageSent||i.messageSent,i.lastUpdated=new Date().toISOString(),A.profileInfo)for(let n of JN)A.profileInfo[n]!=null&&(i[n]=A.profileInfo[n]);Ug(r)}}function Q0(){return ro||(An(),ro=vE(mV,"quota.json"),(!ro||!ro.connections)&&(ro={connections:[]}),ro)}function jN(t){An(),ro=t;try{Gg(mV,t)}catch(e){console.error(`[!] Failed to save quota.json: ${e.message}`)}}function NV(t,e="unknown"){let A=Q0(),r=new Date;A.connections.push({date:r.toISOString().split("T")[0],time:r.toTimeString().split(" ")[0],profileUrl:t,source:e}),jN(A)}function d0(){let t=Q0(),e=new Date;e.setDate(e.getDate()-7);let A=e.toISOString().split("T")[0];return t.connections.filter(r=>r.date>=A)}function LV(){let t=d0(),e=RI(),A=t.filter(g=>g.date===e).length,r=t.length,i=A>=FE,n=r>=bE,s=!i&&!n,o={allowed:s,daily:{sent:A,max:FE},weekly:{sent:r,max:bE}};return s||(o.reason=i?`Daily limit reached (${A}/${FE})`:`Weekly limit reached (${r}/${bE})`),o}function xV(){let t=d0(),e=RI(),A=t.filter(i=>i.date===e).length,r=t.length;return{daily:{sent:A,max:FE,remaining:FE-A},weekly:{sent:r,max:bE,remaining:bE-r}}}function Eve(t){if(!t)return null;let e=t.match(/jobs\/view\/(\d+)/);return e?e[1]:null}function GV(){An();let t=rt.readdirSync(en).filter(n=>n.endsWith(".json")&&n!=="people.json"&&n!=="jobs.json"&&n!=="quota.json");if(t.length===0)return console.log("No daily files found to migrate."),{people:0,jobs:0};console.log(`
207
207
  Migrating from ${t.length} daily files...
208
208
  `);let e=ps(),A=B0(),r=0,i=0;t.sort();for(let n of t){let s=Ft.join(en,n),o;try{o=JSON.parse(rt.readFileSync(s,"utf-8"))}catch(a){console.log(` Skipping ${n}: ${a.message}`);continue}let g=o.date||n.match(/\d{4}-\d{2}-\d{2}/)?.[0]||null,u=o.source||n.split("-").slice(0,-1).join("-").replace(/-\d{4}$/,"")||"unknown";if(!o.profiles||!Array.isArray(o.profiles)){console.log(` Skipping ${n}: no profiles array`);continue}console.log(` ${n}: ${o.profiles.length} profiles`);for(let a of o.profiles){let C=a.profileUrl;if(!C)continue;let I=e[C];if(I){I.seenCount=(I.seenCount||1)+1,g&&(!I.lastSeen||g>I.lastSeen)&&(I.lastSeen=g),g&&(!I.firstSeen||g<I.firstSeen)&&(I.firstSeen=g),u&&!I.sources?.includes(u)&&(I.sources=I.sources||[],I.sources.push(u));for(let c of JN)a[c]!=null&&(I[c]=a[c]);a.status&&a.processed&&(I.connectionStatus=a.status,I.connectionDate=g,a.funnelResult&&(I.connectionMethod=a.funnelResult.method||I.connectionMethod,I.messageSent=a.funnelResult.message||I.messageSent)),I.lastUpdated=new Date().toISOString()}else e[C]={name:a.name||null,title:a.title||null,location:a.location||null,company:a.company||null,connectionDegree:a.connectionDegree||null,connectionsCount:a.connectionsCount||null,mutualConnections:a.mutualConnections||null,photoUrl:a.photoUrl||null,hasVerifiedBadge:a.hasVerifiedBadge||!1,firstSeen:g,lastSeen:g,seenCount:1,sources:u?[u]:[],connectionStatus:a.processed&&a.status||null,connectionDate:a.processed?g:null,connectionMethod:a.funnelResult?.method||null,messageSent:a.funnelResult?.message||null,jobIds:[],lastUpdated:new Date().toISOString()},r++;if(a.fromJob?.url){let c=Eve(a.fromJob.url);c&&(e[C].jobIds||(e[C].jobIds=[]),e[C].jobIds.includes(c)||e[C].jobIds.push(c),A[c]?A[c].recruiterUrl||(A[c].recruiterUrl=C):(A[c]={title:a.fromJob.title||null,company:a.fromJob.company||null,location:null,salary:null,url:a.fromJob.url,applied:!0,appliedDate:g,recruiterUrl:C,firstSeen:g},i++))}}}return Ug(e),h0(A),console.log(`
209
- Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function UV(){return MI||(An(),MI=vE(SV,"sync-state.json")||{},MI)}function PV(t){An(),MI=t;try{Gg(SV,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function qN(){if(Lg)return Lg;An();try{rt.existsSync(HN)&&(Lg=JSON.parse(rt.readFileSync(HN,"utf-8")))}catch{}return Lg||(Lg={}),Lg}function KV(t){return Array.isArray(t.applications)}function TV(){let t=qN();if(KV(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function OV(t){if(!t||!t.questions||t.questions.length===0)return;let e=qN(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=Bve?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),s})};KV(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{Gg(HN,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function HV(){let t=TV(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function JV(t){if(rt.existsSync(Ft.join(en,".git")))try{let e={cwd:en,stdio:"pipe",timeout:1e4};KN("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{KN("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');KN(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var cve,Ive,en,TN,ON,mV,E0,SV,HN,FE,bE,vI,kI,ro,xg,MI,Lg,JN,Bve,hve,WN=HE(()=>{cve=uve(import.meta.url),Ive=Ft.dirname(Ft.dirname(cve)),en=process.env.DATA_DIR?Ft.resolve(process.env.DATA_DIR,"collected-profiles"):Ft.join(Ive,"collected-profiles"),TN=Ft.join(en,"people.json"),ON=Ft.join(en,"jobs.json"),mV=Ft.join(en,"quota.json"),E0=Ft.join(en,"conversations.json"),SV=Ft.join(en,"sync-state.json"),HN=Ft.join(en,"application-questions.json"),FE=20,bE=100,vI=null,kI=null,ro=null,xg=null,MI=null,Lg=null;JN=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];Bve=50;hve={loadPeople:ps,savePeople:Ug,loadJobs:B0,saveJobs:h0,loadConversations:FV,saveConversations:bV,upsertPerson:YN,upsertJob:vV,linkPersonToJob:kV,addEncounter:MV,getPersonStatus:RV,updateConnectionStatus:_V,migrateFromDailyFiles:GV,loadQuota:Q0,saveQuota:jN,recordConnectionSent:NV,canSendConnection:LV,getRecentConnections:d0,getQuotaStatus:xV,loadSyncState:UV,saveSyncState:PV,commitDataSnapshot:JV,logApplicationQuestions:OV,getQuestionStats:HV}});var zV={};JE(zV,{getJobDecision:()=>yve,getLastVisit:()=>bve,getScoutStats:()=>vve,loadCompanies:()=>ZV,loadDiscoveredPeople:()=>GE,loadJobDecisions:()=>XN,loadScoutedJobs:()=>VN,loadVisitLog:()=>_I,recordVisit:()=>Fve,resetCaches:()=>pve,saveCompany:()=>Sve,saveDiscoveredPerson:()=>mve,saveScoutedJob:()=>Dve,setJobDecision:()=>wve});import"dotenv/config";import*as bn from"fs";import*as tn from"path";import{fileURLToPath as Qve}from"url";function NE(){bn.existsSync(Kg)||bn.mkdirSync(Kg,{recursive:!0})}function LE(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";bn.writeFileSync(r,A);for(let i=0;i<3;i++)try{bn.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function xE(t){try{if(bn.existsSync(t))return JSON.parse(bn.readFileSync(t,"utf-8"))}catch{}return null}function pve(){kE=null,ME=null,RE=null,_E=null,Pg=null}function VN(){return kE||(kE=xE(jV)||{},kE)}function Dve(t,e){if(!t)return;NE();let A=VN(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{LE(jV,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function XN(){return ME||(ME=xE(XV)||{},ME)}function wve(t,e,A={}){if(!t||!e)return;NE();let r=XN(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{LE(XV,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function yve(t){return XN()[t]||null}function GE(){return RE||(RE=xE(qV)||{},RE)}function mve(t,e){if(!t)return;NE();let A=GE(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{LE(qV,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function ZV(){return _E||(_E=xE(VV)||{},_E)}function Sve(t,e){if(!t)return;NE();let A=ZV(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{LE(VV,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function _I(){return Pg||(Pg=xE(WV)||{visits:[]},Array.isArray(Pg.visits)||(Pg.visits=[]),Pg)}function Fve(t,e={}){if(!t)return;NE();let A=_I();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{LE(WV,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function bve(t){let e=_I();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function vve(){let t=VN(),e=GE(),A=Object.values(t),r=Object.values(e),i={};for(let I of A)I.company&&(i[I.company]=(i[I.company]||0)+1);let n=Object.entries(i).sort((I,c)=>c[1]-I[1]).slice(0,5).map(([I,c])=>`${I} (${c})`),s={};for(let I of A)for(let c of I.techStack||[])s[c]=(s[c]||0)+1;let o=Object.entries(s).sort((I,c)=>c[1]-I[1]).slice(0,8).map(([I,c])=>`${I} (${c})`),g=_I(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(I=>I.date.startsWith(u)).length,C=new Set(g.visits.map(I=>I.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:C,todayVisited:a,lastScoutDate:A.length>0?A.sort((I,c)=>(c.scoutedAt||"").localeCompare(I.scoutedAt||""))[0]?.scoutedAt:null}}var dve,fve,Kg,jV,qV,WV,VV,XV,kE,ME,RE,_E,Pg,ZN=HE(()=>{dve=Qve(import.meta.url),fve=tn.dirname(tn.dirname(dve)),Kg=process.env.DATA_DIR?tn.resolve(process.env.DATA_DIR,"market-research"):tn.join(fve,"market-research"),jV=tn.join(Kg,"scouted-jobs.json"),qV=tn.join(Kg,"discovered-people.json"),WV=tn.join(Kg,"visit-log.json"),VV=tn.join(Kg,"companies.json"),XV=tn.join(Kg,"job-decisions.json");kE=null;ME=null;RE=null;_E=null;Pg=null});import"dotenv/config";import*as kn from"fs";import*as Tg from"path";import{fileURLToPath as Jve}from"url";var pV=n1(Y6(),1),DV=n1(QV(),1);import gve from"puppeteer";async function l0(t){let e=Math.floor(Math.random()*2001),A=t+e;return new Promise(r=>setTimeout(r,A))}import{getPluginConfig as tve}from"@ilivemylife/graph-sdk";var rve=await tve();for(let[t,e]of Object.entries(rve))process.env[t]===void 0&&(process.env[t]=e);var ive=process.env.LINKEDIN_NAME,Ng=Object.freeze({DRAFT:"draft",CONFIRMED:"confirmed",REJECTED:"rejected",NEEDS_REVIEW:"needs_review",SENT:"sent"}),qUe=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.NEEDS_REVIEW])),nve=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.REJECTED,Ng.NEEDS_REVIEW]));import dV from"fs";import sve from"path";var ove="cookies.json";function ave(){let t=process.env.ILML_SCOPE_DIR;return t?sve.join(t,"plugins-state","linkedin","cookies.json"):ove}function fV(){let t=ave();if(!dV.existsSync(t))throw new Error(`Cookies not found at ${t}. Run: ilml linkedin login`);let e;try{e=dV.readFileSync(t,"utf-8")}catch(r){throw new Error(`Failed to read cookies at ${t}: ${r.message}. Run: ilml linkedin login`)}let A;try{A=JSON.parse(e)}catch{throw new Error(`Cookies file at ${t} is corrupted (invalid JSON). Run: ilml linkedin login`)}if(!Array.isArray(A)||A.length===0)throw new Error(`Cookies file at ${t} is empty or not an array. Run: ilml linkedin login`);return A}var wV=(0,pV.addExtra)(gve);wV.use((0,DV.default)());async function yV(){let t=await wV.launch({headless:!1,defaultViewport:null,protocolTimeout:3e5}),e=async()=>{console.log(`
209
+ Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function UV(){return MI||(An(),MI=vE(SV,"sync-state.json")||{},MI)}function PV(t){An(),MI=t;try{Gg(SV,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function qN(){if(Lg)return Lg;An();try{rt.existsSync(HN)&&(Lg=JSON.parse(rt.readFileSync(HN,"utf-8")))}catch{}return Lg||(Lg={}),Lg}function KV(t){return Array.isArray(t.applications)}function TV(){let t=qN();if(KV(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function OV(t){if(!t||!t.questions||t.questions.length===0)return;let e=qN(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=Bve?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),typeof n.isRequired=="boolean"&&(s.isRequired=n.isRequired),n.wasOptional&&(s.wasOptional=!0),s})};KV(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{Gg(HN,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function HV(){let t=TV(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function JV(t){if(rt.existsSync(Ft.join(en,".git")))try{let e={cwd:en,stdio:"pipe",timeout:1e4};KN("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{KN("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');KN(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var cve,Ive,en,TN,ON,mV,E0,SV,HN,FE,bE,vI,kI,ro,xg,MI,Lg,JN,Bve,hve,WN=HE(()=>{cve=uve(import.meta.url),Ive=Ft.dirname(Ft.dirname(cve)),en=process.env.DATA_DIR?Ft.resolve(process.env.DATA_DIR,"collected-profiles"):Ft.join(Ive,"collected-profiles"),TN=Ft.join(en,"people.json"),ON=Ft.join(en,"jobs.json"),mV=Ft.join(en,"quota.json"),E0=Ft.join(en,"conversations.json"),SV=Ft.join(en,"sync-state.json"),HN=Ft.join(en,"application-questions.json"),FE=20,bE=100,vI=null,kI=null,ro=null,xg=null,MI=null,Lg=null;JN=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];Bve=50;hve={loadPeople:ps,savePeople:Ug,loadJobs:B0,saveJobs:h0,loadConversations:FV,saveConversations:bV,upsertPerson:YN,upsertJob:vV,linkPersonToJob:kV,addEncounter:MV,getPersonStatus:RV,updateConnectionStatus:_V,migrateFromDailyFiles:GV,loadQuota:Q0,saveQuota:jN,recordConnectionSent:NV,canSendConnection:LV,getRecentConnections:d0,getQuotaStatus:xV,loadSyncState:UV,saveSyncState:PV,commitDataSnapshot:JV,logApplicationQuestions:OV,getQuestionStats:HV}});var zV={};JE(zV,{getJobDecision:()=>yve,getLastVisit:()=>bve,getScoutStats:()=>vve,loadCompanies:()=>ZV,loadDiscoveredPeople:()=>GE,loadJobDecisions:()=>XN,loadScoutedJobs:()=>VN,loadVisitLog:()=>_I,recordVisit:()=>Fve,resetCaches:()=>pve,saveCompany:()=>Sve,saveDiscoveredPerson:()=>mve,saveScoutedJob:()=>Dve,setJobDecision:()=>wve});import"dotenv/config";import*as bn from"fs";import*as tn from"path";import{fileURLToPath as Qve}from"url";function NE(){bn.existsSync(Kg)||bn.mkdirSync(Kg,{recursive:!0})}function LE(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";bn.writeFileSync(r,A);for(let i=0;i<3;i++)try{bn.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function xE(t){try{if(bn.existsSync(t))return JSON.parse(bn.readFileSync(t,"utf-8"))}catch{}return null}function pve(){kE=null,ME=null,RE=null,_E=null,Pg=null}function VN(){return kE||(kE=xE(jV)||{},kE)}function Dve(t,e){if(!t)return;NE();let A=VN(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{LE(jV,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function XN(){return ME||(ME=xE(XV)||{},ME)}function wve(t,e,A={}){if(!t||!e)return;NE();let r=XN(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{LE(XV,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function yve(t){return XN()[t]||null}function GE(){return RE||(RE=xE(qV)||{},RE)}function mve(t,e){if(!t)return;NE();let A=GE(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{LE(qV,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function ZV(){return _E||(_E=xE(VV)||{},_E)}function Sve(t,e){if(!t)return;NE();let A=ZV(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{LE(VV,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function _I(){return Pg||(Pg=xE(WV)||{visits:[]},Array.isArray(Pg.visits)||(Pg.visits=[]),Pg)}function Fve(t,e={}){if(!t)return;NE();let A=_I();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{LE(WV,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function bve(t){let e=_I();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function vve(){let t=VN(),e=GE(),A=Object.values(t),r=Object.values(e),i={};for(let I of A)I.company&&(i[I.company]=(i[I.company]||0)+1);let n=Object.entries(i).sort((I,c)=>c[1]-I[1]).slice(0,5).map(([I,c])=>`${I} (${c})`),s={};for(let I of A)for(let c of I.techStack||[])s[c]=(s[c]||0)+1;let o=Object.entries(s).sort((I,c)=>c[1]-I[1]).slice(0,8).map(([I,c])=>`${I} (${c})`),g=_I(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(I=>I.date.startsWith(u)).length,C=new Set(g.visits.map(I=>I.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:C,todayVisited:a,lastScoutDate:A.length>0?A.sort((I,c)=>(c.scoutedAt||"").localeCompare(I.scoutedAt||""))[0]?.scoutedAt:null}}var dve,fve,Kg,jV,qV,WV,VV,XV,kE,ME,RE,_E,Pg,ZN=HE(()=>{dve=Qve(import.meta.url),fve=tn.dirname(tn.dirname(dve)),Kg=process.env.DATA_DIR?tn.resolve(process.env.DATA_DIR,"market-research"):tn.join(fve,"market-research"),jV=tn.join(Kg,"scouted-jobs.json"),qV=tn.join(Kg,"discovered-people.json"),WV=tn.join(Kg,"visit-log.json"),VV=tn.join(Kg,"companies.json"),XV=tn.join(Kg,"job-decisions.json");kE=null;ME=null;RE=null;_E=null;Pg=null});import"dotenv/config";import*as kn from"fs";import*as Tg from"path";import{fileURLToPath as Jve}from"url";var pV=n1(Y6(),1),DV=n1(QV(),1);import gve from"puppeteer";async function l0(t){let e=Math.floor(Math.random()*2001),A=t+e;return new Promise(r=>setTimeout(r,A))}import{getPluginConfig as tve}from"@ilivemylife/graph-sdk";var rve=await tve();for(let[t,e]of Object.entries(rve))process.env[t]===void 0&&(process.env[t]=e);var ive=process.env.LINKEDIN_NAME,Ng=Object.freeze({DRAFT:"draft",CONFIRMED:"confirmed",REJECTED:"rejected",NEEDS_REVIEW:"needs_review",SENT:"sent"}),qUe=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.NEEDS_REVIEW])),nve=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.REJECTED,Ng.NEEDS_REVIEW]));import dV from"fs";import sve from"path";var ove="cookies.json";function ave(){let t=process.env.ILML_SCOPE_DIR;return t?sve.join(t,"plugins-state","linkedin","cookies.json"):ove}function fV(){let t=ave();if(!dV.existsSync(t))throw new Error(`Cookies not found at ${t}. Run: ilml linkedin login`);let e;try{e=dV.readFileSync(t,"utf-8")}catch(r){throw new Error(`Failed to read cookies at ${t}: ${r.message}. Run: ilml linkedin login`)}let A;try{A=JSON.parse(e)}catch{throw new Error(`Cookies file at ${t} is corrupted (invalid JSON). Run: ilml linkedin login`)}if(!Array.isArray(A)||A.length===0)throw new Error(`Cookies file at ${t} is empty or not an array. Run: ilml linkedin login`);return A}var wV=(0,pV.addExtra)(gve);wV.use((0,DV.default)());async function yV(){let t=await wV.launch({headless:!1,defaultViewport:null,protocolTimeout:3e5}),e=async()=>{console.log(`
210
210
  Closing browser...`);try{await t.close()}catch{}process.exit(0)};process.on("SIGINT",e),process.on("SIGTERM",e);let A=await t.newPage();await A.evaluateOnNewDocument(()=>{Object.defineProperty(navigator,"webdriver",{get:()=>{}})});try{let r=fV();await A.setCookie(...r),console.log(" Browser launched, cookies loaded.")}catch(r){console.error(`
211
211
  [!] ${r.message}
212
212
  `),await t.close(),process.exit(1)}return{browser:t,page:A}}WN();ZN();async function $V(t){await t.goto("https://www.linkedin.com/analytics/profile-views/",{waitUntil:"domcontentloaded",timeout:6e4}),await l0(5e3);for(let A=0;A<5;A++)await t.evaluate(()=>window.scrollBy(0,600)),await l0(1e3);return await t.evaluate(()=>{let A=[],r=document.querySelectorAll('a[href*="/in/"]'),i=new Set;for(let n of r){let s=n.getAttribute("href")?.split("?")[0];if(!s||i.has(s))continue;i.add(s);let o=n;for(let B=0;B<8&&!(!o.parentElement||(o=o.parentElement,o.tagName==="LI"||o.classList?.contains("pvs-list__paged-list-wrapper")));B++);let g=o?.innerText?.trim()||"",u=g.split(`
package/dist/visit.mjs CHANGED
@@ -206,7 +206,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
206
206
  `),n}i.dependencies.size&&this.resolvePluginDependencies()}}orderPlugins(){Rg("orderPlugins:before",this.pluginNames);let e=this._plugins.filter(A=>A.requirements.has("runLast")).map(A=>A.name);for(let A of e){let r=this._plugins.findIndex(i=>i.name===A);this._plugins.push(this._plugins.splice(r,1)[0])}Rg("orderPlugins:after",this.pluginNames)}checkPluginRequirements(e={}){for(let A of this._plugins)for(let r of A.requirements)e.context==="launch"&&r==="headful"&&e.options.headless&&console.warn(`Warning: Plugin '${A.name}' is not supported in headless mode.`),e.context==="connect"&&r==="launch"&&console.warn(`Warning: Plugin '${A.name}' doesn't support puppeteer.connect().`)}async callPlugins(e,...A){for(let r of this.getPluginsByProp(e))await r[e].apply(r,A)}async callPluginsWithValue(e,A){for(let r of this.getPluginsByProp(e)){let i=await r[e](A);i&&(A=i)}return A}},OFe=new SE(...JFe()),HFe=t=>new SE(t);function JFe(){try{return[Y("puppeteer"),void 0]}catch{}try{return[eV(),void 0]}catch(t){return[void 0,t]}}_g.PuppeteerExtra=SE;_g.addExtra=HFe;_g.default=OFe;GN.exports=_g.default||{};Object.entries(_g).forEach(([t,e])=>{GN.exports[t]=e})});var iV=w((LUe,rV)=>{"use strict";rV.exports=function(e){if(!Array.isArray(e))throw new TypeError("arr-union expects the first argument to be an array.");for(var A=arguments.length,r=0;++r<A;){var i=arguments[r];if(i){Array.isArray(i)||(i=[i]);for(var n=0;n<i.length;n++){var s=i[n];e.indexOf(s)>=0||e.push(s)}}}return e}});var sV=w((xUe,nV)=>{"use strict";function YFe(t){var e={},A=function(r,i){i=i||jFe(r),(process.env.UNLAZY==="true"||process.env.UNLAZY===!0||process.env.TRAVIS)&&(e[i]=t(r)),Object.defineProperty(A,i,{enumerable:!0,configurable:!0,get:n});function n(){return e.hasOwnProperty(i)?e[i]:e[i]=t(r)}return n};return A}function jFe(t){return t.length===1?t.toLowerCase():(t=t.replace(/^[\W_]+|[\W_]+$/g,"").toLowerCase(),t.replace(/[\W_]+(\w|$)/g,function(e,A){return A.toUpperCase()}))}nV.exports=YFe});var aV=w((GUe,oV)=>{"use strict";oV.exports=function(e,A,r){for(var i in e)if(A.call(r,e[i],i,e)===!1)break}});var uV=w((UUe,gV)=>{"use strict";var qFe=aV(),WFe=Object.prototype.hasOwnProperty;gV.exports=function(e,A,r){qFe(e,function(i,n){if(WFe.call(e,n))return A.call(r,e[n],n,e)})}});var IV=w((PUe,lV)=>{"use strict";var cV=sV()(Y),VFe=Y;Y=cV;Y("is-plain-object","isObject");Y("shallow-clone","clone");Y("kind-of","typeOf");uV();Y=VFe;lV.exports=cV});var EV=w((TUe,CV)=>{"use strict";var lD=IV();function UN(t,e){switch(lD.typeOf(t)){case"object":return XFe(t,e);case"array":return ZFe(t,e);default:return lD.clone(t)}}function XFe(t,e){if(lD.isObject(t)){var A={};return lD.forOwn(t,function(r,i){this[i]=UN(r,e)},A),A}else return e?e(t):t}function ZFe(t,e){for(var A=t.length,r=[],i=-1;++i<A;)r[i]=UN(t[i],e);return r}CV.exports=UN});var dV=w((OUe,hV)=>{hV.exports=function(t){return t!=null&&(BV(t)||zFe(t)||!!t._isBuffer)};function BV(t){return!!t.constructor&&typeof t.constructor.isBuffer=="function"&&t.constructor.isBuffer(t)}function zFe(t){return typeof t.readFloatLE=="function"&&typeof t.slice=="function"&&BV(t.slice(0,0))}});var fV=w((HUe,QV)=>{var $Fe=dV(),eve=Object.prototype.toString;QV.exports=function(e){if(typeof e>"u")return"undefined";if(e===null)return"null";if(e===!0||e===!1||e instanceof Boolean)return"boolean";if(typeof e=="string"||e instanceof String)return"string";if(typeof e=="number"||e instanceof Number)return"number";if(typeof e=="function"||e instanceof Function)return"function";if(typeof Array.isArray<"u"&&Array.isArray(e))return"array";if(e instanceof RegExp)return"regexp";if(e instanceof Date)return"date";var A=eve.call(e);return A==="[object RegExp]"?"regexp":A==="[object Date]"?"date":A==="[object Arguments]"?"arguments":A==="[object Error]"?"error":$Fe(e)?"buffer":A==="[object Set]"?"set":A==="[object WeakSet]"?"weakset":A==="[object Map]"?"map":A==="[object WeakMap]"?"weakmap":A==="[object Symbol]"?"symbol":A==="[object Int8Array]"?"int8array":A==="[object Uint8Array]"?"uint8array":A==="[object Uint8ClampedArray]"?"uint8clampedarray":A==="[object Int16Array]"?"int16array":A==="[object Uint16Array]"?"uint16array":A==="[object Int32Array]"?"int32array":A==="[object Uint32Array]"?"uint32array":A==="[object Float32Array]"?"float32array":A==="[object Float64Array]"?"float64array":"object"}});var mV=w((JUe,yV)=>{"use strict";var Ave=iV(),DV=EV(),pV=fV();yV.exports=function(e,A){!ID(e)&&!Array.isArray(e)&&(e={});for(var r=DV(e),i=arguments.length,n=0;++n<i;){var s=arguments[n];(ID(s)||Array.isArray(s))&&wV(r,s)}return r};function wV(t,e){for(var A in e)if(!(!rve(A)||!tve(e,A))){var r=e[A],i=t[A];ID(i)&&ID(r)?t[A]=wV(i,r):Array.isArray(i)?t[A]=Ave([],i,r):t[A]=DV(r)}return t}function tve(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function ID(t){return pV(t)==="object"||pV(t)==="function"}function rve(t){return t!=="__proto__"&&t!=="constructor"&&t!=="prototype"}});var bV=w(KN=>{"use strict";Object.defineProperty(KN,"__esModule",{value:!0});function ive(t){return t&&typeof t=="object"&&"default"in t?t.default:t}var SV=ive(wt()),nve=mV(),PN=class{constructor(e){this._debugBase=SV(`puppeteer-extra-plugin:base:${this.name}`),this._childClassMembers=[],this._opts=nve(this.defaults,e||{}),this._debugBase("Initialized.")}get name(){throw new Error('Plugin must override "name"')}get defaults(){return{}}get requirements(){return new Set([])}get dependencies(){return new Set([])}get data(){return[]}get opts(){return this._opts}get debug(){return SV(`puppeteer-extra-plugin:${this.name}`)}async beforeLaunch(e){}async afterLaunch(e,A={options:{}}){}async beforeConnect(e){}async afterConnect(e,A={}){}async onBrowser(e,A){}async onTargetCreated(e){}async onPageCreated(e){}async onTargetChanged(e){}async onTargetDestroyed(e){}async onDisconnected(){}async onClose(){}async onPluginRegistered(){}getDataFromPlugins(e){return[]}_getMissingDependencies(e){let A=new Set(e.map(i=>i.name));return new Set(Array.from(this.dependencies.values()).filter(i=>!A.has(i)))}async _bindBrowserEvents(e,A={}){(this._hasChildClassMember("onTargetCreated")||this._hasChildClassMember("onPageCreated"))&&e.on("targetcreated",this._onTargetCreated.bind(this)),this._hasChildClassMember("onTargetChanged")&&this.onTargetChanged&&e.on("targetchanged",this.onTargetChanged.bind(this)),this._hasChildClassMember("onTargetDestroyed")&&this.onTargetDestroyed&&e.on("targetdestroyed",this.onTargetDestroyed.bind(this)),this._hasChildClassMember("onDisconnected")&&this.onDisconnected&&e.on("disconnected",this.onDisconnected.bind(this)),A.context==="launch"&&this._hasChildClassMember("onClose")&&this.onClose&&(process.on("exit",this.onClose.bind(this)),e.on("disconnected",this.onClose.bind(this)),A.options.handleSIGINT!==!1&&process.on("SIGINT",this.onClose.bind(this)),A.options.handleSIGTERM!==!1&&process.on("SIGTERM",this.onClose.bind(this)),A.options.handleSIGHUP!==!1&&process.on("SIGHUP",this.onClose.bind(this))),A.context==="launch"&&this.afterLaunch&&await this.afterLaunch(e,A),A.context==="connect"&&this.afterConnect&&await this.afterConnect(e,A),this.onBrowser&&await this.onBrowser(e,A)}async _onTargetCreated(e){if(this.onTargetCreated&&await this.onTargetCreated(e),e.type()==="page")try{let A=await e.page();if(!A)return;let r="isClosed"in A&&!A.isClosed();this.onPageCreated&&r&&await this.onPageCreated(A)}catch(A){console.error(A)}}_register(e){this._registerChildClassMembers(e),this.onPluginRegistered&&this.onPluginRegistered()}_registerChildClassMembers(e){this._childClassMembers=Object.getOwnPropertyNames(e)}_hasChildClassMember(e){return!!this._childClassMembers.includes(e)}get _isPuppeteerExtraPlugin(){return!0}};KN.PuppeteerExtraPlugin=PN});var vV=w((jUe,FV)=>{"use strict";var{PuppeteerExtraPlugin:sve}=bV(),TN=class extends sve{constructor(e={}){super(e)}get name(){return"stealth"}get defaults(){let e=new Set(["chrome.app","chrome.csi","chrome.loadTimes","chrome.runtime","defaultArgs","iframe.contentWindow","media.codecs","navigator.hardwareConcurrency","navigator.languages","navigator.permissions","navigator.plugins","navigator.webdriver","sourceurl","user-agent-override","webgl.vendor","window.outerdimensions"]);return{availableEvasions:e,enabledEvasions:new Set([...e])}}get dependencies(){return new Set([...this.opts.enabledEvasions].map(e=>`${this.name}/evasions/${e}`))}get availableEvasions(){return this.defaults.availableEvasions}get enabledEvasions(){return this.opts.enabledEvasions}set enabledEvasions(e){this.opts.enabledEvasions=e}async onBrowser(e){e&&e.setMaxListeners&&e.setMaxListeners(30)}},ove=t=>new TN(t);FV.exports=ove});var ZV={};JE(ZV,{addEncounter:()=>WN,canSendConnection:()=>$N,commitDataSnapshot:()=>XV,default:()=>wve,getAllApplications:()=>qV,getPersonStatus:()=>VN,getQuestionStats:()=>VV,getQuotaStatus:()=>e1,getRecentConnections:()=>dD,linkPersonToJob:()=>OV,loadApplicationQuestions:()=>A1,loadConversations:()=>PV,loadJobs:()=>ED,loadPeople:()=>Fn,loadQuota:()=>hD,loadSyncState:()=>JV,logApplicationQuestions:()=>WV,migrateFromDailyFiles:()=>HV,recordConnectionSent:()=>zN,resetCaches:()=>Qve,saveConversations:()=>KV,saveJobs:()=>BD,savePeople:()=>Ug,saveQuota:()=>ZN,saveSyncState:()=>YV,updateConnectionStatus:()=>XN,upsertJob:()=>TV,upsertPerson:()=>qN});import"dotenv/config";import*as rt from"fs";import*as bt from"path";import{fileURLToPath as Bve}from"url";import{execSync as ON}from"child_process";function Qve(){kl=null,Ml=null,to=null,xg=null,Rl=null,Lg=null}function An(){rt.existsSync(en)||rt.mkdirSync(en,{recursive:!0})}function Gg(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";rt.writeFileSync(r,A);for(let i=0;i<3;i++)try{rt.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function vE(t,e){if(!rt.existsSync(t))return null;try{let A=JSON.parse(rt.readFileSync(t,"utf-8"));try{rt.copyFileSync(t,t+".backup")}catch{}return A}catch(A){console.error(`[!] ${e} is corrupted: ${A.message}`),console.error(` File: ${bt.resolve(t)}`);let r=t+".backup";if(rt.existsSync(r))try{let i=JSON.parse(rt.readFileSync(r,"utf-8"));console.error(` Restored from ${r}`);try{rt.copyFileSync(r,t)}catch{}return i}catch{console.error(" Backup also corrupted!")}console.error(` Starting with empty data. Old file preserved as ${t}.corrupted`);try{rt.copyFileSync(t,t+".corrupted")}catch{}return null}}function _l(){return new Date().toISOString().split("T")[0]}function Fn(){return kl||(An(),kl=vE(HN,"people.json")||{},kl)}function Ug(t){An(),kl=t;try{Gg(HN,t)}catch(e){console.error(`[!] Failed to save people.json: ${e.message}`),console.error(` Path: ${bt.resolve(HN)}`)}}function ED(){return Ml||(An(),Ml=vE(JN,"jobs.json")||{},Ml)}function BD(t){An(),Ml=t;try{Gg(JN,t)}catch(e){console.error(`[!] Failed to save jobs.json: ${e.message}`),console.error(` Path: ${bt.resolve(JN)}`)}}function PV(){return xg||(An(),xg=vE(CD,"conversations.json")||{},fve(xg),xg)}function fve(t){let e=0;for(let A of Object.values(t)){if(!(A.draftStatus!==void 0||A.draftPreparedAt!==void 0))continue;let i=(A.messages||[]).find(n=>n.status==="draft");i&&A.draftStatus&&A.draftStatus!=="pending"&&(i.status=A.draftStatus),delete A.draftStatus,delete A.draftPreparedAt,e++}if(e>0){console.log(` [migration] Moved draft state from conv to msg.status for ${e} conversations`);try{Gg(CD,t)}catch{}}}function KV(t){An(),xg=t;try{Gg(CD,t)}catch(e){console.error(`[!] Failed to save conversations.json: ${e.message}`),console.error(` Path: ${bt.resolve(CD)}`)}}function qN(t,e={}){if(!t)return null;let A=Fn(),r=_l(),i=new Date().toISOString(),n=A[t];if(n){n.seenCount=(n.seenCount||1)+1,n.lastSeen=r,n.lastUpdated=i,e.source&&!n.sources?.includes(e.source)&&(n.sources=n.sources||[],n.sources.push(e.source));for(let s of jN)e[s]!=null&&(n[s]=e[s])}else A[t]={name:e.name||null,title:e.title||null,location:e.location||null,company:e.company||null,connectionDegree:e.connectionDegree||null,connectionsCount:e.connectionsCount||null,mutualConnections:e.mutualConnections||null,photoUrl:e.photoUrl||null,hasVerifiedBadge:e.hasVerifiedBadge||!1,firstSeen:r,lastSeen:r,seenCount:1,sources:e.source?[e.source]:[],connectionStatus:null,connectionDate:null,connectionMethod:null,messageSent:null,jobIds:[],lastUpdated:i};return Ug(A),A[t]}function TV(t,e={}){if(!t)return null;let A=ED(),r=_l(),i=A[t];if(i){let n=["title","company","companyUrl","location","salary","url","applied","appliedDate","recruiterUrl","description","techStack","jobTags","seniority","employmentType","industries","jobFunction","postedTime","applicantCount","companySize","workplaceType","contractType","isEasyApply","applyType","scoutedAt","lastSeen"];for(let s of n)e[s]!=null&&(i[s]=e[s])}else A[t]={title:e.title||null,company:e.company||null,location:e.location||null,salary:e.salary||null,url:e.url||null,applied:e.applied||!1,appliedDate:e.appliedDate||r,recruiterUrl:e.recruiterUrl||null,firstSeen:r};return BD(A),A[t]}function OV(t,e){if(!t||!e)return;let A=Fn(),r=A[t];r&&(r.jobIds||(r.jobIds=[]),r.jobIds.includes(e)||(r.jobIds.push(e),r.lastUpdated=new Date().toISOString(),Ug(A)))}function WN(t,e){if(!t||!e)return;let A=Fn(),r=A[t];if(!r)return;r.encounters||(r.encounters=[]);let n={date:_l(),source:e.source||"unknown",action:e.action||"unknown"};e.jobId&&(n.jobId=String(e.jobId)),e.jobTitle&&(n.jobTitle=e.jobTitle),e.jobCompany&&(n.jobCompany=e.jobCompany),!r.encounters.some(o=>o.date===n.date&&o.source===n.source&&o.action===n.action&&(o.jobId||"")===(n.jobId||""))&&(r.encounters.push(n),r.lastUpdated=new Date().toISOString(),Ug(A))}function VN(t){return t&&Fn()[t]?.connectionStatus||null}function XN(t,e,A={}){if(!t)return;let r=Fn(),i=r[t];if(i||(qN(t,A.profileInfo||{}),i=r[t]),!!i){if(i.connectionStatus=e,i.connectionDate=_l(),i.connectionMethod=A.method||i.connectionMethod,i.messageSent=A.messageSent||i.messageSent,i.lastUpdated=new Date().toISOString(),A.profileInfo)for(let n of jN)A.profileInfo[n]!=null&&(i[n]=A.profileInfo[n]);Ug(r)}}function hD(){return to||(An(),to=vE(GV,"quota.json"),(!to||!to.connections)&&(to={connections:[]}),to)}function ZN(t){An(),to=t;try{Gg(GV,t)}catch(e){console.error(`[!] Failed to save quota.json: ${e.message}`)}}function zN(t,e="unknown"){let A=hD(),r=new Date;A.connections.push({date:r.toISOString().split("T")[0],time:r.toTimeString().split(" ")[0],profileUrl:t,source:e}),ZN(A)}function dD(){let t=hD(),e=new Date;e.setDate(e.getDate()-7);let A=e.toISOString().split("T")[0];return t.connections.filter(r=>r.date>=A)}function $N(){let t=dD(),e=_l(),A=t.filter(g=>g.date===e).length,r=t.length,i=A>=bE,n=r>=FE,s=!i&&!n,o={allowed:s,daily:{sent:A,max:bE},weekly:{sent:r,max:FE}};return s||(o.reason=i?`Daily limit reached (${A}/${bE})`:`Weekly limit reached (${r}/${FE})`),o}function e1(){let t=dD(),e=_l(),A=t.filter(i=>i.date===e).length,r=t.length;return{daily:{sent:A,max:bE,remaining:bE-A},weekly:{sent:r,max:FE,remaining:FE-r}}}function pve(t){if(!t)return null;let e=t.match(/jobs\/view\/(\d+)/);return e?e[1]:null}function HV(){An();let t=rt.readdirSync(en).filter(n=>n.endsWith(".json")&&n!=="people.json"&&n!=="jobs.json"&&n!=="quota.json");if(t.length===0)return console.log("No daily files found to migrate."),{people:0,jobs:0};console.log(`
207
207
  Migrating from ${t.length} daily files...
208
208
  `);let e=Fn(),A=ED(),r=0,i=0;t.sort();for(let n of t){let s=bt.join(en,n),o;try{o=JSON.parse(rt.readFileSync(s,"utf-8"))}catch(a){console.log(` Skipping ${n}: ${a.message}`);continue}let g=o.date||n.match(/\d{4}-\d{2}-\d{2}/)?.[0]||null,u=o.source||n.split("-").slice(0,-1).join("-").replace(/-\d{4}$/,"")||"unknown";if(!o.profiles||!Array.isArray(o.profiles)){console.log(` Skipping ${n}: no profiles array`);continue}console.log(` ${n}: ${o.profiles.length} profiles`);for(let a of o.profiles){let I=a.profileUrl;if(!I)continue;let l=e[I];if(l){l.seenCount=(l.seenCount||1)+1,g&&(!l.lastSeen||g>l.lastSeen)&&(l.lastSeen=g),g&&(!l.firstSeen||g<l.firstSeen)&&(l.firstSeen=g),u&&!l.sources?.includes(u)&&(l.sources=l.sources||[],l.sources.push(u));for(let c of jN)a[c]!=null&&(l[c]=a[c]);a.status&&a.processed&&(l.connectionStatus=a.status,l.connectionDate=g,a.funnelResult&&(l.connectionMethod=a.funnelResult.method||l.connectionMethod,l.messageSent=a.funnelResult.message||l.messageSent)),l.lastUpdated=new Date().toISOString()}else e[I]={name:a.name||null,title:a.title||null,location:a.location||null,company:a.company||null,connectionDegree:a.connectionDegree||null,connectionsCount:a.connectionsCount||null,mutualConnections:a.mutualConnections||null,photoUrl:a.photoUrl||null,hasVerifiedBadge:a.hasVerifiedBadge||!1,firstSeen:g,lastSeen:g,seenCount:1,sources:u?[u]:[],connectionStatus:a.processed&&a.status||null,connectionDate:a.processed?g:null,connectionMethod:a.funnelResult?.method||null,messageSent:a.funnelResult?.message||null,jobIds:[],lastUpdated:new Date().toISOString()},r++;if(a.fromJob?.url){let c=pve(a.fromJob.url);c&&(e[I].jobIds||(e[I].jobIds=[]),e[I].jobIds.includes(c)||e[I].jobIds.push(c),A[c]?A[c].recruiterUrl||(A[c].recruiterUrl=I):(A[c]={title:a.fromJob.title||null,company:a.fromJob.company||null,location:null,salary:null,url:a.fromJob.url,applied:!0,appliedDate:g,recruiterUrl:I,firstSeen:g},i++))}}}return Ug(e),BD(A),console.log(`
209
- Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function JV(){return Rl||(An(),Rl=vE(UV,"sync-state.json")||{},Rl)}function YV(t){An(),Rl=t;try{Gg(UV,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function A1(){if(Lg)return Lg;An();try{rt.existsSync(YN)&&(Lg=JSON.parse(rt.readFileSync(YN,"utf-8")))}catch{}return Lg||(Lg={}),Lg}function jV(t){return Array.isArray(t.applications)}function qV(){let t=A1();if(jV(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function WV(t){if(!t||!t.questions||t.questions.length===0)return;let e=A1(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=Dve?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),s})};jV(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{Gg(YN,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function VV(){let t=qV(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function XV(t){if(rt.existsSync(bt.join(en,".git")))try{let e={cwd:en,stdio:"pipe",timeout:1e4};ON("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{ON("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');ON(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var hve,dve,en,HN,JN,GV,CD,UV,YN,bE,FE,kl,Ml,to,xg,Rl,Lg,jN,Dve,wve,QD=HE(()=>{hve=Bve(import.meta.url),dve=bt.dirname(bt.dirname(hve)),en=process.env.DATA_DIR?bt.resolve(process.env.DATA_DIR,"collected-profiles"):bt.join(dve,"collected-profiles"),HN=bt.join(en,"people.json"),JN=bt.join(en,"jobs.json"),GV=bt.join(en,"quota.json"),CD=bt.join(en,"conversations.json"),UV=bt.join(en,"sync-state.json"),YN=bt.join(en,"application-questions.json"),bE=20,FE=100,kl=null,Ml=null,to=null,xg=null,Rl=null,Lg=null;jN=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];Dve=50;wve={loadPeople:Fn,savePeople:Ug,loadJobs:ED,saveJobs:BD,loadConversations:PV,saveConversations:KV,upsertPerson:qN,upsertJob:TV,linkPersonToJob:OV,addEncounter:WN,getPersonStatus:VN,updateConnectionStatus:XN,migrateFromDailyFiles:HV,loadQuota:hD,saveQuota:ZN,recordConnectionSent:zN,canSendConnection:$N,getRecentConnections:dD,getQuotaStatus:e1,loadSyncState:JV,saveSyncState:YV,commitDataSnapshot:XV,logApplicationQuestions:WV,getQuestionStats:VV}});var n9={};JE(n9,{getJobDecision:()=>Mve,getLastVisit:()=>n1,getScoutStats:()=>s1,loadCompanies:()=>i9,loadDiscoveredPeople:()=>Nl,loadJobDecisions:()=>r1,loadScoutedJobs:()=>t1,loadVisitLog:()=>Tg,recordVisit:()=>i1,resetCaches:()=>Fve,saveCompany:()=>_ve,saveDiscoveredPerson:()=>Rve,saveScoutedJob:()=>vve,setJobDecision:()=>kve});import"dotenv/config";import*as vn from"fs";import*as tn from"path";import{fileURLToPath as mve}from"url";function NE(){vn.existsSync(Kg)||vn.mkdirSync(Kg,{recursive:!0})}function LE(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";vn.writeFileSync(r,A);for(let i=0;i<3;i++)try{vn.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function xE(t){try{if(vn.existsSync(t))return JSON.parse(vn.readFileSync(t,"utf-8"))}catch{}return null}function Fve(){kE=null,ME=null,RE=null,_E=null,Pg=null}function t1(){return kE||(kE=xE($V)||{},kE)}function vve(t,e){if(!t)return;NE();let A=t1(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{LE($V,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function r1(){return ME||(ME=xE(r9)||{},ME)}function kve(t,e,A={}){if(!t||!e)return;NE();let r=r1(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{LE(r9,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function Mve(t){return r1()[t]||null}function Nl(){return RE||(RE=xE(e9)||{},RE)}function Rve(t,e){if(!t)return;NE();let A=Nl(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{LE(e9,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function i9(){return _E||(_E=xE(t9)||{},_E)}function _ve(t,e){if(!t)return;NE();let A=i9(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{LE(t9,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function Tg(){return Pg||(Pg=xE(A9)||{visits:[]},Array.isArray(Pg.visits)||(Pg.visits=[]),Pg)}function i1(t,e={}){if(!t)return;NE();let A=Tg();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{LE(A9,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function n1(t){let e=Tg();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function s1(){let t=t1(),e=Nl(),A=Object.values(t),r=Object.values(e),i={};for(let l of A)l.company&&(i[l.company]=(i[l.company]||0)+1);let n=Object.entries(i).sort((l,c)=>c[1]-l[1]).slice(0,5).map(([l,c])=>`${l} (${c})`),s={};for(let l of A)for(let c of l.techStack||[])s[c]=(s[c]||0)+1;let o=Object.entries(s).sort((l,c)=>c[1]-l[1]).slice(0,8).map(([l,c])=>`${l} (${c})`),g=Tg(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(l=>l.date.startsWith(u)).length,I=new Set(g.visits.map(l=>l.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:I,todayVisited:a,lastScoutDate:A.length>0?A.sort((l,c)=>(c.scoutedAt||"").localeCompare(l.scoutedAt||""))[0]?.scoutedAt:null}}var Sve,bve,Kg,$V,e9,A9,t9,r9,kE,ME,RE,_E,Pg,fD=HE(()=>{Sve=mve(import.meta.url),bve=tn.dirname(tn.dirname(Sve)),Kg=process.env.DATA_DIR?tn.resolve(process.env.DATA_DIR,"market-research"):tn.join(bve,"market-research"),$V=tn.join(Kg,"scouted-jobs.json"),e9=tn.join(Kg,"discovered-people.json"),A9=tn.join(Kg,"visit-log.json"),t9=tn.join(Kg,"companies.json"),r9=tn.join(Kg,"job-decisions.json");kE=null;ME=null;RE=null;_E=null;Pg=null});var _V=B1(tV(),1),NV=B1(vV(),1);import Eve from"puppeteer";async function pa(t){let e=Math.floor(Math.random()*2001),A=t+e;return new Promise(r=>setTimeout(r,A))}async function kV(t){return await t.evaluate(()=>{let e=document.querySelectorAll("div.artdeco-modal--is-open");for(let r of e){let i=r.innerText||"",n=i.includes("Premium")||i.includes("premium")||i.includes("Upgrade")||i.includes("upgrade"),s=i.includes("Try for")||i.includes("free trial")||i.includes("/month")||i.includes("per month")||i.includes("Start my")||i.includes("Subscribe"),o=i.includes("Get hired faster")||i.includes("Get hired 2x");if(n||s||o){let g=r.querySelector('button[aria-label="Dismiss"]')||r.querySelector("button.artdeco-modal__dismiss")||r.querySelector("button[data-test-modal-close-btn]");if(g)return g.click(),{dismissed:!0,matched:i.substring(0,80)};let u=r.querySelectorAll("button");for(let a of u){let I=a.innerText?.trim().toLowerCase()||"",l=a.getAttribute("aria-label")?.toLowerCase()||"";if(I==="not now"||I==="no thanks"||I==="dismiss"||l.includes("dismiss"))return a.click(),{dismissed:!0,matched:i.substring(0,80)}}}}let A=document.querySelector(".premium-upsell-link")||document.querySelector("[data-test-premium-upsell]")||document.querySelector(".premium-hub-upsell");if(A){let r=A.closest('[class*="modal"]')?.querySelector('button[aria-label="Dismiss"]')||A.closest('[class*="banner"]')?.querySelector('button[aria-label="Close"]');if(r)return r.click(),{dismissed:!0,matched:"premium-banner"}}return!1})}import{getPluginConfig as ave}from"@ilivemylife/graph-sdk";var gve=await ave();for(let[t,e]of Object.entries(gve))process.env[t]===void 0&&(process.env[t]=e);var uve=process.env.LINKEDIN_NAME,Ng=Object.freeze({DRAFT:"draft",CONFIRMED:"confirmed",REJECTED:"rejected",NEEDS_REVIEW:"needs_review",SENT:"sent"}),VUe=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.NEEDS_REVIEW])),cve=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.REJECTED,Ng.NEEDS_REVIEW]));import MV from"fs";import lve from"path";var Ive="cookies.json";function Cve(){let t=process.env.ILML_SCOPE_DIR;return t?lve.join(t,"plugins-state","linkedin","cookies.json"):Ive}function RV(){let t=Cve();if(!MV.existsSync(t))throw new Error(`Cookies not found at ${t}. Run: ilml linkedin login`);let e;try{e=MV.readFileSync(t,"utf-8")}catch(r){throw new Error(`Failed to read cookies at ${t}: ${r.message}. Run: ilml linkedin login`)}let A;try{A=JSON.parse(e)}catch{throw new Error(`Cookies file at ${t} is corrupted (invalid JSON). Run: ilml linkedin login`)}if(!Array.isArray(A)||A.length===0)throw new Error(`Cookies file at ${t} is empty or not an array. Run: ilml linkedin login`);return A}var LV=(0,_V.addExtra)(Eve);LV.use((0,NV.default)());async function xV(){let t=await LV.launch({headless:!1,defaultViewport:null,protocolTimeout:3e5}),e=async()=>{console.log(`
209
+ Migration complete!`),console.log(` People: ${Object.keys(e).length} total (${r} new)`),console.log(` Jobs: ${Object.keys(A).length} total (${i} new)`),{people:Object.keys(e).length,jobs:Object.keys(A).length}}function JV(){return Rl||(An(),Rl=vE(UV,"sync-state.json")||{},Rl)}function YV(t){An(),Rl=t;try{Gg(UV,t)}catch(e){console.error(`[!] Failed to save sync-state.json: ${e.message}`)}}function A1(){if(Lg)return Lg;An();try{rt.existsSync(YN)&&(Lg=JSON.parse(rt.readFileSync(YN,"utf-8")))}catch{}return Lg||(Lg={}),Lg}function jV(t){return Array.isArray(t.applications)}function qV(){let t=A1();if(jV(t))return t.applications;let e=[];for(let A of Object.values(t))A.applications&&e.push(...A.applications);return e}function WV(t){if(!t||!t.questions||t.questions.length===0)return;let e=A1(),A=t.jobId||"unknown",i={applicationId:`${A}_${Date.now()}`,date:new Date().toISOString(),result:t.result||"submitted",formPages:t.formPages||null,duration:t.duration||null,retries:t.retries||0,failedField:t.failedField||null,questionCount:t.questions.length,questions:t.questions.map(n=>{let s={type:n.type||"input",question:n.labelText||n.question||"",answer:n.answer||""};return n.options&&(n.options.length<=Dve?s.options=n.options:s.optionsOmitted=!0),n.page&&(s.page=n.page),n.wasPreFilled&&(s.wasPreFilled=!0),n.wasRetry&&(s.wasRetry=!0),typeof n.isRequired=="boolean"&&(s.isRequired=n.isRequired),n.wasOptional&&(s.wasOptional=!0),s})};jV(e)?(i.jobId=A,i.jobTitle=t.jobTitle||null,i.jobCompany=t.jobCompany||null,i.jobUrl=t.jobUrl||null,e.applications.push(i)):(e[A]||(e[A]={applications:[]}),e[A].applications.push(i));try{Gg(YN,e)}catch(n){console.error(`[!] Failed to save application-questions.json: ${n.message}`)}}function VV(){let t=qV(),e=new Map;for(let n of t)for(let s of n.questions||[]){let o=s.question.toLowerCase().trim();if(!o)continue;e.has(o)||e.set(o,{question:s.question,count:0,answers:new Map});let g=e.get(o);g.count++;let u=(s.answer||"").trim();g.answers.set(u,(g.answers.get(u)||0)+1)}let A=[...e.values()].sort((n,s)=>s.count-n.count),r=A.slice(0,15).map(n=>({question:n.question,count:n.count,topAnswer:[...n.answers.entries()].sort((s,o)=>o[1]-s[1])[0]?.[0]||""})),i=A.filter(n=>n.answers.size>1&&n.count>=3).map(n=>({question:n.question,count:n.count,answers:[...n.answers.entries()].sort((s,o)=>o[1]-s[1]).map(([s,o])=>`${s} (${o}x)`)}));return{totalApplications:t.length,uniqueQuestions:e.size,topQuestions:r,inconsistent:i}}function XV(t){if(rt.existsSync(bt.join(en,".git")))try{let e={cwd:en,stdio:"pipe",timeout:1e4};ON("git add conversations.json people.json jobs.json quota.json sync-state.json run-log.json application-questions.json",e);try{ON("git diff --cached --quiet",e);return}catch{}let A=(t||`sync ${new Date().toISOString().slice(0,16)}`).replace(/"/g,'\\"');ON(`git commit -m "${A}"`,e)}catch(e){process.env.VERBOSE&&console.log(` [git] snapshot skipped: ${e.message?.slice(0,80)}`)}}var hve,dve,en,HN,JN,GV,CD,UV,YN,bE,FE,kl,Ml,to,xg,Rl,Lg,jN,Dve,wve,QD=HE(()=>{hve=Bve(import.meta.url),dve=bt.dirname(bt.dirname(hve)),en=process.env.DATA_DIR?bt.resolve(process.env.DATA_DIR,"collected-profiles"):bt.join(dve,"collected-profiles"),HN=bt.join(en,"people.json"),JN=bt.join(en,"jobs.json"),GV=bt.join(en,"quota.json"),CD=bt.join(en,"conversations.json"),UV=bt.join(en,"sync-state.json"),YN=bt.join(en,"application-questions.json"),bE=20,FE=100,kl=null,Ml=null,to=null,xg=null,Rl=null,Lg=null;jN=["name","title","location","company","connectionDegree","connectionsCount","mutualConnections","photoUrl","hasVerifiedBadge"];Dve=50;wve={loadPeople:Fn,savePeople:Ug,loadJobs:ED,saveJobs:BD,loadConversations:PV,saveConversations:KV,upsertPerson:qN,upsertJob:TV,linkPersonToJob:OV,addEncounter:WN,getPersonStatus:VN,updateConnectionStatus:XN,migrateFromDailyFiles:HV,loadQuota:hD,saveQuota:ZN,recordConnectionSent:zN,canSendConnection:$N,getRecentConnections:dD,getQuotaStatus:e1,loadSyncState:JV,saveSyncState:YV,commitDataSnapshot:XV,logApplicationQuestions:WV,getQuestionStats:VV}});var n9={};JE(n9,{getJobDecision:()=>Mve,getLastVisit:()=>n1,getScoutStats:()=>s1,loadCompanies:()=>i9,loadDiscoveredPeople:()=>Nl,loadJobDecisions:()=>r1,loadScoutedJobs:()=>t1,loadVisitLog:()=>Tg,recordVisit:()=>i1,resetCaches:()=>Fve,saveCompany:()=>_ve,saveDiscoveredPerson:()=>Rve,saveScoutedJob:()=>vve,setJobDecision:()=>kve});import"dotenv/config";import*as vn from"fs";import*as tn from"path";import{fileURLToPath as mve}from"url";function NE(){vn.existsSync(Kg)||vn.mkdirSync(Kg,{recursive:!0})}function LE(t,e){let A=JSON.stringify(e,null,2),r=t+".tmp";vn.writeFileSync(r,A);for(let i=0;i<3;i++)try{vn.renameSync(r,t);return}catch(n){if(i<2&&(n.code==="EPERM"||n.code==="EBUSY")){let s=Date.now();for(;Date.now()-s<200;);continue}throw n}}function xE(t){try{if(vn.existsSync(t))return JSON.parse(vn.readFileSync(t,"utf-8"))}catch{}return null}function Fve(){kE=null,ME=null,RE=null,_E=null,Pg=null}function t1(){return kE||(kE=xE($V)||{},kE)}function vve(t,e){if(!t)return;NE();let A=t1(),r=new Date().toISOString().slice(0,10);if(A[t]){for(let[i,n]of Object.entries(e))n!=null&&(A[t][i]=n);A[t].lastSeen=r}else A[t]={...e,scoutedAt:r,lastSeen:r};try{LE($V,A)}catch(i){console.error(`[!] Failed to save scouted-jobs.json: ${i.message}`)}}function r1(){return ME||(ME=xE(r9)||{},ME)}function kve(t,e,A={}){if(!t||!e)return;NE();let r=r1(),i=new Date().toISOString().slice(0,10);r[t]?(r[t].status=e,r[t].updatedAt=i,A.reason&&(r[t].reason=A.reason),A.score!=null&&(r[t].score=A.score),A.source&&(r[t].source=A.source)):r[t]={status:e,decidedAt:i,updatedAt:i,reason:A.reason||null,score:A.score??null,source:A.source||null};try{LE(r9,r)}catch(n){console.error(`[!] Failed to save job-decisions.json: ${n.message}`)}}function Mve(t){return r1()[t]||null}function Nl(){return RE||(RE=xE(e9)||{},RE)}function Rve(t,e){if(!t)return;NE();let A=Nl(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.title&&(i.title=e.title),e.company&&(i.company=e.company),e.location&&(i.location=e.location),e.role&&(i.role=e.role),e.isConnected!=null&&(i.isConnected=e.isConnected),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),i.lastSeen=r,i.seenCount=(i.seenCount||1)+1}else A[t]={name:e.name||null,title:e.title||null,company:e.company||null,location:e.location||null,role:e.role||null,source:e.source||"scout",isConnected:e.isConnected||!1,discoveredAt:r,lastSeen:r,seenCount:1,jobIds:e.jobId?[e.jobId]:[]};try{LE(e9,A)}catch(i){console.error(`[!] Failed to save discovered-people.json: ${i.message}`)}}function i9(){return _E||(_E=xE(t9)||{},_E)}function _ve(t,e){if(!t)return;NE();let A=i9(),r=new Date().toISOString().slice(0,10);if(A[t]){let i=A[t];e.name&&(i.name=e.name),e.about&&(i.about=e.about),e.size&&(i.size=e.size),e.industries&&(i.industries=e.industries),e.jobId&&(i.jobIds||(i.jobIds=[]),i.jobIds.includes(e.jobId)||i.jobIds.push(e.jobId)),e.recruiterUrl&&(i.recruiterUrls||(i.recruiterUrls=[]),i.recruiterUrls.includes(e.recruiterUrl)||i.recruiterUrls.push(e.recruiterUrl)),i.lastSeen=r,i.jobCount=i.jobIds?.length||0}else A[t]={name:e.name||null,about:e.about||null,size:e.size||null,industries:e.industries||null,discoveredAt:r,lastSeen:r,jobIds:e.jobId?[e.jobId]:[],recruiterUrls:e.recruiterUrl?[e.recruiterUrl]:[],jobCount:e.jobId?1:0};try{LE(t9,A)}catch(i){console.error(`[!] Failed to save companies.json: ${i.message}`)}}function Tg(){return Pg||(Pg=xE(A9)||{visits:[]},Array.isArray(Pg.visits)||(Pg.visits=[]),Pg)}function i1(t,e={}){if(!t)return;NE();let A=Tg();A.visits.push({date:new Date().toISOString(),profileUrl:t,name:e.name||null,source:e.source||"manual"});let r=Date.now()-90*24*60*60*1e3;A.visits=A.visits.filter(i=>new Date(i.date).getTime()>r);try{LE(A9,A)}catch(i){console.error(`[!] Failed to save visit-log.json: ${i.message}`)}}function n1(t){let e=Tg();for(let A=e.visits.length-1;A>=0;A--)if(e.visits[A].profileUrl===t)return e.visits[A].date;return null}function s1(){let t=t1(),e=Nl(),A=Object.values(t),r=Object.values(e),i={};for(let l of A)l.company&&(i[l.company]=(i[l.company]||0)+1);let n=Object.entries(i).sort((l,c)=>c[1]-l[1]).slice(0,5).map(([l,c])=>`${l} (${c})`),s={};for(let l of A)for(let c of l.techStack||[])s[c]=(s[c]||0)+1;let o=Object.entries(s).sort((l,c)=>c[1]-l[1]).slice(0,8).map(([l,c])=>`${l} (${c})`),g=Tg(),u=new Date().toISOString().slice(0,10),a=g.visits.filter(l=>l.date.startsWith(u)).length,I=new Set(g.visits.map(l=>l.profileUrl)).size;return{totalJobs:A.length,totalRecruiters:r.length,topCompanies:n,topTech:o,totalVisited:I,todayVisited:a,lastScoutDate:A.length>0?A.sort((l,c)=>(c.scoutedAt||"").localeCompare(l.scoutedAt||""))[0]?.scoutedAt:null}}var Sve,bve,Kg,$V,e9,A9,t9,r9,kE,ME,RE,_E,Pg,fD=HE(()=>{Sve=mve(import.meta.url),bve=tn.dirname(tn.dirname(Sve)),Kg=process.env.DATA_DIR?tn.resolve(process.env.DATA_DIR,"market-research"):tn.join(bve,"market-research"),$V=tn.join(Kg,"scouted-jobs.json"),e9=tn.join(Kg,"discovered-people.json"),A9=tn.join(Kg,"visit-log.json"),t9=tn.join(Kg,"companies.json"),r9=tn.join(Kg,"job-decisions.json");kE=null;ME=null;RE=null;_E=null;Pg=null});var _V=B1(tV(),1),NV=B1(vV(),1);import Eve from"puppeteer";async function pa(t){let e=Math.floor(Math.random()*2001),A=t+e;return new Promise(r=>setTimeout(r,A))}async function kV(t){return await t.evaluate(()=>{let e=document.querySelectorAll("div.artdeco-modal--is-open");for(let r of e){let i=r.innerText||"",n=i.includes("Premium")||i.includes("premium")||i.includes("Upgrade")||i.includes("upgrade"),s=i.includes("Try for")||i.includes("free trial")||i.includes("/month")||i.includes("per month")||i.includes("Start my")||i.includes("Subscribe"),o=i.includes("Get hired faster")||i.includes("Get hired 2x");if(n||s||o){let g=r.querySelector('button[aria-label="Dismiss"]')||r.querySelector("button.artdeco-modal__dismiss")||r.querySelector("button[data-test-modal-close-btn]");if(g)return g.click(),{dismissed:!0,matched:i.substring(0,80)};let u=r.querySelectorAll("button");for(let a of u){let I=a.innerText?.trim().toLowerCase()||"",l=a.getAttribute("aria-label")?.toLowerCase()||"";if(I==="not now"||I==="no thanks"||I==="dismiss"||l.includes("dismiss"))return a.click(),{dismissed:!0,matched:i.substring(0,80)}}}}let A=document.querySelector(".premium-upsell-link")||document.querySelector("[data-test-premium-upsell]")||document.querySelector(".premium-hub-upsell");if(A){let r=A.closest('[class*="modal"]')?.querySelector('button[aria-label="Dismiss"]')||A.closest('[class*="banner"]')?.querySelector('button[aria-label="Close"]');if(r)return r.click(),{dismissed:!0,matched:"premium-banner"}}return!1})}import{getPluginConfig as ave}from"@ilivemylife/graph-sdk";var gve=await ave();for(let[t,e]of Object.entries(gve))process.env[t]===void 0&&(process.env[t]=e);var uve=process.env.LINKEDIN_NAME,Ng=Object.freeze({DRAFT:"draft",CONFIRMED:"confirmed",REJECTED:"rejected",NEEDS_REVIEW:"needs_review",SENT:"sent"}),VUe=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.NEEDS_REVIEW])),cve=Object.freeze(new Set([Ng.DRAFT,Ng.CONFIRMED,Ng.REJECTED,Ng.NEEDS_REVIEW]));import MV from"fs";import lve from"path";var Ive="cookies.json";function Cve(){let t=process.env.ILML_SCOPE_DIR;return t?lve.join(t,"plugins-state","linkedin","cookies.json"):Ive}function RV(){let t=Cve();if(!MV.existsSync(t))throw new Error(`Cookies not found at ${t}. Run: ilml linkedin login`);let e;try{e=MV.readFileSync(t,"utf-8")}catch(r){throw new Error(`Failed to read cookies at ${t}: ${r.message}. Run: ilml linkedin login`)}let A;try{A=JSON.parse(e)}catch{throw new Error(`Cookies file at ${t} is corrupted (invalid JSON). Run: ilml linkedin login`)}if(!Array.isArray(A)||A.length===0)throw new Error(`Cookies file at ${t} is empty or not an array. Run: ilml linkedin login`);return A}var LV=(0,_V.addExtra)(Eve);LV.use((0,NV.default)());async function xV(){let t=await LV.launch({headless:!1,defaultViewport:null,protocolTimeout:3e5}),e=async()=>{console.log(`
210
210
  Closing browser...`);try{await t.close()}catch{}process.exit(0)};process.on("SIGINT",e),process.on("SIGTERM",e);let A=await t.newPage();await A.evaluateOnNewDocument(()=>{Object.defineProperty(navigator,"webdriver",{get:()=>{}})});try{let r=RV();await A.setCookie(...r),console.log(" Browser launched, cookies loaded.")}catch(r){console.error(`
211
211
  [!] ${r.message}
212
212
  `),await t.close(),process.exit(1)}return{browser:t,page:A}}QD();async function yve(t,e){let A=t.url();if(A.includes("/in/"))return!1;if(A.includes("/login")||A.includes("/authwall")||A.includes("/checkpoint"))throw new Error("Session expired \u2014 redirected to login. Run: npm run login");console.log(` Off-track: ${A.slice(0,80)}`),console.log(" Navigating back to profile..."),await t.goto(e,{waitUntil:"domcontentloaded",timeout:6e4}),await pa(3e3);let r=t.url();return r.includes("/in/")||console.log(` Recovery failed \u2014 still on: ${r.slice(0,80)}`),!0}async function zV(t,e){try{await t.goto(e,{waitUntil:"domcontentloaded",timeout:6e4}),await pa(2e3+Math.random()*2e3),await kV(t)&&(console.log(" Dismissed Premium overlay"),await pa(1500),await yve(t,e));let r=await t.evaluate(()=>{let i=document.querySelector("h1")?.textContent?.trim()||null,n=document.querySelector("div.text-body-medium")?.textContent?.trim()||null,s=document.querySelector(".text-body-small.inline.t-black--light.break-words")?.textContent?.trim()||null,o=document.querySelector("section#about div.display-flex")?.textContent?.trim()||null,u=document.querySelector('button[aria-label^="Current company"] span.hoverable-link-text')?.textContent?.trim()||null,I=document.querySelector(".dist-value")?.textContent?.trim()||null,c=document.querySelector('a[href*="connectionOf"] span.t-bold')?.textContent?.trim()||null,E=(document.querySelector('a[href*="facetConnectionOf"] span.t-normal')?.textContent?.trim()||null)?.match(/(\d+)\s+other\s+mutual/),h=E?parseInt(E[1],10):null,f=document.querySelector("img.pv-top-card-profile-picture__image--show")?.src||null,p=!!document.querySelector(".pv-text-details__verified-badge-icon");return{name:i,title:n,location:s,about:o,company:u,connectionDegree:I,connectionsCount:c,mutualConnections:h,photoUrl:f,hasVerifiedBadge:p}});return console.log(`Viewed: ${r.name} - ${r.title}`),{...r,profileUrl:e}}catch(A){console.error(`Error viewing profile ${e}:`,A.message);try{await t.goto("about:blank",{timeout:1e4}),await pa(1e3)}catch{}return null}}fD();QD();async function s9(t,e,A={}){let{maxVisits:r=50,delayBetween:i=4e3,skipRecentDays:n=7,verbose:s=!1}=A,o={visited:0,skipped:0,errors:0},g=Date.now()-n*24*60*60*1e3;for(let u of e){if(o.visited>=r)break;if(!u.profileUrl)continue;let a=n1(u.profileUrl);if(a&&new Date(a).getTime()>g){o.skipped++;continue}try{let I=await zV(t,u.profileUrl);i1(u.profileUrl,{name:I?.name||u.name||null,source:u.source||"visit"}),o.visited++,s?console.log(` [${o.visited}] ${I?.name||u.profileUrl} \u2014 ${I?.title?.slice(0,40)||"?"}`):o.visited%10===0&&console.log(` Visited: ${o.visited}`);let l=Math.random()*4e3;await pa(i+l)}catch(I){o.errors++,s&&console.error(` Error visiting ${u.name||u.profileUrl}: ${I.message?.slice(0,60)}`);let l=(I.message||"").toLowerCase();if(l.includes("detached")||l.includes("session closed")||l.includes("target closed")){console.log(" Fatal browser error \u2014 stopping visits");break}}}return o}function o9(t={}){let{limit:e=150,revisitDays:A=14}=t,r=Tg(),i=new Set(r.visits?.map(h=>h.profileUrl)||[]),n=new Map;for(let h of r.visits||[]){let d=n.get(h.profileUrl);(!d||h.date>d)&&n.set(h.profileUrl,h.date)}let s=Date.now()-7*24*60*60*1e3,o=Date.now()-A*24*60*60*1e3;function g(h){let d=n.get(h);return d&&new Date(d).getTime()>s}let u=Nl(),a=Object.entries(u).filter(([h])=>!i.has(h)).map(([h,d])=>({profileUrl:h,name:d.name,source:"new-discovered",priority:1,jobCount:d.jobIds?.length||0})),I=Fn(),l=Object.entries(I).filter(([h,d])=>d.connectionStatus==="connected"||g(h)?!1:(d.jobCount||d.jobIds?.length||0)>=2).map(([h,d])=>({profileUrl:h,name:d.name,source:"active-recruiter",priority:2,jobCount:d.jobCount||d.jobIds?.length||0})),c=Object.entries(I).filter(([h,d])=>{let f=d.connectionStatus;return!(!f||f==="connected"||f==="pending"||f==="sent_without_note"||f==="sent_with_note"||g(h)||(d.jobCount||d.jobIds?.length||0)>=2)}).map(([h,d])=>({profileUrl:h,name:d.name,source:"unconnected",priority:3,jobCount:d.jobCount||d.jobIds?.length||0})),C=[...n.entries()].filter(([h,d])=>new Date(d).getTime()<o).map(([h,d])=>({profileUrl:h,name:null,source:"revisit",priority:4,lastVisit:d})),B=h=>h.sort(()=>Math.random()-.5);return a.sort((h,d)=>d.jobCount-h.jobCount),l.sort((h,d)=>d.jobCount-h.jobCount),B(c),B(C),[...a,...l,...c,...C].slice(0,e)}function a9(){let t=Nl();return Object.entries(t).map(([e,A])=>({profileUrl:e,name:A.name,source:"discovered"}))}function o1(){let t=Fn();return Object.entries(t).filter(([,e])=>{let A=e.connectionStatus;return A&&A!=="connected"&&A!=="pending"&&A!=="sent_without_note"&&A!=="sent_with_note"}).map(([e,A])=>({profileUrl:e,name:A.name,source:"unconnected"}))}function a1(t=14){let e=Tg(),A=Date.now()-t*24*60*60*1e3,r=new Map;for(let i of e.visits){let n=r.get(i.profileUrl);(!n||i.date>n.date)&&r.set(i.profileUrl,i)}return[...r.entries()].filter(([,i])=>new Date(i.date).getTime()<A).map(([i,n])=>({profileUrl:i,name:n.name,source:"revisit"}))}fD();import"dotenv/config";import*as kn from"fs";import*as Da from"path";import{fileURLToPath as Pve}from"url";import"dotenv/config";import{createGraphClient as Nve,resolveToken as Lve}from"@ilivemylife/graph-sdk";import{config as xve}from"dotenv";xve();var g9=Lve()||process.env.TOKEN;g9||(console.error(`
package/ilml-plugin.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linkedin",
3
- "version": "1.3.1",
3
+ "version": "1.5.0",
4
4
  "description": "LinkedIn job automation: apply, scout, sync, funnel, messages",
5
5
  "commands": {
6
6
  "apply": { "run": "node dist/run.mjs" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ilml-plugin-linkedin",
3
- "version": "1.3.1",
3
+ "version": "1.5.0",
4
4
  "description": "ilml plugin: pull your LinkedIn graph (connections, threads, notes) into iLiveMyLife and run inbox sync, AI-drafted replies, Easy Apply, and recruiter outreach from the terminal.",
5
5
  "type": "module",
6
6
  "files": [