mcp-scraper 0.92.0 → 0.93.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/CHANGELOG.md +21 -1
- package/README.md +2 -2
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-core.js +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.js +1 -1
- package/dist/bin/paa-harvest.js +1 -1
- package/dist/{chunk-ZJZMDWDI.js → chunk-35QGIWR6.js} +4 -4
- package/dist/{chunk-BMNXU4JL.js → chunk-4YLZR4OR.js} +1 -1
- package/dist/{chunk-F7V6HSN5.js → chunk-5KQO27NH.js} +1 -1
- package/dist/chunk-DT2FYN6N.js +1 -0
- package/dist/chunk-DUJ56SHU.js +1 -0
- package/dist/{chunk-IU3GN5SX.js → chunk-H3SJLJYM.js} +1 -1
- package/dist/{chunk-37WWXOZU.js → chunk-LBMRUR4E.js} +2 -2
- package/dist/{chunk-ZMNUI5LB.js → chunk-M5VZVMPC.js} +8 -8
- package/dist/{chunk-JM4MGP6E.js → chunk-PMOPJOSJ.js} +1 -1
- package/dist/chunk-RZEZJAID.js +1 -0
- package/dist/chunk-SH5KB4P7.js +1 -0
- package/dist/{chunk-XRWBQI3V.js → chunk-VRVO4OQ3.js} +300 -297
- package/dist/{chunk-JHMI6HEO.js → chunk-W2T4NTCE.js} +1 -1
- package/dist/chunk-XASDACRP.js +6 -0
- package/dist/chunk-Y6MKMSOC.js +1 -0
- package/dist/{extract-bundle-YHQPOGSU.js → extract-bundle-M2XM4BEW.js} +1 -1
- package/dist/{gmail-service-PKMSTKD5.js → gmail-service-EGATZIBE.js} +1 -1
- package/dist/index.cjs +45 -45
- package/dist/index.d.cts +153 -112
- package/dist/index.d.ts +153 -112
- package/dist/index.js +6 -6
- package/dist/{server-IV2GMCGQ.js → server-JLR2YJ7V.js} +464 -465
- package/dist/{site-extract-repository-DVMUVCKD.js → site-extract-repository-3NFFFPXQ.js} +1 -1
- package/dist/{stripe-event-worker-3EGRYJZP.js → stripe-event-worker-PUYXT5DS.js} +1 -1
- package/dist/worker-UG4OXZWR.js +1 -0
- package/package.json +1 -1
- package/dist/chunk-2TZBO52D.js +0 -1
- package/dist/chunk-4FROKQJN.js +0 -1
- package/dist/chunk-5WHYMZ3Z.js +0 -1
- package/dist/chunk-DDUZETZY.js +0 -1
- package/dist/chunk-MYSBUV4Y.js +0 -1
- package/dist/chunk-Q2FOIRK3.js +0 -1
- package/dist/chunk-RECKUOEF.js +0 -1
- package/dist/worker-KOCD6RZ3.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as be}from"./chunk-KJQXUZ4Y.js";import{b as T,
|
|
1
|
+
import{c as be}from"./chunk-KJQXUZ4Y.js";import{b as T,j as ve}from"./chunk-Y6MKMSOC.js";import{a as _e,c as ke,d as X,e as Re,f as Se}from"./chunk-WO3N5FH2.js";function xe(e){return e.toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"")}import{mkdir as J,readFile as Ye,stat as Xe,writeFile as z}from"fs/promises";import{existsSync as Ze}from"fs";import{homedir as et,platform as tt}from"os";import{dirname as Z,join as U}from"path";import{execFile as rt}from"child_process";function ae(e){return e?.trim()||process.env.MCP_SCRAPER_OUTPUT_DIR?.trim()||U(et(),"Downloads","mcp-scraper")}function Ce(){return new Date().toISOString().replace(/[:.]/g,"-")}function se(e){return xe(e).replace(/^-+|-+$/g,"").slice(0,80)||"run"}var V=class e{constructor(t,n,r,i,s,a,l){this.workflowId=t;this.title=n;this.runId=r;this.baseDir=i;this.runDir=s;this.startedAt=a;this.input=l}workflowId;title;runId;baseDir;runDir;startedAt;input;artifacts=[];static async create(t,n,r,i,s){let a=new Date().toISOString(),l=s?.trim()||`${Ce()}-${se(t)}-${Math.random().toString(36).slice(2,8)}`,c=String(r.keyword??r.query??r.domain??r.state??t),p=ae(i),u=U(p,"workflows",t,`${Ce()}-${se(c)}-${se(l).slice(0,20)}`);return await J(u,{recursive:!0}),new e(t,n,l,p,u,a,r)}async remember(t,n,r,i){let s=await Xe(r).then(a=>a.size).catch(()=>{});return this.artifacts.push({kind:t,label:n,path:r,bytes:s,rows:i}),await ve({title:`${this.title} ${n}`,content:`artifact: ${r}`,source:`mcp-scraper-workflow:${this.workflowId}:${this.runId}`}),r}async writeJson(t,n,r){let i=U(this.runDir,n);return await J(Z(i),{recursive:!0}),await z(i,JSON.stringify(r,null,2),"utf8"),this.remember("json",t,i)}async writeText(t,n,r,i="markdown"){let s=U(this.runDir,n);return await J(Z(s),{recursive:!0}),await z(s,r,"utf8"),this.remember(i,t,s)}async writeCsv(t,n,r,i){let s=U(this.runDir,n);return await J(Z(s),{recursive:!0}),await z(s,be(r,i),"utf8"),this.remember("csv",t,s,i.length)}async writeHtml(t,n,r){return this.writeText(t,n,r,"html_report")}async writeManifest(t,n,r,i){let s={workflow:this.workflowId,title:this.title,runId:this.runId,status:t,startedAt:this.startedAt,completedAt:t==="running"?null:new Date().toISOString(),input:this.input,artifacts:this.artifacts,warnings:r,errors:i,counts:n},a=U(this.runDir,"manifest.json");return await z(a,JSON.stringify(s,null,2),"utf8"),await nt(s,a,this.baseDir),a}};function Ae(e=ae()){return U(e,"workflows","index.json")}async function Pe(e){let t=Ae(e);if(!Ze(t))return{runs:[]};try{return JSON.parse(await Ye(t,"utf8"))}catch{return{runs:[]}}}async function nt(e,t,n){if(e.status==="running")return;let r=Ae(n),i=await Pe(n),s=e.artifacts.find(l=>l.kind==="html_report")?.path??null,a={workflow:e.workflow,runId:e.runId,status:e.status,startedAt:e.startedAt,reportPath:s,manifestPath:t,summary:`${e.title} (${e.status})`};i.runs=[a,...i.runs.filter(l=>l.runId!==e.runId)].slice(0,200),await J(Z(r),{recursive:!0}),await z(r,JSON.stringify(i,null,2),"utf8")}async function $e(e){return(await Pe(ae(e))).runs}async function Ee(e,t){let n=await $e(t);return e==="last"?n[0]??null:n.find(r=>r.runId===e)??null}async function it(e,t){let n=await Ee(e,t);if(!n?.reportPath)throw new Error(`No report found for "${e}"`);return tt()==="darwin"&&await new Promise((r,i)=>{rt("open",[n.reportPath],s=>s?i(s):r())}),n.reportPath}import{readFile as At}from"fs/promises";import{z as dr}from"zod";var F=class{constructor(t,n,r=fetch,i={}){this.apiUrl=t;this.apiKey=n;this.fetchImpl=r;this.extraHeaders=i}apiUrl;apiKey;fetchImpl;extraHeaders;async post(t,n,r=18e4){let i=await this.fetchImpl(`${this.apiUrl.replace(/\/$/,"")}${t}`,{method:"POST",headers:{...this.extraHeaders,"Content-Type":"application/json","x-api-key":this.apiKey},body:JSON.stringify(n),signal:AbortSignal.timeout(r)}),s=await i.json().catch(()=>({}));if(!i.ok){let a=typeof s.error=="string"?s.error:`Workflow API ${t} failed with ${i.status}`;throw new Error(a)}return s}};import{z as D}from"zod";function I(e){return String(e??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function ot(e){let t=e.rows.map(n=>`<tr>${e.columns.map(r=>`<td>${I(n[r])}</td>`).join("")}</tr>`).join(`
|
|
2
2
|
`);return["<section>",`<h2>${I(e.title)}</h2>`,'<div class="table-wrap"><table>',`<thead><tr>${e.columns.map(n=>`<th>${I(n)}</th>`).join("")}</tr></thead>`,`<tbody>${t||`<tr><td colspan="${e.columns.length}">No rows</td></tr>`}</tbody>`,"</table></div>","</section>"].join(`
|
|
3
3
|
`)}function P(e){let t=e.warnings?.length?`<section class="warnings"><h2>Warnings</h2><ul>${e.warnings.map(i=>`<li>${I(i)}</li>`).join("")}</ul></section>`:"",n=(e.sections??[]).map(i=>`<section><h2>${I(i.title)}</h2><p>${I(i.body)}</p></section>`).join(`
|
|
4
4
|
`),r=(e.tables??[]).map(ot).join(`
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{a as Tt}from"./chunk-XG6GCEUE.js";import{l as vt,m as St,w as At}from"./chunk-M5VZVMPC.js";import{a as G,c as Ie,d as ae,e as L,f as se,j as Oe,k as Ot}from"./chunk-DT2FYN6N.js";import{b as Rt,c as Pt,d as V,f as $,g as H,h as U,i as Et,k as B,n as kt,q as It}from"./chunk-ORB4RHCK.js";import{a as Te,b as Ce,g as xe}from"./chunk-RZEZJAID.js";import{a as at,b as st}from"./chunk-SH5KB4P7.js";import{a as _t,b as bt,d as wt}from"./chunk-2SP57VCG.js";import{b as ht,c as yt}from"./chunk-6DTXIZY2.js";import{c as it}from"./chunk-Y6MKMSOC.js";import{Nb as ie,Rb as Ee,Tb as ke,Va as Re,b as Se,g as M,h as lt,hb as ft,ia as pt,j as ut,ja as mt,jb as Pe,la as gt,m as ct,o as dt,oa as Ae}from"./chunk-WJ4XFLS4.js";import{request as br}from"https";import{HttpsProxyAgent as wr}from"https-proxy-agent";var le={source:"https://\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061.com/users/zone/premium_domains",retrievedAt:"2026-09-23T20:14:30.483Z",includedStatuses:["premium","remove_candidate"],domains:["advanceautoparts.com","affitto.it","agoda.cn","albertsons.com","allpeople.com","autozone.com","bestbuy.com","bestwestern.com","billiger.de","bottlerover.com","carousell.com","carousell.com.hk","carousell.com.my","carousell.ph","carousell.sg","carsales.com.au","cdiscount.com","chewy.com","costco.com","cvs.com","despegar.com.mx","dickssportinggoods.com","dynos.es","emaxme.com","familytreenow.com","feuvert.fr","flooranddecor.com","foodlion.com","footlocker.co.uk","footlocker.com","giantfoodstores.com","gopuff.com","gplay.bg","hermes.com","hyatt.com","idealo.de","immobilienscout24.de","ingatlan.com","instacart.com","intersport.fr","joann.com","kroger.com","lazada.co.id","lazada.co.th","lazada.com.my","lazada.com.ph","lazada.sg","lazada.vn","lowes.ca","lowes.com","mcmaster.com","mediamarkt.de","mediamarkt.es","medline.com","mscdirect.com","napaonline.com","nofrills.ca","peoplefinders.com","platt.com","publicdatausa.com","realcanadiansuperstore.ca","realestate.com.au","restaurantguru.com","searchpeoplefree.com","shopee.cl","shopee.co.id","shopee.co.th","shopee.com.br","shopee.com.co","shopee.com.mx","shopee.com.my","shopee.ph","shopee.sg","shopee.tw","shopee.vn","similarweb.com","skyscanner.co.kr","skyscanner.net","stopandshop.com","target.com","temu.com","ticketmaster.com","totalwine.com","tractorsupply.com","walmart.com.mx","wayfair.com","weismarkets.com","wizzair.com","worten.pt"]};var Yr=le.source,Ct=le.retrievedAt,yr=new Set(le.domains);function X(e){let t=new URL(e).hostname.toLowerCase().replace(/\.$/,"");for(let o of yr)if(t===o||t.endsWith(`.${o}`))return"premium";return"standard"}function ue(e){for(let t of["providerProduct","billingTier","billableEvent","unitType","source","policyVersion","effectiveAt"])if(!e[t]?.trim())throw new Error(`Provider rate ${t} is required`);if(!Number.isSafeInteger(e.numeratorUsdNanos)||e.numeratorUsdNanos<0)throw new Error("Provider rate numerator must be a non-negative safe integer");if(!Number.isSafeInteger(e.denominatorUnits)||e.denominatorUnits<1)throw new Error("Provider rate denominator must be a positive safe integer");if(Number.isNaN(Date.parse(e.effectiveAt)))throw new Error("Provider rate effectiveAt must be a date");return e}function ce(e,t){if(ue(e),!Number.isSafeInteger(t)||t<0)throw new Error("Billable units must be a non-negative safe integer");let o=BigInt(e.numeratorUsdNanos)*BigInt(t),r=BigInt(e.denominatorUnits),n=(o*2n+r)/(r*2n);if(n>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("Provider amount exceeds safe integer range");return Number(n)}function xt(e=process.env){let t=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_CONTRACT_USD_PER_1000?.trim(),o=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_RATE_SOURCE?.trim(),r=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_RATE_POLICY_VERSION?.trim(),n=e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_RATE_EFFECTIVE_AT?.trim();if(!t&&!o&&!r&&!n)return null;if(!t||!o||!r||!n)throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP contract rate requires amount, source, policy version, and effective date");let a=Number(t);if(!Number.isFinite(a)||a<0)throw new Error("Invalid \u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP contract amount");return ue({providerProduct:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_api",billingTier:"payg",billableEvent:"successful_delivery",unitType:"request",numeratorUsdNanos:Math.round(a*1e9),denominatorUnits:1e3,source:o,policyVersion:r,effectiveAt:n})}function _r(e){return ue({providerProduct:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api",billingTier:e,billableEvent:"transferred_byte",unitType:"byte",numeratorUsdNanos:(e==="premium"?11:8)*1e9,denominatorUnits:1e9,source:`owner_confirmed_payg_2026-09-23;\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_domain_snapshot_${Ct}`,policyVersion:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061-browser-domain-tier-2026-09-23",effectiveAt:"2026-09-23T00:00:00Z"})}function eo(e){return _r(X(e))}function Mt(){return ue({providerProduct:"apify_google_serp_scraperlink",billingTier:"store_pay_per_event",billableEvent:"serp_page",unitType:"page",numeratorUsdNanos:5e8,denominatorUnits:1e3,source:"https://apify.com/scraperlink/google-search-results-serp-scraper",policyVersion:"scraperlink-listing-2026-09-24",effectiveAt:"2026-09-24T00:00:00Z"})}var vr="https://api.\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061.com/request",Sr=8e3,Ar="brd.superproxy.io",Rr="44445",Pr=10*1024*1024;async function Er(e,t){let o=new URL(`http://${t.host}:${t.port}`);o.username=t.username,o.password=t.password;let r=new wr(o);try{return await new Promise((n,a)=>{let i=br(e,{agent:r,headers:{"x-unblock-data-format":"parsed"},rejectUnauthorized:!1,signal:t.signal},s=>{let u=[],l=0;s.on("data",c=>{let p=Buffer.isBuffer(c)?c:Buffer.from(c);if(l+=p.length,l>Pr){i.destroy(new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP response exceeded the maximum size"));return}u.push(p)}),s.on("end",()=>n({ok:(s.statusCode??500)>=200&&(s.statusCode??500)<300,status:s.statusCode??500,rawText:Buffer.concat(u).toString("utf8"),providerRequestId:typeof s.headers["x-response-id"]=="string"?s.headers["x-response-id"]:typeof s.headers["x-request-id"]=="string"?s.headers["x-request-id"]:null}))});i.on("error",()=>a(new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 native SERP request failed"))),i.end()})}finally{r.destroy()}}function $t(e=process.env){let t=!!(e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_USERNAME?.trim()&&e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_PASSWORD?.trim()),o=!!((e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_API_KEY||e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_API_KEY)?.trim()&&e.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_ZONE?.trim());return t||o}function m(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)?e:null}function N(e){return Array.isArray(e)?e:[]}function Ne(e){return typeof e=="string"&&e.trim()?e.trim():null}function R(e){return typeof e=="number"&&Number.isFinite(e)?e:typeof e=="string"&&e.trim()&&Number.isFinite(Number(e))?Number(e):null}function g(e,t){for(let o of t){let r=Ne(e[o]);if(r)return r}return null}function K(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return""}}function zt(e){return{rawUrl:e,resolvedUrl:e,linkType:"plain",resolutionStatus:"not_needed"}}function kr(e){let t=e;if(typeof t=="string")try{t=JSON.parse(t)}catch{throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API returned invalid JSON")}let o=m(t);if(!o)throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API returned an invalid payload");if(typeof o.body=="string")try{let n=JSON.parse(o.body);if(m(n))return m(n)}catch{}let r=m(o.body);return r?m(r.result)??m(r.data)??r:m(o.result)??m(o.data)??o}function J(e,t){for(let r of t){let n=N(e[r]);if(n.length)return n}let o=m(e.results);if(o)for(let r of t){let n=N(o[r]);if(n.length)return n}return[]}function z(e,t){let o=[e,m(e.results)].filter(r=>!!r);for(let r of o)for(let n of t)if(Object.prototype.hasOwnProperty.call(r,n))return{observed:!0,rawShapeValid:Array.isArray(r[n]),rawCount:N(r[n]).length};return{observed:!1,rawShapeValid:!1,rawCount:0}}function Me(e,t){let o=[e,m(e.results)].filter(r=>!!r);for(let r of o)for(let n of t){if(!Object.prototype.hasOwnProperty.call(r,n))continue;let a=m(r[n]);return{observed:!0,rawShapeValid:a!==null,rawCount:a&&Object.keys(a).length>0?1:0}}return{observed:!1,rawShapeValid:!1,rawCount:0}}function Nt(e){return J(e,["organic","organic_results","organicResults"]).flatMap((t,o)=>{let r=m(t);if(!r)return[];let n=g(r,["link","url","href"]),a=g(r,["title","name"]);if(!n||!a)return[];let i=m(r.rating)??m(r.inline_rating);return[{position:Math.max(1,Math.trunc(R(r.global_rank)??R(r.rank)??R(r.position)??o+1)),title:a,url:n,...zt(n),domain:K(n),cite:g(r,["display_link","displayLink","cite"]),snippet:g(r,["description","snippet","text"]),isRedditStyle:K(n)==="reddit.com",inlineRating:i?{value:String(i.value??i.rating??""),count:String(i.count??i.reviews??"")}:null}]}).sort((t,o)=>t.position-o.position)}function Dt(e){return J(e,["snack_pack","local","local_results","local_pack","localPack"]).flatMap((t,o)=>{let r=m(t);if(!r)return[];let n=g(r,["title","name"]);if(!n)return[];let a=N(r.extensions??r.metadata).map(Ne).filter(i=>!!i);return[{position:Math.max(1,Math.trunc(R(r.global_rank)??R(r.rank)??R(r.position)??o+1)),name:n,cid:g(r,["cid"]),rating:g(r,["rating"])??(R(r.rating)!=null?String(R(r.rating)):null),reviewCount:g(r,["reviews_cnt","reviews","review_count","reviewCount"])??(R(r.reviews_cnt)!=null?String(R(r.reviews_cnt)):R(r.reviews)!=null?String(R(r.reviews)):null),metadata:a,websiteUrl:g(r,["website","website_url","link"]),directionsUrl:g(r,["directions","directions_url"])}]})}function Kt(e){let t=m(e);return N(t?.citations??t?.sources??t?.references).flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url","href"]);return n?[{text:g(r,["title","text","name"])??K(n),href:n,...zt(n)}]:[]})}function me(e,t=0){if(t>4)return[];if(Array.isArray(e))return e.flatMap(a=>me(a,t+1));let o=m(e);if(!o)return[];let r=g(o,["snippet","text","answer"]),n=me(o.texts??o.list??o.items,t+1);return[...r?[r]:[],...n]}function qt(e,t){if(!t)return{detected:!1,text:null,citations:[]};let o=m(e.ai_overview)??m(e.aiOverview)??m(e.overview);if(!o)return{detected:!1,text:null,citations:[]};let r=g(o,["text","answer","description"])??(me(o.texts).join(`
|
|
2
|
+
|
|
3
|
+
`).slice(0,5e4)||null),n=Kt(o);return{detected:!!(r||n.length),text:r,citations:n}}function Ht(e,t){if(!t)return{detected:!1,text:null,citations:[]};let o=m(e.ai_mode)??m(e.aiMode);if(!o)return{detected:!1,text:null,citations:[]};let r=g(o,["text","answer","description"])??(me(o.texts).join(`
|
|
4
|
+
|
|
5
|
+
`).slice(0,5e4)||null),n=Kt(o);return{detected:!!(r||n.length),text:r,citations:n}}function Ut(e,t){return t?[...J(e,["videos","video_results"]),...J(e,["short_videos","shorts"])].flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url"]),a=g(r,["title","name"]);return!n||!a?[]:[{type:"video",title:a,channel:g(r,["channel","source"])??"",platform:K(n),duration:g(r,["duration"])??"",url:n}]}):[]}function Bt(e,t){if(!t)return[];let o=m(e.forums);return[...J(e,["discussions","forums","forum_results"]),...N(o?.items)].flatMap(r=>{let n=m(r);if(!n)return[];let a=g(n,["link","url"]),i=g(n,["title","name"]);return!a||!i?[]:[{title:i,source:g(n,["source"])??K(a),url:a}]})}function Ft(e,t){return t?J(e,["what_people_are_saying","whatPeopleSaying"]).flatMap(o=>{let r=m(o);if(!r)return[];let n=g(r,["link","url"]),a=g(r,["title","name"]);if(!n||!a)return[];let i=g(r,["platform","source"])??K(n),s=i.toLowerCase();return[{type:s.includes("reddit")?"reddit":s.includes("facebook")?"facebook":s.includes("instagram")?"instagram":s.includes("tiktok")?"tiktok":s.includes("youtube")?"youtube":s.includes("news")?"news":"unknown",title:a,url:n,source:i,platform:i,popularComment:g(r,["comment","popular_comment"]),engagement:g(r,["engagement"])??"",date:g(r,["date"])??"",duration:g(r,["duration"]),authorNote:g(r,["author_note"])}]}):[]}var Ir={featuredSnippets:["featured_snippets","featured_snippet","featuredSnippet"],knowledgePanel:["knowledge","knowledge_graph","knowledgeGraph"],topStories:["top_stories","topStories"],news:["news","news_results"],images:["images","image_results"],shopping:["shopping","shopping_results"],relatedSearches:["related","related_searches","relatedSearches"],recipes:["recipes","recipe_results"],jobs:["jobs","job_results"],topAds:["top_ads"],bottomAds:["bottom_ads"],topProducts:["top_pla"],bottomProducts:["bottom_pla"],jackpotProducts:["jackpot_pla"],shortVideos:["short_videos","shorts"],localMap:["snack_pack_map"],flights:["flights"],hotels:["hotels_selection"],popularProducts:["popular_products"],weather:["weather"],currencyExchange:["currency_exchange"],latestPosts:["latest_posts"],perspectives:["perspectives"],navigation:["navigation"],chips:["chips"],spelling:["spelling"]};function de(e,t){for(let o of[e,m(e.results)])if(o){for(let r of t)if(Object.prototype.hasOwnProperty.call(o,r))return{observed:!0,value:o[r]}}return{observed:!1,value:null}}function pe(e,t,o){return e?t==null||Array.isArray(t)&&t.length===0?"observed_absent":Array.isArray(t)?o>0?"observed_present":"incomplete":m(t)?o>0?"observed_present":Object.keys(m(t)).length===0?"observed_absent":"incomplete":"incomplete":"unknown"}function Or(e,t){let o={},r=[["localPack",["snack_pack","local","local_results","local_pack","localPack"],t.localPack],["forums",["discussions","forums","forum_results"],t.forums],["videos",["videos","video_results","short_videos","shorts"],t.videos],["aiOverview",["ai_overview","aiOverview","overview"],t.aiOverview],["whatPeopleSaying",["what_people_are_saying","whatPeopleSaying"],t.whatPeopleSaying],["entityIds",["knowledge","knowledge_graph","knowledgeGraph"],t.entityIds]];for(let[u,l,c]of r){let p=de(e,l);o[u]=pe(p.observed,p.value,c)}let n=de(e,["ai_mode","aiMode"]);o.aiMode=pe(n.observed,n.value,t.aiMode);let a=de(e,["people_also_ask","peopleAlsoAsk","related_questions","paa"]),i=N(a.value).slice(0,30).flatMap(u=>{let l=m(u);if(!l)return[];let c=g(l,["question","title"]);return c?[{question:c.slice(0,1e3),answer:g(l,["answer","snippet","text"])?.slice(0,1e4)??null,url:g(l,["link","url"])??null}]:[]});o.paaPreview=pe(a.observed,a.value,i.length);let s=[];for(let[u,l]of Object.entries(Ir)){let c=de(e,l);if(!c.observed)continue;let p=m(c.value),w=(Array.isArray(c.value)?c.value:p&&(Array.isArray(p.items)||Array.isArray(p.posts))?[...N(p.items),...N(p.posts)]:[c.value]).slice(0,20).flatMap(S=>{let y=m(S);if(!y)return[];let O=g(y,["title","name","heading"]),k=g(y,["link","url","website"]),D=g(y,["description","snippet","text","summary","story"]);return!O&&!k&&!D?[]:[{title:O?.slice(0,1e3)??null,url:k,description:D?.slice(0,1e4)??null,position:R(y.global_rank)??R(y.rank)??R(y.position)??null}]});o[u]=pe(c.observed,c.value,w.length);let A=Object.fromEntries(Object.entries(p??{}).slice(0,30).flatMap(([S,y])=>/^[a-zA-Z0-9_]{1,80}$/.test(S)&&(y===null||["string","number","boolean"].includes(typeof y))?[[S,typeof y=="string"?y.slice(0,2e3):y]]:[]));s.push({name:u,attributes:A,items:w})}return{status:o,paaPreview:i,additional:s}}function Gt(e,t){let o=new Set,r=new Set(t.map(i=>i.cid).filter(i=>!!i)),n=new Set,a=(i,s=0)=>{if(s>6||i==null)return;if(Array.isArray(i)){for(let l of i)a(l,s+1);return}let u=m(i);if(u)for(let[l,c]of Object.entries(u)){let p=l.toLowerCase().replace(/[^a-z]/g,""),_=Ne(c);_&&(p==="kgid"||p==="kgmid"||p==="mid")?o.add(_):_&&p==="cid"?r.add(_):_&&p==="gcid"?n.add(_):typeof c=="object"&&a(c,s+1)}};return a(e),{entities:[],kgIds:[...o],cids:[...r],gcids:[...n]}}function Lt(e,t){let o=e instanceof Error?e.message:String(e);return t.aborted||/timeout|timed out/i.test(o)?"timeout":/captcha|recaptcha|unusual traffic|google\.com\/sorry|blocked/i.test(o)?"captcha":/invalid (?:json|payload)/i.test(o)?"invalid_payload":"provider_error"}function Vt(e){return e==="invalid_payload"?"invalid_payload":e==="captcha"?"serp_readiness":e==="timeout"||e==="provider_error"?"provider_transport":"pagination"}async function De(e,t=process.env,o=fetch,r=Er,n){let a=(t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_API_KEY||t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_API_KEY)?.trim(),i=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_ZONE?.trim(),s=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_USERNAME?.trim(),u=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_PASSWORD?.trim(),l=!!(s&&u);if(!l&&(!a||!i))throw new Error("Direct SERP API is not configured");let c=Date.now(),p=yt(),_=null,w=e.location?St(e.location):null;if(e.location&&!w?.canonical)throw new G("query_integrity","location_unresolved",`SERP location could not be resolved without changing the query (candidates: ${w?.ambiguousCandidates??0})`);let A=w?.canonical?vt(w.canonical):null,S=AbortSignal.timeout(e.includeAllSerpFeatures?e.pages>=2?68e3:33e3:Sr),y=e.signal?AbortSignal.any([e.signal,S]):S,O=e.pages>=2?2:1,k=[],D=[],$e=0,ze=async d=>{let I=Date.now(),b=l?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_native_proxy":"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_rest",T=null,q=null,j=!1,Q=!1,F=null,W=null;if(p?.operationRunId&&(d===1||_))try{T=await V({runId:p.operationRunId,attemptNumber:n?n.attemptNumber+d-1:d,method:b,provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",...d===2?{parentAttemptId:_,edgeKind:"next_phase"}:n?{parentAttemptId:n.parentAttemptId,edgeKind:"provider_fallback",retryKind:"provider_fallback"}:{},normalizedFlags:{page:d,device:e.device,hasLocation:!!e.location}}),d===1&&(_=T),q=(await H({attemptId:T,provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",providerProduct:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_api",accountScope:p.operationAccountScope??"production-default",method:b,providerStatus:"started"})).id}catch(h){throw console.warn(JSON.stringify({event:"direct_serp_telemetry_start_failed",page:d,message:h instanceof Error?h.message:String(h)})),h}let P=new URLSearchParams({q:e.query,gl:e.gl,hl:e.hl,pws:"0",num:"10",...d===2?{start:"10"}:{}}),ne=it(e.recency);ne&&P.set("tbs",ne),e.device==="mobile"&&P.set("brd_mobile","1"),(e.includeAiOverview||e.includeAllSerpFeatures)&&P.set("brd_ai_overview","2"),A&&P.set("uule",A),l&&P.set("brd_json","1"),$e+=1;let x;try{if(l){let E=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_HOST?.trim()||Ar,Y=t.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_PROXY_PORT?.trim()||Rr;x=await r(`https://www.google.com/search?${P}`,{username:s,password:u,host:E,port:Y,signal:y})}else{let E=await o(vr,{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},body:JSON.stringify({zone:i,url:`https://www.google.com/search?${P}`,format:"json",data_format:"parsed"}),signal:y});x={ok:E.ok,status:E.status,rawText:await E.text(),providerRequestId:E.headers.get("x-response-id")??E.headers.get("x-request-id")}}if(W=`http_${x.status}`,q&&x.providerRequestId&&await U(q,x.providerRequestId),!x.ok)throw new Error(`\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API failed with HTTP ${x.status}`);j=!0;let h;try{h=kr(JSON.parse(x.rawText))}catch(E){let Y=E instanceof Error&&E.message!=="Unexpected end of JSON input"?E.message:"\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 SERP API returned invalid JSON";throw new G("invalid_payload","invalid_provider_payload",Y)}let f=Nt(h);return k.push({page:d,attempted:!0,captured:f.length>0,resultCount:f.length,requestOffset:d===2?10:0,providerRequestIdObserved:!!x.providerRequestId,...f.length===0?{failureCode:"empty_page"}:{}}),Q=!0,h}catch(h){F=h;let f=Lt(h,y);if(k.some(Y=>Y.page===d)||k.push({page:d,attempted:!0,captured:!1,resultCount:0,requestOffset:d===2?10:0,providerRequestIdObserved:!1,failureCode:f}),d===2)throw h;let E=h instanceof G?h.stage:Vt(f);throw h instanceof G?h:new G(E,f,h instanceof Error?h.message:String(h))}finally{let h=null;if(q&&j)try{let f=xt(t);f&&await B({receiptId:q,costState:"measured",units:1,unitType:"request",amountUsdNanos:ce(f,1),rateSource:f.source,providerProduct:f.providerProduct,billingTier:f.billingTier,billableEvent:f.billableEvent,measurementSource:"provider_http_delivery",rateNumerator:f.numeratorUsdNanos,rateDenominator:f.denominatorUnits,ratePolicyVersion:f.policyVersion,rateEffectiveAt:f.effectiveAt,providerStatus:W??"delivered",providerDurationMs:Date.now()-I})}catch(f){console.warn(JSON.stringify({event:"direct_serp_receipt_finalize_failed",page:d,message:f instanceof Error?f.message:String(f)})),h=f}if(T&&await $({attemptId:T,status:Q?"succeeded":y.aborted?"timed_out":"failed",errorCode:F?Lt(F,y):null,durationMs:Date.now()-I}).catch(f=>console.warn(JSON.stringify({event:"direct_serp_attempt_finish_failed",page:d,message:f instanceof Error?f.message:String(f)}))),h)throw h}};try{D.push({page:1,payload:await ze(1)})}catch(d){throw d}let Ke=null;if(O===2)try{D.push({page:2,payload:await ze(2)})}catch(d){Ke=d}let sr=Date.now()-c,lr=Date.now(),v=D[0].payload,ur=D.flatMap(({page:d,payload:I})=>Nt(I).map(b=>({...b,position:d===2&&b.position<=10?b.position+10:b.position,sourcePage:d}))).filter((d,I,b)=>b.findIndex(T=>Ie(T.url)===Ie(d.url))===I),Je=e.includeLocalPack||e.includeAllSerpFeatures,ye=Je?Dt(v):[],_e=z(v,["snack_pack","local","local_results","local_pack","localPack"]),cr=L({requested:Je,moduleObserved:_e.observed,rawCount:_e.rawCount,mappedCount:ye.length,rawShapeValid:_e.rawShapeValid}),je=e.includeAiOverview||e.includeAllSerpFeatures,Qe=qt(v,je),We=e.includeForums||e.includeAllSerpFeatures,Ye=Bt(v,We),Xe=e.includeVideos||e.includeAllSerpFeatures,Ze=Ut(v,Xe),et=e.includeWhatPeopleSaying||e.includeAllSerpFeatures,tt=Ft(v,et),be=m(v.forums),we=be&&Array.isArray(be.items)?{observed:!0,rawCount:be.items.length,rawShapeValid:!0}:z(v,["discussions","forums","forum_results"]),ve=z(v,["videos","video_results","short_videos","shorts"]),rt={localPack:cr,forums:L({requested:We,moduleObserved:we.observed,rawCount:we.rawCount,mappedCount:Ye.length,rawShapeValid:we.rawShapeValid}),videos:L({requested:Xe,moduleObserved:ve.observed,rawCount:ve.rawCount,mappedCount:Ze.length,rawShapeValid:ve.rawShapeValid}),aiOverview:L({requested:je,moduleObserved:Me(v,["ai_overview","aiOverview","overview"]).observed,rawCount:Me(v,["ai_overview","aiOverview","overview"]).rawCount,mappedCount:Qe.detected?1:0,rawShapeValid:Me(v,["ai_overview","aiOverview","overview"]).rawShapeValid}),whatPeopleSaying:L({requested:et,moduleObserved:z(v,["what_people_are_saying","whatPeopleSaying"]).observed,rawCount:z(v,["what_people_are_saying","whatPeopleSaying"]).rawCount,mappedCount:tt.length,rawShapeValid:z(v,["what_people_are_saying","whatPeopleSaying"]).rawShapeValid})},dr=ae(O,k),pr=k.find(d=>d.page===1)?.resultCount??0,re=k.find(d=>d.page===2)?.resultCount??0,mr=se({query:e.query,finalQuery:e.query,canonicalLocation:w?.canonical??null,locationResolutionSource:w?.source??"not_requested",locationAmbiguousCandidates:w?.ambiguousCandidates??0,uule:A,outboundProviderMethod:l?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_native_proxy":"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_serp_rest"}),oe=Ke?Vt(k.find(d=>d.page===2)?.failureCode??"provider_error"):Object.values(rt).some(d=>d==="incomplete"||d==="unknown")?"optional_feature_parsing":null,gr={pagination:{...dr,providerRequestCount:$e},features:rt,queryIntegrity:mr,failureStage:oe},ot=e.includeAllSerpFeatures?(()=>{let d=D.map(({page:I,payload:b})=>{let T=Dt(b),q=Bt(b,!0),j=Ut(b,!0),Q=Ft(b,!0),F=qt(b,!0),W=Ht(b,!0),P=Gt(b,T),ne=Or(b,{localPack:T.length,forums:q.length,videos:j.length,aiOverview:F.detected?1:0,aiMode:W.detected?1:0,whatPeopleSaying:Q.length,entityIds:P.entities.length+P.kgIds.length+P.cids.length+P.gcids.length});return{page:I,...ne,localPack:T,forums:q,videos:j,whatPeopleSaying:Q,aiOverview:F,aiMode:W,entityIds:P}});return{status:d[0].status,paaPreview:d.flatMap(I=>I.paaPreview),additional:d.flatMap(I=>I.additional),pages:d}})():void 0,fr=new Date().toISOString(),nt=Date.now()-c;return{seed:e.query,location:e.location??null,extractedAt:fr,diagnostics:{phaseTimings:{providerConnectMs:sr,serpParseMs:Date.now()-lr,totalServerMs:nt},pagination:{requestedPages:O,capturedPages:O===2&&re>0?2:1,page2Status:O===2?re>0?"captured":"failed":"not_requested",page1OrganicCount:pr,page2OrganicCount:re,...O===2&&re===0?{failureCode:k.find(d=>d.page===2)?.failureCode==="captcha"?"captcha":k.find(d=>d.page===2)?.failureCode==="timeout"?"timeout":"empty_page"}:{}},completionStatus:"serp_only",problem:null,resultQuality:oe?"partial":"complete",degradedResult:!!oe,degradationReasons:[],retryRecommended:!!oe,serpCompleteness:gr},totalQuestions:0,surface:"web",aiOverview:Qe,aiMode:Ht(v,e.includeAllSerpFeatures),...ot?{fullSerpFeatures:ot}:{},whatPeopleSaying:tt,tree:[],flat:[],videos:Ze,forums:Ye,organicResults:ur,localPack:ye,entityIds:Gt(v,ye),stats:{seed:e.query,totalQuestions:0,maxDepthReached:0,durationMs:nt,errorCount:0}}}var Tr="scraperlink~google-search-results-serp-scraper",Z="https://api.apify.com/v2";var C=class extends Error{constructor(o,r=null,n=!1,a=null){super(o);this.runId=r;this.retrySafe=n;this.terminalStatus=a;this.name="ApifyGoogleRunError"}runId;retrySafe;terminalStatus};function ee(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}function te(e){return typeof e=="string"&&e.trim()?e.trim():null}function Cr(e){try{return["http:","https:"].includes(new URL(e).protocol)}catch{return!1}}function xr(e){if(typeof e!="string")return e;try{return JSON.parse(e)}catch{throw new Error("Apify searchResults is not valid JSON")}}function Jt(e,t){if(!Array.isArray(e)||e.length===0)throw new Error("Apify dataset contains no search results");let o=[];for(let[a,i]of e.entries()){let s=ee(i);if(!s)throw new Error("Apify dataset contains an invalid row");let u=xr(s.searchResults??s),l=ee(u),c=Array.isArray(u)?u:Array.isArray(l?.results)?l.results:Array.isArray(l?.organicResults)?l.organicResults:Array.isArray(l?.organic)?l.organic:l&&(l.position!==void 0||l.title!==void 0)?[l]:null;if(!c)throw new Error("Apify dataset search result shape is unsupported");let p=Number(s.page_number??l?.page_number??a+1);if(!Number.isInteger(p)||p<1||p>t)throw new Error("Apify dataset has an unexpected page number");o.push(...c.map(_=>({row:_,page:p})))}let r=o.map(({row:a,page:i},s)=>{let u=ee(a),l=u?.position,c=te(u?.title),p=te(u?.url??u?.link);if(!u||!c||!p||!Cr(p)||l!==void 0&&(!Number.isInteger(l)||l<1))throw new Error(`Apify search result ${s+1} is missing a valid position, URL, or title`);let _=te(u.description??u.snippet),w=typeof l=="number"?l:s%10+1;return{position:i>1&&w<=10?w+(i-1)*10:w,url:p,title:c,description:_}});if(r.length>t*10)throw new Error("Apify returned more results than requested");let n={page1:r.filter(a=>a.position<=10).length,page2:r.filter(a=>a.position>10).length};if(n.page1===0||t===2&&n.page2===0)throw new Error("Apify did not return every requested result page");return{results:r,pageResultCounts:n}}async function ge(e,t,o,r){let n=await o(e,{headers:{Authorization:`Bearer ${t}`},signal:r});if(!n.ok)throw new Error(`Apify API returned HTTP ${n.status}`);return n.json()}function qe(e){let t=ee(ee(e)?.data),o=te(t?.id),r=te(t?.status);if(!o||!r)throw new Error("Apify returned an invalid run receipt");return{id:o,status:r}}async function Mr(e,t=fetch){let o=performance.now(),r=AbortSignal.timeout(9e4),n=e.signal?AbortSignal.any([e.signal,r]):r,a=e.runId,i=!1,s=null;try{if(!/^[A-Za-z0-9]+$/.test(a))throw new Error("Invalid Apify run ID");let u=qe(await ge(`${Z}/actor-runs/${a}?waitForFinish=30`,e.token,t,n));for(;["READY","RUNNING","TIMING-OUT","ABORTING"].includes(u.status);)u=qe(await ge(`${Z}/actor-runs/${a}?waitForFinish=30`,e.token,t,n));if(i=!0,s=u.status,u.status!=="SUCCEEDED")throw new Error(`Apify run ended with status ${u.status}`);let l=e.pages??1,c=await ge(`${Z}/actor-runs/${a}/dataset/items?format=json`,e.token,t,n);return{query:e.query,...Jt(c,l),requestedPages:l,runId:a,elapsedMs:Math.round(performance.now()-o)}}catch(u){throw new C(u instanceof Error?u.message:String(u),a,i,s)}}async function jt(e,t,o=fetch){let r=performance.now(),n=e.query.trim(),a=e.pages??1;if(!n||n.includes(`
|
|
6
|
+
`))throw new Error("Apify search requires one nonempty query");if(a!==1&&a!==2)throw new Error("Apify search supports one or two pages");let i=t.token.trim();if(!i)throw new Error("Apify API token is required");let s=t.maxChargeUsd??.01;if(!Number.isFinite(s)||s<=0)throw new Error("Invalid Apify charge cap");let u=AbortSignal.timeout(9e4),l=e.signal?AbortSignal.any([e.signal,u]):u,c=`${Z}/actors/${Tr}/runs?maxTotalChargeUsd=${s}&restartOnError=false&waitForFinish=30`,p=null,_=!1,w=null;try{let A=await o(c,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({keyword:n,limit:a===2?"20":"10",page:1,proxy_location:"us",include_merged:!1}),signal:l});if(!A.ok)throw new Error(`Apify run start returned HTTP ${A.status}`);let S=qe(await A.json());if(p=S.id,_=!["READY","RUNNING","TIMING-OUT","ABORTING"].includes(S.status),_&&(w=S.status),S.status!=="SUCCEEDED"&&S.status!=="READY"&&S.status!=="RUNNING")throw new Error(`Apify run ended with status ${S.status}`);if(S.status==="SUCCEEDED"){let O=await ge(`${Z}/actor-runs/${p}/dataset/items?format=json`,i,o,l);return{query:n,...Jt(O,a),requestedPages:a,runId:p,elapsedMs:Math.round(performance.now()-r)}}return{...await Mr({runId:p,query:n,token:i,pages:a,signal:l},o),elapsedMs:Math.round(performance.now()-r)}}catch(A){throw A instanceof C?A:new C(A instanceof Error?A.message:String(A),p,_,w)}}var Qt="apify_google_serp",Wt="apify",Nr="apify_google_serp_scraperlink";async function Yt(e,t,o,r){let n=Mt();await B({receiptId:e,costState:"estimated",units:t,unitType:n.unitType,amountUsdNanos:ce(n,t),rateSource:n.source,providerProduct:n.providerProduct,billingTier:n.billingTier,billableEvent:n.billableEvent,measurementSource:"actor_run_succeeded",rateNumerator:n.numeratorUsdNanos,rateDenominator:n.denominatorUnits,ratePolicyVersion:n.policyVersion,rateEffectiveAt:n.effectiveAt,providerStatus:r,providerDurationMs:o})}async function Xt(e){let t=performance.now(),o=await V({runId:e.operationRunId,attemptNumber:e.attemptNumber,method:Qt,provider:Wt,parentAttemptId:e.parentAttemptId,edgeKind:e.edgeKind,retryKind:e.retryKind,normalizedFlags:{page:1,pages:e.options.pages??1,proxyLocation:"us"}}),r=await H({attemptId:o,provider:Wt,providerProduct:Nr,billingTier:"store_pay_per_event",accountScope:e.accountScope,method:Qt,providerStatus:"before_actor_start"}),n=null,a=null;try{return n=await jt(e.options,{token:e.token},e.fetchImpl),await U(r.id,n.runId),await Yt(r.id,n.requestedPages,n.elapsedMs,"succeeded_estimated"),{...n,attemptId:o}}catch(i){throw a=i,n?Object.assign(new C("Apify cost tracking failed after run completion",n.runId),{attemptId:o}):(i instanceof C&&i.runId&&(await U(r.id,i.runId),i.terminalStatus==="SUCCEEDED"?await Yt(r.id,e.options.pages??1,Math.round(performance.now()-t),"succeeded_dataset_unavailable"):await Et({receiptId:r.id,units:e.options.pages??1,unitType:"page",providerStatus:"run_outcome_or_cost_pending"})),Object.assign(i instanceof Error?i:new Error(String(i)),{attemptId:o}))}finally{await $({attemptId:o,status:a?e.options.signal?.aborted?"timed_out":"failed":"succeeded",errorCode:a?"apify_search_failed":null,durationMs:Math.round(performance.now()-t)})}}function Zt(e){let t=e.results.map(r=>{let n=new URL(r.url).hostname.replace(/^www\./,"");return{position:r.position,title:r.title,url:r.url,rawUrl:r.url,resolvedUrl:r.url,linkType:"plain",resolutionStatus:"not_needed",domain:n,cite:null,snippet:r.description,isRedditStyle:n==="reddit.com",inlineRating:null}}),o=ae(e.requestedPages,[{page:1,attempted:!0,captured:!0,resultCount:e.pageResultCounts.page1,requestOffset:0,providerRequestIdObserved:!0},...e.requestedPages===2?[{page:2,attempted:!0,captured:!0,resultCount:e.pageResultCounts.page2,requestOffset:10,providerRequestIdObserved:!0}]:[]]);return{seed:e.query,location:null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:{providerConnectMs:e.elapsedMs,totalServerMs:e.elapsedMs},pagination:{requestedPages:e.requestedPages,capturedPages:e.requestedPages,page2Status:e.requestedPages===2?"captured":"not_requested",page1OrganicCount:e.pageResultCounts.page1,page2OrganicCount:e.pageResultCounts.page2},completionStatus:"serp_only",problem:null,resultQuality:"complete",degradedResult:!1,degradationReasons:[],retryRecommended:!1,serpCompleteness:{pagination:o,features:{localPack:"not_requested",forums:"not_requested",videos:"not_requested",aiOverview:"not_requested",whatPeopleSaying:"not_requested"},queryIntegrity:se({query:e.query,finalQuery:e.query,locationResolutionSource:"not_requested",outboundProviderMethod:"default_search"}),failureStage:null}},totalQuestions:0,surface:"web",aiOverview:{detected:!1,text:null,citations:[],shareUrl:null},aiMode:{detected:!1,text:null,citations:[]},whatPeopleSaying:[],tree:[],flat:[],videos:[],forums:[],organicResults:t,localPack:[],entityIds:{entities:[],kgIds:[],cids:[],gcids:[]},stats:{seed:e.query,totalQuestions:0,maxDepthReached:0,durationMs:e.elapsedMs,errorCount:0}}}var Dr=12e3;async function er(e){if(e.mode==="full")return qr(e);if(!e.token)throw new Error("Apify search is not configured");let t=performance.now(),o;for(let n=1;n<=2;n++){let a=AbortSignal.any([e.signal,AbortSignal.timeout(Dr)]);try{let i=await Xt({options:{query:e.query,pages:e.pages,signal:a},token:e.token,operationRunId:e.operationRunId,accountScope:e.accountScope,attemptNumber:n,...o?{parentAttemptId:o,edgeKind:"same_method_retry",retryKind:"same_method"}:{}});console.info(JSON.stringify({event:"serp_provider_succeeded",provider:"apify",operationRunId:e.operationRunId,attemptNumber:n,durationMs:i.elapsedMs,resultCount:i.results.length,pages:i.requestedPages,runId:i.runId}));let s=Zt(i);return s.stats.durationMs=Math.round(performance.now()-t),s.diagnostics.phaseTimings&&(s.diagnostics.phaseTimings.totalServerMs=s.stats.durationMs),{result:s,mode:"light",deliveryProvider:"apify",deliveredPages:i.requestedPages}}catch(i){o=i&&typeof i=="object"&&"attemptId"in i?String(i.attemptId):void 0;let s=i instanceof C?i:null;if(console.warn(JSON.stringify({event:"serp_provider_failed",provider:"apify",operationRunId:e.operationRunId,attemptNumber:n,runId:s?.runId??null,retrySafe:s?.retrySafe===!0,error:i instanceof Error?i.message:String(i)})),e.signal.aborted||!o||s?.retrySafe!==!0)throw i}}if(!o)throw new Error("Search attempt receipt is missing");let r={query:e.query,gl:"us",hl:"en",device:"desktop",pages:e.pages,includeAllSerpFeatures:!1,includeLocalPack:!1,includeForums:!1,includeVideos:!1,includeAiOverview:!1,includeWhatPeopleSaying:!1,signal:e.signal};console.info(JSON.stringify({event:"serp_provider_fallback",provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",operationRunId:e.operationRunId,attemptNumber:3}));try{let n=await De(r,process.env,fetch,void 0,{attemptNumber:3,parentAttemptId:o});if(n.organicResults.length===0)throw new Error("Search returned no organic results");return n.stats.durationMs=Math.round(performance.now()-t),n.diagnostics.phaseTimings&&(n.diagnostics.phaseTimings.totalServerMs=n.stats.durationMs),console.info(JSON.stringify({event:"serp_provider_succeeded",provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",operationRunId:e.operationRunId,attemptNumber:3,durationMs:n.stats.durationMs,resultCount:n.organicResults.length,pages:e.pages})),{result:n,mode:"light",deliveryProvider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",deliveredPages:n.diagnostics.pagination?.capturedPages===2?2:1}}catch(n){throw console.warn(JSON.stringify({event:"serp_provider_failed",provider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",operationRunId:e.operationRunId,attemptNumber:3,error:n instanceof Error?n.message:String(n)})),n}}async function qr(e){let t=performance.now(),o={query:e.query,gl:"us",hl:"en",device:"desktop",pages:e.pages,includeAllSerpFeatures:!0,includeLocalPack:!0,includeForums:!0,includeVideos:!0,includeAiOverview:!0,includeWhatPeopleSaying:!0,signal:e.signal},r=await De(o);if(r.organicResults.length===0)throw new Error("Full Search returned no organic results");return r.stats.durationMs=Math.round(performance.now()-t),r.diagnostics.phaseTimings&&(r.diagnostics.phaseTimings.totalServerMs=r.stats.durationMs),{result:r,mode:"full",deliveryProvider:"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",deliveredPages:r.diagnostics.pagination?.capturedPages===2?2:1}}async function He(e,t,o=3){for(let r=1;r<=o;r++){try{let n=await fetch(e,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t),signal:AbortSignal.timeout(1e4)});if(n.ok)return;console.warn(`[webhook] attempt ${r} \u2192 ${n.status} from ${e}`)}catch(n){console.warn(`[webhook] attempt ${r} failed:`,n instanceof Error?n.message:n)}r<o&&await new Promise(n=>setTimeout(n,1e3*r*2))}console.error(`[webhook] gave up after ${o} attempts for ${e}`)}function Hr(e){return e instanceof Error?e.message:String(e)}function Ur(e,t){return e instanceof DOMException&&(e.name==="TimeoutError"||e.name==="AbortError")?!0:/timeout|timed out|Timeout \d+ms exceeded|deadline/i.test(t)}function Br(e){return/captcha|recaptcha|unusual traffic|google\.com\/sorry|blocked/i.test(e)}function Fr(e){return/ERR_TUNNEL_CONNECTION_FAILED|ERR_PROXY_CONNECTION_FAILED|ERR_SOCKS_CONNECTION_FAILED|tunnel connection failed|proxy connection failed|transport error: proxy/i.test(e)}function Gr(e){return/proxy unavailable|proxy_unavailable|connection_test_failed|did not return a proxy id|configured fallback/i.test(e)}function Lr(e){return/(?:spending|billing|organization|account).{0,80}(?:cap|limit|blocked|disabled)|(?:quota|capacity).{0,40}(?:reached|exceeded)|https?:\/\/\S*dashboard/i.test(e)}function Vr(e){return/browser (?:has been )?closed|context (?:has been )?closed|target page, context or browser has been closed|session closed|page has been closed/i.test(e)}function Ue(e){let t=Hr(e);return e instanceof ct?{error_code:"request_aborted",error_type:"request_aborted",message:M("request_aborted"),retryable:!0,httpStatus:408,terminalStatus:"cancelled"}:e instanceof ut||Br(t)?{error_code:"captcha_exhausted",error_type:"captcha",message:M("captcha_exhausted"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Tt(e,t)?{error_code:"vendor_unavailable",error_type:"service_unavailable",message:M("vendor_unavailable"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:e instanceof dt?{error_code:"location_mismatch",error_type:"location_mismatch",message:M("location_mismatch"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Fr(t)?{error_code:"proxy_tunnel_failed",error_type:"connection",message:M("proxy_tunnel_failed"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Gr(t)?{error_code:"proxy_unavailable",error_type:"connection",message:M("proxy_unavailable"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Vr(t)?{error_code:"browser_session_interrupted",error_type:"extraction",message:M("browser_session_interrupted"),retryable:!0,httpStatus:503,terminalStatus:"failed"}:Ur(e,t)?{error_code:"harvest_timeout",error_type:"timeout",message:M("harvest_timeout"),retryable:!0,httpStatus:504,terminalStatus:"failed"}:Lr(t)?{error_code:"service_unavailable",error_type:"service_unavailable",message:Se,retryable:!0,httpStatus:503,terminalStatus:"failed"}:{error_code:"extraction_failed",error_type:"extraction",message:Se,retryable:!1,httpStatus:500,terminalStatus:"failed"}}function Be(e){return JSON.stringify({error_code:e.error_code,error_type:e.error_type,message:e.message,retryable:e.retryable})}function fe(e,t={}){let o=lt({errorCode:e.error_code,errorType:e.error_type,retryable:e.retryable,retryAfterSeconds:t.retryAfterSeconds,chargeStatus:t.chargeStatus,details:t.details});return{error:o.message,...o}}function Fe(e,t={}){let{error:o,...r}=fe(e,t);return r}function ko(e,t={}){let o=Ue(e);return{body:fe(o,t),status:o.httpStatus}}import{createHash as $r}from"crypto";var zr=1e9;function Kr(e){return $r("sha256").update(JSON.stringify(e)).digest("hex")}function he(e){return`harvest:${e}`}async function Mo(e){let t=he(e.jobId);try{return(await Rt({id:t,userId:e.userId,ownerScope:`user:${e.userId}`,tool:e.tool,normalizedFlags:e.normalizedFlags,idempotencyKey:`job:${e.jobId}`,requestFingerprint:Kr(e.normalizedFlags),jobId:e.jobId,requestId:e.requestId??null,deploymentCommit:process.env.VERCEL_GIT_COMMIT_SHA?.trim()||process.env.GIT_COMMIT_SHA?.trim()||null})).id}catch(o){return console.warn(JSON.stringify({event:"operation_run_start_failed",job_id:e.jobId,tool:e.tool,message:o instanceof Error?o.message:String(o)})),null}}async function Le(e,t,o){if(e)try{await Pt({runId:e,status:t,failureClass:o})}catch(r){console.warn(JSON.stringify({event:"operation_run_finish_failed",operation_run_id:e,message:r instanceof Error?r.message:String(r)}))}}async function No(e,t,o,r){if(!(!e||!t))try{await kt({runId:e,billingTable:"billing_debits",billingKey:t,relation:o,amountMc:r})}catch(n){console.warn(JSON.stringify({event:"operation_billing_link_failed",operation_run_id:e,relation:o,message:n instanceof Error?n.message:String(n)}))}}function Ge(e){return e==="timeout"?"timed_out":e==="request_aborted"?"cancelled":e==="browser_session_interrupted"?"interrupted":e==="captcha"||e==="proxy_tunnel_failed"||e==="proxy_unavailable"||e==="location_mismatch"||e==="error"?"failed":"succeeded"}function Jr(e){return e==="\u0062\u0072\u0069\u0067\u0068\u0074_\u0064\u0061\u0074\u0061_browser_api"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061":"\u006b\u0065\u0072\u006e\u0065\u006c"}function tr(e,t,o=0){let r=new Map,n=null;return async a=>{if(e)try{if(a.type==="started"){let s=o+a.attemptNumber;if(s>1&&!n){let p=(await It(e))?.attempts.at(-1);n=p?.id==null?null:String(p.id)}let u=await V({runId:e,attemptNumber:s,method:a.method,provider:a.provider,parentAttemptId:s===1?null:n,edgeKind:s===1?null:o>0&&a.attemptNumber===1?"durable_resume":a.retryKind==="provider_fallback"?"provider_fallback":"same_method_retry",retryKind:s===1?null:o>0&&a.attemptNumber===1?"durable_resume":a.retryKind,retryReason:s===1?null:o>0&&a.attemptNumber===1?"durable_worker_resume":a.retryReason,retryOwner:s===1?null:o>0&&a.attemptNumber===1?"durable_reconciler":"harvest",normalizedFlags:{maxAttempts:a.maxAttempts,maxQuestions:a.maxQuestions,hasLocation:!!a.location,plannedProvider:a.provider,planReason:a.planReason??null,planTimeoutMs:a.planTimeoutMs??null},startedAt:a.startedAt}),l=await H({attemptId:u,provider:a.provider,providerProduct:a.provider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api":"\u006b\u0065\u0072\u006e\u0065\u006c_browser",billingTier:a.provider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?X("https://www.google.com/search"):null,accountScope:t,method:a.method,providerStatus:"started"});r.set(a.attemptNumber,{attemptId:u,receiptId:l.id,plannedProvider:a.provider,observedProvider:null,providerMismatch:!1,method:a.method,startedAtMs:Date.parse(a.startedAt),billingMode:null}),n=u;return}let i=r.get(a.attemptNumber);if(!i)throw new Error(`Missing operation attempt state for attempt ${a.attemptNumber}`);if(a.type==="provider_session_started"){let s=Jr(a.provider);if(i.observedProvider=s,i.billingMode=a.billingMode??null,s!==i.plannedProvider){i.providerMismatch=!0,await B({receiptId:i.receiptId,costState:"unavailable",providerStatus:"provider_mismatch",errorCode:"provider_mismatch",errorMessage:`Planned ${i.plannedProvider}; observed ${s}`,finalizedAt:a.observedAt});let u=s==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser":"\u006b\u0065\u0072\u006e\u0065\u006c_browser",l=await H({attemptId:i.attemptId,provider:s,providerProduct:s==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api":"\u006b\u0065\u0072\u006e\u0065\u006c_browser",billingTier:s==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?X("https://www.google.com/search"):null,accountScope:t,method:u,providerStatus:"observed_provider_mismatch"});i.receiptId=l.id,i.method=u}await U(i.receiptId,a.providerSessionId);return}if(await $({attemptId:i.attemptId,status:i.providerMismatch?"failed":Ge(a.outcome),errorCode:i.providerMismatch?"provider_mismatch":Ge(a.outcome)==="succeeded"?null:a.outcome,errorMessage:a.error,durationMs:a.durationMs,endedAt:a.completedAt}),(i.observedProvider??i.plannedProvider)==="\u006b\u0065\u0072\u006e\u0065\u006c"){let s=i.billingMode==="headful",u=i.billingMode==="headless"||i.billingMode==="headful"?wt(a.durationMs,s):null;await B({receiptId:i.receiptId,costState:"estimated",units:a.durationMs/1e3,unitType:"wall_open_second",amountUsdNanos:u==null?null:Math.round(u*zr),providerProduct:"\u006b\u0065\u0072\u006e\u0065\u006c_browser",billingTier:i.billingMode,billableEvent:"provider_active_gb_second",measurementSource:"wall_open_time_proxy",rateSource:u!=null?`\u006b\u0065\u0072\u006e\u0065\u006c_${i.billingMode}_usd_per_second:${s?bt:_t}`:null,providerStatus:i.providerMismatch?"provider_mismatch":a.outcome,providerDurationMs:a.durationMs,errorCode:i.providerMismatch?"provider_mismatch":Ge(a.outcome)==="succeeded"?null:a.outcome,errorMessage:a.error,finalizedAt:a.completedAt})}}catch(i){console.warn(JSON.stringify({event:"operation_attempt_telemetry_failed",operation_run_id:e,attempt_number:a.attemptNumber,message:i instanceof Error?i.message:String(i)}))}}}function rr(e,t,o=null,r="production-default",n=0){let a=tr(o,r,n);return async i=>{if(await a(i),i.type==="started"){await pt({jobId:e,userId:t,attemptNumber:i.attemptNumber,maxAttempts:i.maxAttempts,query:i.query,location:i.location,maxQuestions:i.maxQuestions,startedAt:i.startedAt});return}if(i.type==="provider_session_started"){await mt({jobId:e,attemptNumber:i.attemptNumber,browserProvider:i.provider,providerSessionId:i.providerSessionId,observedAt:i.observedAt});return}await gt({jobId:e,attemptNumber:i.attemptNumber,outcome:i.outcome,\u006b\u0065\u0072\u006e\u0065\u006cSessionId:i.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,questionCount:i.questionCount,durationMs:i.durationMs,error:i.error,willRetry:i.willRetry,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:i.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:i.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:i.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cDeleteError,browserCloseSucceeded:i.cleanup.browserCloseSucceeded,browserCloseError:i.cleanup.browserCloseError,browserProvider:i.cleanup.provider??null,providerSessionId:i.cleanup.providerSessionId??null,providerLookupStatus:i.cleanup.providerSessionId?"pending":"not_applicable",providerErrorCode:i.cleanup.providerDisconnectObserved?"browser_session_interrupted":null,providerErrorMessage:i.cleanup.providerDisconnectMessage??null,providerReasonSource:i.cleanup.providerDisconnectObserved?"client_runtime":null,providerDisconnectObserved:i.cleanup.providerDisconnectObserved??!1,providerDisconnectMessage:i.cleanup.providerDisconnectMessage??null,debug:i.debug,completedAt:i.completedAt})}}var or=2,Ve=0;function nr(e){if(!e||typeof e!="object")return 0;let t=e;return typeof t.totalQuestions=="number"?t.totalQuestions:Array.isArray(t.flat)?t.flat.length:0}function ir(e){return Te.paa_base+Math.max(1,e)*Te.paa}async function ar(e){Ve++;try{let t=typeof e.options=="string"?JSON.parse(e.options):e.options,o={value:null},r=null,n=t.serpOnly&&!t.serpIdentity,a=he(e.id),i=process.env.APIFY_API_TOKEN?.trim();if(n&&(!$t()||t.mode!=="full"&&!i))throw new Error("Search providers are not configured");let s=await ht({op:t.serpOnly?"serp":"paa",userId:Number(e.user_id),headlessSentOut:o,operationRunId:a,operationAccountScope:"production-default"},()=>n?er({query:t.query??e.query,pages:t.pages===2?2:1,token:i,mode:t.mode,operationRunId:a,accountScope:"production-default",signal:AbortSignal.timeout(at(t.maxQuestions??30,!0,t.mode,t.pages).serverMs)}).then(l=>(r=l,l.result)):At({...t,\u006b\u0065\u0072\u006e\u0065\u006cApiKey:st(),headless:!0,format:"json",outputDir:"/tmp/paa-output-api",onAttemptEvent:rr(e.id,e.user_id,a)}));if(n&&!r)throw new Error("Search provider billing receipt is missing");await ft(e.id,s),await Le(a,"succeeded");let u=await Ae(e.id,e.user_id);if(typeof t.billingHoldMc=="number"&&t.billingDebitKey){let l=t.serpOnly?n?xe(r.deliveredPages,r.deliveryProvider):Ce(o.value):ir(nr(s));await ke(Number(e.user_id),t.billingDebitKey,l,t.serpOnly?"serp_refund":"paa_refund",t.serpOnly?"SERP search settlement":"PAA harvest settlement",t.serpOnly?"serp_search":"paa_harvest")}else if(!t.serpOnly&&typeof t.billingHoldMc=="number"){let l=ir(nr(s)),c=t.billingHoldMc-l;c>0?await ie(e.user_id,c,"paa_refund","overestimate refund"):c<0&&await Ee(e.user_id,-c,"paa",t.query??e.query)}else if(t.serpOnly&&typeof t.billingHoldMc=="number"){let l=n?xe(r.deliveredPages,r.deliveryProvider):Ce(o.value),c=t.billingHoldMc-l;c>0?await ie(e.user_id,c,"serp_refund","headless-mode pricing settle"):c<0&&await Ee(e.user_id,-c,"serp",t.query??e.query)}e.callback_url&&await He(e.callback_url,{job_id:e.id,status:"done",result:Ot(s),attempts:Oe(u)})}catch(t){console.error("[harvest/worker] failed",{jobId:e.id,error:t instanceof Error?t.message:String(t)});let o=Ue(t);await Le(he(e.id),o.error_code==="harvest_timeout"?"timed_out":o.terminalStatus,o.error_code);let r=typeof e.options=="string"?JSON.parse(e.options):e.options,n=typeof r.billingHoldMc=="number"&&r.billingHoldMc>0;await Pe(e.id,Be(o),Fe(o,{chargeStatus:n?"refund_pending":"not_charged"}));let a=await Ae(e.id,e.user_id);try{n&&(r.billingDebitKey?await ke(Number(e.user_id),r.billingDebitKey,0,r.serpOnly?"serp_refund":"paa_refund","failed call",r.serpOnly?"serp_search":"paa_harvest"):await ie(e.user_id,r.billingHoldMc,"refund","failed call"),await Pe(e.id,Be(o),Fe(o,{chargeStatus:"refunded"})))}catch{}e.callback_url&&await He(e.callback_url,{job_id:e.id,status:"failed",...fe(o),attempts:Oe(a)})}finally{Ve--}}async function jr(){let e=await Re();if(!e)return{claimed:!1};let t=Date.now();return await ar(e),{claimed:!0,jobId:e.id,completed:!0,durationMs:Date.now()-t}}async function Xo(e){let t=[];for(let o=0;o<e.maxJobs&&!(Date.now()>=e.deadlineMs);o++){let r=await jr();if(t.push(r),!r.claimed)break}return t}function Zo(){setInterval(async()=>{if(Ve>=or)return;let e=await Re();e&&ar(e)},2e3),console.log(`[worker] started \u2014 polling every 2s, max ${or} concurrent`)}export{X as a,ce as b,_r as c,eo as d,$t as e,er as f,Ue as g,Be as h,fe as i,Fe as j,ko as k,he as l,Mo as m,Le as n,No as o,rr as p,He as q,jr as r,Xo as s,Zo as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";var i="none",a="none";function c(t){switch(t){case"day":return"qdr:d";case"week":return"qdr:w";case"month":return"qdr:m";case"year":return"qdr:y";default:return}}var u=e.object({businessName:e.string().min(1),location:e.string().min(1),gl:e.string().length(2).default("us"),hl:e.string().length(2).default("en"),includeReviews:e.boolean().default(!1),maxReviews:e.number().int().min(1).max(500).default(50),includeServices:e.boolean().default(!1),includeImages:e.boolean().default(!1),imageScope:e.enum(["owner","all"]).default("all"),maxImages:e.number().int().min(1).max(250).default(100),maxInlineImages:e.number().int().min(0).max(5).default(3),\u006b\u0065\u0072\u006e\u0065\u006cApiKey:e.string().optional(),\u006b\u0065\u0072\u006e\u0065\u006cProxyId:e.string().optional(),headless:e.boolean().default(!0)}),g=e.object({query:e.string().min(1),location:e.string().optional(),gl:e.string().length(2).default("us"),hl:e.string().length(2).default("en"),maxResults:e.number().int().min(1).max(50).default(10),includeServices:e.boolean().default(!1),proxyMode:e.enum(["location","configured","none"]).default(a),proxyZip:e.string().regex(/^\d{5}$/).optional(),serpRedirect:e.boolean().optional(),forceDirectEgress:e.boolean().optional(),debug:e.boolean().default(!1),\u006b\u0065\u0072\u006e\u0065\u006cApiKey:e.string().optional(),\u006b\u0065\u0072\u006e\u0065\u006cProxyId:e.string().optional(),\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution:e.unknown().optional(),headless:e.boolean().default(!0)}),p=e.object({name:e.string().nullable(),rating:e.string().nullable(),reviewCount:e.string().nullable(),category:e.string().nullable(),address:e.string().nullable(),hoursSummary:e.string().nullable(),phone:e.string().nullable(),phoneDisplay:e.string().nullable(),website:e.string().nullable(),plusCode:e.string().nullable(),bookingUrl:e.string().nullable()}),d=e.object({day:e.string(),hours:e.string()}),b=e.object({reviewHistogram:e.array(e.object({stars:e.number(),count:e.string()})),reviewTopics:e.array(e.object({label:e.string(),count:e.string()}))}),m=e.object({reviewId:e.string(),author:e.string().nullable(),stars:e.string().nullable(),date:e.string().nullable(),text:e.string().nullable(),ownerResponse:e.string().nullable()}),f=e.object({section:e.string(),attribute:e.string()});async function R(t){if((process.env.NODE_ENV==="test"||process.env.VITEST)&&process.env.MCP_SCRAPER_ENABLE_MEMORY_LIBRARY_SINK_IN_TESTS!=="1")return;let r=process.env.MCP_SCRAPER_API_KEY?.trim(),s=(process.env.MCP_SCRAPER_BASE_URL??"https://mcpscraper.dev").replace(/\/$/,"");if(r)try{let n=await fetch(`${s}/memory/mcp-call`,{method:"POST",headers:{"content-type":"application/json","x-api-key":r},body:JSON.stringify({toolName:"libraryIngestTool",args:t})}),o=await n.json().catch(()=>null);(!n.ok||o?.ok===!1)&&console.warn("[memory-library-sink] ingest not accepted:",n.status,o?.error??"")}catch(n){console.warn("[memory-library-sink] ingest failed:",n?.message)}}export{i as a,a as b,c,u as d,g as e,p as f,d as g,b as h,f as i,R as j};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as Ge,h as ke,i as Qe,j as Ve,l as et}from"./chunk-IK5BG7MO.js";import"./chunk-XG6GCEUE.js";import{b as Ye,c as Xe,h as Ze,j as Ke}from"./chunk-
|
|
1
|
+
import{c as Ge,h as ke,i as Qe,j as Ve,l as et}from"./chunk-IK5BG7MO.js";import"./chunk-XG6GCEUE.js";import{b as Ye,c as Xe,h as Ze,j as Ke}from"./chunk-PMOPJOSJ.js";import"./chunk-M5QHXNFZ.js";import{c as ze,e as Fe,f as He,g as We}from"./chunk-W2BVJ7S2.js";import{c as Je}from"./chunk-RK2VCTZI.js";import"./chunk-ORB4RHCK.js";import"./chunk-TMB56NCA.js";import"./chunk-RZEZJAID.js";import"./chunk-6DTXIZY2.js";import"./chunk-HE45FFBU.js";import{t as qe}from"./chunk-WJ4XFLS4.js";import{createWriteStream as se,mkdirSync as ie,readFileSync as xt,readdirSync as kt,rmSync as _t,statSync as Pt,writeFileSync as g}from"fs";import{createHash as G}from"crypto";import{basename as Mt,join as a}from"path";import{tmpdir as It}from"os";import{createGzip as Ct}from"zlib";import{once as Y}from"events";import{finished as ae}from"stream/promises";import{ZipFile as At}from"yazl";import Rt from"p-limit";import{createHash as _e}from"crypto";var gt=500,ht=.9,ft=1e4,yt=5e4;function ge(r,s){let n=10**s;return Math.round(r*n)/n}function wt(r,s){if(r.length===0||r.length!==s.length)throw new Error("Similarity vectors must have the same non-zero dimension.");let n=0,c=0,b=0;for(let w=0;w<r.length;w++)n+=r[w]*s[w],c+=r[w]*r[w],b+=s[w]*s[w];return c===0||b===0?0:Math.max(-1,Math.min(1,n/(Math.sqrt(c)*Math.sqrt(b))))}function St(r){let s=_e("sha256");for(let n of[...r].sort((c,b)=>c.url.localeCompare(b.url)))s.update(n.url),s.update("\0"),s.update(n.contentHash),s.update("\0");return s.digest("hex")}function tt(r){let s=r.replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/https?:\/\/\S+/gi," ").replace(/&(?:amp|nbsp|quot|#39);/gi," ").replace(/[#>*_`~|\\-]+/g," ").replace(/[^\p{L}\p{N}]+/gu," ").replace(/\s+/g," ").trim().toLowerCase();return s.length>=12?s:null}function bt(r){let s=r.map(f=>f.bodyMarkdown.split(/\n{2,}/).map(M=>M.trim()).filter(Boolean)),n=r.length>=4?Math.max(3,Math.ceil(r.length*.5)):null,c=new Map;for(let f of s){let M=new Set(f.map(tt).filter(I=>!!I));for(let I of M)c.set(I,(c.get(I)??0)+1)}let b=new Set;if(n!=null)for(let[f,M]of c)M>=n&&b.add(f);let w=0;return{texts:r.map((f,M)=>{let I=[];for(let _ of s[M]){let T=tt(_);if(T&&b.has(T)){w+=_.length;continue}I.push(_)}let A=I.join(`
|
|
2
2
|
|
|
3
3
|
`).trim(),C=A.length>=60?A:f.bodyMarkdown;return`${f.title?.trim()||"Untitled page"}
|
|
4
4
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as a,f as b,g as c,h as d,i as e,j as f,k as g,l as h}from"./chunk-
|
|
1
|
+
import{e as a,f as b,g as c,h as d,i as e,j as f,k as g,l as h}from"./chunk-5KQO27NH.js";import"./chunk-H3SJLJYM.js";import"./chunk-QTDLZTQ7.js";import"./chunk-HUV2WTRW.js";import"./chunk-RZEZJAID.js";import"./chunk-2SP57VCG.js";import"./chunk-6DTXIZY2.js";import"./chunk-WJ4XFLS4.js";export{d as GMAIL_ATTACHMENT_REF_TTL_MS,c as GMAIL_INLINE_BODY_BYTES,b as GMAIL_MAIN_CONTRACT_HASH,a as GMAIL_MAIN_CONTRACT_VERSION,h as GmailService,e as GmailServiceError,g as normalizeGmailMessage,f as parseGmailAddresses};
|