mcp-scraper 0.92.1 → 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 +39 -26
- package/README.md +4 -4
- package/THIRD_PARTY_NOTICES.html +203 -0
- 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-2SP57VCG.js +15 -15
- package/dist/{chunk-ZJZMDWDI.js → chunk-35QGIWR6.js} +4 -4
- package/dist/{chunk-GPZ7ITF6.js → chunk-4YLZR4OR.js} +1 -1
- package/dist/{chunk-T2IJVEHG.js → chunk-5KQO27NH.js} +1 -1
- package/dist/chunk-DT2FYN6N.js +1 -0
- package/dist/chunk-DUJ56SHU.js +1 -0
- package/dist/{chunk-TCLSPE3P.js → chunk-H3SJLJYM.js} +1 -1
- package/dist/{chunk-YXUPFECS.js → chunk-LBMRUR4E.js} +2 -2
- package/dist/chunk-M5QHXNFZ.js +3 -3
- package/dist/{chunk-ZMNUI5LB.js → chunk-M5VZVMPC.js} +8 -8
- package/dist/chunk-ORB4RHCK.js +4 -4
- package/dist/{chunk-QHHOKLQY.js → chunk-PMOPJOSJ.js} +1 -1
- package/dist/chunk-RZEZJAID.js +1 -0
- package/dist/chunk-SH5KB4P7.js +1 -0
- package/dist/{chunk-QXAXPIHM.js → chunk-VRVO4OQ3.js} +243 -240
- package/dist/{chunk-JHMI6HEO.js → chunk-W2T4NTCE.js} +1 -1
- package/dist/chunk-WJ4XFLS4.js +15 -15
- package/dist/chunk-XASDACRP.js +6 -0
- package/dist/chunk-Y6MKMSOC.js +1 -0
- package/dist/{extract-bundle-5QTPVIWO.js → extract-bundle-M2XM4BEW.js} +1 -1
- package/dist/{gmail-service-EOC7KJSK.js → gmail-service-EGATZIBE.js} +1 -1
- package/dist/index.cjs +57 -57
- package/dist/index.d.cts +162 -121
- package/dist/index.d.ts +162 -121
- package/dist/index.js +6 -6
- package/dist/{server-NAQTBNPX.js → server-JLR2YJ7V.js} +71 -71
- package/dist/{site-extract-repository-U4G25TR2.js → site-extract-repository-3NFFFPXQ.js} +1 -1
- package/dist/{stripe-event-worker-KW3DR6GB.js → stripe-event-worker-PUYXT5DS.js} +1 -1
- package/dist/worker-UG4OXZWR.js +1 -0
- package/package.json +17 -136
- package/dist/chunk-2BN2TB3U.js +0 -1
- package/dist/chunk-2TZBO52D.js +0 -1
- package/dist/chunk-4FROKQJN.js +0 -1
- package/dist/chunk-GCLSGYYE.js +0 -1
- package/dist/chunk-K6MN7UED.js +0 -2
- package/dist/chunk-RECKUOEF.js +0 -1
- package/dist/chunk-RSPA4IWH.js +0 -1
- package/dist/worker-MSLXSR4M.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(`
|
package/dist/chunk-WJ4XFLS4.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createClient as Ve}from"@libsql/client/http";import{createHash as v,randomBytes as q,randomUUID as N,scryptSync as Ne,timingSafeEqual as ze}from"crypto";import{z as p}from"zod";var k="2026-06-26 21:58:03";var Lt="Google returned a CAPTCHA. Run with --headless=false to re-warm the browser profile, then retry.",ve="This operation is temporarily unavailable. Please retry later.",ke=["request_aborted","captcha_exhausted","captcha_or_blocked","location_mismatch","proxy_tunnel_failed","proxy_unavailable","harvest_timeout","mcp_request_timeout","mcp_http_error","extraction_failed","concurrency_limit_exceeded","unauthorized","forbidden","invalid_request","rate_limited","upstream_rate_limited","insufficient_balance","service_unavailable","response_lost","vendor_unavailable","page_not_found","page_forbidden","page_rate_limited","page_server_error","page_http_error","bot_check_unresolved","page_too_large","page_unreachable","browser_session_interrupted","site_export_not_found","site_export_format_unavailable","site_export_read_failed","site_export_image_not_found","image_url_invalid","image_url_not_https","image_host_unresolvable","image_host_blocked","image_redirect_invalid","image_source_unavailable","image_too_large","image_redirect_limit","image_base64_invalid","image_source_missing","image_source_ambiguous","image_source_type_invalid","image_artifact_not_found","image_page_too_large","page_image_not_found","page_image_candidates_unusable","image_format_unsupported","image_storage_unconfigured","featured_image_unhostable"],Xe=["request_aborted","captcha","location_mismatch","connection","timeout","extraction","concurrency_limit","unauthorized","forbidden","invalid_request","rate_limit","billing","service_unavailable"];function O(e){return e?JSON.stringify(e):null}function ae(e){if(e==null)return null;try{let t=typeof e=="string"?JSON.parse(e):e;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t;if(typeof r.error_code!="string"||!oe.has(r.error_code))return null;let n=Ge({errorCode:r.error_code,errorType:r.error_type,retryable:r.retryable,retryAfterSeconds:r.retry_after_seconds,chargeStatus:r.charge_status,details:r.details});if(typeof r.message=="string"){let s=_e(r.message).trim().slice(0,1e3);s&&!/https?:\/\//i.test(s)&&(n.message=s)}return n}catch{return null}}var oe=new Set(ke),Me=new Set(Xe),Fe=new Set(["active","limit","operation","upgrade_url","topup_url","upgrade_command","slots_per_pack","pack_price_usd","balance_credits","required_credits","retry_guidance","http_status"]),Pe=12,He=500;function j(e){return typeof e=="string"&&oe.has(e)?e:"service_unavailable"}function qe(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t={};for(let[r,n]of Object.entries(e)){if(Object.keys(t).length>=Pe)break;if(Fe.has(r))if(typeof n=="string"){if((r==="upgrade_url"||r==="topup_url")&&!We(n))continue;let s=_e(n).slice(0,He);s&&(t[r]=s)}else(typeof n=="number"&&Number.isFinite(n)||typeof n=="boolean"||n===null)&&(t[r]=n)}return Object.keys(t).length>0?t:void 0}function We(e){if(e.startsWith("/")&&!e.startsWith("//"))return!0;try{let t=new URL(e);return t.protocol==="https:"&&(t.hostname==="mcpscraper.dev"||t.hostname.endsWith(".mcpscraper.dev"))}catch{return!1}}function je(e){let t=j(e);switch(t){case"captcha_exhausted":case"captcha_or_blocked":return"captcha";case"proxy_tunnel_failed":case"proxy_unavailable":case"response_lost":return"connection";case"harvest_timeout":case"mcp_request_timeout":return"timeout";case"concurrency_limit_exceeded":return"concurrency_limit";case"rate_limited":case"upstream_rate_limited":return"rate_limit";case"extraction_failed":case"page_not_found":case"page_forbidden":case"page_rate_limited":case"page_server_error":case"page_http_error":case"bot_check_unresolved":case"page_too_large":case"page_unreachable":case"browser_session_interrupted":case"site_export_not_found":case"site_export_format_unavailable":case"site_export_read_failed":case"site_export_image_not_found":return"extraction";case"image_url_invalid":case"image_url_not_https":case"image_host_unresolvable":case"image_host_blocked":case"image_redirect_invalid":case"image_source_unavailable":case"image_too_large":case"image_redirect_limit":case"image_base64_invalid":case"image_source_missing":case"image_source_ambiguous":case"image_source_type_invalid":case"image_artifact_not_found":case"image_page_too_large":case"page_image_not_found":case"page_image_candidates_unusable":case"image_format_unsupported":case"image_storage_unconfigured":case"featured_image_unhostable":return"invalid_request";case"insufficient_balance":return"billing";case"vendor_unavailable":case"mcp_http_error":return"service_unavailable";default:return t}}function Be(e){switch(j(e)){case"request_aborted":return"The request was cancelled before it completed.";case"captcha_exhausted":case"captcha_or_blocked":return"The target site returned a verification challenge. Heavy traffic can temporarily increase these challenges; retry in a few minutes.";case"location_mismatch":return"The target site returned results for a different location. Please retry.";case"proxy_tunnel_failed":case"proxy_unavailable":return"The web request could not establish a working connection. Please retry later.";case"harvest_timeout":return"The request timed out before it completed. Please retry with a smaller request.";case"mcp_request_timeout":return"The MCP caller stopped waiting before a final response arrived. Durable work may still be running; continue with the returned Task or job handle instead of restarting it.";case"concurrency_limit_exceeded":return"The service is available, but this account has reached its parallel-operation limit. Wait for an active operation to finish or add capacity.";case"unauthorized":return"Authentication is required to perform this operation.";case"forbidden":return"This account does not have permission to perform this operation.";case"invalid_request":return"The request is invalid. Check the supplied inputs and try again.";case"rate_limited":return"This account is sending requests too quickly. Wait briefly and retry.";case"upstream_rate_limited":return"The connected provider is temporarily rate-limiting requests. Wait briefly and retry.";case"mcp_http_error":return"The API returned an unexpected HTTP response.";case"insufficient_balance":return"This account does not have enough Credits for the operation.";case"extraction_failed":return"The target could not be extracted. Please retry later.";case"response_lost":return"The connection was lost before the response arrived. The operation may have already completed and been billed on our side \u2014 check credits_info before retrying blind.";case"vendor_unavailable":return"MCP Scraper's internal browser services require MCP Scraper team attention. Servers or IPs are down until this is fixed \u2014 this is not caused by your request. Please retry in a few minutes.";case"page_not_found":return"The page could not be found. It may have been moved or deleted.";case"page_forbidden":return"The site refused the request.";case"page_rate_limited":return"The site is rate-limiting requests right now. Retrying after a short wait usually works.";case"page_server_error":return"The page's own server returned an error. This is on the target site's side, not something a retry here can fix.";case"page_http_error":return"The page returned an unexpected HTTP response.";case"bot_check_unresolved":return"This site has automated-traffic protection (a bot/CAPTCHA check) that could not be resolved in time. Some sites are simply not extractable this way.";case"page_too_large":return"The page is larger than we can safely process.";case"page_unreachable":return"The page did not respond in time, or the connection could not be completed.";case"browser_session_interrupted":return"The browser session closed before extraction completed. MCP Scraper will retry once with a fresh session; retry the request if this persists.";case"site_export_not_found":return"The site export or requested page was not found, expired, or does not belong to this account.";case"site_export_format_unavailable":return"That representation was not retained for this export page. Read the export manifest and request one of the formats marked available.";case"site_export_read_failed":return"The stored site export could not be read or did not pass its integrity check.";case"site_export_image_not_found":return"The requested site-export image was not found, expired, or does not belong to this account.";case"image_url_invalid":return"The image source is not a valid URL. Use a stable public HTTPS URL or inline image bytes.";case"image_url_not_https":return"Commons image sources must use a public HTTPS URL or inline image bytes.";case"image_host_unresolvable":return"The image host could not be resolved. Use a different stable public URL or inline image bytes.";case"image_host_blocked":return"The image source resolves to a network address Commons cannot fetch safely.";case"image_redirect_invalid":return"The image source redirected to an invalid or unsafe destination.";case"image_source_unavailable":return"The image source could not be fetched. Host a different stable public URL or provide inline image bytes.";case"image_too_large":return"The image exceeds the Commons image size limit.";case"image_redirect_limit":return"The image source exceeded the Commons redirect limit.";case"image_base64_invalid":return"The supplied inline image bytes are invalid.";case"image_source_missing":return"Provide exactly one of a public image or webpage URL, inline image bytes, or an owner-scoped image artifact.";case"image_source_ambiguous":return"Provide only one image source: sourceUrl, imageBase64, or artifactId.";case"image_source_type_invalid":return"Use sourceType only with inline image bytes or an owner-scoped image artifact.";case"image_artifact_not_found":return"The image artifact was not found, expired, or does not belong to this account.";case"image_page_too_large":return"The webpage is too large for bounded Commons image discovery.";case"page_image_not_found":return"The webpage did not expose a usable featured or content image.";case"page_image_candidates_unusable":return"The webpage exposed image candidates, but none returned supported public image bytes.";case"image_format_unsupported":return"Commons accepts JPEG, PNG, GIF, or WebP image bytes.";case"image_storage_unconfigured":return"Commons image storage is temporarily unavailable.";case"featured_image_unhostable":return"The required featured image could not be hosted for Commons publication.";default:return ve}}function Ge(e){let t=j(e.errorCode),r=typeof e.retryAfterSeconds=="number"&&Number.isFinite(e.retryAfterSeconds)?Math.max(1,Math.min(86400,Math.trunc(e.retryAfterSeconds))):void 0,n=e.chargeStatus==="not_charged"||e.chargeStatus==="refund_pending"||e.chargeStatus==="refunded"||e.chargeStatus==="charged"?e.chargeStatus:void 0,s=typeof e.errorType=="string"&&Me.has(e.errorType)?e.errorType:void 0,a=qe(e.details);return{error_code:t,error_type:s??je(t),message:Be(t),retryable:e.retryable===!0,...r?{retry_after_seconds:r}:{},...n?{charge_status:n}:{},...a?{details:a}:{}}}function _e(e){return e.replace(/https?:\/\/[^\s]*(?:brightdata|onkernel|kernel\.sh)[^\s]*/gi,"the service").replace(/bright\s*data/gi,"the service").replace(/brightdata/gi,"the service").replace(/kernel\.sh\s+sessions?/gi,"sessions").replace(/kernel\.sh\s+session/gi,"this session").replace(/kernel\.sh/gi,"the service").replace(/kernel\s+sessions?/gi,"sessions").replace(/kernel\s+session/gi,"this session").replace(/\b(?:sub|cus|sess|proxy)_[A-Za-z0-9_-]+\b/g,"[redacted]").replace(/\b(?:KERNEL|BRIGHTDATA|BRIGHT_DATA)_[A-Z0-9_]*API_KEY\b/g,"BROWSER_SERVICE_API_KEY").replace(/\bkernel\b/gi,"the service").replace(/ +/g," ").trim()}var ee=class extends Error{constructor(r){super(`CAPTCHA detected. ${r}`);this.instructions=r}instructions;name="CaptchaError"},te=class extends Error{constructor(r,n){super(r);this.cause=n}cause;name="ExtractionError"},re=class extends Error{constructor(r){super(`Google Maps search did not reach a complete result state (${r})`);this.pageState=r}pageState;name="MapsSearchIncompletePageError"},ne=class extends Error{name="RequestAbortedError";constructor(t="Request aborted before harvest completed"){super(t)}},se=class extends Error{name="PaaInteractionInterruptedError"},ie=class extends Error{name="LocationMismatchError";constructor(t="Google returned results for a different location than requested"){super(t)}};var I=["oauth_store_metadata","oauth_clients","oauth_client_redirect_uris","oauth_codes","oauth_code_exchanges","oauth_refresh_families","oauth_refresh_tokens","oauth_refresh_rotations","oauth_security_events","oauth_rate_limit_buckets"],x=["oauth_clients_inactivity_idx","oauth_clients_cleanup_idx","oauth_codes_expiry_idx","oauth_codes_client_idx","oauth_code_exchanges_replay_expiry_idx","oauth_refresh_families_lifecycle_idx","oauth_refresh_families_user_status_idx","oauth_refresh_families_client_idx","oauth_refresh_families_cleanup_idx","oauth_refresh_tokens_expiry_idx","oauth_refresh_rotations_replay_expiry_idx","oauth_security_events_retention_idx","oauth_rate_limit_buckets_expiry_idx"],ue={oauth_clients:"oauth_clients_legacy_raw",oauth_codes:"oauth_codes_legacy_raw",oauth_tokens:"oauth_tokens_legacy_raw"},L="strftime('%Y-%m-%dT%H:%M:%fZ','now')";async function y(e,t,r=!1){try{await e.execute(t)}catch(n){let s=n.code;if(!r||s!=="SQL_PARSE_ERROR")throw n}}var Ye=[`CREATE TABLE IF NOT EXISTS oauth_store_metadata (
|
|
1
|
+
import{createClient as Ve}from"@libsql/client/http";import{createHash as v,randomBytes as q,randomUUID as N,scryptSync as Ne,timingSafeEqual as ze}from"crypto";import{z as p}from"zod";var k="2026-06-26 21:58:03";var Lt="Google returned a CAPTCHA. Run with --headless=false to re-warm the browser profile, then retry.",ve="This operation is temporarily unavailable. Please retry later.",ke=["request_aborted","captcha_exhausted","captcha_or_blocked","location_mismatch","proxy_tunnel_failed","proxy_unavailable","harvest_timeout","mcp_request_timeout","mcp_http_error","extraction_failed","concurrency_limit_exceeded","unauthorized","forbidden","invalid_request","rate_limited","upstream_rate_limited","insufficient_balance","service_unavailable","response_lost","vendor_unavailable","page_not_found","page_forbidden","page_rate_limited","page_server_error","page_http_error","bot_check_unresolved","page_too_large","page_unreachable","browser_session_interrupted","site_export_not_found","site_export_format_unavailable","site_export_read_failed","site_export_image_not_found","image_url_invalid","image_url_not_https","image_host_unresolvable","image_host_blocked","image_redirect_invalid","image_source_unavailable","image_too_large","image_redirect_limit","image_base64_invalid","image_source_missing","image_source_ambiguous","image_source_type_invalid","image_artifact_not_found","image_page_too_large","page_image_not_found","page_image_candidates_unusable","image_format_unsupported","image_storage_unconfigured","featured_image_unhostable"],Xe=["request_aborted","captcha","location_mismatch","connection","timeout","extraction","concurrency_limit","unauthorized","forbidden","invalid_request","rate_limit","billing","service_unavailable"];function O(e){return e?JSON.stringify(e):null}function ae(e){if(e==null)return null;try{let t=typeof e=="string"?JSON.parse(e):e;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t;if(typeof r.error_code!="string"||!oe.has(r.error_code))return null;let n=Ge({errorCode:r.error_code,errorType:r.error_type,retryable:r.retryable,retryAfterSeconds:r.retry_after_seconds,chargeStatus:r.charge_status,details:r.details});if(typeof r.message=="string"){let s=_e(r.message).trim().slice(0,1e3);s&&!/https?:\/\//i.test(s)&&(n.message=s)}return n}catch{return null}}var oe=new Set(ke),Me=new Set(Xe),Fe=new Set(["active","limit","operation","upgrade_url","topup_url","upgrade_command","slots_per_pack","pack_price_usd","balance_credits","required_credits","retry_guidance","http_status"]),Pe=12,He=500;function j(e){return typeof e=="string"&&oe.has(e)?e:"service_unavailable"}function qe(e){if(!e||typeof e!="object"||Array.isArray(e))return;let t={};for(let[r,n]of Object.entries(e)){if(Object.keys(t).length>=Pe)break;if(Fe.has(r))if(typeof n=="string"){if((r==="upgrade_url"||r==="topup_url")&&!We(n))continue;let s=_e(n).slice(0,He);s&&(t[r]=s)}else(typeof n=="number"&&Number.isFinite(n)||typeof n=="boolean"||n===null)&&(t[r]=n)}return Object.keys(t).length>0?t:void 0}function We(e){if(e.startsWith("/")&&!e.startsWith("//"))return!0;try{let t=new URL(e);return t.protocol==="https:"&&(t.hostname==="mcpscraper.dev"||t.hostname.endsWith(".mcpscraper.dev"))}catch{return!1}}function je(e){let t=j(e);switch(t){case"captcha_exhausted":case"captcha_or_blocked":return"captcha";case"proxy_tunnel_failed":case"proxy_unavailable":case"response_lost":return"connection";case"harvest_timeout":case"mcp_request_timeout":return"timeout";case"concurrency_limit_exceeded":return"concurrency_limit";case"rate_limited":case"upstream_rate_limited":return"rate_limit";case"extraction_failed":case"page_not_found":case"page_forbidden":case"page_rate_limited":case"page_server_error":case"page_http_error":case"bot_check_unresolved":case"page_too_large":case"page_unreachable":case"browser_session_interrupted":case"site_export_not_found":case"site_export_format_unavailable":case"site_export_read_failed":case"site_export_image_not_found":return"extraction";case"image_url_invalid":case"image_url_not_https":case"image_host_unresolvable":case"image_host_blocked":case"image_redirect_invalid":case"image_source_unavailable":case"image_too_large":case"image_redirect_limit":case"image_base64_invalid":case"image_source_missing":case"image_source_ambiguous":case"image_source_type_invalid":case"image_artifact_not_found":case"image_page_too_large":case"page_image_not_found":case"page_image_candidates_unusable":case"image_format_unsupported":case"image_storage_unconfigured":case"featured_image_unhostable":return"invalid_request";case"insufficient_balance":return"billing";case"vendor_unavailable":case"mcp_http_error":return"service_unavailable";default:return t}}function Be(e){switch(j(e)){case"request_aborted":return"The request was cancelled before it completed.";case"captcha_exhausted":case"captcha_or_blocked":return"The target site returned a verification challenge. Heavy traffic can temporarily increase these challenges; retry in a few minutes.";case"location_mismatch":return"The target site returned results for a different location. Please retry.";case"proxy_tunnel_failed":case"proxy_unavailable":return"The web request could not establish a working connection. Please retry later.";case"harvest_timeout":return"The request timed out before it completed. Please retry with a smaller request.";case"mcp_request_timeout":return"The MCP caller stopped waiting before a final response arrived. Durable work may still be running; continue with the returned Task or job handle instead of restarting it.";case"concurrency_limit_exceeded":return"The service is available, but this account has reached its parallel-operation limit. Wait for an active operation to finish or add capacity.";case"unauthorized":return"Authentication is required to perform this operation.";case"forbidden":return"This account does not have permission to perform this operation.";case"invalid_request":return"The request is invalid. Check the supplied inputs and try again.";case"rate_limited":return"This account is sending requests too quickly. Wait briefly and retry.";case"upstream_rate_limited":return"The connected provider is temporarily rate-limiting requests. Wait briefly and retry.";case"mcp_http_error":return"The API returned an unexpected HTTP response.";case"insufficient_balance":return"This account does not have enough Credits for the operation.";case"extraction_failed":return"The target could not be extracted. Please retry later.";case"response_lost":return"The connection was lost before the response arrived. The operation may have already completed and been billed on our side \u2014 check credits_info before retrying blind.";case"vendor_unavailable":return"MCP Scraper's internal browser services require MCP Scraper team attention. Servers or IPs are down until this is fixed \u2014 this is not caused by your request. Please retry in a few minutes.";case"page_not_found":return"The page could not be found. It may have been moved or deleted.";case"page_forbidden":return"The site refused the request.";case"page_rate_limited":return"The site is rate-limiting requests right now. Retrying after a short wait usually works.";case"page_server_error":return"The page's own server returned an error. This is on the target site's side, not something a retry here can fix.";case"page_http_error":return"The page returned an unexpected HTTP response.";case"bot_check_unresolved":return"This site has automated-traffic protection (a bot/CAPTCHA check) that could not be resolved in time. Some sites are simply not extractable this way.";case"page_too_large":return"The page is larger than we can safely process.";case"page_unreachable":return"The page did not respond in time, or the connection could not be completed.";case"browser_session_interrupted":return"The browser session closed before extraction completed. MCP Scraper will retry once with a fresh session; retry the request if this persists.";case"site_export_not_found":return"The site export or requested page was not found, expired, or does not belong to this account.";case"site_export_format_unavailable":return"That representation was not retained for this export page. Read the export manifest and request one of the formats marked available.";case"site_export_read_failed":return"The stored site export could not be read or did not pass its integrity check.";case"site_export_image_not_found":return"The requested site-export image was not found, expired, or does not belong to this account.";case"image_url_invalid":return"The image source is not a valid URL. Use a stable public HTTPS URL or inline image bytes.";case"image_url_not_https":return"Commons image sources must use a public HTTPS URL or inline image bytes.";case"image_host_unresolvable":return"The image host could not be resolved. Use a different stable public URL or inline image bytes.";case"image_host_blocked":return"The image source resolves to a network address Commons cannot fetch safely.";case"image_redirect_invalid":return"The image source redirected to an invalid or unsafe destination.";case"image_source_unavailable":return"The image source could not be fetched. Host a different stable public URL or provide inline image bytes.";case"image_too_large":return"The image exceeds the Commons image size limit.";case"image_redirect_limit":return"The image source exceeded the Commons redirect limit.";case"image_base64_invalid":return"The supplied inline image bytes are invalid.";case"image_source_missing":return"Provide exactly one of a public image or webpage URL, inline image bytes, or an owner-scoped image artifact.";case"image_source_ambiguous":return"Provide only one image source: sourceUrl, imageBase64, or artifactId.";case"image_source_type_invalid":return"Use sourceType only with inline image bytes or an owner-scoped image artifact.";case"image_artifact_not_found":return"The image artifact was not found, expired, or does not belong to this account.";case"image_page_too_large":return"The webpage is too large for bounded Commons image discovery.";case"page_image_not_found":return"The webpage did not expose a usable featured or content image.";case"page_image_candidates_unusable":return"The webpage exposed image candidates, but none returned supported public image bytes.";case"image_format_unsupported":return"Commons accepts JPEG, PNG, GIF, or WebP image bytes.";case"image_storage_unconfigured":return"Commons image storage is temporarily unavailable.";case"featured_image_unhostable":return"The required featured image could not be hosted for Commons publication.";default:return ve}}function Ge(e){let t=j(e.errorCode),r=typeof e.retryAfterSeconds=="number"&&Number.isFinite(e.retryAfterSeconds)?Math.max(1,Math.min(86400,Math.trunc(e.retryAfterSeconds))):void 0,n=e.chargeStatus==="not_charged"||e.chargeStatus==="refund_pending"||e.chargeStatus==="refunded"||e.chargeStatus==="charged"?e.chargeStatus:void 0,s=typeof e.errorType=="string"&&Me.has(e.errorType)?e.errorType:void 0,a=qe(e.details);return{error_code:t,error_type:s??je(t),message:Be(t),retryable:e.retryable===!0,...r?{retry_after_seconds:r}:{},...n?{charge_status:n}:{},...a?{details:a}:{}}}function _e(e){return e.replace((new RegExp("https?:\\/\\/[^\\s]*(?:\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061|on\u006b\u0065\u0072\u006e\u0065\u006c|\u006b\u0065\u0072\u006e\u0065\u006c\\.sh)[^\\s]*", "gi")),"the service").replace(/bright\s*data/gi,"the service").replace((new RegExp("\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061", "gi")),"the service").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c\\.sh\\s+sessions?", "gi")),"sessions").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c\\.sh\\s+session", "gi")),"this session").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c\\.sh", "gi")),"the service").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c\\s+sessions?", "gi")),"sessions").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c\\s+session", "gi")),"this session").replace(/\b(?:sub|cus|sess|proxy)_[A-Za-z0-9_-]+\b/g,"[redacted]").replace((new RegExp("\\b(?:\u004b\u0045\u0052\u004e\u0045\u004c|\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041|\u0042\u0052\u0049\u0047\u0048\u0054_\u0044\u0041\u0054\u0041)_[A-Z0-9_]*API_KEY\\b", "g")),"BROWSER_SERVICE_API_KEY").replace((new RegExp("\\b\u006b\u0065\u0072\u006e\u0065\u006c\\b", "gi")),"the service").replace(/ +/g," ").trim()}var ee=class extends Error{constructor(r){super(`CAPTCHA detected. ${r}`);this.instructions=r}instructions;name="CaptchaError"},te=class extends Error{constructor(r,n){super(r);this.cause=n}cause;name="ExtractionError"},re=class extends Error{constructor(r){super(`Google Maps search did not reach a complete result state (${r})`);this.pageState=r}pageState;name="MapsSearchIncompletePageError"},ne=class extends Error{name="RequestAbortedError";constructor(t="Request aborted before harvest completed"){super(t)}},se=class extends Error{name="PaaInteractionInterruptedError"},ie=class extends Error{name="LocationMismatchError";constructor(t="Google returned results for a different location than requested"){super(t)}};var I=["oauth_store_metadata","oauth_clients","oauth_client_redirect_uris","oauth_codes","oauth_code_exchanges","oauth_refresh_families","oauth_refresh_tokens","oauth_refresh_rotations","oauth_security_events","oauth_rate_limit_buckets"],x=["oauth_clients_inactivity_idx","oauth_clients_cleanup_idx","oauth_codes_expiry_idx","oauth_codes_client_idx","oauth_code_exchanges_replay_expiry_idx","oauth_refresh_families_lifecycle_idx","oauth_refresh_families_user_status_idx","oauth_refresh_families_client_idx","oauth_refresh_families_cleanup_idx","oauth_refresh_tokens_expiry_idx","oauth_refresh_rotations_replay_expiry_idx","oauth_security_events_retention_idx","oauth_rate_limit_buckets_expiry_idx"],ue={oauth_clients:"oauth_clients_legacy_raw",oauth_codes:"oauth_codes_legacy_raw",oauth_tokens:"oauth_tokens_legacy_raw"},L="strftime('%Y-%m-%dT%H:%M:%fZ','now')";async function y(e,t,r=!1){try{await e.execute(t)}catch(n){let s=n.code;if(!r||s!=="SQL_PARSE_ERROR")throw n}}var Ye=[`CREATE TABLE IF NOT EXISTS oauth_store_metadata (
|
|
2
2
|
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
3
3
|
store_id TEXT NOT NULL UNIQUE,
|
|
4
4
|
schema_version INTEGER NOT NULL CHECK (schema_version > 0),
|
|
@@ -230,14 +230,14 @@ import{createClient as Ve}from"@libsql/client/http";import{createHash as v,rando
|
|
|
230
230
|
max_questions INTEGER NOT NULL,
|
|
231
231
|
status TEXT NOT NULL,
|
|
232
232
|
outcome TEXT,
|
|
233
|
-
|
|
233
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_session_id TEXT,
|
|
234
234
|
question_count INTEGER,
|
|
235
235
|
duration_ms INTEGER,
|
|
236
236
|
error TEXT,
|
|
237
237
|
will_retry INTEGER,
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
238
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_delete_started INTEGER NOT NULL DEFAULT 0,
|
|
239
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_delete_succeeded INTEGER,
|
|
240
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_delete_error TEXT,
|
|
241
241
|
browser_close_succeeded INTEGER,
|
|
242
242
|
browser_close_error TEXT,
|
|
243
243
|
debug_json TEXT,
|
|
@@ -922,8 +922,8 @@ import{createClient as Ve}from"@libsql/client/http";import{createHash as v,rando
|
|
|
922
922
|
id TEXT PRIMARY KEY,
|
|
923
923
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
924
924
|
name TEXT NOT NULL,
|
|
925
|
-
|
|
926
|
-
|
|
925
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_profile_name TEXT NOT NULL,
|
|
926
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_proxy_id TEXT NOT NULL,
|
|
927
927
|
proxy_type TEXT NOT NULL DEFAULT 'isp',
|
|
928
928
|
country TEXT NOT NULL DEFAULT 'US',
|
|
929
929
|
status TEXT NOT NULL DEFAULT 'ready',
|
|
@@ -982,7 +982,7 @@ import{createClient as Ve}from"@libsql/client/http";import{createHash as v,rando
|
|
|
982
982
|
ON CONFLICT(scope, key_hash, window_start)
|
|
983
983
|
DO UPDATE SET count = count + 1, updated_at = datetime('now')
|
|
984
984
|
RETURNING count
|
|
985
|
-
`,args:[e,_,a]}),c=Number(o.rows[0]?.count);if(!Number.isSafeInteger(c)||c<1)throw new Error("Rate-limit bucket mutation did not return a valid count");return{allowed:c<=r,count:c,remaining:Math.max(0,r-c),resetSeconds:Math.max(1,a+n-s)}}async function nr(e){let t=q(32).toString("hex"),r=v("sha256").update(t).digest("hex"),n=new Date(Date.now()+3600*1e3).toISOString();return await i().execute({sql:"INSERT INTO password_reset_tokens (token, user_id, expires_at) VALUES (?, ?, ?)",args:[r,e,n]}),t}async function sr(e){let t=i(),r=v("sha256").update(e).digest("hex"),s=(await t.execute({sql:"SELECT user_id, expires_at, used FROM password_reset_tokens WHERE token = ?",args:[r]})).rows[0];return!s||Number(s.used)||new Date(String(s.expires_at))<new Date?null:(await t.execute({sql:"UPDATE password_reset_tokens SET used = 1 WHERE token = ?",args:[r]}),Number(s.user_id))}async function ir(e){let t=Re();return await i().execute({sql:"UPDATE users SET api_key = ?, key_active = 1 WHERE id = ?",args:[t,e]}),t}async function ar(e){await i().execute({sql:"UPDATE users SET key_active = 0 WHERE id = ?",args:[e]})}async function or(){return(await i().execute("SELECT id, email, name, created_at, active FROM users ORDER BY created_at DESC")).rows.map(t=>S({...t,api_key:"",key_active:1}))}async function _r(e){await i().execute({sql:"UPDATE users SET active = 0 WHERE id = ?",args:[e]})}function R(e){return{id:String(e.id),user_id:Number(e.user_id),status:String(e.status),query:String(e.query),options:String(e.options),callback_url:e.callback_url!=null?String(e.callback_url):null,result:e.result!=null?String(e.result):null,error:e.error!=null?String(e.error):null,public_error_json:e.public_error_json!=null?String(e.public_error_json):null,created_at:String(e.created_at),started_at:e.started_at!=null?String(e.started_at):null,completed_at:e.completed_at!=null?String(e.completed_at):null}}function C(e){return e==null?null:Number(e)===1}function H(e){if(e==null)return null;try{return JSON.parse(String(e))}catch{return null}}function we(e){return{id:String(e.id),job_id:String(e.job_id),user_id:Number(e.user_id),attempt_number:Number(e.attempt_number),max_attempts:Number(e.max_attempts),query:String(e.query),location:e.location!=null?String(e.location):null,max_questions:Number(e.max_questions),status:String(e.status),outcome:e.outcome!=null?String(e.outcome):null
|
|
985
|
+
`,args:[e,_,a]}),c=Number(o.rows[0]?.count);if(!Number.isSafeInteger(c)||c<1)throw new Error("Rate-limit bucket mutation did not return a valid count");return{allowed:c<=r,count:c,remaining:Math.max(0,r-c),resetSeconds:Math.max(1,a+n-s)}}async function nr(e){let t=q(32).toString("hex"),r=v("sha256").update(t).digest("hex"),n=new Date(Date.now()+3600*1e3).toISOString();return await i().execute({sql:"INSERT INTO password_reset_tokens (token, user_id, expires_at) VALUES (?, ?, ?)",args:[r,e,n]}),t}async function sr(e){let t=i(),r=v("sha256").update(e).digest("hex"),s=(await t.execute({sql:"SELECT user_id, expires_at, used FROM password_reset_tokens WHERE token = ?",args:[r]})).rows[0];return!s||Number(s.used)||new Date(String(s.expires_at))<new Date?null:(await t.execute({sql:"UPDATE password_reset_tokens SET used = 1 WHERE token = ?",args:[r]}),Number(s.user_id))}async function ir(e){let t=Re();return await i().execute({sql:"UPDATE users SET api_key = ?, key_active = 1 WHERE id = ?",args:[t,e]}),t}async function ar(e){await i().execute({sql:"UPDATE users SET key_active = 0 WHERE id = ?",args:[e]})}async function or(){return(await i().execute("SELECT id, email, name, created_at, active FROM users ORDER BY created_at DESC")).rows.map(t=>S({...t,api_key:"",key_active:1}))}async function _r(e){await i().execute({sql:"UPDATE users SET active = 0 WHERE id = ?",args:[e]})}function R(e){return{id:String(e.id),user_id:Number(e.user_id),status:String(e.status),query:String(e.query),options:String(e.options),callback_url:e.callback_url!=null?String(e.callback_url):null,result:e.result!=null?String(e.result):null,error:e.error!=null?String(e.error):null,public_error_json:e.public_error_json!=null?String(e.public_error_json):null,created_at:String(e.created_at),started_at:e.started_at!=null?String(e.started_at):null,completed_at:e.completed_at!=null?String(e.completed_at):null}}function C(e){return e==null?null:Number(e)===1}function H(e){if(e==null)return null;try{return JSON.parse(String(e))}catch{return null}}function we(e){return{id:String(e.id),job_id:String(e.job_id),user_id:Number(e.user_id),attempt_number:Number(e.attempt_number),max_attempts:Number(e.max_attempts),query:String(e.query),location:e.location!=null?String(e.location):null,max_questions:Number(e.max_questions),status:String(e.status),outcome:e.outcome!=null?String(e.outcome):null,\u006b\u0065\u0072\u006e\u0065\u006c_session_id:e.\u006b\u0065\u0072\u006e\u0065\u006c_session_id!=null?String(e.\u006b\u0065\u0072\u006e\u0065\u006c_session_id):null,question_count:e.question_count!=null?Number(e.question_count):null,duration_ms:e.duration_ms!=null?Number(e.duration_ms):null,error:e.error!=null?String(e.error):null,will_retry:C(e.will_retry),\u006b\u0065\u0072\u006e\u0065\u006c_delete_started:Number(e.\u006b\u0065\u0072\u006e\u0065\u006c_delete_started??0)===1,\u006b\u0065\u0072\u006e\u0065\u006c_delete_succeeded:C(e.\u006b\u0065\u0072\u006e\u0065\u006c_delete_succeeded),\u006b\u0065\u0072\u006e\u0065\u006c_delete_error:e.\u006b\u0065\u0072\u006e\u0065\u006c_delete_error!=null?String(e.\u006b\u0065\u0072\u006e\u0065\u006c_delete_error):null,browser_close_succeeded:C(e.browser_close_succeeded),browser_close_error:e.browser_close_error!=null?String(e.browser_close_error):null,browser_provider:e.browser_provider!=null?String(e.browser_provider):null,provider_session_id:e.provider_session_id!=null?String(e.provider_session_id):null,provider_session_observed_at:e.provider_session_observed_at!=null?String(e.provider_session_observed_at):null,provider_lookup_status:e.provider_lookup_status!=null?String(e.provider_lookup_status):null,provider_status:e.provider_status!=null?String(e.provider_status):null,provider_error_code:e.provider_error_code!=null?String(e.provider_error_code):null,provider_error_message:e.provider_error_message!=null?String(e.provider_error_message):null,provider_reason_source:e.provider_reason_source!=null?String(e.provider_reason_source):null,provider_duration_ms:e.provider_duration_ms!=null?Number(e.provider_duration_ms):null,provider_bandwidth_bytes:e.provider_bandwidth_bytes!=null?Number(e.provider_bandwidth_bytes):null,provider_captcha:C(e.provider_captcha),provider_checked_at:e.provider_checked_at!=null?String(e.provider_checked_at):null,provider_detail:H(e.provider_detail_json),provider_disconnect_observed:C(e.provider_disconnect_observed),provider_disconnect_message:e.provider_disconnect_message!=null?String(e.provider_disconnect_message):null,debug:H(e.debug_json),created_at:String(e.created_at),completed_at:e.completed_at!=null?String(e.completed_at):null}}function h(e){let{public_error_json:t,...r}=e;return{...r,options:JSON.parse(e.options),result:e.result?JSON.parse(e.result):null,publicError:ae(t)}}async function ur(e,t,r,n){let s=N();return await it(s,e,t,r,n),s}async function it(e,t,r,n,s){if(!/^[a-zA-Z0-9-]{1,100}$/.test(e))throw new Error("job id is invalid");await i().execute({sql:"INSERT INTO jobs (id, user_id, query, options, callback_url) VALUES (?, ?, ?, ?, ?)",args:[e,t,r,JSON.stringify(n),s??null]})}async function cr(e,t,r){let n=N();return await i().execute({sql:"INSERT INTO jobs (id, user_id, query, options, status, started_at) VALUES (?, ?, ?, ?, 'running', datetime('now'))",args:[n,e,t,JSON.stringify(r)]}),n}async function dr(e,t,r,n){let s=await i().execute({sql:`INSERT INTO jobs (id, user_id, query, options, status, started_at)
|
|
986
986
|
VALUES (?, ?, ?, ?, 'running', datetime('now'))
|
|
987
987
|
ON CONFLICT(id) DO NOTHING`,args:[e,t,r,JSON.stringify(n)]}),a=await K(e,t);if(!a)throw new Error(`getOrCreateRunningJob: row missing immediately after insert/lookup for ${e}`);return{job:a,created:s.rowsAffected===1}}async function lr(e){await i().execute({sql:`
|
|
988
988
|
INSERT INTO harvest_attempts (
|
|
@@ -1017,14 +1017,14 @@ import{createClient as Ve}from"@libsql/client/http";import{createHash as v,rando
|
|
|
1017
1017
|
UPDATE harvest_attempts SET
|
|
1018
1018
|
status = 'finished',
|
|
1019
1019
|
outcome = ?,
|
|
1020
|
-
|
|
1020
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_session_id = ?,
|
|
1021
1021
|
question_count = ?,
|
|
1022
1022
|
duration_ms = ?,
|
|
1023
1023
|
error = ?,
|
|
1024
1024
|
will_retry = ?,
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1025
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_delete_started = ?,
|
|
1026
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_delete_succeeded = ?,
|
|
1027
|
+
\u006b\u0065\u0072\u006e\u0065\u006c_delete_error = ?,
|
|
1028
1028
|
browser_close_succeeded = ?,
|
|
1029
1029
|
browser_close_error = ?,
|
|
1030
1030
|
browser_provider = COALESCE(browser_provider, ?),
|
|
@@ -1056,7 +1056,7 @@ import{createClient as Ve}from"@libsql/client/http";import{createHash as v,rando
|
|
|
1056
1056
|
debug_json = ?,
|
|
1057
1057
|
completed_at = ?
|
|
1058
1058
|
WHERE job_id = ? AND attempt_number = ?
|
|
1059
|
-
`,args:[e.outcome,e
|
|
1059
|
+
`,args:[e.outcome,e.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,e.questionCount,e.durationMs,e.error,e.willRetry?1:0,e.\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted?1:0,e.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded==null?null:e.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded?1:0,e.\u006b\u0065\u0072\u006e\u0065\u006cDeleteError,e.browserCloseSucceeded==null?null:e.browserCloseSucceeded?1:0,e.browserCloseError,e.browserProvider??null,e.providerSessionId??null,e.providerLookupStatus??null,e.providerStatus??null,e.providerErrorCode??null,e.providerErrorMessage??null,e.providerReasonSource??null,e.providerDurationMs??null,e.providerBandwidthBytes??null,e.providerCaptcha==null?null:e.providerCaptcha?1:0,e.providerCheckedAt??null,e.providerDetail==null?null:Oe(e.providerDetail),e.providerDisconnectObserved==null?null:e.providerDisconnectObserved?1:0,e.providerDisconnectMessage??null,e.debug==null?null:JSON.stringify(e.debug),e.completedAt,e.jobId,e.attemptNumber]})}function Oe(e,t=4096){let r=JSON.stringify(e);return r.length<=t?r:JSON.stringify({truncated:!0})}async function mr(e){return(await i().execute({sql:`
|
|
1060
1060
|
UPDATE harvest_attempts SET
|
|
1061
1061
|
provider_lookup_status = ?,
|
|
1062
1062
|
provider_status = ?,
|
|
@@ -1071,12 +1071,12 @@ import{createClient as Ve}from"@libsql/client/http";import{createHash as v,rando
|
|
|
1071
1071
|
WHERE id = ?
|
|
1072
1072
|
AND job_id = ?
|
|
1073
1073
|
AND user_id = ?
|
|
1074
|
-
AND browser_provider = '
|
|
1074
|
+
AND browser_provider = '\u0062\u0072\u0069\u0067\u0068\u0074_\u0064\u0061\u0074\u0061_browser_api'
|
|
1075
1075
|
AND provider_session_id = ?
|
|
1076
1076
|
AND COALESCE(provider_lookup_status, '') <> 'complete'
|
|
1077
1077
|
`,args:[e.lookupStatus,e.providerStatus??null,e.errorCode??null,e.errorMessage??null,e.reasonSource??null,e.durationMs??null,e.bandwidthBytes??null,e.captcha==null?null:e.captcha?1:0,e.checkedAt,e.detail==null?null:Oe(e.detail),e.attemptId,e.jobId,e.userId,e.providerSessionId]})).rowsAffected===1}async function Nr(e=25){let t=Math.max(1,Math.min(100,Math.trunc(e)));return(await i().execute({sql:`
|
|
1078
1078
|
SELECT * FROM harvest_attempts
|
|
1079
|
-
WHERE browser_provider = '
|
|
1079
|
+
WHERE browser_provider = '\u0062\u0072\u0069\u0067\u0068\u0074_\u0064\u0061\u0074\u0061_browser_api'
|
|
1080
1080
|
AND provider_session_id IS NOT NULL
|
|
1081
1081
|
AND provider_lookup_status IN ('pending', 'temporary_error')
|
|
1082
1082
|
ORDER BY COALESCE(provider_checked_at, created_at) ASC
|
|
@@ -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};
|