mcp-scraper 0.95.1 → 0.96.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.
Files changed (124) hide show
  1. package/CHANGELOG.md +98 -39
  2. package/README.md +25 -7
  3. package/THIRD_PARTY_NOTICES.html +203 -0
  4. package/dist/actions-YCMJY3PF.js +1 -0
  5. package/dist/artifacts-4ZDNP2JW.js +1 -0
  6. package/dist/artifacts-N62OPIT5.js +1 -0
  7. package/dist/artifacts-PSADD5OC.js +1 -0
  8. package/dist/artifacts-RUR3OHAK.js +1 -0
  9. package/dist/bin/api-server.js +1 -1
  10. package/dist/bin/mcp-scraper-cli.js +22 -22
  11. package/dist/bin/mcp-scraper-core.js +1 -1
  12. package/dist/bin/mcp-scraper-install.js +1 -1
  13. package/dist/bin/mcp-stdio-server.js +1 -1
  14. package/dist/bin/paa-harvest.js +1 -1
  15. package/dist/blob-store-GIH26EDO.js +1 -0
  16. package/dist/bundle-TTJP6DHU.js +1 -0
  17. package/dist/chunk-24YDQ3EO.js +5 -0
  18. package/dist/chunk-2PRH4Z3N.js +181 -0
  19. package/dist/chunk-3F7AFM53.js +1 -0
  20. package/dist/chunk-4HZXATHB.js +27 -0
  21. package/dist/chunk-55ZANTHL.js +3 -0
  22. package/dist/chunk-5BKSKLHX.js +1 -0
  23. package/dist/chunk-63VWBMYR.js +3 -0
  24. package/dist/chunk-6N5EC7ZO.js +1 -0
  25. package/dist/chunk-6SNOUSSZ.js +182 -0
  26. package/dist/chunk-7POHNTVW.js +1 -0
  27. package/dist/chunk-7SR7MEU5.js +62 -0
  28. package/dist/chunk-7UHDOIUE.js +1 -0
  29. package/dist/chunk-ARSQZCTJ.js +945 -0
  30. package/dist/chunk-B3JRL45T.js +1 -0
  31. package/dist/chunk-B4ZKPLSP.js +1 -0
  32. package/dist/chunk-C7MGJUTU.js +1 -0
  33. package/dist/{chunk-W2BVJ7S2.js → chunk-CNSVZTTT.js} +4 -4
  34. package/dist/chunk-DGAW7FD7.js +12 -0
  35. package/dist/chunk-FRXKMOXI.js +41 -0
  36. package/dist/chunk-GVYGAZV7.js +1 -0
  37. package/dist/chunk-HCK6PLM3.js +3 -0
  38. package/dist/{chunk-I3HNHCIJ.js → chunk-HJIOH7HF.js} +199 -84
  39. package/dist/chunk-HNNYXMSI.js +1 -0
  40. package/dist/chunk-HUNSEGUN.js +57 -0
  41. package/dist/chunk-IFPION5D.js +121 -0
  42. package/dist/{chunk-DYDAQQMC.js → chunk-JAV5V3JT.js} +41 -8
  43. package/dist/chunk-JMZIDHYQ.js +2 -0
  44. package/dist/{chunk-FN7U6KRI.js → chunk-JW4GDY7S.js} +1 -1
  45. package/dist/chunk-KXJCGV3H.js +1 -0
  46. package/dist/chunk-LFRAA3MY.js +4 -0
  47. package/dist/{chunk-Y6STAKF3.js → chunk-M5QHXNFZ.js} +3 -3
  48. package/dist/chunk-MVMWPKRC.js +2 -0
  49. package/dist/chunk-NALXKTUU.js +1 -0
  50. package/dist/chunk-NNOX3FYG.js +198 -0
  51. package/dist/chunk-OB6E6UTD.js +1 -0
  52. package/dist/chunk-OILOHQNL.js +2 -0
  53. package/dist/chunk-OLYPLX5C.js +1 -0
  54. package/dist/chunk-QER2ELZP.js +1 -0
  55. package/dist/chunk-QWE7VKIX.js +1 -0
  56. package/dist/chunk-R5LJL6IR.js +225 -0
  57. package/dist/chunk-RDHGQ2WZ.js +1 -0
  58. package/dist/chunk-SDQW7IJN.js +1 -0
  59. package/dist/chunk-SEZETSB3.js +1 -0
  60. package/dist/chunk-SNJR5N36.js +1 -0
  61. package/dist/chunk-TPN25AFZ.js +159 -0
  62. package/dist/{chunk-AK6HVF5F.js → chunk-U4WIJZCX.js} +1 -1
  63. package/dist/chunk-UIOSADPB.js +1718 -0
  64. package/dist/{chunk-DYKSPHHR.js → chunk-UNEJYZ4T.js} +1 -1
  65. package/dist/chunk-VAC3SQ5T.js +16 -0
  66. package/dist/chunk-VVSHZV5S.js +73 -0
  67. package/dist/chunk-WNUXMPVX.js +1 -0
  68. package/dist/chunk-WP3QS4CJ.js +1 -0
  69. package/dist/chunk-ZPQNY5TI.js +1 -0
  70. package/dist/contracts-GUXGFCVV.js +1 -0
  71. package/dist/core-schema-423BSTE6.js +936 -0
  72. package/dist/dispatch-3HY4735M.js +1 -0
  73. package/dist/index.cjs +104 -214
  74. package/dist/index.d.cts +192 -180
  75. package/dist/index.d.ts +192 -180
  76. package/dist/index.js +1 -1
  77. package/dist/media-artifacts-67CJWI7O.js +1 -0
  78. package/dist/metering-ZH2P62IC.js +1 -0
  79. package/dist/migrations-3AKEC5QE.js +1 -0
  80. package/dist/queue-HUP2GNXF.js +1 -0
  81. package/dist/reconciliation-ANXNJWME.js +1 -0
  82. package/dist/report-artifact-offload-6OOY2PTM.js +1 -0
  83. package/dist/repository-4EC5EXVN.js +1 -0
  84. package/dist/{location-data-repository-NWWKDYG6.js → repository-CYXVMYAI.js} +1 -1
  85. package/dist/server-VQU6S24A.js +5825 -0
  86. package/dist/settlement-6CCE2PDH.js +1 -0
  87. package/dist/worker-5G5BK23B.js +1 -0
  88. package/package.json +18 -138
  89. package/dist/analytics-repository-A7VMA24D.js +0 -1
  90. package/dist/chunk-56C243PX.js +0 -2595
  91. package/dist/chunk-6ND5AFV5.js +0 -27
  92. package/dist/chunk-6NE4OIXR.js +0 -6
  93. package/dist/chunk-DOJMTFLB.js +0 -1
  94. package/dist/chunk-EDQ57S4P.js +0 -1
  95. package/dist/chunk-FCJXL4PU.js +0 -182
  96. package/dist/chunk-GPSPSJBJ.js +0 -1
  97. package/dist/chunk-HE45FFBU.js +0 -1
  98. package/dist/chunk-HUV2WTRW.js +0 -1
  99. package/dist/chunk-L552AQQY.js +0 -84
  100. package/dist/chunk-MVDMZ3N2.js +0 -1282
  101. package/dist/chunk-NA76FFGD.js +0 -73
  102. package/dist/chunk-NZSDHDX3.js +0 -1
  103. package/dist/chunk-OS4XFDIG.js +0 -21
  104. package/dist/chunk-QQ7OD7BJ.js +0 -100
  105. package/dist/chunk-RPA5ADXW.js +0 -16
  106. package/dist/chunk-TMB56NCA.js +0 -1
  107. package/dist/chunk-WO3N5FH2.js +0 -5
  108. package/dist/chunk-XPEJB4BZ.js +0 -1
  109. package/dist/chunk-YK4OAZRQ.js +0 -4
  110. package/dist/chunk-YWUNN24S.js +0 -1
  111. package/dist/chunk-ZJTUAWZA.js +0 -19
  112. package/dist/chunk-ZPK5LYEN.js +0 -1565
  113. package/dist/chunk-ZUGTYD2I.js +0 -63
  114. package/dist/db-B6RNXKEI.js +0 -1
  115. package/dist/extract-bundle-X7SRN63Y.js +0 -26
  116. package/dist/gmail-service-FZVJBSUT.js +0 -1
  117. package/dist/lead-list-enrichment-repository-SXYSS7ZX.js +0 -1
  118. package/dist/operation-metering-OBKSWJVJ.js +0 -1
  119. package/dist/server-JV6L7F2X.js +0 -5014
  120. package/dist/site-extract-repository-UVE7TWJO.js +0 -1
  121. package/dist/stripe-event-worker-2LSUVQOM.js +0 -1
  122. package/dist/worker-XPIO5TAV.js +0 -1
  123. /package/dist/{chunk-YGBTTW5D.js → chunk-2IATUJO6.js} +0 -0
  124. /package/dist/{chunk-6DTXIZY2.js → chunk-4ZVO6GX4.js} +0 -0
package/dist/index.cjs CHANGED
@@ -1,196 +1,13 @@
1
- "use strict";var Wo=Object.create;var un=Object.defineProperty;var Ho=Object.getOwnPropertyDescriptor;var Do=Object.getOwnPropertyNames;var Bo=Object.getPrototypeOf,Fo=Object.prototype.hasOwnProperty;var Go=(e,t)=>{for(var n in t)un(e,n,{get:t[n],enumerable:!0})},ui=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Do(t))!Fo.call(e,i)&&i!==n&&un(e,i,{get:()=>t[i],enumerable:!(a=Ho(t,i))||a.enumerable});return e};var cn=(e,t,n)=>(n=e!=null?Wo(Bo(e)):{},ui(t||!e||!e.__esModule?un(n,"default",{value:e,enumerable:!0}):n,e)),Vo=e=>ui(un({},"__esModule",{value:!0}),e);var nS={};Go(nS,{VideoGenerator:()=>$n,buildClipPrompts:()=>Jn,harvest:()=>No});module.exports=Vo(nS);var v=require("zod");var ci=require("zod"),hi=ci.z.enum(["core","hours","services","areasServed","reviews","images","all"]);var hn="none",Yo="none";function ta(e){switch(e){case"day":return"qdr:d";case"week":return"qdr:w";case"month":return"qdr:m";case"year":return"qdr:y";default:return}}var rS=v.z.object({businessName:v.z.string().min(1),location:v.z.string().min(1),gl:v.z.string().length(2).default("us"),hl:v.z.string().length(2).default("en"),includeReviews:v.z.boolean().default(!1),maxReviews:v.z.number().int().min(1).max(1e3).default(50),includeServices:v.z.boolean().default(!1),includeImages:v.z.boolean().default(!1),include:v.z.array(hi).optional(),imageScope:v.z.enum(["owner","all"]).default("all"),maxImages:v.z.number().int().min(1).max(250).default(100),maxInlineImages:v.z.number().int().min(0).max(5).default(3),kernelApiKey:v.z.string().optional(),kernelProxyId:v.z.string().optional(),headless:v.z.boolean().default(!0)}),dS=v.z.object({query:v.z.string().min(1),location:v.z.string().optional(),gl:v.z.string().length(2).default("us"),hl:v.z.string().length(2).default("en"),maxResults:v.z.number().int().min(1).max(50).default(10),includeServices:v.z.boolean().default(!1),proxyMode:v.z.enum(["location","configured","none"]).default(Yo),proxyZip:v.z.string().regex(/^\d{5}$/).optional(),serpRedirect:v.z.boolean().optional(),forceDirectEgress:v.z.boolean().optional(),debug:v.z.boolean().default(!1),kernelApiKey:v.z.string().optional(),kernelProxyId:v.z.string().optional(),kernelProxyResolution:v.z.unknown().optional(),headless:v.z.boolean().default(!0)}),lS=v.z.object({name:v.z.string().nullable(),rating:v.z.string().nullable(),reviewCount:v.z.string().nullable(),category:v.z.string().nullable(),address:v.z.string().nullable(),hoursSummary:v.z.string().nullable(),phone:v.z.string().nullable(),phoneDisplay:v.z.string().nullable(),website:v.z.string().nullable(),plusCode:v.z.string().nullable(),bookingUrl:v.z.string().nullable()}),SS=v.z.object({day:v.z.string(),hours:v.z.string()}),US=v.z.object({reviewHistogram:v.z.array(v.z.object({stars:v.z.number(),count:v.z.string()})),reviewTopics:v.z.array(v.z.object({label:v.z.string(),count:v.z.string()}))}),uS=v.z.object({reviewId:v.z.string(),author:v.z.string().nullable(),stars:v.z.string().nullable(),date:v.z.string().nullable(),text:v.z.string().nullable(),ownerResponse:v.z.string().nullable()}),cS=v.z.object({section:v.z.string(),attribute:v.z.string()});var A=require("zod");var ea=A.z.object({query:A.z.string().min(1),location:A.z.string().optional(),gl:A.z.string().length(2).default("us"),hl:A.z.string().length(2).default("en"),device:A.z.enum(["desktop","mobile"]).default("desktop"),proxyMode:A.z.enum(["location","configured","none"]).default(hn),proxyZip:A.z.string().regex(/^\d{5}$/).optional(),keepDefaultProxy:A.z.boolean().optional(),requireUsEgress:A.z.boolean().optional(),maxAttempts:A.z.number().int().min(1).max(12).optional(),debug:A.z.boolean().default(!1),depth:A.z.number().int().min(1).max(30).default(3),maxQuestions:A.z.number().int().min(1).max(100).default(100),headless:A.z.boolean().default(!1),profileDir:A.z.string().optional(),proxy:A.z.string().url().optional(),kernelApiKey:A.z.string().optional(),kernelProxyId:A.z.string().optional(),kernelProfileName:A.z.string().optional(),kernelProfileSaveChanges:A.z.boolean().optional(),kernelStealth:A.z.boolean().optional(),serpIdentity:A.z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/).optional(),kernelProxyResolution:A.z.unknown().optional(),outputDir:A.z.string().default("./paa-output"),format:A.z.enum(["json","csv","both"]).default("both"),serpOnly:A.z.boolean().default(!1),questionsOnly:A.z.boolean().default(!1),questionGrowthRecoveryRounds:A.z.number().int().min(0).max(4).default(2),pages:A.z.number().int().min(1).max(2).default(1),includeAllSerpFeatures:A.z.boolean().default(!1),includeLocalPack:A.z.boolean().default(!1),includeForums:A.z.boolean().default(!1),includeVideos:A.z.boolean().default(!1),includeAiOverview:A.z.boolean().default(!1),includeWhatPeopleSaying:A.z.boolean().default(!1),includeShortVideos:A.z.boolean().default(!1),recency:A.z.enum(["day","week","month","year"]).optional(),softDeadlineMs:A.z.number().optional()}),gi=A.z.object({questionId:A.z.string().min(1),googleLinkId:A.z.string().nullable(),googleEvidenceId:A.z.string().nullable(),question:A.z.string().min(1),answer:A.z.string().optional(),sourceTitle:A.z.string().optional(),sourceSite:A.z.string().optional(),sourceCite:A.z.string().optional(),sources:A.z.array(A.z.object({title:A.z.string().nullable(),site:A.z.string().nullable(),url:A.z.string().min(1),rawUrl:A.z.string().min(1),resolvedUrl:A.z.string().nullable(),linkType:A.z.enum(["plain","google_url_redirect","google_goto_redirect"]),resolutionStatus:A.z.enum(["not_needed","resolved","unresolved","rejected"])})).default([])});function pi(){return(process.env.BROWSER_SERVICE_API_KEY??process.env.KERNEL_API_KEY)?.trim()||void 0}var On=require("playwright-extra"),fs=cn(require("puppeteer-extra-plugin-stealth"),1),Ms=require("playwright");function et(e,t,n,a,i){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!i)throw new TypeError("Private accessor was defined without a setter");if(typeof t=="function"?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?i.call(e,n):i?i.value=n:t.set(e,n),n}function K(e,t,n,a){if(n==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof t=="function"?e!==t||!a:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?a:n==="a"?a.call(e):a?a.value:t.get(e)}var na=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return na=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,a=>(+a^n()&15>>+a/4).toString(16))};function Fe(e){return typeof e=="object"&&e!==null&&("name"in e&&e.name==="AbortError"||"message"in e&&String(e.message).includes("FetchRequestCanceledException"))}var Ge=e=>{if(e instanceof Error)return e;if(typeof e=="object"&&e!==null){try{if(Object.prototype.toString.call(e)==="[object Error]"){let t=new Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return new Error(JSON.stringify(e))}catch{}}return new Error(e)};var Y=class extends Error{},nt=class e extends Y{constructor(t,n,a,i){super(`${e.makeMessage(t,n,a)}`),this.status=t,this.headers=i,this.error=n}static makeMessage(t,n,a){let i=n?.message?typeof n.message=="string"?n.message:JSON.stringify(n.message):n?JSON.stringify(n):a;return t&&i?`${t} ${i}`:t?`${t} status code (no body)`:i||"(no status code or body)"}static generate(t,n,a,i){if(!t||!i)return new Pt({message:a,cause:Ge(n)});let s=n;return t===400?new le(t,s,a,i):t===401?new Se(t,s,a,i):t===403?new Ue(t,s,a,i):t===404?new ue(t,s,a,i):t===409?new ce(t,s,a,i):t===422?new he(t,s,a,i):t===429?new ge(t,s,a,i):t>=500?new pe(t,s,a,i):new e(t,s,a,i)}},ot=class extends nt{constructor({message:t}={}){super(void 0,void 0,t||"Request was aborted.",void 0)}},Pt=class extends nt{constructor({message:t,cause:n}){super(void 0,void 0,t||"Connection error.",void 0),n&&(this.cause=n)}},Mt=class extends Pt{constructor({message:t}={}){super({message:t??"Request timed out."})}},le=class extends nt{},Se=class extends nt{},Ue=class extends nt{},ue=class extends nt{},ce=class extends nt{},he=class extends nt{},ge=class extends nt{},pe=class extends nt{};var Xo=/^[a-z][a-z0-9+.-]*:/i,wi=e=>Xo.test(e),at=e=>(at=Array.isArray,at(e)),aa=at;function ia(e){return typeof e!="object"?{}:e??{}}function sa(e){if(!e)return!0;for(let t in e)return!1;return!0}function mi(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var yi=(e,t)=>{if(typeof t!="number"||!Number.isInteger(t))throw new Y(`${e} must be an integer`);if(t<0)throw new Y(`${e} must be a positive integer`);return t},qo=e=>{if(typeof e=="number")return Math.round(e);if(typeof e=="string")return parseInt(e,10);throw new Y(`Could not coerce ${e} (type: ${typeof e}) into a number`)};var jo=e=>typeof e=="boolean"?e:typeof e=="string"?e==="true":!!e,Ti=e=>{if(e!=null)return qo(e)};var oa=e=>{if(e!=null)return jo(e)},Ci=e=>{try{return JSON.parse(e)}catch{return}};var ki=e=>new Promise(t=>setTimeout(t,e));var It="0.93.0";function zo(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}var $o=()=>{let e=zo();if(e==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":It,"X-Stainless-OS":Mi(Deno.build.os),"X-Stainless-Arch":fi(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version=="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":It,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(e==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":It,"X-Stainless-OS":Mi(globalThis.process.platform??"unknown"),"X-Stainless-Arch":fi(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let t=Qo();return t?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":It,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":It,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}};function Qo(){if(typeof navigator>"u"||!navigator)return null;let e=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:t,pattern:n}of e){let a=n.exec(navigator.userAgent);if(a){let i=a[1]||0,s=a[2]||0,o=a[3]||0;return{browser:t,version:`${i}.${s}.${o}`}}}return null}var fi=e=>e==="x32"?"x32":e==="x86_64"||e==="x64"?"x64":e==="arm"?"arm":e==="aarch64"||e==="arm64"?"arm64":e?`other:${e}`:"unknown",Mi=e=>(e=e.toLowerCase(),e.includes("ios")?"iOS":e==="android"?"Android":e==="darwin"?"MacOS":e==="win32"?"Windows":e==="freebsd"?"FreeBSD":e==="openbsd"?"OpenBSD":e==="linux"?"Linux":e?`Other:${e}`:"Unknown"),Ni,vi=()=>Ni??(Ni=$o());function _i(){if(typeof fetch<"u")return fetch;throw new Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Kernel({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function ra(...e){let t=globalThis.ReadableStream;if(typeof t>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function gn(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return ra({start(){},async pull(n){let{done:a,value:i}=await t.next();a?n.close():n.enqueue(i)},async cancel(){await t.return?.()}})}function da(e){if(e[Symbol.asyncIterator])return e;let t=e.getReader();return{async next(){try{let n=await t.read();return n?.done&&t.releaseLock(),n}catch(n){throw t.releaseLock(),n}},async return(){let n=t.cancel();return t.releaseLock(),await n,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function bi(e){if(e===null||typeof e!="object")return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}var Ei=({headers:e,body:t})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(t)});var la="RFC3986",Sa=e=>String(e),Ua={RFC1738:e=>String(e).replace(/%20/g,"+"),RFC3986:Sa},Pi="RFC1738";var pn=(e,t)=>(pn=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),pn(e,t)),yt=(()=>{let e=[];for(let t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e})();var ua=1024,Ii=(e,t,n,a,i)=>{if(e.length===0)return e;let s=e;if(typeof e=="symbol"?s=Symbol.prototype.toString.call(e):typeof e!="string"&&(s=String(e)),n==="iso-8859-1")return escape(s).replace(/%u[0-9a-f]{4}/gi,function(d){return"%26%23"+parseInt(d.slice(2),16)+"%3B"});let o="";for(let d=0;d<s.length;d+=ua){let l=s.length>=ua?s.slice(d,d+ua):s,S=[];for(let U=0;U<l.length;++U){let r=l.charCodeAt(U);if(r===45||r===46||r===95||r===126||r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||i===Pi&&(r===40||r===41)){S[S.length]=l.charAt(U);continue}if(r<128){S[S.length]=yt[r];continue}if(r<2048){S[S.length]=yt[192|r>>6]+yt[128|r&63];continue}if(r<55296||r>=57344){S[S.length]=yt[224|r>>12]+yt[128|r>>6&63]+yt[128|r&63];continue}U+=1,r=65536+((r&1023)<<10|l.charCodeAt(U)&1023),S[S.length]=yt[240|r>>18]+yt[128|r>>12&63]+yt[128|r>>6&63]+yt[128|r&63]}o+=S.join("")}return o};function Ai(e){return!e||typeof e!="object"?!1:!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))}function ca(e,t){if(at(e)){let n=[];for(let a=0;a<e.length;a+=1)n.push(t(e[a]));return n}return t(e)}var xi={brackets(e){return String(e)+"[]"},comma:"comma",indices(e,t){return String(e)+"["+t+"]"},repeat(e){return String(e)}},Oi=function(e,t){Array.prototype.push.apply(e,at(t)?t:[t])},Li,z={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:Ii,encodeValuesOnly:!1,format:la,formatter:Sa,indices:!1,serializeDate(e){return(Li??(Li=Function.prototype.call.bind(Date.prototype.toISOString)))(e)},skipNulls:!1,strictNullHandling:!1};function er(e){return typeof e=="string"||typeof e=="number"||typeof e=="boolean"||typeof e=="symbol"||typeof e=="bigint"}var ha={};function Ri(e,t,n,a,i,s,o,d,l,S,U,r,u,c,h,w,k,f){let m=e,L=f,R=0,B=!1;for(;(L=L.get(ha))!==void 0&&!B;){let y=L.get(e);if(R+=1,typeof y<"u"){if(y===R)throw new RangeError("Cyclic object value");B=!0}typeof L.get(ha)>"u"&&(R=0)}if(typeof S=="function"?m=S(t,m):m instanceof Date?m=u?.(m):n==="comma"&&at(m)&&(m=ca(m,function(y){return y instanceof Date?u?.(y):y})),m===null){if(s)return l&&!w?l(t,z.encoder,k,"key",c):t;m=""}if(er(m)||Ai(m)){if(l){let y=w?t:l(t,z.encoder,k,"key",c);return[h?.(y)+"="+h?.(l(m,z.encoder,k,"value",c))]}return[h?.(t)+"="+h?.(String(m))]}let _=[];if(typeof m>"u")return _;let M;if(n==="comma"&&at(m))w&&l&&(m=ca(m,l)),M=[{value:m.length>0?m.join(",")||null:void 0}];else if(at(S))M=S;else{let y=Object.keys(m);M=U?y.sort(U):y}let H=d?String(t).replace(/\./g,"%2E"):String(t),P=a&&at(m)&&m.length===1?H+"[]":H;if(i&&at(m)&&m.length===0)return P+"[]";for(let y=0;y<M.length;++y){let E=M[y],p=typeof E=="object"&&typeof E.value<"u"?E.value:m[E];if(o&&p===null)continue;let C=r&&d?E.replace(/\./g,"%2E"):E,N=at(m)?typeof n=="function"?n(P,C):P:P+(r?"."+C:"["+C+"]");f.set(e,R);let I=new WeakMap;I.set(ha,f),Oi(_,Ri(p,N,n,a,i,s,o,d,n==="comma"&&w&&at(m)?null:l,S,U,r,u,c,h,w,k,I))}return _}function nr(e=z){if(typeof e.allowEmptyArrays<"u"&&typeof e.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof e.encodeDotInKeys<"u"&&typeof e.encodeDotInKeys!="boolean")throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(e.encoder!==null&&typeof e.encoder<"u"&&typeof e.encoder!="function")throw new TypeError("Encoder has to be a function.");let t=e.charset||z.charset;if(typeof e.charset<"u"&&e.charset!=="utf-8"&&e.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let n=la;if(typeof e.format<"u"){if(!pn(Ua,e.format))throw new TypeError("Unknown format option provided.");n=e.format}let a=Ua[n],i=z.filter;(typeof e.filter=="function"||at(e.filter))&&(i=e.filter);let s;if(e.arrayFormat&&e.arrayFormat in xi?s=e.arrayFormat:"indices"in e?s=e.indices?"indices":"repeat":s=z.arrayFormat,"commaRoundTrip"in e&&typeof e.commaRoundTrip!="boolean")throw new TypeError("`commaRoundTrip` must be a boolean, or absent");let o=typeof e.allowDots>"u"?e.encodeDotInKeys?!0:z.allowDots:!!e.allowDots;return{addQueryPrefix:typeof e.addQueryPrefix=="boolean"?e.addQueryPrefix:z.addQueryPrefix,allowDots:o,allowEmptyArrays:typeof e.allowEmptyArrays=="boolean"?!!e.allowEmptyArrays:z.allowEmptyArrays,arrayFormat:s,charset:t,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:z.charsetSentinel,commaRoundTrip:!!e.commaRoundTrip,delimiter:typeof e.delimiter>"u"?z.delimiter:e.delimiter,encode:typeof e.encode=="boolean"?e.encode:z.encode,encodeDotInKeys:typeof e.encodeDotInKeys=="boolean"?e.encodeDotInKeys:z.encodeDotInKeys,encoder:typeof e.encoder=="function"?e.encoder:z.encoder,encodeValuesOnly:typeof e.encodeValuesOnly=="boolean"?e.encodeValuesOnly:z.encodeValuesOnly,filter:i,format:n,formatter:a,serializeDate:typeof e.serializeDate=="function"?e.serializeDate:z.serializeDate,skipNulls:typeof e.skipNulls=="boolean"?e.skipNulls:z.skipNulls,sort:typeof e.sort=="function"?e.sort:null,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:z.strictNullHandling}}function Wi(e,t={}){let n=e,a=nr(t),i,s;typeof a.filter=="function"?(s=a.filter,n=s("",n)):at(a.filter)&&(s=a.filter,i=s);let o=[];if(typeof n!="object"||n===null)return"";let d=xi[a.arrayFormat],l=d==="comma"&&a.commaRoundTrip;i||(i=Object.keys(n)),a.sort&&i.sort(a.sort);let S=new WeakMap;for(let u=0;u<i.length;++u){let c=i[u];a.skipNulls&&n[c]===null||Oi(o,Ri(n[c],c,d,l,a.allowEmptyArrays,a.strictNullHandling,a.skipNulls,a.encodeDotInKeys,a.encode?a.encoder:null,a.filter,a.sort,a.allowDots,a.serializeDate,a.format,a.formatter,a.encodeValuesOnly,a.charset,S))}let U=o.join(a.delimiter),r=a.addQueryPrefix===!0?"?":"";return a.charsetSentinel&&(a.charset==="iso-8859-1"?r+="utf8=%26%2310003%3B&":r+="utf8=%E2%9C%93&"),U.length>0?r+U:""}function Hi(e){return Wi(e,{arrayFormat:"comma"})}function Fi(e){let t=0;for(let i of e)t+=i.length;let n=new Uint8Array(t),a=0;for(let i of e)n.set(i,a),a+=i.length;return n}var Di;function Ve(e){let t;return(Di??(t=new globalThis.TextEncoder,Di=t.encode.bind(t)))(e)}var Bi;function ga(e){let t;return(Bi??(t=new globalThis.TextDecoder,Bi=t.decode.bind(t)))(e)}var Ut,ut,Bt=class{constructor(){Ut.set(this,void 0),ut.set(this,void 0),et(this,Ut,new Uint8Array,"f"),et(this,ut,null,"f")}decode(t){if(t==null)return[];let n=t instanceof ArrayBuffer?new Uint8Array(t):typeof t=="string"?Ve(t):t;et(this,Ut,Fi([K(this,Ut,"f"),n]),"f");let a=[],i;for(;(i=ir(K(this,Ut,"f"),K(this,ut,"f")))!=null;){if(i.carriage&&K(this,ut,"f")==null){et(this,ut,i.index,"f");continue}if(K(this,ut,"f")!=null&&(i.index!==K(this,ut,"f")+1||i.carriage)){a.push(ga(K(this,Ut,"f").subarray(0,K(this,ut,"f")-1))),et(this,Ut,K(this,Ut,"f").subarray(K(this,ut,"f")),"f"),et(this,ut,null,"f");continue}let s=K(this,ut,"f")!==null?i.preceding-1:i.preceding,o=ga(K(this,Ut,"f").subarray(0,s));a.push(o),et(this,Ut,K(this,Ut,"f").subarray(i.index),"f"),et(this,ut,null,"f")}return a}flush(){return K(this,Ut,"f").length?this.decode(`
2
- `):[]}};Ut=new WeakMap,ut=new WeakMap;Bt.NEWLINE_CHARS=new Set([`
3
- `,"\r"]);Bt.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function ir(e,t){for(let i=t??0;i<e.length;i++){if(e[i]===10)return{preceding:i,index:i+1,carriage:!1};if(e[i]===13)return{preceding:i,index:i+1,carriage:!0}}return null}function Gi(e){for(let a=0;a<e.length-1;a++){if(e[a]===10&&e[a+1]===10||e[a]===13&&e[a+1]===13)return a+2;if(e[a]===13&&e[a+1]===10&&a+3<e.length&&e[a+2]===13&&e[a+3]===10)return a+4}return-1}var mn={off:0,error:200,warn:300,info:400,debug:500},pa=(e,t,n)=>{if(e){if(mi(mn,e))return e;$(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(mn))}`)}};function Ye(){}function wn(e,t,n){return!t||mn[e]>mn[n]?Ye:t[e].bind(t)}var sr={error:Ye,warn:Ye,info:Ye,debug:Ye},Vi=new WeakMap;function $(e){let t=e.logger,n=e.logLevel??"off";if(!t)return sr;let a=Vi.get(t);if(a&&a[0]===n)return a[1];let i={error:wn("error",t,n),warn:wn("warn",t,n),info:wn("info",t,n),debug:wn("debug",t,n)};return Vi.set(t,[n,i]),i}var Nt=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&(e.headers=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([t,n])=>[t,t.toLowerCase()==="authorization"||t.toLowerCase()==="api-key"||t.toLowerCase()==="x-api-key"||t.toLowerCase()==="cookie"||t.toLowerCase()==="set-cookie"?"***":n]))),"retryOfRequestLogID"in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);var Ke,yn=class e{constructor(t,n,a){this.iterator=t,Ke.set(this,void 0),this.controller=n,et(this,Ke,a,"f")}static fromSSEResponse(t,n,a){let i=!1,s=a?$(a):console;async function*o(){if(i)throw new Y("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");i=!0;let d=!1;try{for await(let l of or(t,n))try{yield JSON.parse(l.data)}catch(S){throw s.error("Could not parse message into JSON:",l.data),s.error("From chunk:",l.raw),S}d=!0}catch(l){if(Fe(l))return;throw l}finally{d||n.abort()}}return new e(o,n,a)}static fromReadableStream(t,n,a){let i=!1;async function*s(){let d=new Bt,l=da(t);for await(let S of l)for(let U of d.decode(S))yield U;for(let S of d.flush())yield S}async function*o(){if(i)throw new Y("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");i=!0;let d=!1;try{for await(let l of s())d||l&&(yield JSON.parse(l));d=!0}catch(l){if(Fe(l))return;throw l}finally{d||n.abort()}}return new e(o,n,a)}[(Ke=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let t=[],n=[],a=this.iterator(),i=s=>({next:()=>{if(s.length===0){let o=a.next();t.push(o),n.push(o)}return s.shift()}});return[new e(()=>i(t),this.controller,K(this,Ke,"f")),new e(()=>i(n),this.controller,K(this,Ke,"f"))]}toReadableStream(){let t=this,n;return ra({async start(){n=t[Symbol.asyncIterator]()},async pull(a){try{let{value:i,done:s}=await n.next();if(s)return a.close();let o=Ve(JSON.stringify(i)+`
4
- `);a.enqueue(o)}catch(i){a.error(i)}},async cancel(){await n.return?.()}})}};async function*or(e,t){if(!e.body)throw t.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new Y("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new Y("Attempted to iterate over a response with no body");let n=new wa,a=new Bt,i=da(e.body);for await(let s of rr(i))for(let o of a.decode(s)){let d=n.decode(o);d&&(yield d)}for(let s of a.flush()){let o=n.decode(s);o&&(yield o)}}async function*rr(e){let t=new Uint8Array;for await(let n of e){if(n==null)continue;let a=n instanceof ArrayBuffer?new Uint8Array(n):typeof n=="string"?Ve(n):n,i=new Uint8Array(t.length+a.length);i.set(t),i.set(a,t.length),t=i;let s;for(;(s=Gi(t))!==-1;)yield t.slice(0,s),t=t.slice(s)}t.length>0&&(yield t)}var wa=class{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(t){if(t.endsWith("\r")&&(t=t.substring(0,t.length-1)),!t){if(!this.event&&!this.data.length)return null;let s={event:this.event,data:this.data.join(`
5
- `),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],s}if(this.chunks.push(t),t.startsWith(":"))return null;let[n,a,i]=dr(t,":");return i.startsWith(" ")&&(i=i.substring(1)),n==="event"?this.event=i:n==="data"&&this.data.push(i),null}};function dr(e,t){let n=e.indexOf(t);return n!==-1?[e.substring(0,n),t,e.substring(n+t.length)]:[e,"",""]}async function Tn(e,t){let{response:n,requestLogID:a,retryOfRequestLogID:i,startTime:s}=t,o=await(async()=>{if(t.options.stream)return $(e).debug("response",n.status,n.url,n.headers,n.body),t.options.__streamClass?t.options.__streamClass.fromSSEResponse(n,t.controller,e):yn.fromSSEResponse(n,t.controller,e);if(n.status===204)return null;if(t.options.__binaryResponse)return n;let l=n.headers.get("content-type")?.split(";")[0]?.trim();return l?.includes("application/json")||l?.endsWith("+json")?n.headers.get("content-length")==="0"?void 0:await n.json():await n.text()})();return $(e).debug(`[${a}] response parsed`,Nt({retryOfRequestLogID:i,url:n.url,status:n.status,body:o,durationMs:Date.now()-s})),o}var Je,Ft=class e extends Promise{constructor(t,n,a=Tn){super(i=>{i(null)}),this.responsePromise=n,this.parseResponse=a,Je.set(this,void 0),et(this,Je,t,"f")}_thenUnwrap(t){return new e(K(this,Je,"f"),this.responsePromise,async(n,a)=>t(await this.parseResponse(n,a),a))}asResponse(){return this.responsePromise.then(t=>t.response)}async withResponse(){let[t,n]=await Promise.all([this.parse(),this.asResponse()]);return{data:t,response:n}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(t=>this.parseResponse(K(this,Je,"f"),t))),this.parsedPromise}then(t,n){return this.parse().then(t,n)}catch(t){return this.parse().catch(t)}finally(t){return this.parse().finally(t)}};Je=new WeakMap;var Cn,kn=class{constructor(t,n,a,i){Cn.set(this,void 0),et(this,Cn,t,"f"),this.options=i,this.response=n,this.body=a}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let t=this.nextPageRequestOptions();if(!t)throw new Y("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await K(this,Cn,"f").requestAPIList(this.constructor,t)}async*iterPages(){let t=this;for(yield t;t.hasNextPage();)t=await t.getNextPage(),yield t}async*[(Cn=new WeakMap,Symbol.asyncIterator)](){for await(let t of this.iterPages())for(let n of t.getPaginatedItems())yield n}},Xe=class extends Ft{constructor(t,n,a){super(t,n,async(i,s)=>new a(i,s.response,await Tn(i,s),s.options))}async*[Symbol.asyncIterator](){let t=await this;for await(let n of t)yield n}},fn=class extends kn{constructor(t,n,a,i){super(t,n,a,i),this.items=a||[],this.next_page_token=this.response.headers.get("x-next-page-token")??null,this.has_more=oa(this.response.headers.get("x-has-more"))??null}getPaginatedItems(){return this.items??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let t=this.next_page_token;return t?{...this.options,query:{...ia(this.options.query),page_token:t}}:null}},F=class extends kn{constructor(t,n,a,i){super(t,n,a,i),this.items=a||[],this.has_more=oa(this.response.headers.get("x-has-more"))??null,this.next_offset=Ti(this.response.headers.get("x-next-offset"))??null}getPaginatedItems(){return this.items??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let t=this.next_offset;if(t==null){if(this.has_more)throw new Y("Server reported X-Has-More: true without an X-Next-Offset header; refusing to silently truncate pagination");return null}return t===0?null:{...this.options,query:{...ia(this.options.query),offset:t}}}};var Ta=()=>{if(typeof File>"u"){let{process:e}=globalThis,t=typeof e?.versions?.node=="string"&&parseInt(e.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};function we(e,t,n){return Ta(),new File(e,t??"unknown_file",n)}function qe(e){return(typeof e=="object"&&e!==null&&("name"in e&&e.name&&String(e.name)||"url"in e&&e.url&&String(e.url)||"filename"in e&&e.filename&&String(e.filename)||"path"in e&&e.path&&String(e.path))||"").split(/[\\/]/).pop()||void 0}var Mn=e=>e!=null&&typeof e=="object"&&typeof e[Symbol.asyncIterator]=="function";var vt=async(e,t)=>({...e,body:await Ur(e.body,t)}),Yi=new WeakMap;function Sr(e){let t=typeof e=="function"?e:e.fetch,n=Yi.get(t);if(n)return n;let a=(async()=>{try{let i="Response"in t?t.Response:(await t("data:,")).constructor,s=new FormData;return s.toString()!==await new i(s).text()}catch{return!0}})();return Yi.set(t,a),a}var Ur=async(e,t)=>{if(!await Sr(t))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let n=new FormData;return await Promise.all(Object.entries(e||{}).map(([a,i])=>ya(n,a,i))),n},Ki=e=>e instanceof Blob&&"name"in e,ur=e=>typeof e=="object"&&e!==null&&(e instanceof Response||Mn(e)||Ki(e)),ma=e=>{if(ur(e))return!0;if(Array.isArray(e))return e.some(ma);if(e&&typeof e=="object"){for(let t in e)if(ma(e[t]))return!0}return!1},ya=async(e,t,n)=>{if(n!==void 0){if(n==null)throw new TypeError(`Received null for "${t}"; to pass null in FormData, you must use the string 'null'`);if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")e.append(t,String(n));else if(n instanceof Response)e.append(t,we([await n.blob()],qe(n)));else if(Mn(n))e.append(t,we([await new Response(gn(n)).blob()],qe(n)));else if(Ki(n))e.append(t,n,qe(n));else if(Array.isArray(n))await Promise.all(n.map((a,i)=>ya(e,`${t}[${i}]`,a)));else if(typeof n=="object")!(t==="env_vars")&&!ma(n)?Object.entries(n).filter(([s,o])=>o!==void 0).length>0&&e.append(t,JSON.stringify(n)):await Promise.all(Object.entries(n).map(([i,s])=>ya(e,`${t}[${i}]`,s)));else throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${n} instead`)}};var Ji=e=>e!=null&&typeof e=="object"&&typeof e.size=="number"&&typeof e.type=="string"&&typeof e.text=="function"&&typeof e.slice=="function"&&typeof e.arrayBuffer=="function",cr=e=>e!=null&&typeof e=="object"&&typeof e.name=="string"&&typeof e.lastModified=="number"&&Ji(e),hr=e=>e!=null&&typeof e=="object"&&typeof e.url=="string"&&typeof e.blob=="function";async function Nn(e,t,n){if(Ta(),e=await e,cr(e))return e instanceof File?e:we([await e.arrayBuffer()],e.name);if(hr(e)){let i=await e.blob();return t||(t=new URL(e.url).pathname.split(/[\\/]/).pop()),we(await Ca(i),t,n)}let a=await Ca(e);if(t||(t=qe(e)),!n?.type){let i=a.find(s=>typeof s=="object"&&"type"in s&&s.type);typeof i=="string"&&(n={...n,type:i})}return we(a,t,n)}async function Ca(e){let t=[];if(typeof e=="string"||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(Ji(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(Mn(e))for await(let n of e)t.push(...await Ca(n));else{let n=e?.constructor?.name;throw new Error(`Unexpected data type: ${typeof e}${n?`; constructor: ${n}`:""}${gr(e)}`)}return t}function gr(e){return typeof e!="object"||e===null?"":`; props: [${Object.getOwnPropertyNames(e).map(n=>`"${n}"`).join(", ")}]`}var b=class{constructor(t){this._client=t}};var Xi=Symbol("brand.privateNullableHeaders");function*wr(e){if(!e)return;if(Xi in e){let{values:a,nulls:i}=e;yield*a.entries();for(let s of i)yield[s,null];return}let t=!1,n;e instanceof Headers?n=e.entries():aa(e)?n=e:(t=!0,n=Object.entries(e??{}));for(let a of n){let i=a[0];if(typeof i!="string")throw new TypeError("expected header name to be a string");let s=aa(a[1])?a[1]:[a[1]],o=!1;for(let d of s)d!==void 0&&(t&&!o&&(o=!0,yield[i,null]),yield[i,d])}}var T=e=>{let t=new Headers,n=new Set;for(let a of e){let i=new Set;for(let[s,o]of wr(a)){let d=s.toLowerCase();i.has(d)||(t.delete(s),i.add(d)),o===null?(t.delete(s),n.add(d)):(t.append(s,o),n.delete(d))}}return{[Xi]:!0,values:t,nulls:n}};function ji(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}var qi=Object.freeze(Object.create(null)),mr=(e=ji)=>function(n,...a){if(n.length===1)return n[0];let i=!1,s=[],o=n.reduce((U,r,u)=>{/[?#]/.test(r)&&(i=!0);let c=a[u],h=(i?encodeURIComponent:e)(""+c);return u!==a.length&&(c==null||typeof c=="object"&&c.toString===Object.getPrototypeOf(Object.getPrototypeOf(c.hasOwnProperty??qi)??qi)?.toString)&&(h=c+"",s.push({start:U.length+r.length,length:h.length,error:`Value of type ${Object.prototype.toString.call(c).slice(8,-1)} is not a valid path parameter`})),U+r+(u===a.length?"":h)},""),d=o.split(/[?#]/,1)[0],l=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,S;for(;(S=l.exec(d))!==null;)s.push({start:S.index,length:S[0].length,error:`Value "${S[0]}" can't be safely passed as a path parameter`});if(s.sort((U,r)=>U.start-r.start),s.length>0){let U=0,r=s.reduce((u,c)=>{let h=" ".repeat(c.start-U),w="^".repeat(c.length);return U=c.start+c.length,u+h+w},"");throw new Y(`Path parameters result in path with invalid segments:
6
- ${s.map(u=>u.error).join(`
1
+ "use strict";var nr=Object.create;var pn=Object.defineProperty;var ar=Object.getOwnPropertyDescriptor;var ir=Object.getOwnPropertyNames;var sr=Object.getPrototypeOf,or=Object.prototype.hasOwnProperty;var rr=(e,t)=>{for(var n in t)pn(e,n,{get:t[n],enumerable:!0})},fi=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ir(t))!or.call(e,i)&&i!==n&&pn(e,i,{get:()=>t[i],enumerable:!(a=ar(t,i))||a.enumerable});return e};var yn=(e,t,n)=>(n=e!=null?nr(sr(e)):{},fi(t||!e||!e.__esModule?pn(n,"default",{value:e,enumerable:!0}):n,e)),dr=e=>fi(pn({},"__esModule",{value:!0}),e);var kS={};rr(kS,{VideoGenerator:()=>Zn,buildClipPrompts:()=>zn,harvest:()=>Ko});module.exports=dr(kS);var xt=class extends Error{constructor(t,n){super(`SERP provider mismatch: planned ${t}, observed ${n}`),this.name="SerpProviderMismatchError"}};function Cn(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 vi(e){return lr({intent:e.intent,\u0062\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061Available:e.\u0062\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061Available,\u006b\u0065\u0072\u006e\u0065\u006cAvailable:!0,persistent\u004b\u0065\u0072\u006e\u0065\u006cIdentityRequested:e.persistent\u004b\u0065\u0072\u006e\u0065\u006cIdentityRequested,retryIndex:e.retryIndex,priorTerminalReason:e.priorTerminalReason,allowedFallbacks:e.\u006b\u0065\u0072\u006e\u0065\u006cFallbackAvailable&&e.intent!=="\u006b\u0065\u0072\u006e\u0065\u006c"?["\u006b\u0065\u0072\u006e\u0065\u006c"]:[],timeoutMs:e.softDeadlineMs==null?4e5:Math.max(1,e.softDeadlineMs-Date.now())})}function Ti(e){if(e.forceManagedSerp&&e.force\u004b\u0065\u0072\u006e\u0065\u006cSerp)throw new Error("forceManagedSerp and force\u004b\u0065\u0072\u006e\u0065\u006cSerp cannot both be true");return e.forceManagedSerp?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061":e.force\u004b\u0065\u0072\u006e\u0065\u006cSerp?"\u006b\u0065\u0072\u006e\u0065\u006c":"auto"}function mn(e,t){if(!t)throw new Error(`Requested SERP provider is unavailable: ${e}`);return e}function lr(e){if(!Number.isInteger(e.retryIndex)||e.retryIndex<0)throw new Error("retryIndex must be a non-negative integer");if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw new Error("timeoutMs must be a positive number");let t,n;e.intent==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?(t=mn("\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",e.\u0062\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061Available),n="explicit_\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"):e.intent==="\u006b\u0065\u0072\u006e\u0065\u006c"?(t=mn("\u006b\u0065\u0072\u006e\u0065\u006c",e.\u006b\u0065\u0072\u006e\u0065\u006cAvailable),n="explicit_\u006b\u0065\u0072\u006e\u0065\u006c"):e.persistent\u004b\u0065\u0072\u006e\u0065\u006cIdentityRequested?(t=mn("\u006b\u0065\u0072\u006e\u0065\u006c",e.\u006b\u0065\u0072\u006e\u0065\u006cAvailable),n="persistent_\u006b\u0065\u0072\u006e\u0065\u006c_identity"):e.\u0062\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061Available?(t="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061",n="managed_default"):(t=mn("\u006b\u0065\u0072\u006e\u0065\u006c",e.\u006b\u0065\u0072\u006e\u0065\u006cAvailable),n="\u006b\u0065\u0072\u006e\u0065\u006c_default");let a=e.allowedFallbacks.find(d=>d!==t&&(d==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?e.\u0062\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061Available:e.\u006b\u0065\u0072\u006e\u0065\u006cAvailable)),i=e.retryIndex>0&&a?a:t,s=e.retryIndex===0?"primary":i===t?"same_provider_retry":"provider_fallback";return Object.freeze({plannedProvider:i,attemptKind:s,reasonCode:s==="primary"?n:s==="provider_fallback"?"provider_fallback":"same_provider_retry",retryIndex:e.retryIndex,priorTerminalReason:e.priorTerminalReason??null,timeoutMs:Math.floor(e.timeoutMs),fallbackAllowed:!!a})}function Sr(e,t){if(typeof e!="string")return null;let n=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();return n?n.slice(0,t):null}function Ni(e){let t=Sr(e,320);return t?t.replace(/\b(?:wss?|https?):\/\/\S+/gi,"[redacted endpoint]").replace(/\b(?:authorization|proxy-authorization):\s*\S+/gi,"$1: [redacted]").replace(/\bBearer\s+\S+/gi,"Bearer [redacted]").slice(0,320):null}function Wt(e){return Ni(e)}function bi(e){if(typeof e!="string"||e.length===0||e.length>512||e.trim()!==e||/[\s\u0000-\u001f\u007f]/.test(e)||/:\/\//.test(e))throw new Error("\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 did not return a valid browser session ID");return e}function ea(e,t,n=new Date().toISOString()){let a=Ni(t);return{source:e,message:a??e.replaceAll("_"," "),observedAt:n}}function Ur(e){return{provider:e.provider,providerDisconnectObserved:e.disconnectObservation!==null,providerDisconnectMessage:e.disconnectObservation?.message??null}}function Pi(e){return{...Ur(e),providerSessionId:e.providerSessionId}}function Ii(e,t,n,a){return new Proxy(e,{get(i,s,d){if(s==="launch")return async l=>{await t.start(n,"browser"),await i.launch(l);let S=i.getProviderSessionMetadata();if(await t.resource(n,"browser",S.providerSessionId,S.provider),!S.providerSessionId)throw new Error("Browser connection returned no attributable session identity");if(Cn(S.provider)!==a)throw new xt(a,S.provider);await t.assertActive(n)};let r=Reflect.get(i,s,d);return typeof r=="function"?r.bind(i):r}})}function na(e,t,n,a=null){let i=n.\u006b\u0065\u0072\u006e\u0065\u006cSessionId??n.providerSessionId??null,s=n.\u006b\u0065\u0072\u006e\u0065\u006cSessionId!=null?n.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded===!0:n.physicalOutcome==="terminated",d=n.browserCloseSucceeded===!0&&n.localDisconnectSucceeded!==!1&&s,r=n.physicalOutcome==="not_started"&&n.browserCloseSucceeded===null,l={drained:n.extractionDrained===!0,effects:{browser:{resourceId:i,state:d?"terminated":r?"not_started":"unknown"},proxy:{resourceId:a,state:n.disposableProxyDeleted===!0?a===null?"not_started":"terminated":"unknown"}},details:{browserCloseSucceeded:n.browserCloseSucceeded??null,localDisconnectSucceeded:n.localDisconnectSucceeded??null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:n.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded??null,browserCloseError:Wt(n.browserCloseError),\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:Wt(n.\u006b\u0065\u0072\u006e\u0065\u006cDeleteError),localDisconnectError:Wt(n.localDisconnectError)}};return e.complete(t,l)}var gr=require("crypto");var Ai=require("@libsql/client/http"),cr=process.env.TURSO_DATABASE_URL??"file:./paa-api.db",ur=process.env.TURSO_AUTH_TOKEN,aa=null;function qe(){return aa||(aa=(0,Ai.createClient)({url:cr,authToken:ur})),aa}var hr=require("crypto");var ia=class extends Error{constructor(){super("physical_permission_or_receipt_unknown"),this.name="PhysicalPermissionError"}};var wr=new WeakSet;function xi(e){let t=e&&typeof e=="object"?e.physicalExecution:void 0;if(t!==void 0){if(!t||typeof t!="object"||!wr.has(t))throw new ia;return t}}var kn="none";function sa(e){switch(e){case"day":return"qdr:d";case"week":return"qdr:w";case"month":return"qdr:m";case"year":return"qdr:y";default:return}}var x=require("zod");var oa=x.z.object({query:x.z.string().min(1),location:x.z.string().optional(),gl:x.z.string().length(2).default("us"),hl:x.z.string().length(2).default("en"),device:x.z.enum(["desktop","mobile"]).default("desktop"),proxyMode:x.z.enum(["location","configured","none"]).default(kn),proxyZip:x.z.string().regex(/^\d{5}$/).optional(),keepDefaultProxy:x.z.boolean().optional(),requireUsEgress:x.z.boolean().optional(),maxAttempts:x.z.number().int().min(1).max(12).optional(),debug:x.z.boolean().default(!1),depth:x.z.number().int().min(1).max(30).default(3),maxQuestions:x.z.number().int().min(1).max(100).default(100),headless:x.z.boolean().default(!1),profileDir:x.z.string().optional(),proxy:x.z.string().url().optional(),\u006b\u0065\u0072\u006e\u0065\u006cApiKey:x.z.string().optional(),\u006b\u0065\u0072\u006e\u0065\u006cProxyId:x.z.string().optional(),\u006b\u0065\u0072\u006e\u0065\u006cProfileName:x.z.string().optional(),\u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges:x.z.boolean().optional(),\u006b\u0065\u0072\u006e\u0065\u006cStealth:x.z.boolean().optional(),serpIdentity:x.z.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/).optional(),\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution:x.z.unknown().optional(),outputDir:x.z.string().default("./paa-output"),format:x.z.enum(["json","csv","both"]).default("both"),serpOnly:x.z.boolean().default(!1),questionsOnly:x.z.boolean().default(!1),questionGrowthRecoveryRounds:x.z.number().int().min(0).max(4).default(2),pages:x.z.number().int().min(1).max(2).default(1),includeAllSerpFeatures:x.z.boolean().default(!1),includeLocalPack:x.z.boolean().default(!1),includeForums:x.z.boolean().default(!1),includeVideos:x.z.boolean().default(!1),includeAiOverview:x.z.boolean().default(!1),includeWhatPeopleSaying:x.z.boolean().default(!1),includeShortVideos:x.z.boolean().default(!1),recency:x.z.enum(["day","week","month","year"]).optional(),softDeadlineMs:x.z.number().optional()}),Wi=x.z.object({questionId:x.z.string().min(1),googleLinkId:x.z.string().nullable(),googleEvidenceId:x.z.string().nullable(),question:x.z.string().min(1),answer:x.z.string().optional(),answerExpansionIncomplete:x.z.boolean().optional(),sourceTitle:x.z.string().optional(),sourceSite:x.z.string().optional(),sourceCite:x.z.string().optional(),sources:x.z.array(x.z.object({title:x.z.string().nullable(),site:x.z.string().nullable(),description:x.z.string().nullable().optional(),url:x.z.string().min(1),rawUrl:x.z.string().min(1),resolvedUrl:x.z.string().nullable(),linkType:x.z.enum(["plain","google_url_redirect","google_goto_redirect"]),resolutionStatus:x.z.enum(["not_needed","resolved","unresolved","rejected"])})).default([])});function Li(){return(process.env.BROWSER_SERVICE_API_KEY??process.env.\u004b\u0045\u0052\u004e\u0045\u004c_API_KEY)?.trim()||void 0}var ot=require("fs"),Lt=yn(require("path"),1),qt=yn(require("papaparse"),1);async function Oi(e){if((process.env.NODE_ENV==="test"||process.env.VITEST)&&process.env.MCP_SCRAPER_ENABLE_MEMORY_LIBRARY_SINK_IN_TESTS!=="1")return;let t=process.env.MCP_SCRAPER_API_KEY?.trim(),n=(process.env.MCP_SCRAPER_BASE_URL??"https://mcpscraper.dev").replace(/\/$/,"");if(t)try{let a=await fetch(`${n}/memory/mcp-call`,{method:"POST",headers:{"content-type":"application/json","x-api-key":t},body:JSON.stringify({toolName:"libraryIngestTool",args:e})}),i=await a.json().catch(()=>null);(!a.ok||i?.ok===!1)&&console.warn("[memory-library-sink] ingest not accepted:",a.status,i?.error??"")}catch(a){console.warn("[memory-library-sink] ingest failed:",a?.message)}}var Mn=class{async writeJSON(t,n){await ot.promises.mkdir(n,{recursive:!0});let i=`${t.seed.toLowerCase().replace(/\W+/g,"-").slice(0,40)}-${Date.now()}.json`,s=Lt.default.join(n,i);return await ot.promises.writeFile(s,JSON.stringify(t,null,2),"utf8"),await Oi({title:`${t.seed} scrape`,content:JSON.stringify(t),source:`mcp-scraper:${s}`}),s}async writeCSV(t,n){await ot.promises.mkdir(n,{recursive:!0});let i=(t[0]?.seed_query??"paa").toLowerCase().replace(/\W+/g,"-").slice(0,40),s=qt.default.unparse(t.map(({sources:l,...S})=>({...S,sources_json:JSON.stringify(l)})),{header:!0}),d=`${i}-${Date.now()}.csv`,r=Lt.default.join(n,d);return await ot.promises.writeFile(r,s,"utf8"),r}async writeVideoCSV(t,n,a){await ot.promises.mkdir(a,{recursive:!0});let i=n.toLowerCase().replace(/\W+/g,"-").slice(0,40),s=qt.default.unparse(t,{header:!0}),d=`${i}-videos-${Date.now()}.csv`,r=Lt.default.join(a,d);return await ot.promises.writeFile(r,s,"utf8"),r}async writeForumCSV(t,n,a){await ot.promises.mkdir(a,{recursive:!0});let i=n.toLowerCase().replace(/\W+/g,"-").slice(0,40),s=qt.default.unparse(t,{header:!0}),d=`${i}-forums-${Date.now()}.csv`,r=Lt.default.join(a,d);return await ot.promises.writeFile(r,s,"utf8"),r}async writeAIOverviewCSV(t,n,a,i){await ot.promises.mkdir(i,{recursive:!0});let s=a.toLowerCase().replace(/\W+/g,"-").slice(0,40),d=t.map((c,o)=>({seed_query:a,response_text:o===0?n??"":"",citation_text:c.text,citation_href:c.href})),r=qt.default.unparse(d,{header:!0}),l=`${s}-ai-overview-${Date.now()}.csv`,S=Lt.default.join(i,l);return await ot.promises.writeFile(S,r,"utf8"),S}async writeAIModeCSV(t,n,a,i){await ot.promises.mkdir(i,{recursive:!0});let s=a.toLowerCase().replace(/\W+/g,"-").slice(0,40),d=t.map((c,o)=>({seed_query:a,response_text:o===0?n??"":"",citation_text:c.text,citation_href:c.href})),r=qt.default.unparse(d,{header:!0}),l=`${s}-ai-mode-${Date.now()}.csv`,S=Lt.default.join(i,l);return await ot.promises.writeFile(S,r,"utf8"),S}async writeWhatPeopleSayingCSV(t,n,a){await ot.promises.mkdir(a,{recursive:!0});let i=n.toLowerCase().replace(/\W+/g,"-").slice(0,40),s=t.map(S=>({seed_query:n,...S})),d=qt.default.unparse(s,{header:!0}),r=`${i}-what-people-saying-${Date.now()}.csv`,l=Lt.default.join(a,r);return await ot.promises.writeFile(l,d,"utf8"),l}};var Bi="Google returned a CAPTCHA. Run with --headless=false to re-warm the browser profile, then retry.";var yr=["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","directory_job_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"],mr=["request_aborted","captcha","location_mismatch","connection","timeout","extraction","concurrency_limit","unauthorized","forbidden","invalid_request","not_found","rate_limit","billing","service_unavailable"];var $S=new Set(yr),jS=new Set(mr);function Ri(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 Z=class extends Error{constructor(n){super(`CAPTCHA detected. ${n}`);this.instructions=n}instructions;name="CaptchaError"},rt=class extends Error{constructor(n,a){super(n);this.cause=a}cause;name="ExtractionError"};var dt=class extends Error{name="RequestAbortedError";constructor(t="Request aborted before harvest completed"){super(t)}},zt=class extends Error{name="PaaInteractionInterruptedError"},we=class extends Error{name="LocationMismatchError";constructor(t="Google returned results for a different location than requested"){super(t)}};function nt(e,t,n,a,i){if(a==="m")throw new TypeError("Private method is not writable");if(a==="a"&&!i)throw new TypeError("Private accessor was defined without a setter");if(typeof t=="function"?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return a==="a"?i.call(e,n):i?i.value=n:t.set(e,n),n}function q(e,t,n,a){if(n==="a"&&!a)throw new TypeError("Private accessor was defined without a getter");if(typeof t=="function"?e!==t||!a:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?a:n==="a"?a.call(e):a?a.value:t.get(e)}var ra=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return ra=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,a=>(+a^n()&15>>+a/4).toString(16))};function ze(e){return typeof e=="object"&&e!==null&&("name"in e&&e.name==="AbortError"||"message"in e&&String(e.message).includes("FetchRequestCanceledException"))}var $e=e=>{if(e instanceof Error)return e;if(typeof e=="object"&&e!==null){try{if(Object.prototype.toString.call(e)==="[object Error]"){let t=new Error(e.message,e.cause?{cause:e.cause}:{});return e.stack&&(t.stack=e.stack),e.cause&&!t.cause&&(t.cause=e.cause),e.name&&(t.name=e.name),t}}catch{}try{return new Error(JSON.stringify(e))}catch{}}return new Error(e)};var J=class extends Error{},at=class e extends J{constructor(t,n,a,i){super(`${e.makeMessage(t,n,a)}`),this.status=t,this.headers=i,this.error=n}static makeMessage(t,n,a){let i=n?.message?typeof n.message=="string"?n.message:JSON.stringify(n.message):n?JSON.stringify(n):a;return t&&i?`${t} ${i}`:t?`${t} status code (no body)`:i||"(no status code or body)"}static generate(t,n,a,i){if(!t||!i)return new Ot({message:a,cause:$e(n)});let s=n;return t===400?new pe(t,s,a,i):t===401?new ye(t,s,a,i):t===403?new me(t,s,a,i):t===404?new Ce(t,s,a,i):t===409?new ke(t,s,a,i):t===422?new Me(t,s,a,i):t===429?new fe(t,s,a,i):t>=500?new ve(t,s,a,i):new e(t,s,a,i)}},lt=class extends at{constructor({message:t}={}){super(void 0,void 0,t||"Request was aborted.",void 0)}},Ot=class extends at{constructor({message:t,cause:n}){super(void 0,void 0,t||"Connection error.",void 0),n&&(this.cause=n)}},ft=class extends Ot{constructor({message:t}={}){super({message:t??"Request timed out."})}},pe=class extends at{},ye=class extends at{},me=class extends at{},Ce=class extends at{},ke=class extends at{},Me=class extends at{},fe=class extends at{},ve=class extends at{};var kr=/^[a-z][a-z0-9+.-]*:/i,Hi=e=>kr.test(e),it=e=>(it=Array.isArray,it(e)),da=it;function la(e){return typeof e!="object"?{}:e??{}}function Sa(e){if(!e)return!0;for(let t in e)return!1;return!0}function Ei(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var Fi=(e,t)=>{if(typeof t!="number"||!Number.isInteger(t))throw new J(`${e} must be an integer`);if(t<0)throw new J(`${e} must be a positive integer`);return t},Mr=e=>{if(typeof e=="number")return Math.round(e);if(typeof e=="string")return parseInt(e,10);throw new J(`Could not coerce ${e} (type: ${typeof e}) into a number`)};var fr=e=>typeof e=="boolean"?e:typeof e=="string"?e==="true":!!e,_i=e=>{if(e!=null)return Mr(e)};var Ua=e=>{if(e!=null)return fr(e)},Di=e=>{try{return JSON.parse(e)}catch{return}};var Gi=e=>new Promise(t=>setTimeout(t,e));var Bt="0.93.0";function vr(){return typeof Deno<"u"&&Deno.build!=null?"deno":typeof EdgeRuntime<"u"?"edge":Object.prototype.toString.call(typeof globalThis.process<"u"?globalThis.process:0)==="[object process]"?"node":"unknown"}var Tr=()=>{let e=vr();if(e==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Bt,"X-Stainless-OS":Ki(Deno.build.os),"X-Stainless-Arch":Vi(Deno.build.arch),"X-Stainless-Runtime":"deno","X-Stainless-Runtime-Version":typeof Deno.version=="string"?Deno.version:Deno.version?.deno??"unknown"};if(typeof EdgeRuntime<"u")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Bt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(e==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Bt,"X-Stainless-OS":Ki(globalThis.process.platform??"unknown"),"X-Stainless-Arch":Vi(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let t=Nr();return t?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Bt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":Bt,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}};function Nr(){if(typeof navigator>"u"||!navigator)return null;let e=[{key:"edge",pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"ie",pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"chrome",pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"firefox",pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:"safari",pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}];for(let{key:t,pattern:n}of e){let a=n.exec(navigator.userAgent);if(a){let i=a[1]||0,s=a[2]||0,d=a[3]||0;return{browser:t,version:`${i}.${s}.${d}`}}}return null}var Vi=e=>e==="x32"?"x32":e==="x86_64"||e==="x64"?"x64":e==="arm"?"arm":e==="aarch64"||e==="arm64"?"arm64":e?`other:${e}`:"unknown",Ki=e=>(e=e.toLowerCase(),e.includes("ios")?"iOS":e==="android"?"Android":e==="darwin"?"MacOS":e==="win32"?"Windows":e==="freebsd"?"FreeBSD":e==="openbsd"?"OpenBSD":e==="linux"?"Linux":e?`Other:${e}`:"Unknown"),Yi,Ji=()=>Yi??(Yi=Tr());function qi(){if(typeof fetch<"u")return fetch;throw new Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new \u004b\u0065\u0072\u006e\u0065\u006c({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function ca(...e){let t=globalThis.ReadableStream;if(typeof t>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function fn(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return ca({start(){},async pull(n){let{done:a,value:i}=await t.next();a?n.close():n.enqueue(i)},async cancel(){await t.return?.()}})}function ua(e){if(e[Symbol.asyncIterator])return e;let t=e.getReader();return{async next(){try{let n=await t.read();return n?.done&&t.releaseLock(),n}catch(n){throw t.releaseLock(),n}},async return(){let n=t.cancel();return t.releaseLock(),await n,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function zi(e){if(e===null||typeof e!="object")return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}var $i=({headers:e,body:t})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(t)});var ha="RFC3986",ga=e=>String(e),wa={RFC1738:e=>String(e).replace(/%20/g,"+"),RFC3986:ga},ji="RFC1738";var vn=(e,t)=>(vn=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),vn(e,t)),Mt=(()=>{let e=[];for(let t=0;t<256;++t)e.push("%"+((t<16?"0":"")+t.toString(16)).toUpperCase());return e})();var pa=1024,Qi=(e,t,n,a,i)=>{if(e.length===0)return e;let s=e;if(typeof e=="symbol"?s=Symbol.prototype.toString.call(e):typeof e!="string"&&(s=String(e)),n==="iso-8859-1")return escape(s).replace(/%u[0-9a-f]{4}/gi,function(r){return"%26%23"+parseInt(r.slice(2),16)+"%3B"});let d="";for(let r=0;r<s.length;r+=pa){let l=s.length>=pa?s.slice(r,r+pa):s,S=[];for(let c=0;c<l.length;++c){let o=l.charCodeAt(c);if(o===45||o===46||o===95||o===126||o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122||i===ji&&(o===40||o===41)){S[S.length]=l.charAt(c);continue}if(o<128){S[S.length]=Mt[o];continue}if(o<2048){S[S.length]=Mt[192|o>>6]+Mt[128|o&63];continue}if(o<55296||o>=57344){S[S.length]=Mt[224|o>>12]+Mt[128|o>>6&63]+Mt[128|o&63];continue}c+=1,o=65536+((o&1023)<<10|l.charCodeAt(c)&1023),S[S.length]=Mt[240|o>>18]+Mt[128|o>>12&63]+Mt[128|o>>6&63]+Mt[128|o&63]}d+=S.join("")}return d};function Xi(e){return!e||typeof e!="object"?!1:!!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e))}function ya(e,t){if(it(e)){let n=[];for(let a=0;a<e.length;a+=1)n.push(t(e[a]));return n}return t(e)}var ts={brackets(e){return String(e)+"[]"},comma:"comma",indices(e,t){return String(e)+"["+t+"]"},repeat(e){return String(e)}},es=function(e,t){Array.prototype.push.apply(e,it(t)?t:[t])},Zi,tt={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:Qi,encodeValuesOnly:!1,format:ha,formatter:ga,indices:!1,serializeDate(e){return(Zi??(Zi=Function.prototype.call.bind(Date.prototype.toISOString)))(e)},skipNulls:!1,strictNullHandling:!1};function Ir(e){return typeof e=="string"||typeof e=="number"||typeof e=="boolean"||typeof e=="symbol"||typeof e=="bigint"}var ma={};function ns(e,t,n,a,i,s,d,r,l,S,c,o,U,u,h,w,y,N){let C=e,M=N,W=0,L=!1;for(;(M=M.get(ma))!==void 0&&!L;){let m=M.get(e);if(W+=1,typeof m<"u"){if(m===W)throw new RangeError("Cyclic object value");L=!0}typeof M.get(ma)>"u"&&(W=0)}if(typeof S=="function"?C=S(t,C):C instanceof Date?C=U?.(C):n==="comma"&&it(C)&&(C=ya(C,function(m){return m instanceof Date?U?.(m):m})),C===null){if(s)return l&&!w?l(t,tt.encoder,y,"key",u):t;C=""}if(Ir(C)||Xi(C)){if(l){let m=w?t:l(t,tt.encoder,y,"key",u);return[h?.(m)+"="+h?.(l(C,tt.encoder,y,"value",u))]}return[h?.(t)+"="+h?.(String(C))]}let B=[];if(typeof C>"u")return B;let f;if(n==="comma"&&it(C))w&&l&&(C=ya(C,l)),f=[{value:C.length>0?C.join(",")||null:void 0}];else if(it(S))f=S;else{let m=Object.keys(C);f=c?m.sort(c):m}let F=r?String(t).replace(/\./g,"%2E"):String(t),P=a&&it(C)&&C.length===1?F+"[]":F;if(i&&it(C)&&C.length===0)return P+"[]";for(let m=0;m<f.length;++m){let v=f[m],O=typeof v=="object"&&typeof v.value<"u"?v.value:C[v];if(d&&O===null)continue;let p=o&&r?v.replace(/\./g,"%2E"):v,k=it(C)?typeof n=="function"?n(P,p):P:P+(o?"."+p:"["+p+"]");N.set(e,W);let _=new WeakMap;_.set(ma,N),es(B,ns(O,k,n,a,i,s,d,r,n==="comma"&&w&&it(C)?null:l,S,c,o,U,u,h,w,y,_))}return B}function Ar(e=tt){if(typeof e.allowEmptyArrays<"u"&&typeof e.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof e.encodeDotInKeys<"u"&&typeof e.encodeDotInKeys!="boolean")throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(e.encoder!==null&&typeof e.encoder<"u"&&typeof e.encoder!="function")throw new TypeError("Encoder has to be a function.");let t=e.charset||tt.charset;if(typeof e.charset<"u"&&e.charset!=="utf-8"&&e.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let n=ha;if(typeof e.format<"u"){if(!vn(wa,e.format))throw new TypeError("Unknown format option provided.");n=e.format}let a=wa[n],i=tt.filter;(typeof e.filter=="function"||it(e.filter))&&(i=e.filter);let s;if(e.arrayFormat&&e.arrayFormat in ts?s=e.arrayFormat:"indices"in e?s=e.indices?"indices":"repeat":s=tt.arrayFormat,"commaRoundTrip"in e&&typeof e.commaRoundTrip!="boolean")throw new TypeError("`commaRoundTrip` must be a boolean, or absent");let d=typeof e.allowDots>"u"?e.encodeDotInKeys?!0:tt.allowDots:!!e.allowDots;return{addQueryPrefix:typeof e.addQueryPrefix=="boolean"?e.addQueryPrefix:tt.addQueryPrefix,allowDots:d,allowEmptyArrays:typeof e.allowEmptyArrays=="boolean"?!!e.allowEmptyArrays:tt.allowEmptyArrays,arrayFormat:s,charset:t,charsetSentinel:typeof e.charsetSentinel=="boolean"?e.charsetSentinel:tt.charsetSentinel,commaRoundTrip:!!e.commaRoundTrip,delimiter:typeof e.delimiter>"u"?tt.delimiter:e.delimiter,encode:typeof e.encode=="boolean"?e.encode:tt.encode,encodeDotInKeys:typeof e.encodeDotInKeys=="boolean"?e.encodeDotInKeys:tt.encodeDotInKeys,encoder:typeof e.encoder=="function"?e.encoder:tt.encoder,encodeValuesOnly:typeof e.encodeValuesOnly=="boolean"?e.encodeValuesOnly:tt.encodeValuesOnly,filter:i,format:n,formatter:a,serializeDate:typeof e.serializeDate=="function"?e.serializeDate:tt.serializeDate,skipNulls:typeof e.skipNulls=="boolean"?e.skipNulls:tt.skipNulls,sort:typeof e.sort=="function"?e.sort:null,strictNullHandling:typeof e.strictNullHandling=="boolean"?e.strictNullHandling:tt.strictNullHandling}}function as(e,t={}){let n=e,a=Ar(t),i,s;typeof a.filter=="function"?(s=a.filter,n=s("",n)):it(a.filter)&&(s=a.filter,i=s);let d=[];if(typeof n!="object"||n===null)return"";let r=ts[a.arrayFormat],l=r==="comma"&&a.commaRoundTrip;i||(i=Object.keys(n)),a.sort&&i.sort(a.sort);let S=new WeakMap;for(let U=0;U<i.length;++U){let u=i[U];a.skipNulls&&n[u]===null||es(d,ns(n[u],u,r,l,a.allowEmptyArrays,a.strictNullHandling,a.skipNulls,a.encodeDotInKeys,a.encode?a.encoder:null,a.filter,a.sort,a.allowDots,a.serializeDate,a.format,a.formatter,a.encodeValuesOnly,a.charset,S))}let c=d.join(a.delimiter),o=a.addQueryPrefix===!0?"?":"";return a.charsetSentinel&&(a.charset==="iso-8859-1"?o+="utf8=%26%2310003%3B&":o+="utf8=%E2%9C%93&"),c.length>0?o+c:""}function is(e){return as(e,{arrayFormat:"comma"})}function rs(e){let t=0;for(let i of e)t+=i.length;let n=new Uint8Array(t),a=0;for(let i of e)n.set(i,a),a+=i.length;return n}var ss;function je(e){let t;return(ss??(t=new globalThis.TextEncoder,ss=t.encode.bind(t)))(e)}var os;function Ca(e){let t;return(os??(t=new globalThis.TextDecoder,os=t.decode.bind(t)))(e)}var gt,wt,$t=class{constructor(){gt.set(this,void 0),wt.set(this,void 0),nt(this,gt,new Uint8Array,"f"),nt(this,wt,null,"f")}decode(t){if(t==null)return[];let n=t instanceof ArrayBuffer?new Uint8Array(t):typeof t=="string"?je(t):t;nt(this,gt,rs([q(this,gt,"f"),n]),"f");let a=[],i;for(;(i=Wr(q(this,gt,"f"),q(this,wt,"f")))!=null;){if(i.carriage&&q(this,wt,"f")==null){nt(this,wt,i.index,"f");continue}if(q(this,wt,"f")!=null&&(i.index!==q(this,wt,"f")+1||i.carriage)){a.push(Ca(q(this,gt,"f").subarray(0,q(this,wt,"f")-1))),nt(this,gt,q(this,gt,"f").subarray(q(this,wt,"f")),"f"),nt(this,wt,null,"f");continue}let s=q(this,wt,"f")!==null?i.preceding-1:i.preceding,d=Ca(q(this,gt,"f").subarray(0,s));a.push(d),nt(this,gt,q(this,gt,"f").subarray(i.index),"f"),nt(this,wt,null,"f")}return a}flush(){return q(this,gt,"f").length?this.decode(`
2
+ `):[]}};gt=new WeakMap,wt=new WeakMap;$t.NEWLINE_CHARS=new Set([`
3
+ `,"\r"]);$t.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function Wr(e,t){for(let i=t??0;i<e.length;i++){if(e[i]===10)return{preceding:i,index:i+1,carriage:!1};if(e[i]===13)return{preceding:i,index:i+1,carriage:!0}}return null}function ds(e){for(let a=0;a<e.length-1;a++){if(e[a]===10&&e[a+1]===10||e[a]===13&&e[a+1]===13)return a+2;if(e[a]===13&&e[a+1]===10&&a+3<e.length&&e[a+2]===13&&e[a+3]===10)return a+4}return-1}var Nn={off:0,error:200,warn:300,info:400,debug:500},ka=(e,t,n)=>{if(e){if(Ei(Nn,e))return e;et(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(Nn))}`)}};function Qe(){}function Tn(e,t,n){return!t||Nn[e]>Nn[n]?Qe:t[e].bind(t)}var Lr={error:Qe,warn:Qe,info:Qe,debug:Qe},ls=new WeakMap;function et(e){let t=e.logger,n=e.logLevel??"off";if(!t)return Lr;let a=ls.get(t);if(a&&a[0]===n)return a[1];let i={error:Tn("error",t,n),warn:Tn("warn",t,n),info:Tn("info",t,n),debug:Tn("debug",t,n)};return ls.set(t,[n,i]),i}var vt=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&(e.headers=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([t,n])=>[t,t.toLowerCase()==="authorization"||t.toLowerCase()==="api-key"||t.toLowerCase()==="x-api-key"||t.toLowerCase()==="cookie"||t.toLowerCase()==="set-cookie"?"***":n]))),"retryOfRequestLogID"in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);var Xe,bn=class e{constructor(t,n,a){this.iterator=t,Xe.set(this,void 0),this.controller=n,nt(this,Xe,a,"f")}static fromSSEResponse(t,n,a){let i=!1,s=a?et(a):console;async function*d(){if(i)throw new J("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");i=!0;let r=!1;try{for await(let l of Or(t,n))try{yield JSON.parse(l.data)}catch(S){throw s.error("Could not parse message into JSON:",l.data),s.error("From chunk:",l.raw),S}r=!0}catch(l){if(ze(l))return;throw l}finally{r||n.abort()}}return new e(d,n,a)}static fromReadableStream(t,n,a){let i=!1;async function*s(){let r=new $t,l=ua(t);for await(let S of l)for(let c of r.decode(S))yield c;for(let S of r.flush())yield S}async function*d(){if(i)throw new J("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");i=!0;let r=!1;try{for await(let l of s())r||l&&(yield JSON.parse(l));r=!0}catch(l){if(ze(l))return;throw l}finally{r||n.abort()}}return new e(d,n,a)}[(Xe=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let t=[],n=[],a=this.iterator(),i=s=>({next:()=>{if(s.length===0){let d=a.next();t.push(d),n.push(d)}return s.shift()}});return[new e(()=>i(t),this.controller,q(this,Xe,"f")),new e(()=>i(n),this.controller,q(this,Xe,"f"))]}toReadableStream(){let t=this,n;return ca({async start(){n=t[Symbol.asyncIterator]()},async pull(a){try{let{value:i,done:s}=await n.next();if(s)return a.close();let d=je(JSON.stringify(i)+`
4
+ `);a.enqueue(d)}catch(i){a.error(i)}},async cancel(){await n.return?.()}})}};async function*Or(e,t){if(!e.body)throw t.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new J("The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api"):new J("Attempted to iterate over a response with no body");let n=new Ma,a=new $t,i=ua(e.body);for await(let s of Br(i))for(let d of a.decode(s)){let r=n.decode(d);r&&(yield r)}for(let s of a.flush()){let d=n.decode(s);d&&(yield d)}}async function*Br(e){let t=new Uint8Array;for await(let n of e){if(n==null)continue;let a=n instanceof ArrayBuffer?new Uint8Array(n):typeof n=="string"?je(n):n,i=new Uint8Array(t.length+a.length);i.set(t),i.set(a,t.length),t=i;let s;for(;(s=ds(t))!==-1;)yield t.slice(0,s),t=t.slice(s)}t.length>0&&(yield t)}var Ma=class{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(t){if(t.endsWith("\r")&&(t=t.substring(0,t.length-1)),!t){if(!this.event&&!this.data.length)return null;let s={event:this.event,data:this.data.join(`
5
+ `),raw:this.chunks};return this.event=null,this.data=[],this.chunks=[],s}if(this.chunks.push(t),t.startsWith(":"))return null;let[n,a,i]=Rr(t,":");return i.startsWith(" ")&&(i=i.substring(1)),n==="event"?this.event=i:n==="data"&&this.data.push(i),null}};function Rr(e,t){let n=e.indexOf(t);return n!==-1?[e.substring(0,n),t,e.substring(n+t.length)]:[e,"",""]}async function Pn(e,t){let{response:n,requestLogID:a,retryOfRequestLogID:i,startTime:s}=t,d=await(async()=>{if(t.options.stream)return et(e).debug("response",n.status,n.url,n.headers,n.body),t.options.__streamClass?t.options.__streamClass.fromSSEResponse(n,t.controller,e):bn.fromSSEResponse(n,t.controller,e);if(n.status===204)return null;if(t.options.__binaryResponse)return n;let l=n.headers.get("content-type")?.split(";")[0]?.trim();return l?.includes("application/json")||l?.endsWith("+json")?n.headers.get("content-length")==="0"?void 0:await n.json():await n.text()})();return et(e).debug(`[${a}] response parsed`,vt({retryOfRequestLogID:i,url:n.url,status:n.status,body:d,durationMs:Date.now()-s})),d}var Ze,jt=class e extends Promise{constructor(t,n,a=Pn){super(i=>{i(null)}),this.responsePromise=n,this.parseResponse=a,Ze.set(this,void 0),nt(this,Ze,t,"f")}_thenUnwrap(t){return new e(q(this,Ze,"f"),this.responsePromise,async(n,a)=>t(await this.parseResponse(n,a),a))}asResponse(){return this.responsePromise.then(t=>t.response)}async withResponse(){let[t,n]=await Promise.all([this.parse(),this.asResponse()]);return{data:t,response:n}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(t=>this.parseResponse(q(this,Ze,"f"),t))),this.parsedPromise}then(t,n){return this.parse().then(t,n)}catch(t){return this.parse().catch(t)}finally(t){return this.parse().finally(t)}};Ze=new WeakMap;var In,An=class{constructor(t,n,a,i){In.set(this,void 0),nt(this,In,t,"f"),this.options=i,this.response=n,this.body=a}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let t=this.nextPageRequestOptions();if(!t)throw new J("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await q(this,In,"f").requestAPIList(this.constructor,t)}async*iterPages(){let t=this;for(yield t;t.hasNextPage();)t=await t.getNextPage(),yield t}async*[(In=new WeakMap,Symbol.asyncIterator)](){for await(let t of this.iterPages())for(let n of t.getPaginatedItems())yield n}},tn=class extends jt{constructor(t,n,a){super(t,n,async(i,s)=>new a(i,s.response,await Pn(i,s),s.options))}async*[Symbol.asyncIterator](){let t=await this;for await(let n of t)yield n}},xn=class extends An{constructor(t,n,a,i){super(t,n,a,i),this.items=a||[],this.next_page_token=this.response.headers.get("x-next-page-token")??null,this.has_more=Ua(this.response.headers.get("x-has-more"))??null}getPaginatedItems(){return this.items??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let t=this.next_page_token;return t?{...this.options,query:{...la(this.options.query),page_token:t}}:null}},G=class extends An{constructor(t,n,a,i){super(t,n,a,i),this.items=a||[],this.has_more=Ua(this.response.headers.get("x-has-more"))??null,this.next_offset=_i(this.response.headers.get("x-next-offset"))??null}getPaginatedItems(){return this.items??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let t=this.next_offset;if(t==null){if(this.has_more)throw new J("Server reported X-Has-More: true without an X-Next-Offset header; refusing to silently truncate pagination");return null}return t===0?null:{...this.options,query:{...la(this.options.query),offset:t}}}};var Ta=()=>{if(typeof File>"u"){let{process:e}=globalThis,t=typeof e?.versions?.node=="string"&&parseInt(e.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};function Te(e,t,n){return Ta(),new File(e,t??"unknown_file",n)}function en(e){return(typeof e=="object"&&e!==null&&("name"in e&&e.name&&String(e.name)||"url"in e&&e.url&&String(e.url)||"filename"in e&&e.filename&&String(e.filename)||"path"in e&&e.path&&String(e.path))||"").split(/[\\/]/).pop()||void 0}var Wn=e=>e!=null&&typeof e=="object"&&typeof e[Symbol.asyncIterator]=="function";var Tt=async(e,t)=>({...e,body:await Fr(e.body,t)}),Ss=new WeakMap;function Er(e){let t=typeof e=="function"?e:e.fetch,n=Ss.get(t);if(n)return n;let a=(async()=>{try{let i="Response"in t?t.Response:(await t("data:,")).constructor,s=new FormData;return s.toString()!==await new i(s).text()}catch{return!0}})();return Ss.set(t,a),a}var Fr=async(e,t)=>{if(!await Er(t))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let n=new FormData;return await Promise.all(Object.entries(e||{}).map(([a,i])=>va(n,a,i))),n},Us=e=>e instanceof Blob&&"name"in e,_r=e=>typeof e=="object"&&e!==null&&(e instanceof Response||Wn(e)||Us(e)),fa=e=>{if(_r(e))return!0;if(Array.isArray(e))return e.some(fa);if(e&&typeof e=="object"){for(let t in e)if(fa(e[t]))return!0}return!1},va=async(e,t,n)=>{if(n!==void 0){if(n==null)throw new TypeError(`Received null for "${t}"; to pass null in FormData, you must use the string 'null'`);if(typeof n=="string"||typeof n=="number"||typeof n=="boolean")e.append(t,String(n));else if(n instanceof Response)e.append(t,Te([await n.blob()],en(n)));else if(Wn(n))e.append(t,Te([await new Response(fn(n)).blob()],en(n)));else if(Us(n))e.append(t,n,en(n));else if(Array.isArray(n))await Promise.all(n.map((a,i)=>va(e,`${t}[${i}]`,a)));else if(typeof n=="object")!(t==="env_vars")&&!fa(n)?Object.entries(n).filter(([s,d])=>d!==void 0).length>0&&e.append(t,JSON.stringify(n)):await Promise.all(Object.entries(n).map(([i,s])=>va(e,`${t}[${i}]`,s)));else throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${n} instead`)}};var cs=e=>e!=null&&typeof e=="object"&&typeof e.size=="number"&&typeof e.type=="string"&&typeof e.text=="function"&&typeof e.slice=="function"&&typeof e.arrayBuffer=="function",Dr=e=>e!=null&&typeof e=="object"&&typeof e.name=="string"&&typeof e.lastModified=="number"&&cs(e),Gr=e=>e!=null&&typeof e=="object"&&typeof e.url=="string"&&typeof e.blob=="function";async function Ln(e,t,n){if(Ta(),e=await e,Dr(e))return e instanceof File?e:Te([await e.arrayBuffer()],e.name);if(Gr(e)){let i=await e.blob();return t||(t=new URL(e.url).pathname.split(/[\\/]/).pop()),Te(await Na(i),t,n)}let a=await Na(e);if(t||(t=en(e)),!n?.type){let i=a.find(s=>typeof s=="object"&&"type"in s&&s.type);typeof i=="string"&&(n={...n,type:i})}return Te(a,t,n)}async function Na(e){let t=[];if(typeof e=="string"||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(cs(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(Wn(e))for await(let n of e)t.push(...await Na(n));else{let n=e?.constructor?.name;throw new Error(`Unexpected data type: ${typeof e}${n?`; constructor: ${n}`:""}${Vr(e)}`)}return t}function Vr(e){return typeof e!="object"||e===null?"":`; props: [${Object.getOwnPropertyNames(e).map(n=>`"${n}"`).join(", ")}]`}var I=class{constructor(t){this._client=t}};var us=Symbol("brand.privateNullableHeaders");function*Yr(e){if(!e)return;if(us in e){let{values:a,nulls:i}=e;yield*a.entries();for(let s of i)yield[s,null];return}let t=!1,n;e instanceof Headers?n=e.entries():da(e)?n=e:(t=!0,n=Object.entries(e??{}));for(let a of n){let i=a[0];if(typeof i!="string")throw new TypeError("expected header name to be a string");let s=da(a[1])?a[1]:[a[1]],d=!1;for(let r of s)r!==void 0&&(t&&!d&&(d=!0,yield[i,null]),yield[i,r])}}var T=e=>{let t=new Headers,n=new Set;for(let a of e){let i=new Set;for(let[s,d]of Yr(a)){let r=s.toLowerCase();i.has(r)||(t.delete(s),i.add(r)),d===null?(t.delete(s),n.add(r)):(t.append(s,d),n.delete(r))}}return{[us]:!0,values:t,nulls:n}};function gs(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}var hs=Object.freeze(Object.create(null)),Jr=(e=gs)=>function(n,...a){if(n.length===1)return n[0];let i=!1,s=[],d=n.reduce((c,o,U)=>{/[?#]/.test(o)&&(i=!0);let u=a[U],h=(i?encodeURIComponent:e)(""+u);return U!==a.length&&(u==null||typeof u=="object"&&u.toString===Object.getPrototypeOf(Object.getPrototypeOf(u.hasOwnProperty??hs)??hs)?.toString)&&(h=u+"",s.push({start:c.length+o.length,length:h.length,error:`Value of type ${Object.prototype.toString.call(u).slice(8,-1)} is not a valid path parameter`})),c+o+(U===a.length?"":h)},""),r=d.split(/[?#]/,1)[0],l=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,S;for(;(S=l.exec(r))!==null;)s.push({start:S.index,length:S[0].length,error:`Value "${S[0]}" can't be safely passed as a path parameter`});if(s.sort((c,o)=>c.start-o.start),s.length>0){let c=0,o=s.reduce((U,u)=>{let h=" ".repeat(u.start-c),w="^".repeat(u.length);return c=u.start+u.length,U+h+w},"");throw new J(`Path parameters result in path with invalid segments:
6
+ ${s.map(U=>U.error).join(`
7
7
  `)}
8
- ${o}
9
- ${r}`)}return o},g=mr(ji);var Gt=class extends b{create(t,n){return this._client.post("/org/api_keys",{body:t,...n})}retrieve(t,n={},a){return this._client.get(g`/org/api_keys/${t}`,{query:n,...a})}update(t,n,a){return this._client.patch(g`/org/api_keys/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/org/api_keys",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/org/api_keys/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}rotate(t,n={},a){return this._client.post(g`/org/api_keys/${t}/rotate`,{body:n,...a})}};var Vt=class extends b{list(t={},n){return this._client.getAPIList("/apps",F,{query:t,...n})}};var me=class extends b{create(t,n){return this._client.post("/audit-logs/export/destinations",{body:t,...n})}retrieve(t,n){return this._client.get(g`/audit-logs/export/destinations/${t}`,n)}update(t,n,a){return this._client.patch(g`/audit-logs/export/destinations/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/audit-logs/export/destinations",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/audit-logs/export/destinations/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}test(t,n){return this._client.post(g`/audit-logs/export/destinations/${t}/test`,n)}};var Tr=6,Cr=5e4,kr=8e3,gt=class extends Y{};async function $i(e,t,n,a,i={}){if(!n||typeof n.write!="function")throw new TypeError("audit log download destination must provide write()");let{onProgress:s,maxTransferRetries:o=Tr,...d}=i;if(!Number.isInteger(o)||o<0)throw new TypeError("maxTransferRetries must be a non-negative integer");let l=d.timeout??a,S,U={bytesWritten:0,chunks:0,rows:0},r=new Set;for(;;){let u=await fr(e,S?{...t,cursor:S}:t,d,o,l),{nextCursor:c,hasMore:h,rows:w}=Mr(u.headers,S);if(h&&c){if(r.has(c))throw new gt("response repeated X-Next-Cursor header");r.add(c)}if(await _r(n,u.body),S=c,U.bytesWritten+=u.body.byteLength,U.chunks+=1,U.rows+=w,s&&await s({...U,chunkRows:w}),!h)return U}}async function fr(e,t,n,a,i){for(let s=0;;s+=1){let o=new AbortController,d=()=>o.abort();n.signal?.aborted?o.abort():n.signal?.addEventListener("abort",d,{once:!0});let l;try{l=await e(t,{...n,signal:o.signal})}catch(r){throw n.signal?.removeEventListener("abort",d),r}let S=!1,U=setTimeout(()=>{S=!0,o.abort()},i);try{let r=new Uint8Array(await l.arrayBuffer());if(clearTimeout(U),n.signal?.aborted)throw new ot;if(S)throw new Mt;let u=l.headers.get("x-content-sha256");if(!u)throw new gt("response missing X-Content-Sha256 header");let c=await Nr(r);if(n.signal?.aborted)throw new ot;if(c!==u)throw new gt(`audit log chunk checksum mismatch (got ${c}, want ${u})`);return{body:r,headers:l.headers}}catch(r){if(n.signal?.aborted&&!(r instanceof ot)?r=new ot:S&&(r=new Mt),s===a||r instanceof ot)throw r;await vr(s+1,n.signal)}finally{clearTimeout(U),n.signal?.removeEventListener("abort",d)}}}function Mr(e,t){let n=e.get("x-has-more");if(n!=="true"&&n!=="false")throw new gt("response missing or invalid X-Has-More header");let a=n==="true",i=e.get("x-row-count");if(i===null||!/^[0-9]+$/.test(i))throw new gt("response missing or invalid X-Row-Count header");let s=Number(i);if(!Number.isSafeInteger(s)||s>Cr)throw new gt("response missing or invalid X-Row-Count header");let o=e.get("x-next-cursor")||void 0;if(a&&(!o||o===t))throw new gt("response has invalid X-Next-Cursor header");if(!a&&o)throw new gt("response returned a cursor after the final chunk");return{rows:s,nextCursor:o,hasMore:a}}async function Nr(e){let t=await globalThis.crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(t),n=>n.toString(16).padStart(2,"0")).join("")}async function vr(e,t){let n=Math.min(1e3*2**(e-1),kr);await new Promise((a,i)=>{if(t?.aborted){i(new ot);return}let s=()=>{clearTimeout(o),i(new ot)},o=setTimeout(()=>{t?.removeEventListener("abort",s),a()},n);t?.addEventListener("abort",s,{once:!0})})}async function _r(e,t){let n=0;for(;n<t.byteLength;){let a=await e.write(n===0?t:t.subarray(n));if(typeof a=="number"){n+=zi(a,t.byteLength-n);continue}if(a&&typeof a=="object"&&"bytesWritten"in a){let i=a.bytesWritten;n+=zi(i,t.byteLength-n);continue}return}}function zi(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new gt("audit log download destination performed a short write");return e}var At=class extends b{constructor(){super(...arguments),this.exportDestinations=new me(this._client)}list(t,n){return this._client.getAPIList("/audit-logs",fn,{query:t,...n})}exportChunk(t,n){return this._client.get("/audit-logs/export/chunk",{query:t,...n,headers:T([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}download(t,n,a){return $i((i,s)=>this.exportChunk(i,s),t,n,this._client.timeout,a)}};At.ExportDestinations=me;var ye=class extends b{create(t,n){return this._client.post("/auth/connections",{body:t,...n})}retrieve(t,n){return this._client.get(g`/auth/connections/${t}`,n)}update(t,n,a){return this._client.patch(g`/auth/connections/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/auth/connections",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/auth/connections/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}follow(t,n){return this._client.get(g`/auth/connections/${t}/events`,{...n,headers:T([{Accept:"text/event-stream"},n?.headers]),stream:!0})}login(t,n={},a){return this._client.post(g`/auth/connections/${t}/login`,{body:n,...a})}submit(t,n,a){return this._client.post(g`/auth/connections/${t}/submit`,{body:n,...a})}timeline(t,n={},a){return this._client.getAPIList(g`/auth/connections/${t}/timeline`,F,{query:n,...a})}};var Te=class extends b{retrieve(t){return this._client.get("/auth/context",t)}};var _t=class extends b{constructor(){super(...arguments),this.context=new Te(this._client),this.connections=new ye(this._client)}};_t.Context=Te;_t.Connections=ye;var Yt=class extends b{create(t,n){return this._client.post("/browser_pools",{body:t,...n})}retrieve(t,n){return this._client.get(g`/browser_pools/${t}`,n)}update(t,n,a){return this._client.patch(g`/browser_pools/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/browser_pools",F,{query:t,...n})}delete(t,n={},a){return this._client.delete(g`/browser_pools/${t}`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}acquire(t,n,a){return this._client.post(g`/browser_pools/${t}/acquire`,{body:n,...a})}flush(t,n){return this._client.post(g`/browser_pools/${t}/flush`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}release(t,n,a){return this._client.post(g`/browser_pools/${t}/release`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}};var Ce=class extends b{batch(t,n,a){return this._client.post(g`/browsers/${t}/computer/batch`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}captureScreenshot(t,n={},a){return this._client.post(g`/browsers/${t}/computer/screenshot`,{body:n,...a,headers:T([{Accept:"image/png"},a?.headers]),__binaryResponse:!0})}clickMouse(t,n,a){return this._client.post(g`/browsers/${t}/computer/click_mouse`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}dragMouse(t,n,a){return this._client.post(g`/browsers/${t}/computer/drag_mouse`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}getMousePosition(t,n){return this._client.post(g`/browsers/${t}/computer/get_mouse_position`,n)}moveMouse(t,n,a){return this._client.post(g`/browsers/${t}/computer/move_mouse`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}pressKey(t,n,a){return this._client.post(g`/browsers/${t}/computer/press_key`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}readClipboard(t,n){return this._client.post(g`/browsers/${t}/computer/clipboard/read`,n)}scroll(t,n,a){return this._client.post(g`/browsers/${t}/computer/scroll`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}setCursorVisibility(t,n,a){return this._client.post(g`/browsers/${t}/computer/cursor`,{body:n,...a})}typeText(t,n,a){return this._client.post(g`/browsers/${t}/computer/type`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}writeClipboard(t,n,a){return this._client.post(g`/browsers/${t}/computer/clipboard/write`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}};var ke=class extends b{stream(t,n,a){return this._client.get(g`/browsers/${t}/logs/stream`,{query:n,...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}};var fe=class extends b{execute(t,n,a){return this._client.post(g`/browsers/${t}/playwright/execute`,{body:n,...a})}};var Me=class extends b{exec(t,n,a){return this._client.post(g`/browsers/${t}/process/exec`,{body:n,...a})}kill(t,n,a){let{id:i,...s}=n;return this._client.post(g`/browsers/${i}/process/${t}/kill`,{body:s,...a})}resize(t,n,a){let{id:i,...s}=n;return this._client.post(g`/browsers/${i}/process/${t}/resize`,{body:s,...a})}spawn(t,n,a){return this._client.post(g`/browsers/${t}/process/spawn`,{body:n,...a})}status(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/process/${t}/status`,a)}stdin(t,n,a){let{id:i,...s}=n;return this._client.post(g`/browsers/${i}/process/${t}/stdin`,{body:s,...a})}stdoutStream(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/process/${t}/stdout/stream`,{...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}};var Ne=class extends b{list(t,n){return this._client.get(g`/browsers/${t}/replays`,n)}download(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/replays/${t}`,{...a,headers:T([{Accept:"video/mp4"},a?.headers]),__binaryResponse:!0})}start(t,n={},a){return this._client.post(g`/browsers/${t}/replays`,{body:n,...a})}stop(t,n,a){let{id:i}=n;return this._client.post(g`/browsers/${i}/replays/${t}/stop`,{...a,headers:T([{Accept:"*/*"},a?.headers])})}};var ve=class extends b{events(t,n={},a){return this._client.getAPIList(g`/browsers/${t}/telemetry/events`,F,{query:n,...a})}stream(t,n={},a){let{"Last-Event-ID":i,...s}=n??{};return this._client.get(g`/browsers/${t}/telemetry/stream`,{query:s,...a,headers:T([{Accept:"text/event-stream",...i!=null?{"Last-Event-ID":i}:void 0},a?.headers]),stream:!0})}};var _e=class extends b{events(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/fs/watch/${t}/events`,{...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}start(t,n,a){return this._client.post(g`/browsers/${t}/fs/watch`,{body:n,...a})}stop(t,n,a){let{id:i}=n;return this._client.delete(g`/browsers/${i}/fs/watch/${t}`,{...a,headers:T([{Accept:"*/*"},a?.headers])})}};var Kt=class extends b{constructor(){super(...arguments),this.watch=new _e(this._client)}createDirectory(t,n,a){return this._client.put(g`/browsers/${t}/fs/create_directory`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}deleteDirectory(t,n,a){return this._client.put(g`/browsers/${t}/fs/delete_directory`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}deleteFile(t,n,a){return this._client.put(g`/browsers/${t}/fs/delete_file`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}downloadDirZip(t,n,a){return this._client.get(g`/browsers/${t}/fs/download_dir_zip`,{query:n,...a,headers:T([{Accept:"application/zip"},a?.headers]),__binaryResponse:!0})}fileInfo(t,n,a){return this._client.get(g`/browsers/${t}/fs/file_info`,{query:n,...a})}listFiles(t,n,a){return this._client.get(g`/browsers/${t}/fs/list_files`,{query:n,...a})}move(t,n,a){return this._client.put(g`/browsers/${t}/fs/move`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}readFile(t,n,a){return this._client.get(g`/browsers/${t}/fs/read_file`,{query:n,...a,headers:T([{Accept:"application/octet-stream"},a?.headers]),__binaryResponse:!0})}setFilePermissions(t,n,a){return this._client.put(g`/browsers/${t}/fs/set_file_permissions`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}upload(t,n,a){return this._client.post(g`/browsers/${t}/fs/upload`,vt({body:n,...a,headers:T([{Accept:"*/*"},a?.headers])},this._client))}uploadZip(t,n,a){return this._client.post(g`/browsers/${t}/fs/upload_zip`,vt({body:n,...a,headers:T([{Accept:"*/*"},a?.headers])},this._client))}writeFile(t,n,a,i){let{path:s,mode:o}=a;return this._client.put(g`/browsers/${t}/fs/write_file`,{body:n,query:{path:s,mode:o},...i,headers:T([{"Content-Type":"application/octet-stream",Accept:"*/*"},i?.headers])})}};Kt.Watch=_e;function vn(e,t){return`${e.replace(/\/+$/,"")}${t.startsWith("/")?t:`/${t}`}`}async function Qi(e,t,n,a){let i=e.browserRouteCache.get(t);if(!i)throw new Y(`browser route cache does not contain session ${t}; create, retrieve, or list the browser before calling browser.fetch`);let{url:s,method:o,headers:d,body:l,signal:S,duplex:U,timeout_ms:r}=Dr(n,a);Br(s);let u={url:s,jwt:i.jwt};r!==void 0&&(u.timeout_ms=r);let c=d.get("accept"),h={method:Hr(o),path:vn(i.baseURL,"/curl/raw"),query:u,body:l,headers:T([{Authorization:null},c?{Accept:c}:{Accept:"*/*"},Fr(d)]),signal:S??null,__binaryResponse:!0};return U&&(h.fetchOptions={duplex:U}),e.request(h).asResponse()}function Hr(e){let t=e.toLowerCase();if(!new Set(["get","post","put","patch","delete"]).has(t))throw new Y(`browser.fetch unsupported HTTP method: ${e}`);return t}function Dr(e,t){let n=t&&"timeout_ms"in t?t.timeout_ms:void 0;if(e instanceof Request){let i=new Headers(e.headers);t?.headers&&new Headers(t.headers).forEach((S,U)=>{i.set(U,S)});let s={url:e.url,method:(t?.method??e.method)?.toUpperCase()||"GET",headers:i},o=t?.body??e.body;o!=null&&(s.body=o);let d=t?.signal??e.signal;return d!==void 0&&(s.signal=d),t?.duplex!==void 0&&(s.duplex=t.duplex),n!==void 0&&(s.timeout_ms=n),s}let a={url:e instanceof URL?e.href:String(e),method:(t?.method??"GET").toUpperCase(),headers:new Headers(t?.headers)};return t?.body!==void 0&&(a.body=t.body),t?.signal!==void 0&&(a.signal=t.signal),t?.duplex!==void 0&&(a.duplex=t.duplex),n!==void 0&&(a.timeout_ms=n),a}function Br(e){let t;try{t=new URL(e)}catch{throw new Y(`browser.fetch target must be an absolute URL; received: ${e}`)}if(t.protocol!=="http:"&&t.protocol!=="https:")throw new Y(`browser.fetch only supports http(s) URLs; received: ${t.protocol}`)}function Fr(e){let t={};return e.forEach((n,a)=>{switch(a.toLowerCase()){case"accept":case"content-length":case"connection":case"keep-alive":case"proxy-authenticate":case"proxy-authorization":case"te":case"trailers":case"transfer-encoding":case"upgrade":return;default:t[a]=n}}),t}var lt=class extends b{constructor(){super(...arguments),this.telemetry=new ve(this._client),this.replays=new Ne(this._client),this.fs=new Kt(this._client),this.process=new Me(this._client),this.logs=new ke(this._client),this.computer=new Ce(this._client),this.playwright=new fe(this._client)}create(t={},n){return this._client.post("/browsers",{body:t,...n})}retrieve(t,n={},a){return this._client.get(g`/browsers/${t}`,{query:n,...a})}update(t,n,a){return this._client.patch(g`/browsers/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/browsers",F,{query:t,...n})}curl(t,n,a){return this._client.post(g`/browsers/${t}/curl`,{body:n,...a})}fetch(t,n,a){return Qi(this._client,t,n,a)}deleteByID(t,n){return this._client.delete(g`/browsers/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}loadExtensions(t,n,a){return this._client.post(g`/browsers/${t}/extensions`,vt({body:n,...a,headers:T([{Accept:"*/*"},a?.headers])},this._client))}};lt.Telemetry=ve;lt.Replays=Ne;lt.Fs=Kt;lt.Process=Me;lt.Logs=ke;lt.Computer=Ce;lt.Playwright=fe;var Jt=class extends b{create(t,n){return this._client.post("/org/credential_providers",{body:t,...n})}retrieve(t,n){return this._client.get(g`/org/credential_providers/${t}`,n)}update(t,n,a){return this._client.patch(g`/org/credential_providers/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/org/credential_providers",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/org/credential_providers/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}listItems(t,n){return this._client.get(g`/org/credential_providers/${t}/items`,n)}test(t,n){return this._client.post(g`/org/credential_providers/${t}/test`,n)}};var Xt=class extends b{create(t,n){return this._client.post("/credentials",{body:t,...n})}retrieve(t,n){return this._client.get(g`/credentials/${t}`,n)}update(t,n,a){return this._client.patch(g`/credentials/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/credentials",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/credentials/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}totpCode(t,n){return this._client.get(g`/credentials/${t}/totp-code`,n)}};var qt=class extends b{create(t,n){return this._client.post("/deployments",vt({body:t,...n},this._client))}retrieve(t,n){return this._client.get(g`/deployments/${t}`,n)}list(t={},n){return this._client.getAPIList("/deployments",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/deployments/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}follow(t,n={},a){return this._client.get(g`/deployments/${t}/events`,{query:n,...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}};var jt=class extends b{list(t={},n){return this._client.getAPIList("/extensions",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/extensions/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}download(t,n){return this._client.get(g`/extensions/${t}`,{...n,headers:T([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}downloadFromChromeStore(t,n){return this._client.get("/extensions/from_chrome_store",{query:t,...n,headers:T([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}get(t,n){return this._client.get(g`/extensions/${t}/metadata`,n)}upload(t,n){return this._client.post("/extensions",vt({body:t,...n},this._client))}};var zt=class extends b{create(t,n){return this._client.post("/invocations",{body:t,...n})}retrieve(t,n){return this._client.get(g`/invocations/${t}`,n)}update(t,n,a){return this._client.patch(g`/invocations/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/invocations",F,{query:t,...n})}deleteBrowsers(t,n){return this._client.delete(g`/invocations/${t}/browsers`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}follow(t,n={},a){return this._client.get(g`/invocations/${t}/events`,{query:n,...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}listBrowsers(t,n){return this._client.get(g`/invocations/${t}/browsers`,n)}};var be=class extends b{retrieve(t){return this._client.get("/org/entitlements",t)}};var Ee=class extends b{retrieve(t){return this._client.get("/org/limits",t)}update(t,n){return this._client.patch("/org/limits",{body:t,...n})}};var bt=class extends b{constructor(){super(...arguments),this.entitlements=new be(this._client),this.limits=new Ee(this._client)}};bt.Entitlements=be;bt.Limits=Ee;var $t=class extends b{create(t,n){return this._client.post("/profiles",{body:t,...n})}retrieve(t,n){return this._client.get(g`/profiles/${t}`,n)}update(t,n,a){return this._client.patch(g`/profiles/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/profiles",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/profiles/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}download(t,n={},a){return this._client.get(g`/profiles/${t}/download`,{query:n,...a,headers:T([{Accept:"application/octet-stream"},a?.headers]),__binaryResponse:!0})}};var Pe=class extends b{retrieve(t,n){return this._client.get(g`/org/projects/${t}/limits`,n)}update(t,n,a){return this._client.patch(g`/org/projects/${t}/limits`,{body:n,...a})}};var Lt=class extends b{constructor(){super(...arguments),this.limits=new Pe(this._client)}create(t,n){return this._client.post("/org/projects",{body:t,...n})}retrieve(t,n){return this._client.get(g`/org/projects/${t}`,n)}update(t,n,a){return this._client.patch(g`/org/projects/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/org/projects",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/org/projects/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}};Lt.Limits=Pe;var Qt=class extends b{create(t,n){return this._client.post("/proxies",{body:t,...n})}retrieve(t,n){return this._client.get(g`/proxies/${t}`,n)}update(t,n,a){return this._client.patch(g`/proxies/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/proxies",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/proxies/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}check(t,n={},a){return this._client.post(g`/proxies/${t}/check`,{body:n,...a})}};var Ie=class extends b{create(t,n){return this._client.post("/telemetry/destinations",{body:t,...n})}retrieve(t,n){return this._client.get(g`/telemetry/destinations/${t}`,n)}update(t,n,a){return this._client.patch(g`/telemetry/destinations/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/telemetry/destinations",F,{query:t,...n})}delete(t,n){return this._client.delete(g`/telemetry/destinations/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}};var xt=class extends b{constructor(){super(...arguments),this.destinations=new Ie(this._client)}};xt.Destinations=Ie;var je=class{constructor(){this.entries=new Map}get(t){return this.entries.get(t)}set(t){this.entries.set(t.sessionId,t)}delete(t){this.entries.delete(t)}clear(){this.entries.clear()}},Zi="KERNEL_BROWSER_ROUTING_SUBRESOURCES",Xr=["curl","telemetry/stream"],qr=/^\/(?:v\d+\/)?browsers(?:\/[^/]+)?\/?$/,jr=/^\/(?:v\d+\/)?browser_pools\/[^/]+\/acquire\/?$/,zr=/^\/(?:v\d+\/)?browsers\/([^/]+)\/?$/,$r=/^\/(?:v\d+\/)?browser_pools\/[^/]+\/release\/?$/;function fa(){let e=Sd();return e===void 0?[...Xr]:e.trim()===""?[]:e.split(",").map(t=>t.trim()).filter(Boolean)}function Ma(e,{apiBaseURL:t,subresources:n,cache:a}){let i=[...n].map(o=>o.trim().replace(/^\/+|\/+$/g,"")).filter(Boolean),s=new URL(t).origin;return async(o,d)=>{let l=new Request(o,d),S=Qr(l,s),U=await sd(e,{input:o,init:d,request:l},s,i,a);return S&&await ad(U,a),await Zr(l,U,s,a),U}}function Qr(e,t){let n=new URL(e.url);return n.origin===t&&(qr.test(n.pathname)||jr.test(n.pathname))}async function Zr(e,t,n,a){if(!t.ok)return;let i=new URL(e.url);if(i.origin!==n)return;let s=td(e,i.pathname)??await ed(e,i.pathname);s&&a.delete(s)}function td(e,t){if(e.method.toUpperCase()!=="DELETE")return;let n=t.match(zr);return n&&decodeURIComponent(n[1]??"")||void 0}async function ed(e,t){if(!(e.method.toUpperCase()!=="POST"||!$r.test(t)))try{let n=await e.clone().json();if(!n||typeof n!="object")return;let a=n.session_id;return typeof a=="string"&&a.trim()?a.trim():void 0}catch{return}}function nd(e){if(!e||typeof e!="object")return;let t=e,n=typeof t.session_id=="string"?t.session_id.trim():"",a=typeof t.base_url=="string"?t.base_url.trim():"";if(!n||!a)return;let i=typeof t.jwt=="string"?t.jwt.trim():"",s=typeof t.cdp_ws_url=="string"?t.cdp_ws_url:void 0,o=i||ld(s)||"";if(o)return{sessionId:n,baseURL:a,jwt:o}}async function ad(e,t){if((e.headers.get("content-type")?.toLowerCase()??"").includes("application/json"))try{ka(await e.clone().json(),t)}catch{}}function ka(e,t){let n=nd(e);if(n&&t.set(n),Array.isArray(e)){for(let a of e)ka(a,t);return}if(!(!e||typeof e!="object"))for(let a of Object.values(e))typeof a=="object"&&a!==null&&ka(a,t)}function id(e,t){let n=e.replace(/^\/+|\/+$/g,"");return t.some(a=>n===a||n.startsWith(a+"/"))}async function sd(e,{input:t,init:n,request:a},i,s,o){let d=new URL(a.url);if(d.origin!==i)return e(t,n);let l=d.pathname.match(/^\/(?:v\d+\/)?browsers\/([^/]+)\/([^/]+)(\/.*)?$/);if(!l)return e(t,n);let S=decodeURIComponent(l[1]??""),U=l[2]??"";if(!S||!id(U+(l[3]??""),s))return e(t,n);let r=o.get(S);if(r===void 0)return e(t,n);let u=new URL(vn(r.baseURL,`/${U}${l[3]??""}`));d.searchParams.forEach((h,w)=>{w!=="jwt"&&u.searchParams.append(w,h)}),u.searchParams.get("jwt")||u.searchParams.set("jwt",r.jwt);let c=new Headers(a.headers);return c.delete("authorization"),e(u.toString(),od(t,a,n,c))}function od(e,t,n,a){let i=t.method.toUpperCase(),s={...n??{},method:i,headers:a,redirect:t.redirect,signal:n?.signal??(e instanceof Request?e.signal:void 0)};if(delete s.body,delete s.duplex,i!=="GET"&&i!=="HEAD"){let o=rd(t,n);o!==void 0&&(s.body=o),n?.duplex!==void 0?s.duplex=n.duplex:dd(o)&&(s.duplex="half")}return s}function rd(e,t){return t?.body!==void 0&&t.body!==null?t.body:e.body??void 0}function dd(e){return globalThis.ReadableStream&&e instanceof globalThis.ReadableStream||typeof e=="object"&&e!==null&&Symbol.asyncIterator in e}function ld(e){if(e)try{return new URL(e).searchParams.get("jwt")??void 0}catch{return}}function Sd(){if(typeof globalThis.process<"u"){let e=globalThis.process.env?.[Zi];return typeof e=="string"?e:void 0}if(typeof globalThis.Deno<"u"){let e=globalThis.Deno.env?.get?.(Zi);return typeof e=="string"?e:void 0}}var _n=class{constructor(t){this.actions=new Map,this.name=t,ts.registerApp(this)}action(t,n){let a;if(n.length===0)throw new Error("Action handlers must accept at least the context parameter");if(n.length===1){let i=n;a=async(s,o)=>i(s)}else a=n;return this.actions.set(t,{name:t,handler:a}),a}getActions(){return Array.from(this.actions.values())}getAction(t){return this.actions.get(t)}toJSON(){return{name:this.name,actions:this.getActions().map(t=>({name:t.name}))}}},Na=class{constructor(){this.apps=new Map}registerApp(t){this.apps.set(t.name,t)}getApps(){return Array.from(this.apps.values())}getAppByName(t){return this.apps.get(t)}export(){return{apps:this.getApps().map(t=>t.toJSON())}}exportJSON(){return JSON.stringify(this.export(),null,2)}},ts=new Na;var Ae=e=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[e]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(e)?.trim()||void 0};var va,_a,ze,es,ns={production:"https://api.onkernel.com/",development:"https://localhost:3001/"},D=class{constructor({baseURL:t=Ae("KERNEL_BASE_URL"),apiKey:n=Ae("KERNEL_API_KEY"),projectID:a=null,project:i=null,...s}={}){if(va.add(this),ze.set(this,void 0),this.deployments=new qt(this),this.apps=new Vt(this),this.invocations=new zt(this),this.browsers=new lt(this),this.profiles=new $t(this),this.auth=new _t(this),this.telemetry=new xt(this),this.proxies=new Qt(this),this.extensions=new jt(this),this.browserPools=new Yt(this),this.credentials=new Xt(this),this.projects=new Lt(this),this.organization=new bt(this),this.auditLogs=new At(this),this.apiKeys=new Gt(this),this.credentialProviders=new Jt(this),typeof globalThis<"u"&&typeof globalThis.Bun<"u"&&globalThis.Bun.version&&!Ae("KERNEL_SUPPRESS_BUN_WARNING")&&$(this).warn("The Bun runtime was detected. Playwright may have CDP connection issues, proceed with caution. Suppress this warning by setting the KERNEL_SUPPRESS_BUN_WARNING environment variable to true"),n===void 0)throw new Y("The KERNEL_API_KEY environment variable is missing or empty; either provide it, or instantiate the Kernel client with an apiKey option, like new Kernel({ apiKey: 'My API Key' }).");let o={apiKey:n,projectID:a,project:i,...s,baseURL:t,environment:s.environment??"production"};if(t&&s.environment)throw new Y("Ambiguous URL; The `baseURL` option (or KERNEL_BASE_URL env var) and the `environment` option are given. If you want to use the environment you must pass baseURL: null");this.baseURL=o.baseURL||ns[o.environment||"production"],this.timeout=o.timeout??_a.DEFAULT_TIMEOUT,this.logger=o.logger??console;let d="warn";this.logLevel=d,this.logLevel=pa(o.logLevel,"ClientOptions.logLevel",this)??pa(Ae("KERNEL_LOG"),"process.env['KERNEL_LOG']",this)??d,this.fetchOptions=o.fetchOptions,this.maxRetries=o.maxRetries??2,this.rawFetch=o.fetch??_i(),this.browserRouteCache=new je,this.fetch=Ma(this.rawFetch,{apiBaseURL:this.baseURL,subresources:fa(),cache:this.browserRouteCache}),et(this,ze,Ei,"f");let l=Ae("KERNEL_CUSTOM_HEADERS");if(l){let S={};for(let U of l.split(`
10
- `)){let r=U.indexOf(":");r>=0&&(S[U.substring(0,r).trim()]=U.substring(r+1).trim())}o.defaultHeaders={...S,...o.defaultHeaders}}this._options=o,this.apiKey=n,this.projectID=a,this.project=i}withOptions(t){let n=new this.constructor({...this._options,environment:t.environment?t.environment:void 0,baseURL:t.environment?void 0:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.rawFetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,projectID:this.projectID,project:this.project,...t});return n.browserRouteCache=this.browserRouteCache,n.fetch=Ma(n.rawFetch,{apiBaseURL:n.baseURL,subresources:fa(),cache:n.browserRouteCache}),n}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:t,nulls:n}){}async authHeaders(t){return T([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(t){return Hi(t)}getUserAgent(){return`${this.constructor.name}/JS ${It}`}defaultIdempotencyKey(){return`stainless-node-retry-${na()}`}makeStatusError(t,n,a,i){return nt.generate(t,n,a,i)}buildURL(t,n,a){let i=!K(this,va,"m",es).call(this)&&a||this.baseURL,s=wi(t)?new URL(t):new URL(i+(i.endsWith("/")&&t.startsWith("/")?t.slice(1):t)),o=this.defaultQuery(),d=Object.fromEntries(s.searchParams);return(!sa(o)||!sa(d))&&(n={...d,...o,...n}),typeof n=="object"&&n&&!Array.isArray(n)&&(s.search=this.stringifyQuery(n)),s.toString()}async prepareOptions(t){}async prepareRequest(t,{url:n,options:a}){}get(t,n){return this.methodRequest("get",t,n)}post(t,n){return this.methodRequest("post",t,n)}patch(t,n){return this.methodRequest("patch",t,n)}put(t,n){return this.methodRequest("put",t,n)}delete(t,n){return this.methodRequest("delete",t,n)}methodRequest(t,n,a){return this.request(Promise.resolve(a).then(i=>({method:t,path:n,...i})))}request(t,n=null){return new Ft(this,this.makeRequest(t,n,void 0))}async makeRequest(t,n,a){let i=await t,s=i.maxRetries??this.maxRetries;n==null&&(n=s),await this.prepareOptions(i);let{req:o,url:d,timeout:l}=await this.buildRequest(i,{retryCount:s-n});await this.prepareRequest(o,{url:d,options:i});let S="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),U=a===void 0?"":`, retryOf: ${a}`,r=Date.now();if($(this).debug(`[${S}] sending request`,Nt({retryOfRequestLogID:a,method:i.method,url:d,options:i,headers:o.headers})),i.signal?.aborted)throw new ot;let u=new AbortController,c=await this.fetchWithTimeout(d,o,l,u).catch(Ge),h=Date.now();if(c instanceof globalThis.Error){let k=`retrying, ${n} attempts remaining`;if(i.signal?.aborted)throw new ot;let f=Fe(c)||/timed? ?out/i.test(String(c)+("cause"in c?String(c.cause):""));if(n)return $(this).info(`[${S}] connection ${f?"timed out":"failed"} - ${k}`),$(this).debug(`[${S}] connection ${f?"timed out":"failed"} (${k})`,Nt({retryOfRequestLogID:a,url:d,durationMs:h-r,message:c.message})),this.retryRequest(i,n,a??S);throw $(this).info(`[${S}] connection ${f?"timed out":"failed"} - error; no more retries left`),$(this).debug(`[${S}] connection ${f?"timed out":"failed"} (error; no more retries left)`,Nt({retryOfRequestLogID:a,url:d,durationMs:h-r,message:c.message})),f?new Mt:new Pt({cause:c})}let w=`[${S}${U}] ${o.method} ${d} ${c.ok?"succeeded":"failed"} with status ${c.status} in ${h-r}ms`;if(!c.ok){let k=await this.shouldRetry(c);if(n&&k){let _=`retrying, ${n} attempts remaining`;return await bi(c.body),$(this).info(`${w} - ${_}`),$(this).debug(`[${S}] response error (${_})`,Nt({retryOfRequestLogID:a,url:c.url,status:c.status,headers:c.headers,durationMs:h-r})),this.retryRequest(i,n,a??S,c.headers)}let f=k?"error; no more retries left":"error; not retryable";$(this).info(`${w} - ${f}`);let m=await c.text().catch(_=>Ge(_).message),L=Ci(m),R=L?void 0:m;throw $(this).debug(`[${S}] response error (${f})`,Nt({retryOfRequestLogID:a,url:c.url,status:c.status,headers:c.headers,message:R,durationMs:Date.now()-r})),this.makeStatusError(c.status,L,R,c.headers)}return $(this).info(w),$(this).debug(`[${S}] response start`,Nt({retryOfRequestLogID:a,url:c.url,status:c.status,headers:c.headers,durationMs:h-r})),{response:c,options:i,controller:u,requestLogID:S,retryOfRequestLogID:a,startTime:r}}getAPIList(t,n,a){return this.requestAPIList(n,a&&"then"in a?a.then(i=>({method:"get",path:t,...i})):{method:"get",path:t,...a})}requestAPIList(t,n){let a=this.makeRequest(n,null,void 0);return new Xe(this,a,t)}async fetchWithTimeout(t,n,a,i){let{signal:s,method:o,...d}=n||{},l=this._makeAbort(i);s&&s.addEventListener("abort",l,{once:!0});let S=setTimeout(l,a),U=globalThis.ReadableStream&&d.body instanceof globalThis.ReadableStream||typeof d.body=="object"&&d.body!==null&&Symbol.asyncIterator in d.body,r={signal:i.signal,...U?{duplex:"half"}:{},method:"GET",...d};o&&(r.method=o.toUpperCase());try{return await this.fetch.call(void 0,t,r)}finally{clearTimeout(S)}}async shouldRetry(t){let n=t.headers.get("x-should-retry");return n==="true"?!0:n==="false"?!1:t.status===408||t.status===409||t.status===429||t.status>=500}async retryRequest(t,n,a,i){let s,o=i?.get("retry-after-ms");if(o){let l=parseFloat(o);Number.isNaN(l)||(s=l)}let d=i?.get("retry-after");if(d&&!s){let l=parseFloat(d);Number.isNaN(l)?s=Date.parse(d)-Date.now():s=l*1e3}if(s===void 0){let l=t.maxRetries??this.maxRetries;s=this.calculateDefaultRetryTimeoutMillis(n,l)}return await ki(s),this.makeRequest(t,n-1,a)}calculateDefaultRetryTimeoutMillis(t,n){let s=n-t,o=Math.min(.5*Math.pow(2,s),8),d=1-Math.random()*.25;return o*d*1e3}async buildRequest(t,{retryCount:n=0}={}){let a={...t},{method:i,path:s,query:o,defaultBaseURL:d}=a,l=this.buildURL(s,o,d);"timeout"in a&&yi("timeout",a.timeout),a.timeout=a.timeout??this.timeout;let{bodyHeaders:S,body:U}=this.buildBody({options:a}),r=await this.buildHeaders({options:t,method:i,bodyHeaders:S,retryCount:n});return{req:{method:i,headers:r,...a.signal&&{signal:a.signal},...globalThis.ReadableStream&&U instanceof globalThis.ReadableStream&&{duplex:"half"},...U&&{body:U},...this.fetchOptions??{},...a.fetchOptions??{}},url:l,timeout:a.timeout}}async buildHeaders({options:t,method:n,bodyHeaders:a,retryCount:i}){let s={};this.idempotencyHeader&&n!=="get"&&(t.idempotencyKey||(t.idempotencyKey=this.defaultIdempotencyKey()),s[this.idempotencyHeader]=t.idempotencyKey);let o=T([s,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(i),...t.timeout?{"X-Stainless-Timeout":String(Math.trunc(t.timeout/1e3))}:{},...vi(),"X-Kernel-Project-Id":this.projectID,"X-Kernel-Project":this.project},await this.authHeaders(t),this._options.defaultHeaders,a,t.headers]);return this.validateHeaders(o),o.values}_makeAbort(t){return()=>t.abort()}buildBody({options:t}){let{body:n,headers:a}=t;if(!n)return n==null&&"body"in t?K(this,ze,"f").call(this,{body:n,headers:T([a])}):{bodyHeaders:void 0,body:void 0};let i=T([a]);return ArrayBuffer.isView(n)||n instanceof ArrayBuffer||n instanceof DataView||typeof n=="string"&&i.values.has("content-type")||globalThis.Blob&&n instanceof globalThis.Blob||n instanceof FormData||n instanceof URLSearchParams||globalThis.ReadableStream&&n instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:n}:typeof n=="object"&&(Symbol.asyncIterator in n||Symbol.iterator in n&&"next"in n&&typeof n.next=="function")?{bodyHeaders:void 0,body:gn(n)}:typeof n=="object"&&i.values.get("content-type")==="application/x-www-form-urlencoded"?{bodyHeaders:{"content-type":"application/x-www-form-urlencoded"},body:this.stringifyQuery(n)}:K(this,ze,"f").call(this,{body:n,headers:i})}app(t){return new _n(t)}};_a=D,ze=new WeakMap,va=new WeakSet,es=function(){return this.baseURL!==ns[this._options.environment||"production"]};D.Kernel=_a;D.DEFAULT_TIMEOUT=6e4;D.KernelError=Y;D.APIError=nt;D.APIConnectionError=Pt;D.APIConnectionTimeoutError=Mt;D.APIUserAbortError=ot;D.NotFoundError=ue;D.ConflictError=ce;D.RateLimitError=ge;D.BadRequestError=le;D.AuthenticationError=Se;D.InternalServerError=pe;D.PermissionDeniedError=Ue;D.UnprocessableEntityError=he;D.toFile=Nn;D.Deployments=qt;D.Apps=Vt;D.Invocations=zt;D.Browsers=lt;D.Profiles=$t;D.Auth=_t;D.Telemetry=xt;D.Proxies=Qt;D.Extensions=jt;D.BrowserPools=Yt;D.Credentials=Xt;D.Projects=Lt;D.Organization=bt;D.AuditLogs=At;D.APIKeys=Gt;D.CredentialProviders=Jt;var mt={paaItem:".related-question-pair",captchaMarker:'#captcha-form, #recaptcha, form[action*="/sorry/"], .g-recaptcha, [data-sitekey]'},as={container:'div[jscontroller="HWk0Gf"]',sectionHeading:'.mgAbYb[role="heading"]',item:"a.rIRoqf"},bn={udm:"39",item:"a.rIRoqf",durationPattern:/^\d+:\d+$/,platforms:["YouTube","TikTok","Instagram","Facebook","X"]},is={section:".ULSxyf",item:"a.KYg7td.INpicf",title:".hyYc0c",source:".K4ETW"},ss={sectionTag:"g-section-with-header",sectionHeadingText:"What people are saying",card:'.dRzkFf[role="listitem"]',cardLink:'a.WlydOe[jsname="YKoRaf"]',titleH1:"h1.WQWxe",titleDiv:".eAaXgc",popularCommentLabel:".qgdis",source:".sTl1Td",platformBadge:".appd0, .KrMNbf",ytChannel:".sjVJQd",ytDate:".PLq9Je",authorNote:".nDgy9d"},os={root:"[data-lhcontainer][data-streaming-container][eid]",legacyRoot:'[data-hveid="CBMQAA"]',wrapper:".Fgyi2e",controller:'[jscontroller="AkrxPe"]',contentSubtree:'[data-subtree="mfc"]',header:".heWuVc",heading:".Fzsovc.cwYVJe.RJPOee",showMoreButton:'[aria-label="Show more AI Overview"]',sourcesPanel:".OZ9ddf.WAUd4",disclaimer:".DuQANe.MSJHRb"},rs={root:'[data-hveid="CAUQAA"]',wrapper:".Fgyi2e",citations:'.Fgyi2e [data-hveid] a[jsname="pxBnId"]'},ds={result:".wHYlTd.tF2Cxc",title:"h3.LC20lb",siteName:".VuuXrf",cite:"cite.tjvcx",snippet:".VwiC3b",redditCite:"cite.qLRx3b",ratingWrap:".Y0A0hc",ratingValue:".yi40Hd",reviewCount:".RDApEe"},ls={headingText:"Businesses",card:".w7Dbne",name:".OSrXXb",ratingValue:".yi40Hd",reviewCount:".RDApEe"},Ss="2026-05-07";var Us="Google returned a CAPTCHA. Run with --headless=false to re-warm the browser profile, then retry.";var Ud=["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"],ud=["request_aborted","captcha","location_mismatch","connection","timeout","extraction","concurrency_limit","unauthorized","forbidden","invalid_request","rate_limit","billing","service_unavailable"];var og=new Set(Ud),rg=new Set(ud);function us(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 it=class extends Error{constructor(n){super(`CAPTCHA detected. ${n}`);this.instructions=n}instructions;name="CaptchaError"},Le=class extends Error{constructor(n,a){super(n);this.cause=a}cause;name="ExtractionError"};var pt=class extends Error{name="RequestAbortedError";constructor(t="Request aborted before harvest completed"){super(t)}},Zt=class extends Error{name="PaaInteractionInterruptedError"},$e=class extends Error{name="LocationMismatchError";constructor(t="Google returned results for a different location than requested"){super(t)}};async function En(e,t,n,a){let i,s=!1,o,d=()=>{},l=()=>a?.reason instanceof DOMException&&a.reason.name==="TimeoutError"?a.reason:new pt,S=()=>d(l()),U=new Promise((u,c)=>{d=c}),r=async u=>{let c;try{await Promise.race([u.close().catch(()=>{}),new Promise(h=>{c=setTimeout(h,2e3)})])}finally{c&&clearTimeout(c)}};if(a?.aborted)throw l();a?.addEventListener("abort",S,{once:!0}),o=setTimeout(()=>d(new DOMException("Optional pagination timed out","TimeoutError")),3e4);try{return await Promise.race([(async()=>{let u=await e.newPage();if(s)throw await r(u),new pt;if(i=u,await t(u),s)throw new pt;return n(u)})(),U])}finally{s=!0,o&&clearTimeout(o),a?.removeEventListener("abort",S),i&&await r(i)}}var Ia=require("crypto");var cs=require("@libsql/client/http"),Qe=require("crypto"),Z=require("zod");var Et="strftime('%Y-%m-%dT%H:%M:%fZ','now')";var cd=[`CREATE TABLE IF NOT EXISTS oauth_store_metadata (
11
- id INTEGER PRIMARY KEY CHECK (id = 1),
12
- store_id TEXT NOT NULL UNIQUE,
13
- schema_version INTEGER NOT NULL CHECK (schema_version > 0),
14
- authority_epoch INTEGER NOT NULL CHECK (authority_epoch > 0),
15
- authority_state TEXT NOT NULL CHECK (authority_state IN ('ready','authoritative','retired')),
16
- updated_at TEXT NOT NULL DEFAULT (${Et})
17
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_clients (
18
- client_id TEXT PRIMARY KEY,
19
- client_name TEXT NOT NULL,
20
- client_type TEXT NOT NULL CHECK (client_type = 'public'),
21
- token_endpoint_auth_method TEXT NOT NULL CHECK (token_endpoint_auth_method = 'none'),
22
- status TEXT NOT NULL CHECK (status IN ('active','disabled','expired')),
23
- created_at TEXT NOT NULL DEFAULT (${Et}),
24
- last_used_at TEXT,
25
- expires_at TEXT
26
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_client_redirect_uris (
27
- client_id TEXT NOT NULL REFERENCES oauth_clients(client_id) ON DELETE CASCADE,
28
- redirect_uri TEXT NOT NULL,
29
- redirect_kind TEXT NOT NULL CHECK (redirect_kind IN ('https','loopback','private_scheme')),
30
- PRIMARY KEY (client_id, redirect_uri)
31
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_codes (
32
- code_digest BLOB PRIMARY KEY,
33
- lookup_key_id TEXT NOT NULL,
34
- client_id TEXT NOT NULL REFERENCES oauth_clients(client_id) ON DELETE RESTRICT,
35
- redirect_uri TEXT NOT NULL,
36
- code_challenge TEXT NOT NULL,
37
- challenge_method TEXT NOT NULL CHECK (challenge_method = 'S256'),
38
- user_id TEXT NOT NULL,
39
- scope TEXT NOT NULL,
40
- resource TEXT,
41
- issued_at TEXT NOT NULL DEFAULT (${Et}),
42
- expires_at TEXT NOT NULL
43
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_code_exchanges (
44
- code_digest BLOB PRIMARY KEY,
45
- request_fingerprint BLOB NOT NULL UNIQUE,
46
- client_id TEXT NOT NULL,
47
- family_id TEXT NOT NULL UNIQUE,
48
- grant_scope TEXT NOT NULL,
49
- grant_resource TEXT,
50
- scope TEXT NOT NULL,
51
- resource TEXT,
52
- sealed_refresh BLOB NOT NULL,
53
- sealed_nonce BLOB NOT NULL,
54
- sealed_tag BLOB NOT NULL,
55
- replay_key_id TEXT NOT NULL,
56
- completed_at TEXT NOT NULL DEFAULT (${Et}),
57
- replay_expires_at TEXT NOT NULL
58
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_refresh_families (
59
- family_id TEXT PRIMARY KEY,
60
- user_id TEXT NOT NULL,
61
- client_id TEXT NOT NULL REFERENCES oauth_clients(client_id) ON DELETE RESTRICT,
62
- issuer TEXT NOT NULL,
63
- scope TEXT NOT NULL,
64
- resource TEXT,
65
- status TEXT NOT NULL CHECK (status IN ('active','revoked','compromised','expired')),
66
- current_generation INTEGER NOT NULL CHECK (current_generation > 0),
67
- created_at TEXT NOT NULL DEFAULT (${Et}),
68
- expires_at TEXT NOT NULL,
69
- revoked_at TEXT,
70
- compromised_at TEXT,
71
- UNIQUE (family_id, client_id),
72
- FOREIGN KEY (family_id, current_generation)
73
- REFERENCES oauth_refresh_tokens(family_id, generation)
74
- DEFERRABLE INITIALLY DEFERRED
75
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_refresh_tokens (
76
- family_id TEXT NOT NULL REFERENCES oauth_refresh_families(family_id) ON DELETE CASCADE,
77
- generation INTEGER NOT NULL CHECK (generation > 0),
78
- token_digest BLOB NOT NULL UNIQUE,
79
- lookup_key_id TEXT NOT NULL,
80
- token_prefix TEXT NOT NULL,
81
- predecessor_generation INTEGER,
82
- issued_at TEXT NOT NULL DEFAULT (${Et}),
83
- expires_at TEXT NOT NULL,
84
- used_at TEXT,
85
- revoked_at TEXT,
86
- PRIMARY KEY (family_id, generation),
87
- CHECK (predecessor_generation IS NULL OR (predecessor_generation > 0 AND predecessor_generation < generation))
88
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_refresh_rotations (
89
- family_id TEXT NOT NULL REFERENCES oauth_refresh_families(family_id) ON DELETE CASCADE,
90
- predecessor_generation INTEGER NOT NULL,
91
- request_fingerprint BLOB NOT NULL,
92
- successor_generation INTEGER NOT NULL,
93
- sealed_successor BLOB NOT NULL,
94
- sealed_nonce BLOB NOT NULL,
95
- sealed_tag BLOB NOT NULL,
96
- replay_key_id TEXT NOT NULL,
97
- rotated_at TEXT NOT NULL DEFAULT (${Et}),
98
- replay_expires_at TEXT NOT NULL,
99
- PRIMARY KEY (family_id, predecessor_generation),
100
- UNIQUE (family_id, successor_generation),
101
- CHECK (successor_generation = predecessor_generation + 1)
102
- ) STRICT`,`CREATE TABLE IF NOT EXISTS oauth_security_events (
103
- event_id TEXT PRIMARY KEY,
104
- family_id TEXT NOT NULL,
105
- event_type TEXT NOT NULL CHECK (event_type IN ('reuse','binding_mismatch','manual_revoke','expiry')),
106
- reason_code TEXT NOT NULL,
107
- occurred_at TEXT NOT NULL DEFAULT (${Et}),
108
- retain_until TEXT NOT NULL
109
- ) STRICT`,"CREATE INDEX IF NOT EXISTS oauth_clients_inactivity_idx ON oauth_clients(status, last_used_at, client_id)","CREATE INDEX IF NOT EXISTS oauth_codes_expiry_idx ON oauth_codes(expires_at, code_digest)","CREATE INDEX IF NOT EXISTS oauth_code_exchanges_replay_expiry_idx ON oauth_code_exchanges(replay_expires_at, code_digest)","CREATE INDEX IF NOT EXISTS oauth_refresh_families_lifecycle_idx ON oauth_refresh_families(status, expires_at, family_id)","CREATE INDEX IF NOT EXISTS oauth_refresh_families_user_status_idx ON oauth_refresh_families(user_id, status)","CREATE INDEX IF NOT EXISTS oauth_refresh_tokens_expiry_idx ON oauth_refresh_tokens(expires_at, family_id, generation)","CREATE INDEX IF NOT EXISTS oauth_refresh_rotations_replay_expiry_idx ON oauth_refresh_rotations(replay_expires_at, family_id, predecessor_generation)","CREATE INDEX IF NOT EXISTS oauth_security_events_retention_idx ON oauth_security_events(retain_until, event_id)"],hd=["CREATE INDEX IF NOT EXISTS oauth_clients_cleanup_idx ON oauth_clients(COALESCE(last_used_at,created_at), client_id)","CREATE INDEX IF NOT EXISTS oauth_codes_client_idx ON oauth_codes(client_id, code_digest)","CREATE INDEX IF NOT EXISTS oauth_refresh_families_client_idx ON oauth_refresh_families(client_id, family_id)",`CREATE INDEX IF NOT EXISTS oauth_refresh_families_cleanup_idx
110
- ON oauth_refresh_families(COALESCE(compromised_at,revoked_at,expires_at), family_id)
111
- WHERE status!='active'`],gd=[`CREATE TABLE IF NOT EXISTS oauth_rate_limit_buckets (
112
- scope TEXT NOT NULL CHECK (length(scope) BETWEEN 1 AND 80),
113
- key_digest BLOB NOT NULL CHECK (typeof(key_digest) = 'blob' AND length(key_digest) = 32),
114
- window_start INTEGER NOT NULL CHECK (window_start >= 0),
115
- window_seconds INTEGER NOT NULL CHECK (window_seconds BETWEEN 1 AND 604800),
116
- count INTEGER NOT NULL CHECK (count >= 1),
117
- expires_at INTEGER NOT NULL CHECK (expires_at = window_start + window_seconds),
118
- updated_at TEXT NOT NULL DEFAULT (${Et}),
119
- PRIMARY KEY (scope, key_digest, window_start, window_seconds)
120
- ) STRICT`,`CREATE INDEX IF NOT EXISTS oauth_rate_limit_buckets_expiry_idx
121
- ON oauth_rate_limit_buckets(expires_at, scope, key_digest, window_start, window_seconds)`],ug=[...cd,...hd,...gd];var wd=process.env.TURSO_DATABASE_URL??"file:./paa-api.db",md=process.env.TURSO_AUTH_TOKEN,ba=null;function Pn(){return ba||(ba=(0,cs.createClient)({url:wd,authToken:md})),ba}var Cg=32*1024;var kg=Z.z.object({id:Z.z.string(),user_id:Z.z.number(),status:Z.z.string().default("pending"),client_domain:Z.z.string(),session_path:Z.z.string(),request:Z.z.string(),result:Z.z.string().nullable(),error:Z.z.string().nullable(),created_at:Z.z.string(),updated_at:Z.z.string()}),fg=Z.z.object({id:Z.z.number(),job_id:Z.z.string(),phase:Z.z.string(),completed_at:Z.z.string(),output_summary:Z.z.string()});var hs=require("async_hooks"),gs="MCP_SCRAPER_ALLOW_HEADLESS_HARVEST_TEST",ps=new hs.AsyncLocalStorage;function ws(e,t){return ps.run(e,t)}function te(){return ps.getStore()}var yd=166667e-10,Td=.0001333336,ms=new Set(["serp","fb_search","fb_ad","instagram"]),Cd=.00111,kd=4,fd=4e-4;function xe(e,t){let n=process.env[e]?.trim();if(!n)return t;let a=Number(n);return Number.isFinite(a)&&a>=0?a:t}var Md=xe("NANGO_USD_PER_CONNECTION_MONTH",1),Nd=xe("NANGO_USD_PER_FUNCTION_RUN",1e-4),vd=xe("NANGO_USD_PER_PROXY_REQUEST",1e-4),_d=xe("NANGO_USD_PER_COMPUTE_SEC",2e-4),bd=xe("BRIGHTDATA_BROWSER_USD_PER_GB",8),_g=xe("BRIGHTDATA_SERP_USD_PER_REQUEST",.002836168);function Ea(e,t){return Math.max(0,e)/1e3*(t?Td:yd)}function ys(e,t){return e==="fal_wizper"?Math.max(0,t)/kd*Cd:e==="deepinfra_qwen"?Math.max(0,t)/1e3*fd:e==="openrouter"||e==="mcp_memory_video"||e==="mcp_memory_ai"?Math.max(0,t):e==="nango_connection"?Math.max(0,t)*Md:e==="nango_function_run"?Math.max(0,t)*Nd:e==="nango_proxy_request"?Math.max(0,t)*vd:e==="nango_compute"?Math.max(0,t)*_d:e==="brightdata_browser_api"?Math.max(0,t)/1e9*bd:0}var Pa=!1,Ze=null;async function Ts(){if(!Pa)return Ze||(Ze=Ed().finally(()=>{Ze=null}),Ze)}async function Ed(){let e=Pn(),t=await e.execute(`
122
- SELECT
123
- (SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name IN ('kernel_session_log', 'vendor_usage_log', 'cost_probe_runs')) = 3
124
- AND (SELECT COUNT(*) FROM pragma_table_info('kernel_session_log') WHERE name IN ('proxy_source', 'proxy_type', 'method')) = 3
125
- AND (SELECT COUNT(*) FROM pragma_table_info('vendor_usage_log') WHERE name IN ('method', 'source_key', 'provider_duration_ms', 'provider_captcha', 'provider_status')) = 5
126
- AND (SELECT COUNT(*) FROM sqlite_master WHERE type = 'index' AND name = 'vendor_usage_log_vendor_source_key') = 1
127
- AND (SELECT COUNT(*) FROM pragma_table_info('cost_probe_runs') WHERE name IN ('units', 'unit_type', 'mode')) = 3
128
- AS ready
129
- `);if(Number(t.rows[0]?.ready??0)===1){Pa=!0;return}await e.execute(`
130
- CREATE TABLE IF NOT EXISTS kernel_session_log (
131
- id TEXT PRIMARY KEY,
132
- kernel_session_id TEXT,
133
- op TEXT,
134
- source TEXT NOT NULL,
135
- probe_run_id TEXT,
136
- user_id INTEGER,
137
- stealth INTEGER,
138
- headless_sent INTEGER,
139
- proxy_used INTEGER,
140
- fallback INTEGER NOT NULL DEFAULT 0,
141
- opened_at TEXT,
142
- closed_at TEXT,
143
- duration_ms INTEGER NOT NULL DEFAULT 0,
144
- est_cost_usd_headless REAL NOT NULL DEFAULT 0,
145
- est_cost_usd_headful REAL NOT NULL DEFAULT 0,
146
- error TEXT,
147
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
148
- )
149
- `),await e.execute("CREATE INDEX IF NOT EXISTS kernel_session_log_op ON kernel_session_log(op)"),await e.execute("CREATE INDEX IF NOT EXISTS kernel_session_log_probe ON kernel_session_log(probe_run_id)"),await e.execute("CREATE INDEX IF NOT EXISTS kernel_session_log_created ON kernel_session_log(created_at)");try{await e.execute("ALTER TABLE kernel_session_log ADD COLUMN proxy_source TEXT")}catch{}try{await e.execute("ALTER TABLE kernel_session_log ADD COLUMN proxy_type TEXT")}catch{}try{await e.execute("ALTER TABLE kernel_session_log ADD COLUMN method TEXT")}catch{}await e.execute(`
150
- CREATE TABLE IF NOT EXISTS vendor_usage_log (
151
- id TEXT PRIMARY KEY,
152
- op TEXT,
153
- probe_run_id TEXT,
154
- user_id INTEGER,
155
- vendor TEXT NOT NULL,
156
- model TEXT,
157
- units REAL NOT NULL DEFAULT 0,
158
- unit_type TEXT,
159
- est_cost_usd REAL NOT NULL DEFAULT 0,
160
- error TEXT,
161
- source_key TEXT,
162
- provider_duration_ms INTEGER,
163
- provider_captcha INTEGER,
164
- provider_status TEXT,
165
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
166
- )
167
- `),await e.execute("CREATE INDEX IF NOT EXISTS vendor_usage_log_op ON vendor_usage_log(op)"),await e.execute("CREATE INDEX IF NOT EXISTS vendor_usage_log_probe ON vendor_usage_log(probe_run_id)"),await e.execute("CREATE INDEX IF NOT EXISTS vendor_usage_log_created ON vendor_usage_log(created_at)");try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN method TEXT")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN source_key TEXT")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN provider_duration_ms INTEGER")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN provider_captcha INTEGER")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN provider_status TEXT")}catch{}await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS vendor_usage_log_vendor_source_key ON vendor_usage_log(vendor, source_key) WHERE source_key IS NOT NULL"),await e.execute(`
168
- CREATE TABLE IF NOT EXISTS cost_probe_runs (
169
- id TEXT PRIMARY KEY,
170
- tool TEXT NOT NULL,
171
- target TEXT,
172
- started_at TEXT NOT NULL DEFAULT (datetime('now')),
173
- wall_ms INTEGER NOT NULL DEFAULT 0,
174
- success INTEGER NOT NULL DEFAULT 0,
175
- error TEXT,
176
- http_only INTEGER NOT NULL DEFAULT 0,
177
- kernel_used INTEGER NOT NULL DEFAULT 0,
178
- kernel_sessions INTEGER NOT NULL DEFAULT 0,
179
- kernel_seconds_total REAL NOT NULL DEFAULT 0,
180
- kernel_tier_observed TEXT,
181
- est_kernel_cost_usd_headless REAL NOT NULL DEFAULT 0,
182
- est_kernel_cost_usd_headful REAL NOT NULL DEFAULT 0,
183
- vendor_cost_usd REAL NOT NULL DEFAULT 0,
184
- charged_credits REAL NOT NULL DEFAULT 0,
185
- margin_usd_headless_starter REAL NOT NULL DEFAULT 0,
186
- margin_usd_headful_starter REAL NOT NULL DEFAULT 0,
187
- notes TEXT
188
- )
189
- `),await e.execute("CREATE INDEX IF NOT EXISTS cost_probe_runs_tool ON cost_probe_runs(tool)");try{await e.execute("ALTER TABLE cost_probe_runs ADD COLUMN units REAL")}catch{}try{await e.execute("ALTER TABLE cost_probe_runs ADD COLUMN unit_type TEXT")}catch{}try{await e.execute("ALTER TABLE cost_probe_runs ADD COLUMN mode TEXT")}catch{}Pa=!0}async function Cs(e){try{await Ts();let t=te(),n=Math.max(0,e.closedAtMs-e.openedAtMs);await Pn().execute({sql:`INSERT INTO kernel_session_log
190
- (id, kernel_session_id, op, source, probe_run_id, user_id, stealth, headless_sent, proxy_used, proxy_source, proxy_type, fallback, opened_at, closed_at, duration_ms, est_cost_usd_headless, est_cost_usd_headful, error, method)
191
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,args:[(0,Ia.randomUUID)(),e.kernelSessionId??null,t?.op??null,e.source,t?.probeRunId??null,t?.userId??null,In(e.stealth),In(e.headlessSent),In(e.proxyUsed),e.proxySource??null,e.proxyType??null,e.fallback?1:0,new Date(e.openedAtMs).toISOString(),new Date(e.closedAtMs).toISOString(),n,Ea(n,!1),Ea(n,!0),e.error??null,t?.subOp??null]})}catch(t){console.warn("[cost-telemetry] recordKernelSession failed:",t instanceof Error?t.message:String(t))}}async function Aa(e){try{await Ts();let t=te();return(await Pn().execute({sql:`INSERT OR IGNORE INTO vendor_usage_log
192
- (id, op, probe_run_id, user_id, vendor, model, units, unit_type, est_cost_usd, error, method, source_key, provider_duration_ms, provider_captcha, provider_status)
193
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,args:[(0,Ia.randomUUID)(),e.op??t?.op??null,e.probeRunId??t?.probeRunId??null,e.userId??t?.userId??null,e.vendor,e.model??null,e.units,e.unitType,ys(e.vendor,e.units),e.error??null,e.method??t?.subOp??null,e.sourceKey??null,e.providerDurationMs??null,In(e.providerCaptcha),e.providerStatus??null]})).rowsAffected===1}catch(t){return console.warn("[cost-telemetry] recordVendorUsage failed:",t instanceof Error?t.message:String(t)),!1}}function In(e){return e==null?null:e?1:0}var Pd=/\b(?:HeadlessChrome|Chrome|Chromium|Firefox)\/\d+|\bVersion\/\d+.*\bSafari\//;async function An(e){try{let t=await e.evaluate(()=>navigator.userAgent);return typeof t=="string"&&Pd.test(t)?t:null}catch{return null}}async function Ln(e){let t=null;try{let n=e.contexts().flatMap(a=>a.pages())[0];return n||(t=await e.newContext(),n=t.pages()[0]??await t.newPage()),await An(n)}catch{return null}finally{t&&await t.close().catch(()=>{})}}On.chromium.use((0,fs.default)());var Id=180,Ad=3e3,Ld=5e3,xd='#search, #rso, a[href] h3, [data-snhf], [role="main"]';function La(e,t){return e?Math.max(1,Math.min(t,e-Date.now())):t}function Od(e,t){let n=process.env[e];if(!n)return t;let a=Number(n);return Number.isInteger(a)&&a>0?a:t}function xa(e){return e?e.slice(-6):null}function ks(e,t){let n=(t??process.env.SERP_REDIRECT_BASE)?.trim().replace(/\/+$/,"");return n?`${n}/g/${Buffer.from(e,"utf8").toString("base64url")}`:e}function Rd(e){return e?/united states|u\.?s\.?a?\.?|^us$/i.test(e.trim()):!1}function Re(e){return e instanceof Error?e.message:String(e)}function Wd(e){return/\b409\b|conflict|already exists/i.test(Re(e))}function Hd(e){return/\b404\b|not[ _-]?found|already (?:gone|deleted|closed)|does not exist/i.test(Re(e))}async function Dd(e,t){try{await e.profiles.create({name:t})}catch(n){if(!Wd(n))throw n}}function xn(e,t){return{viewport:e.viewport,locale:e.locale,...t?{userAgent:t}:{},...e.deviceScaleFactor?{deviceScaleFactor:e.deviceScaleFactor}:{},...e.isMobile!==void 0?{isMobile:e.isMobile}:{},...e.hasTouch!==void 0?{hasTouch:e.hasTouch}:{}}}async function Oe(e,t,n){let a;try{return await Promise.race([e,new Promise((i,s)=>{a=setTimeout(()=>s(new Error(`${n} timed out after ${t}ms`)),t)})])}finally{a&&clearTimeout(a)}}function Bd(e){let t=e.trim();if(!t)throw new Error("channelHandle is required");if(/^https?:\/\//i.test(t)||/^(www\.|m\.)?youtube\.com\//i.test(t)){let o=new URL(/^https?:\/\//i.test(t)?t:`https://${t}`);if(o.hostname.replace(/^www\./,"").replace(/^m\./,"").toLowerCase()!=="youtube.com")throw new Error("channel URL must be on youtube.com");let l=o.pathname.split("/").filter(Boolean),S=l[0]??"",U=l[1]??"";if(S.startsWith("@"))return`https://www.youtube.com/${S}/videos`;if(S==="channel"&&U)return`https://www.youtube.com/channel/${U}/videos`;if((S==="c"||S==="user")&&U)return`https://www.youtube.com/${S}/${U}/videos`;throw new Error("channel URL must be a YouTube handle, /channel/UC..., /c/..., or /user/... URL")}let i=t.replace(/^\/+/,"").replace(/\/+$/,"").replace(/\/videos$/i,"");if(/^UC[\w-]{20,}$/.test(i))return`https://www.youtube.com/channel/${i}/videos`;let s=i.startsWith("@")?i:`@${i}`;if(!/^@[\w.-]+$/.test(s))throw new Error("channelHandle must be an @handle, UC channel ID, or YouTube channel URL");return`https://www.youtube.com/${s}/videos`}var Rn=class{browser=null;context=null;page=null;kernelClient=null;kernelSessionId=null;kernelOpenedAtMs=null;kernelStealth=null;kernelProxyUsed=null;kernelProxySource=null;kernelProxyType=null;kernelHeadlessSent=null;lastKernelBillingMode=null;lastKernelOpenedAtMs=null;lastKernelClosedAtMs=null;debugEnabled=!1;debugSnapshot={kernel:null,context:null,networkLocation:null,serpNavigation:null};async launch(t){this.debugEnabled=t.debug===!0;let n=t.proxyMode??(t.kernelProxyId?"configured":"none"),a=t.isMobile?"mobile":"desktop";if(this.debugSnapshot={kernel:null,context:{viewport:t.viewport,locale:t.locale,device:a,userAgent:null,deviceScaleFactor:t.deviceScaleFactor??null,isMobile:t.isMobile===!0,hasTouch:t.hasTouch===!0},networkLocation:null,serpNavigation:null},t.kernelApiKey){this.kernelClient=new D({apiKey:t.kernelApiKey});let s=Number.isInteger(t.kernelTimeoutSeconds)&&Number(t.kernelTimeoutSeconds)>0?Number(t.kernelTimeoutSeconds):Od("KERNEL_BROWSER_TIMEOUT_SECONDS",Id),o=Math.min(s,600);t.kernelProfileName&&t.kernelProfileSaveChanges===!0&&await Dd(this.kernelClient,t.kernelProfileName);let d=te(),l;t.headlessMode==="headful"||d?.forceHeadful===!0?l=!1:t.headlessMode==="headless"?l=!0:l=d?.forceHeadless===!0||process.env.KERNEL_HEADLESS_DISABLED!=="true"&&!!d?.op&&ms.has(d.op),this.kernelHeadlessSent=l?!0:null,this.lastKernelBillingMode=l?"headless":"headful",d?.headlessSentOut&&(d.headlessSentOut.value=this.kernelHeadlessSent);let S=await this.kernelClient.browsers.create({stealth:t.kernelStealth===!0,timeout_seconds:o,...l?{headless:!0}:{},...t.kernelProxyId?{proxy_id:t.kernelProxyId}:{},...t.kernelProfileName?{profile:{name:t.kernelProfileName,...typeof t.kernelProfileSaveChanges=="boolean"?{save_changes:t.kernelProfileSaveChanges}:{}}}:{}});this.kernelSessionId=S.session_id,this.kernelOpenedAtMs=Date.now(),this.lastKernelOpenedAtMs=this.kernelOpenedAtMs,this.lastKernelClosedAtMs=null,this.kernelStealth=typeof S.stealth=="boolean"?S.stealth:null,this.kernelProxyUsed=typeof S.proxy_id=="string"?!!S.proxy_id:!!t.kernelProxyId,this.kernelProxySource=t.kernelProxyResolution?.source??null,this.kernelProxyType=t.kernelProxyResolution?.proxyType??null;let U=null,r=null;if(!t.kernelProxyId&&!t.keepDefaultProxy)try{await Oe(this.kernelClient.browsers.update(this.kernelSessionId,{disable_default_proxy:!0}),5e3,`Kernel session ${this.kernelSessionId} disable default proxy`),U=!0}catch(c){U=!1,r=Re(c)}let u={sessionId:this.kernelSessionId,proxyMode:n,requestedProxyIdPresent:!!t.kernelProxyId,requestedProxyIdSuffix:xa(t.kernelProxyId),createdProxyIdPresent:typeof S.proxy_id=="string"?!!S.proxy_id:null,createdProxyIdSuffix:xa(S.proxy_id),retrievedProxyIdPresent:null,retrievedProxyIdSuffix:null,retrievedProxyIdMatchesRequested:null,defaultProxyDisabled:U,defaultProxyDisableError:r,proxyResolution:t.kernelProxyResolution??null,timeoutSeconds:o,stealth:typeof S.stealth=="boolean"?S.stealth:null,profilePresent:null,poolPresent:null,retrieveError:null};if(this.debugSnapshot.kernel=u,console.info(JSON.stringify({event:"kernel_browser_created",kernel_session_id:this.kernelSessionId,timeout_seconds:o,proxy_mode:n,proxy_id_present:!!t.kernelProxyId,profile_name_present:!!t.kernelProfileName,proxy_resolution_source:t.kernelProxyResolution?.source})),this.debugEnabled&&await this.populateKernelRetrieveDebug(u,t.kernelProxyId),this.browser=await Ms.chromium.connectOverCDP(S.cdp_ws_url),t.kernelProfileName||t.preserveKernelContext)this.context=this.browser.contexts()[0]??await this.browser.newContext(xn(t)),this.page=this.context.pages()[0]??await this.context.newPage(),this.debugSnapshot.context.userAgent=await An(this.page);else{let c=await Ln(this.browser);this.debugSnapshot.context.userAgent=c,this.context=await this.browser.newContext(xn(t,c)),this.page=await this.context.newPage()}if(await this.installEsbuildHelperShims(this.context),t.preserveKernelContext||await this.page.setViewportSize(t.viewport),(this.debugEnabled||t.requireUsEgress)&&(this.debugSnapshot.networkLocation=await this.captureBrowserNetworkLocation()),t.requireUsEgress){let c=this.debugSnapshot.networkLocation?.country??null;if(!Rd(c))throw new it(`Non-US egress (${c??"unknown"}) \u2014 retrying with a fresh session`)}return}let i={headless:t.headless,proxy:t.proxy?{server:t.proxy}:void 0,...t.browserExecutablePath?{executablePath:t.browserExecutablePath}:{},...t.ignoreDefaultArgs?{ignoreDefaultArgs:t.ignoreDefaultArgs}:{}};if(t.profileDir)this.context=await On.chromium.launchPersistentContext(t.profileDir,{...i,...xn(t)}),await this.installEsbuildHelperShims(this.context),this.page=await this.context.newPage(),this.debugSnapshot.context.userAgent=await An(this.page);else{this.browser=await On.chromium.launch(i);let s=await Ln(this.browser);this.debugSnapshot.context.userAgent=s,this.context=await this.browser.newContext(xn(t,s)),await this.installEsbuildHelperShims(this.context),this.page=await this.context.newPage()}this.debugEnabled&&(this.debugSnapshot.networkLocation=await this.captureBrowserNetworkLocation())}async populateKernelRetrieveDebug(t,n){if(!(!this.kernelClient||!this.kernelSessionId))try{let a=await Oe(this.kernelClient.browsers.retrieve(this.kernelSessionId),5e3,`Kernel session ${this.kernelSessionId} retrieve`);t.retrievedProxyIdPresent=typeof a.proxy_id=="string"?!!a.proxy_id:!1,t.retrievedProxyIdSuffix=xa(a.proxy_id),t.retrievedProxyIdMatchesRequested=n?a.proxy_id===n:!a.proxy_id,t.timeoutSeconds=typeof a.timeout_seconds=="number"?a.timeout_seconds:t.timeoutSeconds,t.stealth=typeof a.stealth=="boolean"?a.stealth:t.stealth,t.profilePresent=!!a.profile,t.poolPresent=!!a.pool}catch(a){t.retrieveError=Re(a)}}async captureBrowserNetworkLocation(){let t=(a,i="ipapi.co")=>({source:i,ip:null,city:null,region:null,country:null,org:null,timezone:null,error:a});if(!this.context)return t("browser context is not available");let n=null;try{n=await this.context.newPage();let a=await this.loadJsonInDebugPage(n,"https://ipwho.is/");if(a){let d=typeof a.connection=="object"&&a.connection!==null?a.connection:{};return{source:"ipwho.is",ip:typeof a.ip=="string"?a.ip:null,city:typeof a.city=="string"?a.city:null,region:typeof a.region=="string"?a.region:null,country:typeof a.country=="string"?a.country:null,org:typeof d.org=="string"?d.org:null,timezone:typeof a.timezone=="object"&&a.timezone!==null&&typeof a.timezone.id=="string"?a.timezone.id:null,error:null}}let i=await this.loadJsonInDebugPage(n,"https://api64.ipify.org?format=json");if(i)return{source:"api64.ipify.org",ip:typeof i.ip=="string"?i.ip:null,city:null,region:null,country:null,org:null,timezone:null,error:null};await Oe(n.goto("https://ipapi.co/json/",{waitUntil:"domcontentloaded",timeout:7e3}),8e3,"browser network location navigation");let s=await n.locator("body").innerText({timeout:2e3}),o=JSON.parse(s);return{source:"ipapi.co",ip:typeof o.ip=="string"?o.ip:null,city:typeof o.city=="string"?o.city:null,region:typeof o.region=="string"?o.region:null,country:typeof o.country_name=="string"?o.country_name:typeof o.country=="string"?o.country:null,org:typeof o.org=="string"?o.org:null,timezone:typeof o.timezone=="string"?o.timezone:null,error:null}}catch(a){return t(Re(a))}finally{await n?.close().catch(()=>{})}}async loadJsonInDebugPage(t,n){try{await Oe(t.goto(n,{waitUntil:"domcontentloaded",timeout:7e3}),8e3,`browser network location navigation ${n}`);let a=await t.locator("body").innerText({timeout:2e3});return JSON.parse(a)}catch{return null}}async installEsbuildHelperShims(t){await t.addInitScript(()=>{let n=globalThis;typeof n.__name!="function"&&(n.__name=a=>a),typeof n.__publicField!="function"&&(n.__publicField=(a,i,s)=>(a[i]=s,s))})}async withTemporaryPage(t,n){if(!this.context)throw new Error("Browser context is not available");return En(this.context,async()=>{},t,n)}async navigateToSERP(t,n,a,i,s){let o=new URLSearchParams({q:t,gl:a,hl:i,pws:"0"});s?.tbs&&o.set("tbs",s.tbs),n&&o.set("uule",n);let d="https://www.google.com/search?"+o.toString(),l=ks(d),S=s?.debug?{requestedUrl:d,finalUrl:null,title:null,bodySnippet:null,hasPaa:null,captchaDetected:null,googleSorryUrl:null,redirected:null}:null;S&&(this.debugSnapshot.serpNavigation=S);try{await this.page.goto(l,{waitUntil:"domcontentloaded",timeout:La(s?.deadlineMs,s?.purpose==="serp"?8e3:45e3)})}catch(r){await this.updateSerpNavigationDebug(S,d,{hasPaa:null,captchaDetected:null});let u=await this.captureDiagnostics(d);throw new Le(`page.goto failed: ${r.message} | ${u}`)}if(await this.isSerpChallengeVisible())throw await this.updateSerpNavigationDebug(S,d,{hasPaa:!1,captchaDetected:!0}),new it(this.captchaMessage());if(s?.purpose==="serp"){await this.page.waitForSelector(xd,{timeout:La(s.deadlineMs,1500)}).catch(()=>null);let r=await this.page.locator(mt.paaItem).count().catch(()=>0)>0;return await this.updateSerpNavigationDebug(S,d,{hasPaa:r,captchaDetected:!1}),{hasPaa:r}}if(await this.page.waitForSelector(mt.paaItem,{timeout:La(s?.deadlineMs,4e3)}).catch(()=>null))return await this.updateSerpNavigationDebug(S,d,{hasPaa:!0,captchaDetected:!1}),{hasPaa:!0};if(await this.isSerpChallengeVisible())throw await this.updateSerpNavigationDebug(S,d,{hasPaa:!1,captchaDetected:!0}),new it(this.captchaMessage());for(let r=1;r<=6;r++)if(await this.page.evaluate(c=>{window.scrollTo(0,document.body.scrollHeight*c)},r/6),await this.page.waitForTimeout(600),await this.page.locator(mt.paaItem).count()>0)return await this.updateSerpNavigationDebug(S,d,{hasPaa:!0,captchaDetected:!1}),{hasPaa:!0};return await this.updateSerpNavigationDebug(S,d,{hasPaa:!1,captchaDetected:!1}),{hasPaa:!1}}async isSerpChallengeVisible(){if(!this.page)return!1;if(await this.page.locator(mt.captchaMarker).count().catch(()=>0)>0)return!0;let n=this.page.url();if(/google\.[^/]+\/sorry\//i.test(n))return!0;let a=await this.page.evaluate(()=>(document.body?.innerText??"").replace(/\s+/g," ").trim().slice(0,1e3)).catch(()=>"");return/recaptcha|unusual traffic|are you a robot|about this page|detected unusual traffic/i.test(a)}async updateSerpNavigationDebug(t,n,a){if(!(!t||!this.page))try{let i=this.page.url(),s=await this.page.title().catch(()=>""),o=await this.page.evaluate(()=>(document.body?.innerText??"").replace(/\s+/g," ").trim().slice(0,500)).catch(()=>""),d=/recaptcha|unusual traffic|are you a robot/i.test(o);t.finalUrl=i,t.title=s,t.bodySnippet=o,t.hasPaa=a.hasPaa,t.captchaDetected=a.captchaDetected??d,t.googleSorryUrl=/google\.[^/]+\/sorry\//i.test(i),t.redirected=i!==n}catch(i){t.bodySnippet=`debug capture failed: ${Re(i)}`}}async captureDiagnostics(t){try{let n=this.page.url(),a=await this.page.title().catch(()=>""),i=await this.page.evaluate(()=>(document.body?.innerText??"").replace(/\s+/g," ").trim().slice(0,400)).catch(()=>""),s=/consent\.google\./.test(n)||/before you continue/i.test(i),o=/recaptcha|unusual traffic|are you a robot/i.test(i),d=[s?"CONSENT_WALL":"",o?"BOT_CHALLENGE":"",n!==t?"REDIRECTED":""].filter(Boolean).join(",");return`intended=${t} | final=${n} | title="${a}" | flags=[${d}] | body="${i}"`}catch(n){return`diagnostics-failed: ${n.message}`}}captchaMessage(){return this.kernelClient?"Google returned a CAPTCHA on this session \u2014 retrying with a fresh session.":Us}async navigateTo(t){let n=process.env.ADS_ARRIVAL_REDIRECT_BASE?.trim(),a=n?ks(t,n):t;try{if(await this.page.goto(a,{waitUntil:"domcontentloaded",timeout:45e3}),/google\.[^/]+\/search\?/i.test(t)&&await this.isSerpChallengeVisible())throw new it(this.captchaMessage())}catch(i){if(i instanceof it)throw i;let s=await this.captureDiagnostics(t);throw new Le(`page.goto failed: ${i.message} | ${s}`)}}async navigateToChannel(t){let n=Bd(t);try{await this.page.goto(n,{waitUntil:"networkidle",timeout:3e4})}catch(a){let i=await this.captureDiagnostics(n);throw new Le(`navigateToChannel failed: ${a.message} | ${i}`)}}async evaluate(t,n){return this.page.evaluate(t,n)}getPage(){return this.page}getKernelSessionId(){return this.kernelSessionId}getKernelMeteringEvidence(){return{sessionId:this.kernelSessionId??this.debugSnapshot.kernel?.sessionId??null,billingMode:this.lastKernelBillingMode,openedAtMs:this.lastKernelOpenedAtMs,closedAtMs:this.lastKernelClosedAtMs}}getProviderSessionMetadata(){return{provider:this.kernelSessionId?"kernel":"local",providerSessionId:this.kernelSessionId,disconnectObservation:null,billingMode:this.kernelSessionId?this.kernelHeadlessSent?"headless":"headful":null}}getDebugSnapshot(){return this.debugSnapshot}async close(){if(this.browser){let t=this.browser,n=this.kernelSessionId,a=this.kernelClient,i=this.kernelOpenedAtMs,s=this.kernelStealth,o=this.kernelProxyUsed,d=this.kernelProxySource,l=this.kernelProxyType,S=this.kernelHeadlessSent,U=this.getProviderSessionMetadata();if(this.browser=null,this.context=null,this.page=null,this.kernelSessionId=null,this.kernelClient=null,this.kernelOpenedAtMs=null,this.kernelHeadlessSent=null,this.kernelProxySource=null,this.kernelProxyType=null,a&&n){console.info(JSON.stringify({event:"kernel_browser_delete_started",kernel_session_id:n}));let r=Oe(a.browsers.deleteByID(n),Ld,`Kernel session ${n} delete`),u=Oe(t.close(),Ad,`Kernel browser ${n} close`),[c,h]=await Promise.allSettled([r,u]);this.lastKernelClosedAtMs=Date.now(),i!=null&&Cs({kernelSessionId:n,source:"browser_driver",stealth:s,headlessSent:S,proxyUsed:o,proxySource:d,proxyType:l,openedAtMs:i,closedAtMs:this.lastKernelClosedAtMs});let w=c.status==="rejected"&&Hd(c.reason),k={kernelSessionId:n,kernelDeleteStarted:!0,kernelDeleteSucceeded:c.status==="fulfilled"||w,kernelDeleteError:c.status==="rejected"&&!w?c.reason instanceof Error?c.reason.message:String(c.reason):null,browserCloseSucceeded:h.status==="fulfilled",browserCloseError:h.status==="rejected"?h.reason instanceof Error?h.reason.message:String(h.reason):null,provider:U.provider,providerSessionId:U.providerSessionId,providerDisconnectObserved:!1,providerDisconnectMessage:null};return c.status==="rejected"&&!w?(console.warn(JSON.stringify({event:"kernel_browser_delete_failed",kernel_session_id:n,message:k.kernelDeleteError})),console.warn(`Kernel session cleanup failed for ${n}:`,c.reason)):console.info(JSON.stringify({event:"kernel_browser_delete_succeeded",kernel_session_id:n})),h.status==="rejected"&&(console.warn(JSON.stringify({event:"kernel_browser_close_failed",kernel_session_id:n,message:k.browserCloseError})),console.warn(`Kernel browser close failed for ${n}:`,h.reason)),k}return await t.close(),{kernelSessionId:null,kernelDeleteStarted:!1,kernelDeleteSucceeded:null,kernelDeleteError:null,browserCloseSucceeded:!0,browserCloseError:null,provider:U.provider,providerSessionId:U.providerSessionId,providerDisconnectObserved:!1,providerDisconnectMessage:null}}else if(this.context){let t=this.context;return this.context=null,this.page=null,await t.close(),{kernelSessionId:null,kernelDeleteStarted:!1,kernelDeleteSucceeded:null,kernelDeleteError:null,browserCloseSucceeded:!0,browserCloseError:null,provider:"local",providerSessionId:null,providerDisconnectObserved:!1,providerDisconnectMessage:null}}return{kernelSessionId:null,kernelDeleteStarted:!1,kernelDeleteSucceeded:null,kernelDeleteError:null,browserCloseSucceeded:null,browserCloseError:null,provider:"local",providerSessionId:null,providerDisconnectObserved:!1,providerDisconnectMessage:null}}};var Is=require("playwright");function Fd(e,t){if(typeof e!="string")return null;let n=e.replace(/[\u0000-\u001f\u007f]+/g," ").replace(/\s+/g," ").trim();return n?n.slice(0,t):null}function Ns(e){let t=Fd(e,320);return t?t.replace(/\b(?:wss?|https?):\/\/\S+/gi,"[redacted endpoint]").replace(/\b(?:authorization|proxy-authorization):\s*\S+/gi,"$1: [redacted]").replace(/\bBearer\s+\S+/gi,"Bearer [redacted]").slice(0,320):null}function vs(e){return Ns(e)}function _s(e){if(typeof e!="string"||e.length===0||e.length>512||e.trim()!==e||/[\s\u0000-\u001f\u007f]/.test(e)||/:\/\//.test(e))throw new Error("Bright Data did not return a valid browser session ID");return e}function Oa(e,t,n=new Date().toISOString()){let a=Ns(t);return{source:e,message:a??e.replaceAll("_"," "),observedAt:n}}function Gd(e){return{provider:e.provider,providerDisconnectObserved:e.disconnectObservation!==null,providerDisconnectMessage:e.disconnectObservation?.message??null}}function bs(e){return{...Gd(e),providerSessionId:e.providerSessionId}}function Ra(){return process.env.BRIGHTDATA_BROWSER_WSS?.trim()||null}function Es(){return process.env.SERP_BROWSER_PROVIDER?.trim().toLowerCase()==="kernel"?!1:!!Ra()}var Vd=new Set(["image","media","font","stylesheet","ping"]),Yd=["doubleclick.net","googleadservices.com","googlesyndication.com","google-analytics.com"],Kd='#search, #rso, a[href] h3, [data-snhf], [role="main"]',Jd=3e4,Ps=1500;function ee(e,t){return e?Math.max(1,Math.min(t,e-Date.now())):t}async function Wa(e,t=!1){let n=e.request();try{let a=await n.allHeaders(),i=await fetch(n.url(),{method:n.method(),headers:{accept:a.accept??"*/*","accept-language":a["accept-language"]??"en-US,en;q=0.9","user-agent":a["user-agent"]??"Mozilla/5.0",...t?{cookie:a.cookie??"",referer:a.referer??"https://www.google.com/",...a["x-client-data"]?{"x-client-data":a["x-client-data"]}:{}}:{}},body:n.method()==="GET"||n.method()==="HEAD"?void 0:n.postData()});if(!i.ok)return!1;let s=Buffer.from(await i.arrayBuffer());return await e.fulfill({status:i.status,contentType:i.headers.get("content-type")??"application/octet-stream",headers:{"cache-control":"public, max-age=3600"},body:s}),!0}catch{return!1}}var Wn=class{constructor(t={}){this.resourcePolicy=t}resourcePolicy;browser=null;context=null;page=null;cdpSession=null;providerSessionId=null;disconnectObservation=null;closing=!1;observeDisconnect(t,n){this.closing||this.disconnectObservation||(this.disconnectObservation=Oa(t,n))}async launch(t){if(this.page)return;this.closing=!1,this.providerSessionId=null,this.disconnectObservation=null;let n=Ra();if(!n)throw new Error("SERP browser service is not configured");this.browser=await Is.chromium.connectOverCDP(n,{timeout:ee(t.operationDeadlineMs,Jd)}),this.context=this.browser.contexts()[0]??await this.browser.newContext(),await this.context.addInitScript(()=>{let s=globalThis;typeof s.__name!="function"&&(s.__name=o=>o),typeof s.__publicField!="function"&&(s.__publicField=(o,d,l)=>(o[d]=l,l))}),this.page=this.context.pages()[0]??await this.context.newPage(),this.browser.on("disconnected",()=>this.observeDisconnect("browser_disconnected")),this.context.on("close",()=>this.observeDisconnect("context_closed")),this.page.on("close",()=>this.observeDisconnect("page_closed")),this.page.on("crash",()=>this.observeDisconnect("page_crashed")),this.cdpSession=await this.context.newCDPSession(this.page);let i=await this.cdpSession.send("Browser.getSessionId");this.providerSessionId=_s(i?.sessionId),await this.setupPage(this.page),this.resourcePolicy.startupSettleMs&&await this.page.waitForTimeout(this.resourcePolicy.startupSettleMs)}async setupPage(t){this.resourcePolicy.nativeGoogleAssets||await t.route("**/*",async n=>{let a=n.request(),i=a.resourceType(),s;try{s=new URL(a.url())}catch{await n.continue();return}let o=s.hostname.toLowerCase();if(!(s.pathname==="/sgasync"&&await Wa(n,!0))&&!(s.pathname.includes("/shared_dict/")&&await Wa(n))&&!(i==="script"&&(o==="www.google.com"||o==="www.gstatic.com")&&await Wa(n))){if(Vd.has(i)&&!(i==="image"&&this.resourcePolicy.allowImages)&&!(i==="stylesheet"&&this.resourcePolicy.allowStylesheets)){await n.abort("blockedbyclient");return}if(Yd.some(d=>o===d||o.endsWith(`.${d}`))){await n.abort("blockedbyclient");return}await n.continue()}})}async withTemporaryPage(t,n){if(!this.context||this.closing)throw new Error("Browser context is not available");return En(this.context,a=>this.setupPage(a),t,n)}async navigateToSERP(t,n,a,i,s){if(!this.page)throw new Error("Browser page is not available");let o=new URLSearchParams({q:t,gl:a,hl:i,pws:"0"});if(s?.tbs&&o.set("tbs",s.tbs),n&&o.set("uule",n),await this.page.goto(`https://www.google.com/search?${o}`,{waitUntil:"domcontentloaded",timeout:ee(s?.deadlineMs,s?.purpose==="serp"?12e4:45e3)}),s?.purpose==="serp"&&new URL(this.page.url()).pathname.startsWith("/sorry")&&this.cdpSession){let l=this.cdpSession,S;(await Promise.race([l.send("Captcha.solve",{detectTimeout:ee(s.deadlineMs,3e4)}).catch(()=>null),new Promise(r=>{S=setTimeout(()=>r(null),ee(s.deadlineMs,75e3))})]).finally(()=>{S&&clearTimeout(S)}))?.status==="solve_finished"&&await this.page.waitForURL(r=>new URL(r.toString()).pathname==="/search",{timeout:ee(s.deadlineMs,25e3)}).catch(()=>{})}return s?.purpose==="serp"?(await this.page.waitForSelector(Kd,{timeout:ee(s.deadlineMs,8e3)}).catch(()=>null),{hasPaa:await this.page.locator(mt.paaItem).count().catch(()=>0)>0}):{hasPaa:!!await this.page.waitForSelector(mt.paaItem,{timeout:ee(s?.deadlineMs,8e3)}).catch(()=>null)}}async navigateTo(t){if(!this.page)throw new Error("Browser page is not available");await this.page.goto(t,{waitUntil:"load",timeout:45e3})}async navigateToChannel(){throw new Error("YouTube navigation is not supported by the SERP browser driver")}async evaluate(t,n){if(!this.page)throw new Error("Browser page is not available");return this.page.evaluate(t,n)}getPage(){if(!this.page)throw new Error("Browser page is not available");return this.page}getKernelSessionId(){return null}getBrightDataSessionId(){return this.providerSessionId}getProviderSessionMetadata(){return{provider:"bright_data_browser_api",providerSessionId:this.providerSessionId,disconnectObservation:this.disconnectObservation}}getDebugSnapshot(){return{kernel:null,context:null,networkLocation:null,serpNavigation:null}}async close(){this.closing=!0;let t=null,n;try{let i=this.browser?.close();i&&await Promise.race([i,new Promise((s,o)=>{n=setTimeout(()=>o(new Error(`Browser close acknowledgement exceeded ${Ps}ms`)),Ps)})])}catch(i){t=vs(i instanceof Error?i.message:String(i))??"Bright Data browser close failed",this.disconnectObservation??=Oa("browser_close_error",t)}finally{n&&clearTimeout(n)}let a=bs(this.getProviderSessionMetadata());return this.browser=null,this.context=null,this.page=null,this.cdpSession=null,{kernelSessionId:null,kernelDeleteStarted:!1,kernelDeleteSucceeded:null,kernelDeleteError:null,browserCloseSucceeded:t===null,browserCloseError:t,...a}}};function As(e,t){return e.plannedProvider==="brightdata"?new Wn({nativeGoogleAssets:t?.nativeGoogleAssets}):new Rn}var q={container:".eJH8qe.adDDi",dataInitq:"[data-initq]",item:mt.paaItem,itemDataQ:"data-q",itemDataInitQ:"data-initq",itemQuestionEl:".JlqpRe",answerContainer:".bCOlv, .hgKElc, .wDYxhc, .LGOjhe, .fo7IQd, .fmW3u",aiAnswerBody:".pWvJNd",aiCitation:"a.PMDqCb[href]",aiSourceCard:"a.vIWmYe[href], a.Zbfntb[href]",sourceTitle:"h3",sourceSite:".VuuXrf",sourceCite:"cite",clickTarget:".JlqpRe",expandedClass:"aoRk1c",captchaMarker:mt.captchaMarker};var ne={austin:"Austin,Texas,United States","new york":"New York,New York,United States","new york city":"New York,New York,United States",nyc:"New York,New York,United States","los angeles":"Los Angeles,California,United States",la:"Los Angeles,California,United States",chicago:"Chicago,Illinois,United States",houston:"Houston,Texas,United States",phoenix:"Phoenix,Arizona,United States",philadelphia:"Philadelphia,Pennsylvania,United States",philly:"Philadelphia,Pennsylvania,United States","san antonio":"San Antonio,Texas,United States",dallas:"Dallas,Texas,United States",miami:"Miami,Florida,United States",seattle:"Seattle,Washington,United States",denver:"Denver,Colorado,United States",loveland:"Loveland,Colorado,United States","loveland co":"Loveland,Colorado,United States","fort collins":"Fort Collins,Colorado,United States",boulder:"Boulder,Colorado,United States","colorado springs":"Colorado Springs,Colorado,United States",boston:"Boston,Massachusetts,United States",atlanta:"Atlanta,Georgia,United States","san francisco":"San Francisco,California,United States",sf:"San Francisco,California,United States",portland:"Portland,Oregon,United States","las vegas":"Las Vegas,Nevada,United States",minneapolis:"Minneapolis,Minnesota,United States",detroit:"Detroit,Michigan,United States",nashville:"Nashville,Tennessee,United States",charlotte:"Charlotte,North Carolina,United States",orlando:"Orlando,Florida,United States","san diego":"San Diego,California,United States",baltimore:"Baltimore,Maryland,United States",sacramento:"Sacramento,California,United States",columbus:"Columbus,Ohio,United States",indianapolis:"Indianapolis,Indiana,United States","san jose":"San Jose,California,United States","fort worth":"Fort Worth,Texas,United States",jacksonville:"Jacksonville,Florida,United States",memphis:"Memphis,Tennessee,United States",louisville:"Louisville,Kentucky,United States",raleigh:"Raleigh,North Carolina,United States",richmond:"Richmond,Virginia,United States","salt lake city":"Salt Lake City,Utah,United States",toronto:"Toronto,Ontario,Canada",vancouver:"Vancouver,British Columbia,Canada",montreal:"Montreal,Quebec,Canada",calgary:"Calgary,Alberta,Canada",ottawa:"Ottawa,Ontario,Canada",london:"London,England,United Kingdom",manchester:"Manchester,England,United Kingdom",birmingham:"Birmingham,England,United Kingdom",edinburgh:"Edinburgh,Scotland,United Kingdom",glasgow:"Glasgow,Scotland,United Kingdom",leeds:"Leeds,England,United Kingdom",sydney:"Sydney,New South Wales,Australia",melbourne:"Melbourne,Victoria,Australia",brisbane:"Brisbane,Queensland,Australia",perth:"Perth,Western Australia,Australia",adelaide:"Adelaide,South Australia,Australia",dublin:"Dublin,Leinster,Ireland"};var Ls=`3, Nanjemoy,Maryland,United States
8
+ ${d}
9
+ ${o}`)}return d},g=Jr(gs);var Qt=class extends I{create(t,n){return this._client.post("/org/api_keys",{body:t,...n})}retrieve(t,n={},a){return this._client.get(g`/org/api_keys/${t}`,{query:n,...a})}update(t,n,a){return this._client.patch(g`/org/api_keys/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/org/api_keys",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/org/api_keys/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}rotate(t,n={},a){return this._client.post(g`/org/api_keys/${t}/rotate`,{body:n,...a})}};var Xt=class extends I{list(t={},n){return this._client.getAPIList("/apps",G,{query:t,...n})}};var Ne=class extends I{create(t,n){return this._client.post("/audit-logs/export/destinations",{body:t,...n})}retrieve(t,n){return this._client.get(g`/audit-logs/export/destinations/${t}`,n)}update(t,n,a){return this._client.patch(g`/audit-logs/export/destinations/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/audit-logs/export/destinations",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/audit-logs/export/destinations/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}test(t,n){return this._client.post(g`/audit-logs/export/destinations/${t}/test`,n)}};var zr=6,$r=5e4,jr=8e3,yt=class extends J{};async function ps(e,t,n,a,i={}){if(!n||typeof n.write!="function")throw new TypeError("audit log download destination must provide write()");let{onProgress:s,maxTransferRetries:d=zr,...r}=i;if(!Number.isInteger(d)||d<0)throw new TypeError("maxTransferRetries must be a non-negative integer");let l=r.timeout??a,S,c={bytesWritten:0,chunks:0,rows:0},o=new Set;for(;;){let U=await Qr(e,S?{...t,cursor:S}:t,r,d,l),{nextCursor:u,hasMore:h,rows:w}=Xr(U.headers,S);if(h&&u){if(o.has(u))throw new yt("response repeated X-Next-Cursor header");o.add(u)}if(await ed(n,U.body),S=u,c.bytesWritten+=U.body.byteLength,c.chunks+=1,c.rows+=w,s&&await s({...c,chunkRows:w}),!h)return c}}async function Qr(e,t,n,a,i){for(let s=0;;s+=1){let d=new AbortController,r=()=>d.abort();n.signal?.aborted?d.abort():n.signal?.addEventListener("abort",r,{once:!0});let l;try{l=await e(t,{...n,signal:d.signal})}catch(o){throw n.signal?.removeEventListener("abort",r),o}let S=!1,c=setTimeout(()=>{S=!0,d.abort()},i);try{let o=new Uint8Array(await l.arrayBuffer());if(clearTimeout(c),n.signal?.aborted)throw new lt;if(S)throw new ft;let U=l.headers.get("x-content-sha256");if(!U)throw new yt("response missing X-Content-Sha256 header");let u=await Zr(o);if(n.signal?.aborted)throw new lt;if(u!==U)throw new yt(`audit log chunk checksum mismatch (got ${u}, want ${U})`);return{body:o,headers:l.headers}}catch(o){if(n.signal?.aborted&&!(o instanceof lt)?o=new lt:S&&(o=new ft),s===a||o instanceof lt)throw o;await td(s+1,n.signal)}finally{clearTimeout(c),n.signal?.removeEventListener("abort",r)}}}function Xr(e,t){let n=e.get("x-has-more");if(n!=="true"&&n!=="false")throw new yt("response missing or invalid X-Has-More header");let a=n==="true",i=e.get("x-row-count");if(i===null||!/^[0-9]+$/.test(i))throw new yt("response missing or invalid X-Row-Count header");let s=Number(i);if(!Number.isSafeInteger(s)||s>$r)throw new yt("response missing or invalid X-Row-Count header");let d=e.get("x-next-cursor")||void 0;if(a&&(!d||d===t))throw new yt("response has invalid X-Next-Cursor header");if(!a&&d)throw new yt("response returned a cursor after the final chunk");return{rows:s,nextCursor:d,hasMore:a}}async function Zr(e){let t=await globalThis.crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(t),n=>n.toString(16).padStart(2,"0")).join("")}async function td(e,t){let n=Math.min(1e3*2**(e-1),jr);await new Promise((a,i)=>{if(t?.aborted){i(new lt);return}let s=()=>{clearTimeout(d),i(new lt)},d=setTimeout(()=>{t?.removeEventListener("abort",s),a()},n);t?.addEventListener("abort",s,{once:!0})})}async function ed(e,t){let n=0;for(;n<t.byteLength;){let a=await e.write(n===0?t:t.subarray(n));if(typeof a=="number"){n+=ws(a,t.byteLength-n);continue}if(a&&typeof a=="object"&&"bytesWritten"in a){let i=a.bytesWritten;n+=ws(i,t.byteLength-n);continue}return}}function ws(e,t){if(!Number.isSafeInteger(e)||e<=0||e>t)throw new yt("audit log download destination performed a short write");return e}var Rt=class extends I{constructor(){super(...arguments),this.exportDestinations=new Ne(this._client)}list(t,n){return this._client.getAPIList("/audit-logs",xn,{query:t,...n})}exportChunk(t,n){return this._client.get("/audit-logs/export/chunk",{query:t,...n,headers:T([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}download(t,n,a){return ps((i,s)=>this.exportChunk(i,s),t,n,this._client.timeout,a)}};Rt.ExportDestinations=Ne;var be=class extends I{create(t,n){return this._client.post("/auth/connections",{body:t,...n})}retrieve(t,n){return this._client.get(g`/auth/connections/${t}`,n)}update(t,n,a){return this._client.patch(g`/auth/connections/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/auth/connections",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/auth/connections/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}follow(t,n){return this._client.get(g`/auth/connections/${t}/events`,{...n,headers:T([{Accept:"text/event-stream"},n?.headers]),stream:!0})}login(t,n={},a){return this._client.post(g`/auth/connections/${t}/login`,{body:n,...a})}submit(t,n,a){return this._client.post(g`/auth/connections/${t}/submit`,{body:n,...a})}timeline(t,n={},a){return this._client.getAPIList(g`/auth/connections/${t}/timeline`,G,{query:n,...a})}};var Pe=class extends I{retrieve(t){return this._client.get("/auth/context",t)}};var Nt=class extends I{constructor(){super(...arguments),this.context=new Pe(this._client),this.connections=new be(this._client)}};Nt.Context=Pe;Nt.Connections=be;var Zt=class extends I{create(t,n){return this._client.post("/browser_pools",{body:t,...n})}retrieve(t,n){return this._client.get(g`/browser_pools/${t}`,n)}update(t,n,a){return this._client.patch(g`/browser_pools/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/browser_pools",G,{query:t,...n})}delete(t,n={},a){return this._client.delete(g`/browser_pools/${t}`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}acquire(t,n,a){return this._client.post(g`/browser_pools/${t}/acquire`,{body:n,...a})}flush(t,n){return this._client.post(g`/browser_pools/${t}/flush`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}release(t,n,a){return this._client.post(g`/browser_pools/${t}/release`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}};var Ie=class extends I{batch(t,n,a){return this._client.post(g`/browsers/${t}/computer/batch`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}captureScreenshot(t,n={},a){return this._client.post(g`/browsers/${t}/computer/screenshot`,{body:n,...a,headers:T([{Accept:"image/png"},a?.headers]),__binaryResponse:!0})}clickMouse(t,n,a){return this._client.post(g`/browsers/${t}/computer/click_mouse`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}dragMouse(t,n,a){return this._client.post(g`/browsers/${t}/computer/drag_mouse`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}getMousePosition(t,n){return this._client.post(g`/browsers/${t}/computer/get_mouse_position`,n)}moveMouse(t,n,a){return this._client.post(g`/browsers/${t}/computer/move_mouse`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}pressKey(t,n,a){return this._client.post(g`/browsers/${t}/computer/press_key`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}readClipboard(t,n){return this._client.post(g`/browsers/${t}/computer/clipboard/read`,n)}scroll(t,n,a){return this._client.post(g`/browsers/${t}/computer/scroll`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}setCursorVisibility(t,n,a){return this._client.post(g`/browsers/${t}/computer/cursor`,{body:n,...a})}typeText(t,n,a){return this._client.post(g`/browsers/${t}/computer/type`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}writeClipboard(t,n,a){return this._client.post(g`/browsers/${t}/computer/clipboard/write`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}};var Ae=class extends I{stream(t,n,a){return this._client.get(g`/browsers/${t}/logs/stream`,{query:n,...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}};var xe=class extends I{execute(t,n,a){return this._client.post(g`/browsers/${t}/playwright/execute`,{body:n,...a})}};var We=class extends I{exec(t,n,a){return this._client.post(g`/browsers/${t}/process/exec`,{body:n,...a})}kill(t,n,a){let{id:i,...s}=n;return this._client.post(g`/browsers/${i}/process/${t}/kill`,{body:s,...a})}resize(t,n,a){let{id:i,...s}=n;return this._client.post(g`/browsers/${i}/process/${t}/resize`,{body:s,...a})}spawn(t,n,a){return this._client.post(g`/browsers/${t}/process/spawn`,{body:n,...a})}status(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/process/${t}/status`,a)}stdin(t,n,a){let{id:i,...s}=n;return this._client.post(g`/browsers/${i}/process/${t}/stdin`,{body:s,...a})}stdoutStream(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/process/${t}/stdout/stream`,{...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}};var Le=class extends I{list(t,n){return this._client.get(g`/browsers/${t}/replays`,n)}download(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/replays/${t}`,{...a,headers:T([{Accept:"video/mp4"},a?.headers]),__binaryResponse:!0})}start(t,n={},a){return this._client.post(g`/browsers/${t}/replays`,{body:n,...a})}stop(t,n,a){let{id:i}=n;return this._client.post(g`/browsers/${i}/replays/${t}/stop`,{...a,headers:T([{Accept:"*/*"},a?.headers])})}};var Oe=class extends I{events(t,n={},a){return this._client.getAPIList(g`/browsers/${t}/telemetry/events`,G,{query:n,...a})}stream(t,n={},a){let{"Last-Event-ID":i,...s}=n??{};return this._client.get(g`/browsers/${t}/telemetry/stream`,{query:s,...a,headers:T([{Accept:"text/event-stream",...i!=null?{"Last-Event-ID":i}:void 0},a?.headers]),stream:!0})}};var Be=class extends I{events(t,n,a){let{id:i}=n;return this._client.get(g`/browsers/${i}/fs/watch/${t}/events`,{...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}start(t,n,a){return this._client.post(g`/browsers/${t}/fs/watch`,{body:n,...a})}stop(t,n,a){let{id:i}=n;return this._client.delete(g`/browsers/${i}/fs/watch/${t}`,{...a,headers:T([{Accept:"*/*"},a?.headers])})}};var te=class extends I{constructor(){super(...arguments),this.watch=new Be(this._client)}createDirectory(t,n,a){return this._client.put(g`/browsers/${t}/fs/create_directory`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}deleteDirectory(t,n,a){return this._client.put(g`/browsers/${t}/fs/delete_directory`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}deleteFile(t,n,a){return this._client.put(g`/browsers/${t}/fs/delete_file`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}downloadDirZip(t,n,a){return this._client.get(g`/browsers/${t}/fs/download_dir_zip`,{query:n,...a,headers:T([{Accept:"application/zip"},a?.headers]),__binaryResponse:!0})}fileInfo(t,n,a){return this._client.get(g`/browsers/${t}/fs/file_info`,{query:n,...a})}listFiles(t,n,a){return this._client.get(g`/browsers/${t}/fs/list_files`,{query:n,...a})}move(t,n,a){return this._client.put(g`/browsers/${t}/fs/move`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}readFile(t,n,a){return this._client.get(g`/browsers/${t}/fs/read_file`,{query:n,...a,headers:T([{Accept:"application/octet-stream"},a?.headers]),__binaryResponse:!0})}setFilePermissions(t,n,a){return this._client.put(g`/browsers/${t}/fs/set_file_permissions`,{body:n,...a,headers:T([{Accept:"*/*"},a?.headers])})}upload(t,n,a){return this._client.post(g`/browsers/${t}/fs/upload`,Tt({body:n,...a,headers:T([{Accept:"*/*"},a?.headers])},this._client))}uploadZip(t,n,a){return this._client.post(g`/browsers/${t}/fs/upload_zip`,Tt({body:n,...a,headers:T([{Accept:"*/*"},a?.headers])},this._client))}writeFile(t,n,a,i){let{path:s,mode:d}=a;return this._client.put(g`/browsers/${t}/fs/write_file`,{body:n,query:{path:s,mode:d},...i,headers:T([{"Content-Type":"application/octet-stream",Accept:"*/*"},i?.headers])})}};te.Watch=Be;function On(e,t){return`${e.replace(/\/+$/,"")}${t.startsWith("/")?t:`/${t}`}`}async function ys(e,t,n,a){let i=e.browserRouteCache.get(t);if(!i)throw new J(`browser route cache does not contain session ${t}; create, retrieve, or list the browser before calling browser.fetch`);let{url:s,method:d,headers:r,body:l,signal:S,duplex:c,timeout_ms:o}=ud(n,a);hd(s);let U={url:s,jwt:i.jwt};o!==void 0&&(U.timeout_ms=o);let u=r.get("accept"),h={method:cd(d),path:On(i.baseURL,"/curl/raw"),query:U,body:l,headers:T([{Authorization:null},u?{Accept:u}:{Accept:"*/*"},gd(r)]),signal:S??null,__binaryResponse:!0};return c&&(h.fetchOptions={duplex:c}),e.request(h).asResponse()}function cd(e){let t=e.toLowerCase();if(!new Set(["get","post","put","patch","delete"]).has(t))throw new J(`browser.fetch unsupported HTTP method: ${e}`);return t}function ud(e,t){let n=t&&"timeout_ms"in t?t.timeout_ms:void 0;if(e instanceof Request){let i=new Headers(e.headers);t?.headers&&new Headers(t.headers).forEach((S,c)=>{i.set(c,S)});let s={url:e.url,method:(t?.method??e.method)?.toUpperCase()||"GET",headers:i},d=t?.body??e.body;d!=null&&(s.body=d);let r=t?.signal??e.signal;return r!==void 0&&(s.signal=r),t?.duplex!==void 0&&(s.duplex=t.duplex),n!==void 0&&(s.timeout_ms=n),s}let a={url:e instanceof URL?e.href:String(e),method:(t?.method??"GET").toUpperCase(),headers:new Headers(t?.headers)};return t?.body!==void 0&&(a.body=t.body),t?.signal!==void 0&&(a.signal=t.signal),t?.duplex!==void 0&&(a.duplex=t.duplex),n!==void 0&&(a.timeout_ms=n),a}function hd(e){let t;try{t=new URL(e)}catch{throw new J(`browser.fetch target must be an absolute URL; received: ${e}`)}if(t.protocol!=="http:"&&t.protocol!=="https:")throw new J(`browser.fetch only supports http(s) URLs; received: ${t.protocol}`)}function gd(e){let t={};return e.forEach((n,a)=>{switch(a.toLowerCase()){case"accept":case"content-length":case"connection":case"keep-alive":case"proxy-authenticate":case"proxy-authorization":case"te":case"trailers":case"transfer-encoding":case"upgrade":return;default:t[a]=n}}),t}var Ut=class extends I{constructor(){super(...arguments),this.telemetry=new Oe(this._client),this.replays=new Le(this._client),this.fs=new te(this._client),this.process=new We(this._client),this.logs=new Ae(this._client),this.computer=new Ie(this._client),this.playwright=new xe(this._client)}create(t={},n){return this._client.post("/browsers",{body:t,...n})}retrieve(t,n={},a){return this._client.get(g`/browsers/${t}`,{query:n,...a})}update(t,n,a){return this._client.patch(g`/browsers/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/browsers",G,{query:t,...n})}curl(t,n,a){return this._client.post(g`/browsers/${t}/curl`,{body:n,...a})}fetch(t,n,a){return ys(this._client,t,n,a)}deleteByID(t,n){return this._client.delete(g`/browsers/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}loadExtensions(t,n,a){return this._client.post(g`/browsers/${t}/extensions`,Tt({body:n,...a,headers:T([{Accept:"*/*"},a?.headers])},this._client))}};Ut.Telemetry=Oe;Ut.Replays=Le;Ut.Fs=te;Ut.Process=We;Ut.Logs=Ae;Ut.Computer=Ie;Ut.Playwright=xe;var ee=class extends I{create(t,n){return this._client.post("/org/credential_providers",{body:t,...n})}retrieve(t,n){return this._client.get(g`/org/credential_providers/${t}`,n)}update(t,n,a){return this._client.patch(g`/org/credential_providers/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/org/credential_providers",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/org/credential_providers/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}listItems(t,n){return this._client.get(g`/org/credential_providers/${t}/items`,n)}test(t,n){return this._client.post(g`/org/credential_providers/${t}/test`,n)}};var ne=class extends I{create(t,n){return this._client.post("/credentials",{body:t,...n})}retrieve(t,n){return this._client.get(g`/credentials/${t}`,n)}update(t,n,a){return this._client.patch(g`/credentials/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/credentials",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/credentials/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}totpCode(t,n){return this._client.get(g`/credentials/${t}/totp-code`,n)}};var ae=class extends I{create(t,n){return this._client.post("/deployments",Tt({body:t,...n},this._client))}retrieve(t,n){return this._client.get(g`/deployments/${t}`,n)}list(t={},n){return this._client.getAPIList("/deployments",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/deployments/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}follow(t,n={},a){return this._client.get(g`/deployments/${t}/events`,{query:n,...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}};var ie=class extends I{list(t={},n){return this._client.getAPIList("/extensions",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/extensions/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}download(t,n){return this._client.get(g`/extensions/${t}`,{...n,headers:T([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}downloadFromChromeStore(t,n){return this._client.get("/extensions/from_chrome_store",{query:t,...n,headers:T([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}get(t,n){return this._client.get(g`/extensions/${t}/metadata`,n)}upload(t,n){return this._client.post("/extensions",Tt({body:t,...n},this._client))}};var se=class extends I{create(t,n){return this._client.post("/invocations",{body:t,...n})}retrieve(t,n){return this._client.get(g`/invocations/${t}`,n)}update(t,n,a){return this._client.patch(g`/invocations/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/invocations",G,{query:t,...n})}deleteBrowsers(t,n){return this._client.delete(g`/invocations/${t}/browsers`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}follow(t,n={},a){return this._client.get(g`/invocations/${t}/events`,{query:n,...a,headers:T([{Accept:"text/event-stream"},a?.headers]),stream:!0})}listBrowsers(t,n){return this._client.get(g`/invocations/${t}/browsers`,n)}};var Re=class extends I{retrieve(t){return this._client.get("/org/entitlements",t)}};var He=class extends I{retrieve(t){return this._client.get("/org/limits",t)}update(t,n){return this._client.patch("/org/limits",{body:t,...n})}};var bt=class extends I{constructor(){super(...arguments),this.entitlements=new Re(this._client),this.limits=new He(this._client)}};bt.Entitlements=Re;bt.Limits=He;var oe=class extends I{create(t,n){return this._client.post("/profiles",{body:t,...n})}retrieve(t,n){return this._client.get(g`/profiles/${t}`,n)}update(t,n,a){return this._client.patch(g`/profiles/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/profiles",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/profiles/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}download(t,n={},a){return this._client.get(g`/profiles/${t}/download`,{query:n,...a,headers:T([{Accept:"application/octet-stream"},a?.headers]),__binaryResponse:!0})}};var Ee=class extends I{retrieve(t,n){return this._client.get(g`/org/projects/${t}/limits`,n)}update(t,n,a){return this._client.patch(g`/org/projects/${t}/limits`,{body:n,...a})}};var Ht=class extends I{constructor(){super(...arguments),this.limits=new Ee(this._client)}create(t,n){return this._client.post("/org/projects",{body:t,...n})}retrieve(t,n){return this._client.get(g`/org/projects/${t}`,n)}update(t,n,a){return this._client.patch(g`/org/projects/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/org/projects",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/org/projects/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}};Ht.Limits=Ee;var re=class extends I{create(t,n){return this._client.post("/proxies",{body:t,...n})}retrieve(t,n){return this._client.get(g`/proxies/${t}`,n)}update(t,n,a){return this._client.patch(g`/proxies/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/proxies",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/proxies/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}check(t,n={},a){return this._client.post(g`/proxies/${t}/check`,{body:n,...a})}};var Fe=class extends I{create(t,n){return this._client.post("/telemetry/destinations",{body:t,...n})}retrieve(t,n){return this._client.get(g`/telemetry/destinations/${t}`,n)}update(t,n,a){return this._client.patch(g`/telemetry/destinations/${t}`,{body:n,...a})}list(t={},n){return this._client.getAPIList("/telemetry/destinations",G,{query:t,...n})}delete(t,n){return this._client.delete(g`/telemetry/destinations/${t}`,{...n,headers:T([{Accept:"*/*"},n?.headers])})}};var Et=class extends I{constructor(){super(...arguments),this.destinations=new Fe(this._client)}};Et.Destinations=Fe;var nn=class{constructor(){this.entries=new Map}get(t){return this.entries.get(t)}set(t){this.entries.set(t.sessionId,t)}delete(t){this.entries.delete(t)}clear(){this.entries.clear()}},ms="\u004b\u0045\u0052\u004e\u0045\u004c_BROWSER_ROUTING_SUBRESOURCES",kd=["curl","telemetry/stream"],Md=/^\/(?:v\d+\/)?browsers(?:\/[^/]+)?\/?$/,fd=/^\/(?:v\d+\/)?browser_pools\/[^/]+\/acquire\/?$/,vd=/^\/(?:v\d+\/)?browsers\/([^/]+)\/?$/,Td=/^\/(?:v\d+\/)?browser_pools\/[^/]+\/release\/?$/;function Pa(){let e=Ed();return e===void 0?[...kd]:e.trim()===""?[]:e.split(",").map(t=>t.trim()).filter(Boolean)}function Ia(e,{apiBaseURL:t,subresources:n,cache:a}){let i=[...n].map(d=>d.trim().replace(/^\/+|\/+$/g,"")).filter(Boolean),s=new URL(t).origin;return async(d,r)=>{let l=new Request(d,r),S=Nd(l,s),c=await Ld(e,{input:d,init:r,request:l},s,i,a);return S&&await xd(c,a),await bd(l,c,s,a),c}}function Nd(e,t){let n=new URL(e.url);return n.origin===t&&(Md.test(n.pathname)||fd.test(n.pathname))}async function bd(e,t,n,a){if(!t.ok)return;let i=new URL(e.url);if(i.origin!==n)return;let s=Pd(e,i.pathname)??await Id(e,i.pathname);s&&a.delete(s)}function Pd(e,t){if(e.method.toUpperCase()!=="DELETE")return;let n=t.match(vd);return n&&decodeURIComponent(n[1]??"")||void 0}async function Id(e,t){if(!(e.method.toUpperCase()!=="POST"||!Td.test(t)))try{let n=await e.clone().json();if(!n||typeof n!="object")return;let a=n.session_id;return typeof a=="string"&&a.trim()?a.trim():void 0}catch{return}}function Ad(e){if(!e||typeof e!="object")return;let t=e,n=typeof t.session_id=="string"?t.session_id.trim():"",a=typeof t.base_url=="string"?t.base_url.trim():"";if(!n||!a)return;let i=typeof t.jwt=="string"?t.jwt.trim():"",s=typeof t.cdp_ws_url=="string"?t.cdp_ws_url:void 0,d=i||Hd(s)||"";if(d)return{sessionId:n,baseURL:a,jwt:d}}async function xd(e,t){if((e.headers.get("content-type")?.toLowerCase()??"").includes("application/json"))try{ba(await e.clone().json(),t)}catch{}}function ba(e,t){let n=Ad(e);if(n&&t.set(n),Array.isArray(e)){for(let a of e)ba(a,t);return}if(!(!e||typeof e!="object"))for(let a of Object.values(e))typeof a=="object"&&a!==null&&ba(a,t)}function Wd(e,t){let n=e.replace(/^\/+|\/+$/g,"");return t.some(a=>n===a||n.startsWith(a+"/"))}async function Ld(e,{input:t,init:n,request:a},i,s,d){let r=new URL(a.url);if(r.origin!==i)return e(t,n);let l=r.pathname.match(/^\/(?:v\d+\/)?browsers\/([^/]+)\/([^/]+)(\/.*)?$/);if(!l)return e(t,n);let S=decodeURIComponent(l[1]??""),c=l[2]??"";if(!S||!Wd(c+(l[3]??""),s))return e(t,n);let o=d.get(S);if(o===void 0)return e(t,n);let U=new URL(On(o.baseURL,`/${c}${l[3]??""}`));r.searchParams.forEach((h,w)=>{w!=="jwt"&&U.searchParams.append(w,h)}),U.searchParams.get("jwt")||U.searchParams.set("jwt",o.jwt);let u=new Headers(a.headers);return u.delete("authorization"),e(U.toString(),Od(t,a,n,u))}function Od(e,t,n,a){let i=t.method.toUpperCase(),s={...n??{},method:i,headers:a,redirect:t.redirect,signal:n?.signal??(e instanceof Request?e.signal:void 0)};if(delete s.body,delete s.duplex,i!=="GET"&&i!=="HEAD"){let d=Bd(t,n);d!==void 0&&(s.body=d),n?.duplex!==void 0?s.duplex=n.duplex:Rd(d)&&(s.duplex="half")}return s}function Bd(e,t){return t?.body!==void 0&&t.body!==null?t.body:e.body??void 0}function Rd(e){return globalThis.ReadableStream&&e instanceof globalThis.ReadableStream||typeof e=="object"&&e!==null&&Symbol.asyncIterator in e}function Hd(e){if(e)try{return new URL(e).searchParams.get("jwt")??void 0}catch{return}}function Ed(){if(typeof globalThis.process<"u"){let e=globalThis.process.env?.[ms];return typeof e=="string"?e:void 0}if(typeof globalThis.Deno<"u"){let e=globalThis.Deno.env?.get?.(ms);return typeof e=="string"?e:void 0}}var Bn=class{constructor(t){this.actions=new Map,this.name=t,Cs.registerApp(this)}action(t,n){let a;if(n.length===0)throw new Error("Action handlers must accept at least the context parameter");if(n.length===1){let i=n;a=async(s,d)=>i(s)}else a=n;return this.actions.set(t,{name:t,handler:a}),a}getActions(){return Array.from(this.actions.values())}getAction(t){return this.actions.get(t)}toJSON(){return{name:this.name,actions:this.getActions().map(t=>({name:t.name}))}}},Aa=class{constructor(){this.apps=new Map}registerApp(t){this.apps.set(t.name,t)}getApps(){return Array.from(this.apps.values())}getAppByName(t){return this.apps.get(t)}export(){return{apps:this.getApps().map(t=>t.toJSON())}}exportJSON(){return JSON.stringify(this.export(),null,2)}},Cs=new Aa;var _e=e=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[e]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(e)?.trim()||void 0};var xa,Wa,an,ks,Ms={production:"https://api.on\u006b\u0065\u0072\u006e\u0065\u006c.com/",development:"https://localhost:3001/"},E=class{constructor({baseURL:t=_e("\u004b\u0045\u0052\u004e\u0045\u004c_BASE_URL"),apiKey:n=_e("\u004b\u0045\u0052\u004e\u0045\u004c_API_KEY"),projectID:a=null,project:i=null,...s}={}){if(xa.add(this),an.set(this,void 0),this.deployments=new ae(this),this.apps=new Xt(this),this.invocations=new se(this),this.browsers=new Ut(this),this.profiles=new oe(this),this.auth=new Nt(this),this.telemetry=new Et(this),this.proxies=new re(this),this.extensions=new ie(this),this.browserPools=new Zt(this),this.credentials=new ne(this),this.projects=new Ht(this),this.organization=new bt(this),this.auditLogs=new Rt(this),this.apiKeys=new Qt(this),this.credentialProviders=new ee(this),typeof globalThis<"u"&&typeof globalThis.Bun<"u"&&globalThis.Bun.version&&!_e("\u004b\u0045\u0052\u004e\u0045\u004c_SUPPRESS_BUN_WARNING")&&et(this).warn("The Bun runtime was detected. Playwright may have CDP connection issues, proceed with caution. Suppress this warning by setting the \u004b\u0045\u0052\u004e\u0045\u004c_SUPPRESS_BUN_WARNING environment variable to true"),n===void 0)throw new J("The \u004b\u0045\u0052\u004e\u0045\u004c_API_KEY environment variable is missing or empty; either provide it, or instantiate the \u004b\u0065\u0072\u006e\u0065\u006c client with an apiKey option, like new \u004b\u0065\u0072\u006e\u0065\u006c({ apiKey: 'My API Key' }).");let d={apiKey:n,projectID:a,project:i,...s,baseURL:t,environment:s.environment??"production"};if(t&&s.environment)throw new J("Ambiguous URL; The `baseURL` option (or \u004b\u0045\u0052\u004e\u0045\u004c_BASE_URL env var) and the `environment` option are given. If you want to use the environment you must pass baseURL: null");this.baseURL=d.baseURL||Ms[d.environment||"production"],this.timeout=d.timeout??Wa.DEFAULT_TIMEOUT,this.logger=d.logger??console;let r="warn";this.logLevel=r,this.logLevel=ka(d.logLevel,"ClientOptions.logLevel",this)??ka(_e("\u004b\u0045\u0052\u004e\u0045\u004c_LOG"),"process.env['\u004b\u0045\u0052\u004e\u0045\u004c_LOG']",this)??r,this.fetchOptions=d.fetchOptions,this.maxRetries=d.maxRetries??2,this.rawFetch=d.fetch??qi(),this.browserRouteCache=new nn,this.fetch=Ia(this.rawFetch,{apiBaseURL:this.baseURL,subresources:Pa(),cache:this.browserRouteCache}),nt(this,an,$i,"f");let l=_e("\u004b\u0045\u0052\u004e\u0045\u004c_CUSTOM_HEADERS");if(l){let S={};for(let c of l.split(`
10
+ `)){let o=c.indexOf(":");o>=0&&(S[c.substring(0,o).trim()]=c.substring(o+1).trim())}d.defaultHeaders={...S,...d.defaultHeaders}}this._options=d,this.apiKey=n,this.projectID=a,this.project=i}withOptions(t){let n=new this.constructor({...this._options,environment:t.environment?t.environment:void 0,baseURL:t.environment?void 0:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.rawFetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,projectID:this.projectID,project:this.project,...t});return n.browserRouteCache=this.browserRouteCache,n.fetch=Ia(n.rawFetch,{apiBaseURL:n.baseURL,subresources:Pa(),cache:n.browserRouteCache}),n}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:t,nulls:n}){}async authHeaders(t){return T([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(t){return is(t)}getUserAgent(){return`${this.constructor.name}/JS ${Bt}`}defaultIdempotencyKey(){return`stainless-node-retry-${ra()}`}makeStatusError(t,n,a,i){return at.generate(t,n,a,i)}buildURL(t,n,a){let i=!q(this,xa,"m",ks).call(this)&&a||this.baseURL,s=Hi(t)?new URL(t):new URL(i+(i.endsWith("/")&&t.startsWith("/")?t.slice(1):t)),d=this.defaultQuery(),r=Object.fromEntries(s.searchParams);return(!Sa(d)||!Sa(r))&&(n={...r,...d,...n}),typeof n=="object"&&n&&!Array.isArray(n)&&(s.search=this.stringifyQuery(n)),s.toString()}async prepareOptions(t){}async prepareRequest(t,{url:n,options:a}){}get(t,n){return this.methodRequest("get",t,n)}post(t,n){return this.methodRequest("post",t,n)}patch(t,n){return this.methodRequest("patch",t,n)}put(t,n){return this.methodRequest("put",t,n)}delete(t,n){return this.methodRequest("delete",t,n)}methodRequest(t,n,a){return this.request(Promise.resolve(a).then(i=>({method:t,path:n,...i})))}request(t,n=null){return new jt(this,this.makeRequest(t,n,void 0))}async makeRequest(t,n,a){let i=await t,s=i.maxRetries??this.maxRetries;n==null&&(n=s),await this.prepareOptions(i);let{req:d,url:r,timeout:l}=await this.buildRequest(i,{retryCount:s-n});await this.prepareRequest(d,{url:r,options:i});let S="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),c=a===void 0?"":`, retryOf: ${a}`,o=Date.now();if(et(this).debug(`[${S}] sending request`,vt({retryOfRequestLogID:a,method:i.method,url:r,options:i,headers:d.headers})),i.signal?.aborted)throw new lt;let U=new AbortController,u=await this.fetchWithTimeout(r,d,l,U).catch($e),h=Date.now();if(u instanceof globalThis.Error){let y=`retrying, ${n} attempts remaining`;if(i.signal?.aborted)throw new lt;let N=ze(u)||/timed? ?out/i.test(String(u)+("cause"in u?String(u.cause):""));if(n)return et(this).info(`[${S}] connection ${N?"timed out":"failed"} - ${y}`),et(this).debug(`[${S}] connection ${N?"timed out":"failed"} (${y})`,vt({retryOfRequestLogID:a,url:r,durationMs:h-o,message:u.message})),this.retryRequest(i,n,a??S);throw et(this).info(`[${S}] connection ${N?"timed out":"failed"} - error; no more retries left`),et(this).debug(`[${S}] connection ${N?"timed out":"failed"} (error; no more retries left)`,vt({retryOfRequestLogID:a,url:r,durationMs:h-o,message:u.message})),N?new ft:new Ot({cause:u})}let w=`[${S}${c}] ${d.method} ${r} ${u.ok?"succeeded":"failed"} with status ${u.status} in ${h-o}ms`;if(!u.ok){let y=await this.shouldRetry(u);if(n&&y){let B=`retrying, ${n} attempts remaining`;return await zi(u.body),et(this).info(`${w} - ${B}`),et(this).debug(`[${S}] response error (${B})`,vt({retryOfRequestLogID:a,url:u.url,status:u.status,headers:u.headers,durationMs:h-o})),this.retryRequest(i,n,a??S,u.headers)}let N=y?"error; no more retries left":"error; not retryable";et(this).info(`${w} - ${N}`);let C=await u.text().catch(B=>$e(B).message),M=Di(C),W=M?void 0:C;throw et(this).debug(`[${S}] response error (${N})`,vt({retryOfRequestLogID:a,url:u.url,status:u.status,headers:u.headers,message:W,durationMs:Date.now()-o})),this.makeStatusError(u.status,M,W,u.headers)}return et(this).info(w),et(this).debug(`[${S}] response start`,vt({retryOfRequestLogID:a,url:u.url,status:u.status,headers:u.headers,durationMs:h-o})),{response:u,options:i,controller:U,requestLogID:S,retryOfRequestLogID:a,startTime:o}}getAPIList(t,n,a){return this.requestAPIList(n,a&&"then"in a?a.then(i=>({method:"get",path:t,...i})):{method:"get",path:t,...a})}requestAPIList(t,n){let a=this.makeRequest(n,null,void 0);return new tn(this,a,t)}async fetchWithTimeout(t,n,a,i){let{signal:s,method:d,...r}=n||{},l=this._makeAbort(i);s&&s.addEventListener("abort",l,{once:!0});let S=setTimeout(l,a),c=globalThis.ReadableStream&&r.body instanceof globalThis.ReadableStream||typeof r.body=="object"&&r.body!==null&&Symbol.asyncIterator in r.body,o={signal:i.signal,...c?{duplex:"half"}:{},method:"GET",...r};d&&(o.method=d.toUpperCase());try{return await this.fetch.call(void 0,t,o)}finally{clearTimeout(S)}}async shouldRetry(t){let n=t.headers.get("x-should-retry");return n==="true"?!0:n==="false"?!1:t.status===408||t.status===409||t.status===429||t.status>=500}async retryRequest(t,n,a,i){let s,d=i?.get("retry-after-ms");if(d){let l=parseFloat(d);Number.isNaN(l)||(s=l)}let r=i?.get("retry-after");if(r&&!s){let l=parseFloat(r);Number.isNaN(l)?s=Date.parse(r)-Date.now():s=l*1e3}if(s===void 0){let l=t.maxRetries??this.maxRetries;s=this.calculateDefaultRetryTimeoutMillis(n,l)}return await Gi(s),this.makeRequest(t,n-1,a)}calculateDefaultRetryTimeoutMillis(t,n){let s=n-t,d=Math.min(.5*Math.pow(2,s),8),r=1-Math.random()*.25;return d*r*1e3}async buildRequest(t,{retryCount:n=0}={}){let a={...t},{method:i,path:s,query:d,defaultBaseURL:r}=a,l=this.buildURL(s,d,r);"timeout"in a&&Fi("timeout",a.timeout),a.timeout=a.timeout??this.timeout;let{bodyHeaders:S,body:c}=this.buildBody({options:a}),o=await this.buildHeaders({options:t,method:i,bodyHeaders:S,retryCount:n});return{req:{method:i,headers:o,...a.signal&&{signal:a.signal},...globalThis.ReadableStream&&c instanceof globalThis.ReadableStream&&{duplex:"half"},...c&&{body:c},...this.fetchOptions??{},...a.fetchOptions??{}},url:l,timeout:a.timeout}}async buildHeaders({options:t,method:n,bodyHeaders:a,retryCount:i}){let s={};this.idempotencyHeader&&n!=="get"&&(t.idempotencyKey||(t.idempotencyKey=this.defaultIdempotencyKey()),s[this.idempotencyHeader]=t.idempotencyKey);let d=T([s,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(i),...t.timeout?{"X-Stainless-Timeout":String(Math.trunc(t.timeout/1e3))}:{},...Ji(),"X-\u004b\u0065\u0072\u006e\u0065\u006c-Project-Id":this.projectID,"X-\u004b\u0065\u0072\u006e\u0065\u006c-Project":this.project},await this.authHeaders(t),this._options.defaultHeaders,a,t.headers]);return this.validateHeaders(d),d.values}_makeAbort(t){return()=>t.abort()}buildBody({options:t}){let{body:n,headers:a}=t;if(!n)return n==null&&"body"in t?q(this,an,"f").call(this,{body:n,headers:T([a])}):{bodyHeaders:void 0,body:void 0};let i=T([a]);return ArrayBuffer.isView(n)||n instanceof ArrayBuffer||n instanceof DataView||typeof n=="string"&&i.values.has("content-type")||globalThis.Blob&&n instanceof globalThis.Blob||n instanceof FormData||n instanceof URLSearchParams||globalThis.ReadableStream&&n instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:n}:typeof n=="object"&&(Symbol.asyncIterator in n||Symbol.iterator in n&&"next"in n&&typeof n.next=="function")?{bodyHeaders:void 0,body:fn(n)}:typeof n=="object"&&i.values.get("content-type")==="application/x-www-form-urlencoded"?{bodyHeaders:{"content-type":"application/x-www-form-urlencoded"},body:this.stringifyQuery(n)}:q(this,an,"f").call(this,{body:n,headers:i})}app(t){return new Bn(t)}};Wa=E,an=new WeakMap,xa=new WeakSet,ks=function(){return this.baseURL!==Ms[this._options.environment||"production"]};E.\u004b\u0065\u0072\u006e\u0065\u006c=Wa;E.DEFAULT_TIMEOUT=6e4;E.\u004b\u0065\u0072\u006e\u0065\u006cError=J;E.APIError=at;E.APIConnectionError=Ot;E.APIConnectionTimeoutError=ft;E.APIUserAbortError=lt;E.NotFoundError=Ce;E.ConflictError=ke;E.RateLimitError=fe;E.BadRequestError=pe;E.AuthenticationError=ye;E.InternalServerError=ve;E.PermissionDeniedError=me;E.UnprocessableEntityError=Me;E.toFile=Ln;E.Deployments=ae;E.Apps=Xt;E.Invocations=se;E.Browsers=Ut;E.Profiles=oe;E.Auth=Nt;E.Telemetry=Et;E.Proxies=re;E.Extensions=ie;E.BrowserPools=Zt;E.Credentials=ne;E.Projects=Ht;E.Organization=bt;E.AuditLogs=Rt;E.APIKeys=Qt;E.CredentialProviders=ee;var fs=require("crypto");var Fd="pr.oxylabs.io",_d=7777,Dd=10;function vs(){return process.env.OXYLABS_USERNAME?.trim()||void 0}function Ts(){return process.env.OXYLABS_PASSWORD?.trim()||void 0}function Gd(){return(process.env.OXYLABS_COUNTRY?.trim()||"US").toUpperCase()}function Ns(){return!!(vs()&&Ts())}function Vd(){let e="";for(let t=0;t<10;t++)e+=String((0,fs.randomInt)(0,10));return e}function Kd(e={}){let t=vs();if(!t)return;let n=t.startsWith("customer-")?t:`customer-${t}`,a=(e.country?.trim()||Gd()).toUpperCase(),i=e.sticky?`-sessid-${Vd()}-sesstime-${Dd}`:"";return`${n}-cc-${a}${i}`}function La(e){return e.replace(/pr\.oxylabs\.io(:\d+)?/gi,"backup proxy").replace(/oxylabs/gi,"backup proxy")}function Yd(e){return`mcp-backup-custom-${`${Date.now()}-${e??0}-${Math.random().toString(36).slice(2,8)}`}`}async function bs(e,t={}){let n=Kd({sticky:t.sticky}),a=Ts();if(!n||!a)throw new Error("backup proxy pool is not configured");let i=new E({apiKey:e});try{let s=await i.proxies.create({type:"custom",name:Yd(t.attemptIndex),protocol:"http",config:{host:Fd,port:_d,username:n,password:a}});if(!s.id)throw new Error("backup proxy creation did not return a proxy id");return s.id}catch(s){let d=s instanceof Error?s.message:String(s);throw new Error(La(d))}}var de={austin:"Austin,Texas,United States","new york":"New York,New York,United States","new york city":"New York,New York,United States",nyc:"New York,New York,United States","los angeles":"Los Angeles,California,United States",la:"Los Angeles,California,United States",chicago:"Chicago,Illinois,United States",houston:"Houston,Texas,United States",phoenix:"Phoenix,Arizona,United States",philadelphia:"Philadelphia,Pennsylvania,United States",philly:"Philadelphia,Pennsylvania,United States","san antonio":"San Antonio,Texas,United States",dallas:"Dallas,Texas,United States",miami:"Miami,Florida,United States",seattle:"Seattle,Washington,United States",denver:"Denver,Colorado,United States",loveland:"Loveland,Colorado,United States","loveland co":"Loveland,Colorado,United States","fort collins":"Fort Collins,Colorado,United States",boulder:"Boulder,Colorado,United States","colorado springs":"Colorado Springs,Colorado,United States",boston:"Boston,Massachusetts,United States",atlanta:"Atlanta,Georgia,United States","san francisco":"San Francisco,California,United States",sf:"San Francisco,California,United States",portland:"Portland,Oregon,United States","las vegas":"Las Vegas,Nevada,United States",minneapolis:"Minneapolis,Minnesota,United States",detroit:"Detroit,Michigan,United States",nashville:"Nashville,Tennessee,United States",charlotte:"Charlotte,North Carolina,United States",orlando:"Orlando,Florida,United States","san diego":"San Diego,California,United States",baltimore:"Baltimore,Maryland,United States",sacramento:"Sacramento,California,United States",columbus:"Columbus,Ohio,United States",indianapolis:"Indianapolis,Indiana,United States","san jose":"San Jose,California,United States","fort worth":"Fort Worth,Texas,United States",jacksonville:"Jacksonville,Florida,United States",memphis:"Memphis,Tennessee,United States",louisville:"Louisville,Kentucky,United States",raleigh:"Raleigh,North Carolina,United States",richmond:"Richmond,Virginia,United States","salt lake city":"Salt Lake City,Utah,United States",toronto:"Toronto,Ontario,Canada",vancouver:"Vancouver,British Columbia,Canada",montreal:"Montreal,Quebec,Canada",calgary:"Calgary,Alberta,Canada",ottawa:"Ottawa,Ontario,Canada",london:"London,England,United Kingdom",manchester:"Manchester,England,United Kingdom",birmingham:"Birmingham,England,United Kingdom",edinburgh:"Edinburgh,Scotland,United Kingdom",glasgow:"Glasgow,Scotland,United Kingdom",leeds:"Leeds,England,United Kingdom",sydney:"Sydney,New South Wales,Australia",melbourne:"Melbourne,Victoria,Australia",brisbane:"Brisbane,Queensland,Australia",perth:"Perth,Western Australia,Australia",adelaide:"Adelaide,South Australia,Australia",dublin:"Dublin,Leinster,Ireland"};var Ps=`3, Nanjemoy,Maryland,United States
194
11
  Aaronsburg,Pennsylvania,United States
195
12
  Abbeville,Alabama,United States
196
13
  Abbeville,Georgia,United States
@@ -21882,24 +21699,97 @@ Zortman,Montana,United States
21882
21699
  Zuehl,Texas,United States
21883
21700
  Zumbrota,Minnesota,United States
21884
21701
  Zuni,New Mexico,United States
21885
- Zwolle,Louisiana,United States`,xs={ad:"Andorra",ae:"United Arab Emirates",af:"Afghanistan",ag:"Antigua and Barbuda",al:"Albania",am:"Armenia",ao:"Angola",aq:"Antarctica",ar:"Argentina",as:"American Samoa",at:"Austria",au:"Australia",az:"Azerbaijan",ba:"Bosnia and Herzegovina",bb:"Barbados",bd:"Bangladesh",be:"Belgium",bf:"Burkina Faso",bg:"Bulgaria",bh:"Bahrain",bi:"Burundi",bj:"Benin",bl:"Saint Barthelemy",bn:"Brunei",bo:"Bolivia",bq:"Caribbean Netherlands",br:"Brazil",bs:"The Bahamas",bt:"Bhutan",bw:"Botswana",by:"Belarus",bz:"Belize",ca:"Canada",cc:"Cocos (Keeling) Islands",cd:"Democratic Republic of the Congo",cf:"Central African Republic",cg:"Republic of the Congo",ch:"Switzerland",ci:"Cote d'Ivoire",ck:"Cook Islands",cl:"Chile",cm:"Cameroon",cn:"China",co:"Colombia",cr:"Costa Rica",cv:"Cabo Verde",cw:"Curacao",cx:"Christmas Island",cy:"Cyprus",cz:"Czechia",de:"Germany",dj:"Djibouti",dk:"Denmark",dm:"Dominica",do:"Dominican Republic",dz:"Algeria",ec:"Ecuador",ee:"Estonia",eg:"Egypt",er:"Eritrea",es:"Spain",et:"Ethiopia",fi:"Finland",fj:"Fiji",fm:"Micronesia",fr:"France",ga:"Gabon",gb:"United Kingdom",gd:"Grenada",ge:"Georgia",gg:"Guernsey",gh:"Ghana",gm:"The Gambia",gn:"Guinea",gq:"Equatorial Guinea",gr:"Greece",gs:"South Georgia and the South Sandwich Islands",gt:"Guatemala",gu:"Guam",gw:"Guinea-Bissau",gy:"Guyana",hm:"Heard Island and McDonald Islands",hn:"Honduras",hr:"Croatia",ht:"Haiti",hu:"Hungary",id:"Indonesia",ie:"Ireland",il:"Israel",im:"Isle of Man",in:"India",iq:"Iraq",is:"Iceland",it:"Italy",je:"Jersey",jm:"Jamaica",jo:"Jordan",jp:"Japan",ke:"Kenya",kg:"Kyrgyzstan",kh:"Cambodia",ki:"Kiribati",km:"Comoros",kn:"Saint Kitts and Nevis",kr:"South Korea",kw:"Kuwait",kz:"Kazakhstan",la:"Laos",lb:"Lebanon",lc:"Saint Lucia",li:"Liechtenstein",lk:"Sri Lanka",lr:"Liberia",ls:"Lesotho",lt:"Lithuania",lu:"Luxembourg",lv:"Latvia",ly:"Libya",ma:"Morocco",mc:"Monaco",md:"Moldova",me:"Montenegro",mf:"Saint Martin",mg:"Madagascar",mh:"Marshall Islands",mk:"North Macedonia",ml:"Mali",mm:"Myanmar (Burma)",mn:"Mongolia",mp:"Northern Mariana Islands",mr:"Mauritania",mt:"Malta",mu:"Mauritius",mv:"Maldives",mw:"Malawi",mx:"Mexico",my:"Malaysia",mz:"Mozambique",na:"Namibia",nc:"New Caledonia",ne:"Niger",nf:"Norfolk Island",ng:"Nigeria",ni:"Nicaragua",nl:"Netherlands",no:"Norway",np:"Nepal",nr:"Nauru",nu:"Niue",nz:"New Zealand",om:"Oman",pa:"Panama",pe:"Peru",pf:"French Polynesia",pg:"Papua New Guinea",ph:"Philippines",pk:"Pakistan",pl:"Poland",pm:"Saint Pierre and Miquelon",pn:"Pitcairn Islands",pt:"Portugal",pw:"Palau",py:"Paraguay",qa:"Qatar",ro:"Romania",rs:"Serbia",ru:"Russia",rw:"Rwanda",sa:"Saudi Arabia",sb:"Solomon Islands",sc:"Seychelles",sd:"Sudan",se:"Sweden",sg:"Singapore",sh:"Saint Helena, Ascension and Tristan da Cunha",si:"Slovenia",sk:"Slovakia",sl:"Sierra Leone",sm:"San Marino",sn:"Senegal",so:"Somalia",sr:"Suriname",ss:"South Sudan",st:"Sao Tome and Principe",sv:"El Salvador",sx:"Sint Maarten",sy:"Syria",sz:"Eswatini",td:"Chad",tf:"French Southern and Antarctic Lands",tg:"Togo",th:"Thailand",tj:"Tajikistan",tk:"Tokelau",tl:"Timor-Leste",tm:"Turkmenistan",tn:"Tunisia",to:"Tonga",tr:"Turkiye",tt:"Trinidad and Tobago",tv:"Tuvalu",tz:"Tanzania",ua:"Ukraine",ug:"Uganda",um:"United States Minor Outlying Islands",us:"United States",uy:"Uruguay",uz:"Uzbekistan",va:"Vatican City",vc:"Saint Vincent and the Grenadines",ve:"Venezuela",vn:"Vietnam",vu:"Vanuatu",wf:"Wallis and Futuna",ws:"Samoa",ye:"Yemen",za:"South Africa",zm:"Zambia",zw:"Zimbabwe"};var Ha={AL:"Alabama",AK:"Alaska",AZ:"Arizona",AR:"Arkansas",CA:"California",CO:"Colorado",CT:"Connecticut",DE:"Delaware",DC:"District of Columbia",FL:"Florida",GA:"Georgia",HI:"Hawaii",ID:"Idaho",IL:"Illinois",IN:"Indiana",IA:"Iowa",KS:"Kansas",KY:"Kentucky",LA:"Louisiana",ME:"Maine",MD:"Maryland",MA:"Massachusetts",MI:"Michigan",MN:"Minnesota",MS:"Mississippi",MO:"Missouri",MT:"Montana",NE:"Nebraska",NV:"Nevada",NH:"New Hampshire",NJ:"New Jersey",NM:"New Mexico",NY:"New York",NC:"North Carolina",ND:"North Dakota",OH:"Ohio",OK:"Oklahoma",OR:"Oregon",PA:"Pennsylvania",PR:"Puerto Rico",RI:"Rhode Island",SC:"South Carolina",SD:"South Dakota",TN:"Tennessee",TX:"Texas",UT:"Utah",VT:"Vermont",VA:"Virginia",WA:"Washington",WV:"West Virginia",WI:"Wisconsin",WY:"Wyoming"};var Da=null,Rs=null;function Xd(){if(Da)return;let e=new Map,t=new Map;for(let n of Ls.split(`
21886
- `)){let a=n.trim();if(!a)continue;let i=a.toLowerCase();e.has(i)||e.set(i,a);let s=i.split(",",1)[0],o=t.get(s);o?o.push(a):t.set(s,[a])}for(let n of Object.values(xs)){let a=String(n).toLowerCase();e.has(a)||e.set(a,String(n))}Da=e,Rs=t}function qd(e){let t=[],n=e;do{let a=n&127;n>>>=7,n>0&&(a|=128),t.push(a)}while(n>0);return t}function Ws(e){let t=Buffer.from(e,"utf8");return`w+${Buffer.concat([Buffer.from([8,2,16,32,34]),Buffer.from(qd(t.length)),t]).toString("base64")}`}function Os(){return{canonical:null,matched:!1,source:"unresolved",ambiguousCandidates:0}}function Ot(e,t){return{canonical:e,matched:!0,source:t,ambiguousCandidates:0}}function Ba(e){let t=e.toLowerCase().trim();if(!t)return Os();if(ne[t])return Ot(ne[t],"alias");Xd();let n=Da,a=Rs,i=n.get(t);if(i)return Ot(i,"exact");let s=n.get(`${t},united states`);if(s)return Ot(s,"state-or-country");let o=t.split(",");if(o.length>=2){let r=o[0].trim(),u=o.slice(1).join(",").trim(),c=Ha[u.toUpperCase()]??u,h=n.get(`${r},${c.toLowerCase()},united states`);if(h)return Ot(h,"city-state")}let d=t.match(/^(.*?)[\s,]+([a-z]{2})$/);if(d){let r=Ha[d[2].toUpperCase()];if(r){let u=n.get(`${d[1].trim()},${r.toLowerCase()},united states`);if(u)return Ot(u,"city-state")}}let l=a.get(t);if(l?.length===1)return Ot(l[0],"city-unique");if(l&&l.length>1)return{canonical:null,matched:!1,source:"unresolved",ambiguousCandidates:l.length};let S=o[0].trim();if(S!==t&&ne[S])return Ot(ne[S],"alias-partial");let U=t.replace(/\s+[a-z]{2}$/,"").trim();return U!==t&&ne[U]?Ot(ne[U],"alias-partial"):Os()}function Hs(e){return Ba(e).canonical??e}var Fa={alabama:"AL",alaska:"AK",arizona:"AZ",arkansas:"AR",california:"CA",colorado:"CO",connecticut:"CT",delaware:"DE",florida:"FL",georgia:"GA",hawaii:"HI",idaho:"ID",illinois:"IL",indiana:"IN",iowa:"IA",kansas:"KS",kentucky:"KY",louisiana:"LA",maine:"ME",maryland:"MD",massachusetts:"MA",michigan:"MI",minnesota:"MN",mississippi:"MS",missouri:"MO",montana:"MT",nebraska:"NE",nevada:"NV","new hampshire":"NH","new jersey":"NJ","new mexico":"NM","new york":"NY","north carolina":"NC","north dakota":"ND",ohio:"OH",oklahoma:"OK",oregon:"OR",pennsylvania:"PA","rhode island":"RI","south carolina":"SC","south dakota":"SD",tennessee:"TN",texas:"TX",utah:"UT",vermont:"VT",virginia:"VA",washington:"WA","west virginia":"WV",wisconsin:"WI",wyoming:"WY","district of columbia":"DC"},jd=[...Object.keys(Fa).map(e=>e.replace(/\s+/g,"\\s+")),...Object.values(Fa)].join("|"),zd=new RegExp(`\\b([A-Z][A-Za-z]+(?:[\\s.-][A-Z][A-Za-z]+){0,4}),?\\s+(${jd})\\b`,"gi");function Bs(e){if(!e)return null;let t=e.trim();return/^[A-Z]{2}$/i.test(t)?t.toUpperCase():Fa[t.toLowerCase()]??null}function Fs(e){return e.replace(/\s+/g," ").trim().replace(/^.*\b(?:in|near|around|serving)\s+/i,"").toLowerCase().replace(/\b[a-z]/g,n=>n.toUpperCase())}function $d(e){if(!e)return null;let[t="",n=""]=e.split(",").map(a=>a.trim());return{city:Fs(t),regionCode:Bs(n),canonicalLocation:e}}function Qd(e,t,n,a){let i=Fs(t),s=Bs(n);if(!i||!s)return;let o=`${i.toLowerCase()}|${s}`,d=e.get(o);if(d){d.count++,d.examples.length<3&&!d.examples.includes(a)&&d.examples.push(a);return}e.set(o,{city:i,regionCode:s,count:1,examples:[a]})}function Zd(e){try{return decodeURIComponent(e)}catch{}try{return decodeURIComponent(e.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return e}}function Ds(e,t){let n=Zd(t).replace(/[+/|_-]+/g," ");for(let a of n.matchAll(zd))Qd(e,a[1]??"",a[2]??"",n.slice(0,180))}function tn(e,t,n){let a=$d(e),i=new Map;for(let d of t)Ds(i,[d.title,d.snippet??"",d.cite??"",d.url].join(" "));for(let d of n)Ds(i,[d.name,...d.metadata,d.websiteUrl??"",d.directionsUrl??""].join(" "));let s=Array.from(i.values()).sort((d,l)=>l.count-d.count||d.city.localeCompare(l.city)).slice(0,8);return a?s.length===0?{status:"unknown",expected:a,candidates:[]}:{status:s.some(d=>d.city.toLowerCase()===a.city.toLowerCase()&&(a.regionCode==null||d.regionCode===a.regionCode))?"matched":"mismatch",expected:a,candidates:s}:{status:"not_requested",expected:null,candidates:s}}var tl=[/An AI Overview is not available for this search/gi,/Can't generate an AI overview right now\.?\s*Try again later\.?/gi,/\bAI Overview\b/gi,/\bView all\b/gi],el=[/\bRelated Links\b/i,/\bAsk anything in\s*AI Mode\b/i,/\bAI can make mistakes\b/i,/\bThis is for informational purposes only\b/i,/\bShow more\b/i,/\b\d+\s+sites\b/i,/\b\d{1,2}\s*[msh]\s*[A-Z][A-Za-z]/,/\b(?:YouTube|Reddit|Facebook|Instagram|TikTok)·/];function Hn(e){return e.replace(/\u00a0/g," ").replace(/([.!?])([A-Z])/g,"$1 $2").replace(/([:;])([A-Z])/g,"$1 $2").replace(/([a-z])([A-Z][a-z])/g,"$1 $2").replace(/(\d)([A-Z][a-z])/g,"$1 $2").replace(/([a-z])(\d)/g,"$1 $2").replace(/\s+/g," ").trim()}function nl(e){let t=-1;for(let n of el){let a=n.exec(e);n.lastIndex=0,a&&(t===-1||a.index<t)&&(t=a.index)}return t===-1?e:e.slice(0,t)}function al(e,t){let n=t?.trim();if(!n||n.length<8)return e;let a=e.toLowerCase().indexOf(n.toLowerCase());return a>40?e.slice(0,a):e}function il(e){let t=e.match(/[•·]\s*(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?\s+\d{1,2},\s+\d{4}/i);if(t?.index&&t.index>40)return t.index;let n=Math.max(0,e.length-260),a=e.slice(n),i=[...a.matchAll(/[.!?]\s*(?=[A-Z][A-Za-z0-9"'$])/g)];for(let o of i){let d=a.slice(o.index+1).trim(),l=d.slice(0,160),S=/^(?:Best|Top|What|How|Why|When|Where|Which|Can|Should|Is|Are|Do|Does)\b/i.test(d);if(d.length>20&&S&&/(?:\s[-|]\s|Heating|Cooling|Company|Services|Blog|Guide|Review)/i.test(l))return n+o.index+1}let s=i.at(-1);return s?.index!==void 0?n+s.index+1:e.length}function sl(e){let t=e.match(/https?:\/\/\S+/i);if(!t?.index)return e;let n=e.slice(0,t.index);return n.slice(0,il(n))}function ol(e){if(e.length<=1200)return e;let t=e.slice(0,1200),n=Math.max(t.lastIndexOf("."),t.lastIndexOf("!"),t.lastIndexOf("?"));return(n>240?t.slice(0,n+1):t).trim()}function Gs(e,t,n){if(!e)return;let a=Hn(e),i=t?Hn(t):"";if(i&&a.toLowerCase().startsWith(i.toLowerCase())&&(a=a.slice(i.length).trim()),!/^An error has occurred\.?\s*Please try again later\.?/i.test(a)){for(let s of tl)a=a.replace(s," ");if(a=a.replace(/\b[A-Z][A-Za-z&'\u2019 -]{2,60}\+\d+\b/g," ").replace(/\b(?:[a-z0-9-]+\.)+[a-z]{2,}\+\d+\b/gi," "),a=Hn(a),a=nl(a),a=al(a,n),a=sl(a),a=Hn(a),a=a.replace(/\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\.?\s+\d{1,2},\s+\d{4}$/i,"").trim(),a=ol(a),!!a&&!/^An error has occurred\.?\s*Please try again later\.?$/i.test(a))return a}}async function Vs(e){let t=e??{aio:{root:"[data-lhcontainer][data-streaming-container][eid]",legacyRoot:'[data-hveid="CBMQAA"]',wrapper:".Fgyi2e",controller:'[jscontroller="AkrxPe"]',contentSubtree:'[data-subtree="mfc"]',heading:".Fzsovc.cwYVJe.RJPOee",header:".heWuVc",showMoreButton:'[aria-label="Show more AI Overview"]',sourcesPanel:".OZ9ddf.WAUd4",disclaimer:".DuQANe.MSJHRb"},aim:{root:'[data-hveid="CAUQAA"]',wrapper:".Fgyi2e"},expandWaitMs:1500},n=window.google?.sn??"unknown",a=n==="aim"?"aim":n==="web"?"web":"unknown";function i(y){return y?(y.innerText??y.textContent??"").trim():""}function s(y){if(!y)return!1;let E=y.replace(/\s+/g," ").trim();return E.length>=16&&E.split(" ").filter(Boolean).length>=2}function o(y){let E=y.querySelector(t.aio.heading);if(i(E)==="AI Overview")return!0;let p=y.querySelector(t.aio.header);return!!i(p).split(/\n|\s{2,}/).some(C=>C.trim()==="AI Overview")}function d(){let E=Array.from(document.querySelectorAll(t.aio.root)).find(o);if(E)return E;if(t.aio.legacyRoot){let C=document.querySelector(t.aio.legacyRoot);if(C&&o(C))return C}let p=document.querySelectorAll(`${t.aio.heading}, h1, h2, h3, [role="heading"]`);for(let C of p){if(i(C)!=="AI Overview")continue;let N=C.parentElement;for(let I=0;I<8&&N;I++){if(N.matches(t.aio.root)||N.querySelector(t.aio.controller)||N.querySelector(t.aio.contentSubtree))return N;N=N.parentElement}return C.parentElement}return null}function l(y){if(!y)return null;let E=y.cloneNode(!0);E.querySelectorAll(["script","style","noscript","img","picture","video",t.aio.header,t.aio.showMoreButton,t.aio.sourcesPanel,t.aio.disclaimer,'[data-subtree="dfa"]',"[data-src-id]",'[role="dialog"]',".HWMcu",".bTFeG",".CyMdWb",".MFrAxb",".F0OfWd.hfWAgb",".x2qcTc.fZavHb",".SvjEff",".sR2MY",".lKuDef",".GSPQcc","a[href]","button",'[role="button"]'].join(",")).forEach(x=>x.remove());let p=document.createElement("div");p.style.position="fixed",p.style.left="-10000px",p.style.top="0",p.style.width=`${Math.max(320,Math.round(y.getBoundingClientRect?.().width||960))}px`,p.style.opacity="0",p.style.pointerEvents="none",p.append(E),document.body.append(p);let C=E.innerText||E.textContent||"";p.remove();let N=C.replace(/\r/g,"").replace(/[ \t]+\n/g,`
21702
+ Zwolle,Louisiana,United States`,Is={ad:"Andorra",ae:"United Arab Emirates",af:"Afghanistan",ag:"Antigua and Barbuda",al:"Albania",am:"Armenia",ao:"Angola",aq:"Antarctica",ar:"Argentina",as:"American Samoa",at:"Austria",au:"Australia",az:"Azerbaijan",ba:"Bosnia and Herzegovina",bb:"Barbados",bd:"Bangladesh",be:"Belgium",bf:"Burkina Faso",bg:"Bulgaria",bh:"Bahrain",bi:"Burundi",bj:"Benin",bl:"Saint Barthelemy",bn:"Brunei",bo:"Bolivia",bq:"Caribbean Netherlands",br:"Brazil",bs:"The Bahamas",bt:"Bhutan",bw:"Botswana",by:"Belarus",bz:"Belize",ca:"Canada",cc:"Cocos (Keeling) Islands",cd:"Democratic Republic of the Congo",cf:"Central African Republic",cg:"Republic of the Congo",ch:"Switzerland",ci:"Cote d'Ivoire",ck:"Cook Islands",cl:"Chile",cm:"Cameroon",cn:"China",co:"Colombia",cr:"Costa Rica",cv:"Cabo Verde",cw:"Curacao",cx:"Christmas Island",cy:"Cyprus",cz:"Czechia",de:"Germany",dj:"Djibouti",dk:"Denmark",dm:"Dominica",do:"Dominican Republic",dz:"Algeria",ec:"Ecuador",ee:"Estonia",eg:"Egypt",er:"Eritrea",es:"Spain",et:"Ethiopia",fi:"Finland",fj:"Fiji",fm:"Micronesia",fr:"France",ga:"Gabon",gb:"United Kingdom",gd:"Grenada",ge:"Georgia",gg:"Guernsey",gh:"Ghana",gm:"The Gambia",gn:"Guinea",gq:"Equatorial Guinea",gr:"Greece",gs:"South Georgia and the South Sandwich Islands",gt:"Guatemala",gu:"Guam",gw:"Guinea-Bissau",gy:"Guyana",hm:"Heard Island and McDonald Islands",hn:"Honduras",hr:"Croatia",ht:"Haiti",hu:"Hungary",id:"Indonesia",ie:"Ireland",il:"Israel",im:"Isle of Man",in:"India",iq:"Iraq",is:"Iceland",it:"Italy",je:"Jersey",jm:"Jamaica",jo:"Jordan",jp:"Japan",ke:"Kenya",kg:"Kyrgyzstan",kh:"Cambodia",ki:"Kiribati",km:"Comoros",kn:"Saint Kitts and Nevis",kr:"South Korea",kw:"Kuwait",kz:"Kazakhstan",la:"Laos",lb:"Lebanon",lc:"Saint Lucia",li:"Liechtenstein",lk:"Sri Lanka",lr:"Liberia",ls:"Lesotho",lt:"Lithuania",lu:"Luxembourg",lv:"Latvia",ly:"Libya",ma:"Morocco",mc:"Monaco",md:"Moldova",me:"Montenegro",mf:"Saint Martin",mg:"Madagascar",mh:"Marshall Islands",mk:"North Macedonia",ml:"Mali",mm:"Myanmar (Burma)",mn:"Mongolia",mp:"Northern Mariana Islands",mr:"Mauritania",mt:"Malta",mu:"Mauritius",mv:"Maldives",mw:"Malawi",mx:"Mexico",my:"Malaysia",mz:"Mozambique",na:"Namibia",nc:"New Caledonia",ne:"Niger",nf:"Norfolk Island",ng:"Nigeria",ni:"Nicaragua",nl:"Netherlands",no:"Norway",np:"Nepal",nr:"Nauru",nu:"Niue",nz:"New Zealand",om:"Oman",pa:"Panama",pe:"Peru",pf:"French Polynesia",pg:"Papua New Guinea",ph:"Philippines",pk:"Pakistan",pl:"Poland",pm:"Saint Pierre and Miquelon",pn:"Pitcairn Islands",pt:"Portugal",pw:"Palau",py:"Paraguay",qa:"Qatar",ro:"Romania",rs:"Serbia",ru:"Russia",rw:"Rwanda",sa:"Saudi Arabia",sb:"Solomon Islands",sc:"Seychelles",sd:"Sudan",se:"Sweden",sg:"Singapore",sh:"Saint Helena, Ascension and Tristan da Cunha",si:"Slovenia",sk:"Slovakia",sl:"Sierra Leone",sm:"San Marino",sn:"Senegal",so:"Somalia",sr:"Suriname",ss:"South Sudan",st:"Sao Tome and Principe",sv:"El Salvador",sx:"Sint Maarten",sy:"Syria",sz:"Eswatini",td:"Chad",tf:"French Southern and Antarctic Lands",tg:"Togo",th:"Thailand",tj:"Tajikistan",tk:"Tokelau",tl:"Timor-Leste",tm:"Turkmenistan",tn:"Tunisia",to:"Tonga",tr:"Turkiye",tt:"Trinidad and Tobago",tv:"Tuvalu",tz:"Tanzania",ua:"Ukraine",ug:"Uganda",um:"United States Minor Outlying Islands",us:"United States",uy:"Uruguay",uz:"Uzbekistan",va:"Vatican City",vc:"Saint Vincent and the Grenadines",ve:"Venezuela",vn:"Vietnam",vu:"Vanuatu",wf:"Wallis and Futuna",ws:"Samoa",ye:"Yemen",za:"South Africa",zm:"Zambia",zw:"Zimbabwe"};var Oa={AL:"Alabama",AK:"Alaska",AZ:"Arizona",AR:"Arkansas",CA:"California",CO:"Colorado",CT:"Connecticut",DE:"Delaware",DC:"District of Columbia",FL:"Florida",GA:"Georgia",HI:"Hawaii",ID:"Idaho",IL:"Illinois",IN:"Indiana",IA:"Iowa",KS:"Kansas",KY:"Kentucky",LA:"Louisiana",ME:"Maine",MD:"Maryland",MA:"Massachusetts",MI:"Michigan",MN:"Minnesota",MS:"Mississippi",MO:"Missouri",MT:"Montana",NE:"Nebraska",NV:"Nevada",NH:"New Hampshire",NJ:"New Jersey",NM:"New Mexico",NY:"New York",NC:"North Carolina",ND:"North Dakota",OH:"Ohio",OK:"Oklahoma",OR:"Oregon",PA:"Pennsylvania",PR:"Puerto Rico",RI:"Rhode Island",SC:"South Carolina",SD:"South Dakota",TN:"Tennessee",TX:"Texas",UT:"Utah",VT:"Vermont",VA:"Virginia",WA:"Washington",WV:"West Virginia",WI:"Wisconsin",WY:"Wyoming"};var Ba=null,xs=null;function Jd(){if(Ba)return;let e=new Map,t=new Map;for(let n of Ps.split(`
21703
+ `)){let a=n.trim();if(!a)continue;let i=a.toLowerCase();e.has(i)||e.set(i,a);let s=i.split(",",1)[0],d=t.get(s);d?d.push(a):t.set(s,[a])}for(let n of Object.values(Is)){let a=String(n).toLowerCase();e.has(a)||e.set(a,String(n))}Ba=e,xs=t}function qd(e){let t=[],n=e;do{let a=n&127;n>>>=7,n>0&&(a|=128),t.push(a)}while(n>0);return t}function Ws(e){let t=Buffer.from(e,"utf8");return`w+${Buffer.concat([Buffer.from([8,2,16,32,34]),Buffer.from(qd(t.length)),t]).toString("base64")}`}function As(){return{canonical:null,matched:!1,source:"unresolved",ambiguousCandidates:0}}function Ft(e,t){return{canonical:e,matched:!0,source:t,ambiguousCandidates:0}}function Ra(e){let t=e.toLowerCase().trim();if(!t)return As();if(de[t])return Ft(de[t],"alias");Jd();let n=Ba,a=xs,i=n.get(t);if(i)return Ft(i,"exact");let s=n.get(`${t},united states`);if(s)return Ft(s,"state-or-country");let d=t.split(",");if(d.length>=2){let o=d[0].trim(),U=d.slice(1).join(",").trim(),u=Oa[U.toUpperCase()]??U,h=n.get(`${o},${u.toLowerCase()},united states`);if(h)return Ft(h,"city-state")}let r=t.match(/^(.*?)[\s,]+([a-z]{2})$/);if(r){let o=Oa[r[2].toUpperCase()];if(o){let U=n.get(`${r[1].trim()},${o.toLowerCase()},united states`);if(U)return Ft(U,"city-state")}}let l=a.get(t);if(l?.length===1)return Ft(l[0],"city-unique");if(l&&l.length>1)return{canonical:null,matched:!1,source:"unresolved",ambiguousCandidates:l.length};let S=d[0].trim();if(S!==t&&de[S])return Ft(de[S],"alias-partial");let c=t.replace(/\s+[a-z]{2}$/,"").trim();return c!==t&&de[c]?Ft(de[c],"alias-partial"):As()}function Ls(e){return Ra(e).canonical??e}var Os={alabama:"AL",alaska:"AK",arizona:"AZ",arkansas:"AR",california:"CA",colorado:"CO",connecticut:"CT",delaware:"DE",florida:"FL",georgia:"GA",hawaii:"HI",idaho:"ID",illinois:"IL",indiana:"IN",iowa:"IA",kansas:"KS",kentucky:"KY",louisiana:"LA",maine:"ME",maryland:"MD",massachusetts:"MA",michigan:"MI",minnesota:"MN",mississippi:"MS",missouri:"MO",montana:"MT",nebraska:"NE",nevada:"NV","new hampshire":"NH","new jersey":"NJ","new mexico":"NM","new york":"NY","north carolina":"NC","north dakota":"ND",ohio:"OH",oklahoma:"OK",oregon:"OR",pennsylvania:"PA","rhode island":"RI","south carolina":"SC","south dakota":"SD",tennessee:"TN",texas:"TX",utah:"UT",vermont:"VT",virginia:"VA",washington:"WA","west virginia":"WV",wisconsin:"WI",wyoming:"WY"},zd={"atlanta|GA":"30303","austin|TX":"78701","baltimore|MD":"21201","boston|MA":"02108","boulder|CO":"80302","charlotte|NC":"28202","chicago|IL":"60601","colorado_springs|CO":"80903","columbus|OH":"43215","dallas|TX":"75201","denver|CO":"80202","detroit|MI":"48226","fort_collins|CO":"80524","fort_worth|TX":"76102","houston|TX":"77002","indianapolis|IN":"46204","jacksonville|FL":"32202","las_vegas|NV":"89101","los_angeles|CA":"90012","louisville|KY":"40202","loveland|CO":"80537","memphis|TN":"38103","miami|FL":"33131","minneapolis|MN":"55401","nashville|TN":"37203","new_york|NY":"10001","orlando|FL":"32801","philadelphia|PA":"19103","phoenix|AZ":"85004","portland|OR":"97205","raleigh|NC":"27601","richmond|VA":"23219","sacramento|CA":"95814","salt_lake_city|UT":"84101","san_antonio|TX":"78205","san_diego|CA":"92101","san_francisco|CA":"94103","san_jose|CA":"95113","seattle|WA":"98101"};function $d(e){return e?e.slice(-6):null}function St(e,t,n,a,i,s=!1){return{\u006b\u0065\u0072\u006e\u0065\u006cProxyId:n,...s&&n?{disposableProxyId:n}:{},resolution:{source:e,proxyType:e==="disabled"?"none":e==="configured_fallback"?"configured":e==="mobile_created"?"mobile":e==="isp_created"?"isp":e==="backup_custom"?"custom":e==="location_created"||e==="location_reused"?"residential":"unknown",proxyMode:t,proxyIdPresent:!!n,proxyIdSuffix:$d(n),target:a,error:i,disposable:s}}}function jd(e){return e.trim().toLowerCase().replace(/\s+/g," ")}function Qd(e){return e.trim().toLowerCase().replace(/\./g,"").replace(/\s+/g," ")}function Xd(e){if(!e)return!0;let t=Qd(e);return t==="united states"||t==="united states of america"||t==="usa"||t==="us"}function Bs(e){let t=e.trim();if(/^[A-Za-z]{2}$/.test(t)){let n=t.toUpperCase();return Object.values(Os).includes(n)?n:null}return Os[jd(t)]??null}function Zd(e){let n=e.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),a=n.join("_"),i=n.join("");return Array.from(new Set([a,i].filter(Boolean)))}function Dt(e,t,n){return n?`mcp-serp-residential-${e.toLowerCase()}-${t.toLowerCase()}-${n}`:`mcp-serp-residential-${e.toLowerCase()}-${t.toLowerCase()}`}function Rn(e,t){let n=`${Date.now()}-${t??0}-${Math.random().toString(36).slice(2,8)}`;return`${e}-fresh-${n}`}function tl(e){return`mcp-serp-residential-us-zip-${e}`}function el(e,t){if(!e||t.toLowerCase()!=="us")return null;let n=Ls(e),a=n.split(",").map(S=>S.trim()).filter(Boolean);if(a.length>1&&Xd(a[a.length-1])&&(a=a.slice(0,-1)),a.length===1){let S=Bs(a[0]);return S?{canonicalLocation:n,level:"state",country:"US",state:S,city:"",cityCandidates:[],proxyName:Dt("US",S),config:{country:"US",state:S}}:null}let[i="",s=""]=a;if(!i||!s)return null;let d=Bs(s);if(!d)return null;let r=Zd(i),l=r[0];return l?{canonicalLocation:n,level:"city",country:"US",state:d,city:l,cityCandidates:r,proxyName:Dt("US",d,l),config:{country:"US",state:d,city:l}}:null}function nl(e){return`${e.city}|${e.state}`}function Rs(e,t){return t&&/^\d{5}$/.test(t)?t:zd[nl(e)]??null}function Hs(e,t){return{...e,level:"zip",zip:t,proxyName:tl(t),config:{country:e.country,state:e.state,zip:t}}}function Ha(e,t){return{...e,proxyName:t}}function Fa(e,t,n){return t.level==="zip"?e?.country?.toUpperCase()===t.country&&e?.zip===t.zip:e?.country?.toUpperCase()===t.country&&e?.state?.toUpperCase()===t.state&&(n?e?.city===n:!e?.city)}function al(e,t){return e.find(n=>n.type==="residential"&&n.status!=="unavailable"&&!!n.id&&(n.name===t.proxyName||Fa(n.config,t,t.level==="city"?t.city:void 0)))??null}function il(e,t){for(let n of t.cityCandidates){let a=Dt(t.country,t.state,n),i=e.find(s=>s.type==="residential"&&s.status!=="unavailable"&&!!s.id&&(s.name===a||Fa(s.config,t,n)));if(i)return i}return null}function Hn(e){return{...e,level:"state",proxyName:Dt(e.country,e.state),config:{country:e.country,state:e.state}}}function sl(e,t){let n=Dt(t.country,t.state);return e.find(a=>a.type==="residential"&&a.status!=="unavailable"&&!!a.id&&(a.name===n||Fa(a.config,t)))??null}function ol(e,t){return Hn(e)}function _t(e){return e instanceof Error?e.message:String(e)}function rl(e,t,n){let a=[],i=Rs(e,t);if(i){let d=Hs(e,i);a.push(Ha(d,Rn(d.proxyName,n)))}for(let d of e.cityCandidates){let r={...e,level:"city",city:d,proxyName:Dt(e.country,e.state,d),config:{country:e.country,state:e.state,city:d}};a.push(Ha(r,Rn(r.proxyName,n)))}let s=Hn(e);return a.push(Ha(s,Rn(s.proxyName,n))),a}async function Ea(e,t,n){if(e.backupOnExhaustion&&n.length>0&&e.\u006b\u0065\u0072\u006e\u0065\u006cApiKey&&Ns())try{let a=await bs(e.\u006b\u0065\u0072\u006e\u0065\u006cApiKey,{attemptIndex:e.attemptIndex});return St("backup_custom",e.proxyMode,a,t,null,!0)}catch(a){n.push(`backup: ${La(_t(a))}`)}return St("configured_fallback",e.proxyMode,e.configured\u004b\u0065\u0072\u006e\u0065\u006cProxyId,t,n.join(" | "))}async function dl(e,t,n){let a=[];for(let i of rl(n,t.proxyZip,t.attemptIndex))try{let s=await e.proxies.create({type:"residential",name:i.proxyName,config:i.level==="zip"?{country:i.country,zip:i.zip}:i.config});if(s.id)return St("location_created",t.proxyMode,s.id,i,null,!0);a.push(`${i.proxyName}: \u004b\u0065\u0072\u006e\u0065\u006c did not return a proxy id`)}catch(s){a.push(`${i.proxyName}: ${_t(s)}`)}if(process.env.\u004b\u0045\u0052\u004e\u0045\u004c_PROXY_TYPE!=="residential"){let i=Hn(n);try{let s=await e.proxies.create({type:"isp",name:Rn(`mcp-serp-isp-${i.country.toLowerCase()}-${(i.state??"").toLowerCase()}`,t.attemptIndex),config:{country:i.country,...i.state?{state:i.state}:{}}});if(s.id)return St("isp_created",t.proxyMode,s.id,i,null,!0);a.push("isp: \u004b\u0065\u0072\u006e\u0065\u006c did not return a proxy id")}catch(s){a.push(`isp: ${_t(s)}`)}}return Ea(t,n,a)}async function Es(e,t){if(!e||!t)return;await new E({apiKey:e}).proxies.delete(t)}async function Fs(e){if(e.proxyMode==="none")return St("disabled",e.proxyMode,void 0,null,null);if(e.proxyMode==="configured")return St("configured_fallback",e.proxyMode,e.configured\u004b\u0065\u0072\u006e\u0065\u006cProxyId,null,null);let t=el(e.location,e.gl);if(!t||!e.\u006b\u0065\u0072\u006e\u0065\u006cApiKey)return St("configured_fallback",e.proxyMode,e.configured\u004b\u0065\u0072\u006e\u0065\u006cProxyId,t,t?null:"location could not be normalized to a US city/state proxy target");let n=new E({apiKey:e.\u006b\u0065\u0072\u006e\u0065\u006cApiKey});try{let a=e.attemptIndex??0;if(e.fresh)return await dl(n,e,t);if(a>=1){let c=ol(t,a),o=[];try{let U=await n.proxies.create({type:"residential",name:c.proxyName,config:c.config});if(U.id)return St("location_created",e.proxyMode,U.id,c,null);o.push(`${c.state}: \u004b\u0065\u0072\u006e\u0065\u006c did not return a proxy id`)}catch(U){o.push(`${c.state}: ${_t(U)}`)}return Ea(e,c,o)}let i=[];for await(let c of await n.proxies.list())i.push(c);let s=Rs(t,e.proxyZip),d=[];if(s){let c=Hs(t,s),o=al(i,c);if(o?.id)return St("location_reused",e.proxyMode,o.id,c,null);try{let U=await n.proxies.create({type:"residential",name:c.proxyName,config:{country:c.country,zip:s}});if(U.id)return St("location_created",e.proxyMode,U.id,c,null);d.push(`${s}: \u004b\u0065\u0072\u006e\u0065\u006c did not return a proxy id`)}catch(U){d.push(`${s}: ${_t(U)}`)}}let r=il(i,t);if(r?.id)return St("location_reused",e.proxyMode,r.id,t,d.join(" | ")||null);for(let c of t.cityCandidates)try{let o=await n.proxies.create({type:"residential",name:Dt(t.country,t.state,c),config:{country:t.country,state:t.state,city:c}});if(o.id)return St("location_created",e.proxyMode,o.id,{...t,level:"city",city:c,proxyName:Dt(t.country,t.state,c),config:{country:t.country,state:t.state,city:c}},null);d.push(`${c}: \u004b\u0065\u0072\u006e\u0065\u006c did not return a proxy id`)}catch(o){d.push(`${c}: ${_t(o)}`)}let l=Hn(t),S=sl(i,l);if(S?.id)return St("location_reused",e.proxyMode,S.id,l,d.join(" | "));try{let c=await n.proxies.create({type:"residential",name:l.proxyName,config:l.config});if(c.id)return St("location_created",e.proxyMode,c.id,l,d.join(" | "));d.push(`${l.state}: \u004b\u0065\u0072\u006e\u0065\u006c did not return a proxy id`)}catch(c){d.push(`${l.state}: ${_t(c)}`)}return Ea(e,t,d)}catch(a){return St("configured_fallback",e.proxyMode,e.configured\u004b\u0065\u0072\u006e\u0065\u006cProxyId,t,_t(a))}}var _s=require("async_hooks"),Ds="MCP_SCRAPER_ALLOW_HEADLESS_HARVEST_TEST",Gs=new _s.AsyncLocalStorage;function Vs(e,t){return Gs.run(e,t)}function le(){return Gs.getStore()}function _a(){return process.env.\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_BROWSER_WSS?.trim()||null}function Ks(){return process.env.SERP_BROWSER_PROVIDER?.trim().toLowerCase()==="\u006b\u0065\u0072\u006e\u0065\u006c"?!1:!!_a()}var Dn=require("playwright-extra"),So=yn(require("puppeteer-extra-plugin-stealth"),1),Uo=require("playwright");var st={paaItem:".related-question-pair",captchaMarker:'#captcha-form, #recaptcha, form[action*="/sorry/"], .g-recaptcha, [data-sitekey]'},sn={container:'div[jscontroller="HWk0Gf"]',sectionHeading:'.mgAbYb[role="heading"]',item:"a.rIRoqf"},on={udm:"39",item:"a.rIRoqf",durationPattern:/^\d+:\d+$/,platforms:["YouTube","TikTok","Instagram","Facebook","X"]},Ys={section:".ULSxyf",item:"a.KYg7td.INpicf",title:".hyYc0c",source:".K4ETW"},Js={sectionTag:"g-section-with-header",sectionHeadingText:"What people are saying",card:'.dRzkFf[role="listitem"]',cardLink:'a.WlydOe[jsname="YKoRaf"]',titleH1:"h1.WQWxe",titleDiv:".eAaXgc",popularCommentLabel:".qgdis",source:".sTl1Td",platformBadge:".appd0, .KrMNbf",ytChannel:".sjVJQd",ytDate:".PLq9Je",authorNote:".nDgy9d"},qs={root:"[data-lhcontainer][data-streaming-container][eid]",legacyRoot:'[data-hveid="CBMQAA"]',wrapper:".Fgyi2e",controller:'[jscontroller="AkrxPe"]',contentSubtree:'[data-subtree="mfc"]',header:".heWuVc",heading:".Fzsovc.cwYVJe.RJPOee",showMoreButton:'[aria-label="Show more AI Overview"]',sourcesPanel:".OZ9ddf.WAUd4",disclaimer:".DuQANe.MSJHRb"},zs={root:'[data-hveid="CAUQAA"]',wrapper:".Fgyi2e",citations:'.Fgyi2e [data-hveid] a[jsname="pxBnId"]'},$s={result:".wHYlTd.tF2Cxc",title:"h3.LC20lb",siteName:".VuuXrf",cite:"cite.tjvcx",snippet:".VwiC3b",redditCite:"cite.qLRx3b",ratingWrap:".Y0A0hc",ratingValue:".yi40Hd",reviewCount:".RDApEe"},js={headingText:"Businesses",card:".w7Dbne",name:".OSrXXb",ratingValue:".yi40Hd",reviewCount:".RDApEe"},Qs="2026-05-07";async function En(e,t,n,a){let i,s=!1,d,r=()=>{},l=()=>a?.reason instanceof DOMException&&a.reason.name==="TimeoutError"?a.reason:new dt,S=()=>r(l()),c=new Promise((U,u)=>{r=u}),o=async U=>{let u;try{await Promise.race([U.close().catch(()=>{}),new Promise(h=>{u=setTimeout(h,2e3)})])}finally{u&&clearTimeout(u)}};if(a?.aborted)throw l();a?.addEventListener("abort",S,{once:!0}),d=setTimeout(()=>r(new DOMException("Optional pagination timed out","TimeoutError")),3e4);try{return await Promise.race([(async()=>{let U=await e.newPage();if(s)throw await o(U),new dt;if(i=U,await t(U),s)throw new dt;return n(U)})(),c])}finally{s=!0,d&&clearTimeout(d),a?.removeEventListener("abort",S),i&&await o(i)}}var Va=require("crypto");var ll=166667e-10;var Sl=.00111,Ul=4,cl=4e-4;function De(e,t){let n=process.env[e]?.trim();if(!n)return t;let a=Number(n);return Number.isFinite(a)&&a>=0?a:t}var ul=De("NANGO_USD_PER_CONNECTION_MONTH",1),hl=De("NANGO_USD_PER_FUNCTION_RUN",1e-4),gl=De("NANGO_USD_PER_PROXY_REQUEST",1e-4),wl=De("NANGO_USD_PER_COMPUTE_SEC",2e-4),pl=De("\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_BROWSER_USD_PER_GB",8),ew=De("\u0042\u0052\u0049\u0047\u0048\u0054\u0044\u0041\u0054\u0041_SERP_USD_PER_REQUEST",.002836168);function Da(e,t){return Math.max(0,e)/1e3*ll}function Xs(e,t){return e==="fal_wizper"?Math.max(0,t)/Ul*Sl:e==="deepinfra_qwen"?Math.max(0,t)/1e3*cl:e==="openrouter"||e==="mcp_memory_video"||e==="mcp_memory_ai"?Math.max(0,t):e==="nango_connection"?Math.max(0,t)*ul:e==="nango_function_run"?Math.max(0,t)*hl:e==="nango_proxy_request"?Math.max(0,t)*gl:e==="nango_compute"?Math.max(0,t)*wl:e==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser_api"?Math.max(0,t)/1e9*pl:0}var Ga=!1,rn=null;async function Zs(){if(!Ga)return rn||(rn=yl().finally(()=>{rn=null}),rn)}async function yl(){let e=qe(),t=await e.execute(`
21704
+ SELECT
21705
+ (SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name IN ('\u006b\u0065\u0072\u006e\u0065\u006c_session_log', 'vendor_usage_log', 'cost_probe_runs')) = 3
21706
+ AND (SELECT COUNT(*) FROM pragma_table_info('\u006b\u0065\u0072\u006e\u0065\u006c_session_log') WHERE name IN ('proxy_source', 'proxy_type', 'method')) = 3
21707
+ AND (SELECT COUNT(*) FROM pragma_table_info('vendor_usage_log') WHERE name IN ('method', 'source_key', 'provider_duration_ms', 'provider_captcha', 'provider_status')) = 5
21708
+ AND (SELECT COUNT(*) FROM sqlite_master WHERE type = 'index' AND name = 'vendor_usage_log_vendor_source_key') = 1
21709
+ AND (SELECT COUNT(*) FROM pragma_table_info('cost_probe_runs') WHERE name IN ('units', 'unit_type', 'mode')) = 3
21710
+ AS ready
21711
+ `);if(Number(t.rows[0]?.ready??0)===1){Ga=!0;return}await e.execute(`
21712
+ CREATE TABLE IF NOT EXISTS \u006b\u0065\u0072\u006e\u0065\u006c_session_log (
21713
+ id TEXT PRIMARY KEY,
21714
+ \u006b\u0065\u0072\u006e\u0065\u006c_session_id TEXT,
21715
+ op TEXT,
21716
+ source TEXT NOT NULL,
21717
+ probe_run_id TEXT,
21718
+ user_id INTEGER,
21719
+ stealth INTEGER,
21720
+ headless_sent INTEGER,
21721
+ proxy_used INTEGER,
21722
+ fallback INTEGER NOT NULL DEFAULT 0,
21723
+ opened_at TEXT,
21724
+ closed_at TEXT,
21725
+ duration_ms INTEGER NOT NULL DEFAULT 0,
21726
+ est_cost_usd_headless REAL NOT NULL DEFAULT 0,
21727
+ est_cost_usd_headful REAL NOT NULL DEFAULT 0,
21728
+ error TEXT,
21729
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
21730
+ )
21731
+ `),await e.execute("CREATE INDEX IF NOT EXISTS \u006b\u0065\u0072\u006e\u0065\u006c_session_log_op ON \u006b\u0065\u0072\u006e\u0065\u006c_session_log(op)"),await e.execute("CREATE INDEX IF NOT EXISTS \u006b\u0065\u0072\u006e\u0065\u006c_session_log_probe ON \u006b\u0065\u0072\u006e\u0065\u006c_session_log(probe_run_id)"),await e.execute("CREATE INDEX IF NOT EXISTS \u006b\u0065\u0072\u006e\u0065\u006c_session_log_created ON \u006b\u0065\u0072\u006e\u0065\u006c_session_log(created_at)");try{await e.execute("ALTER TABLE \u006b\u0065\u0072\u006e\u0065\u006c_session_log ADD COLUMN proxy_source TEXT")}catch{}try{await e.execute("ALTER TABLE \u006b\u0065\u0072\u006e\u0065\u006c_session_log ADD COLUMN proxy_type TEXT")}catch{}try{await e.execute("ALTER TABLE \u006b\u0065\u0072\u006e\u0065\u006c_session_log ADD COLUMN method TEXT")}catch{}await e.execute(`
21732
+ CREATE TABLE IF NOT EXISTS vendor_usage_log (
21733
+ id TEXT PRIMARY KEY,
21734
+ op TEXT,
21735
+ probe_run_id TEXT,
21736
+ user_id INTEGER,
21737
+ vendor TEXT NOT NULL,
21738
+ model TEXT,
21739
+ units REAL NOT NULL DEFAULT 0,
21740
+ unit_type TEXT,
21741
+ est_cost_usd REAL NOT NULL DEFAULT 0,
21742
+ error TEXT,
21743
+ source_key TEXT,
21744
+ provider_duration_ms INTEGER,
21745
+ provider_captcha INTEGER,
21746
+ provider_status TEXT,
21747
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
21748
+ )
21749
+ `),await e.execute("CREATE INDEX IF NOT EXISTS vendor_usage_log_op ON vendor_usage_log(op)"),await e.execute("CREATE INDEX IF NOT EXISTS vendor_usage_log_probe ON vendor_usage_log(probe_run_id)"),await e.execute("CREATE INDEX IF NOT EXISTS vendor_usage_log_created ON vendor_usage_log(created_at)");try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN method TEXT")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN source_key TEXT")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN provider_duration_ms INTEGER")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN provider_captcha INTEGER")}catch{}try{await e.execute("ALTER TABLE vendor_usage_log ADD COLUMN provider_status TEXT")}catch{}await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS vendor_usage_log_vendor_source_key ON vendor_usage_log(vendor, source_key) WHERE source_key IS NOT NULL"),await e.execute(`
21750
+ CREATE TABLE IF NOT EXISTS cost_probe_runs (
21751
+ id TEXT PRIMARY KEY,
21752
+ tool TEXT NOT NULL,
21753
+ target TEXT,
21754
+ started_at TEXT NOT NULL DEFAULT (datetime('now')),
21755
+ wall_ms INTEGER NOT NULL DEFAULT 0,
21756
+ success INTEGER NOT NULL DEFAULT 0,
21757
+ error TEXT,
21758
+ http_only INTEGER NOT NULL DEFAULT 0,
21759
+ \u006b\u0065\u0072\u006e\u0065\u006c_used INTEGER NOT NULL DEFAULT 0,
21760
+ \u006b\u0065\u0072\u006e\u0065\u006c_sessions INTEGER NOT NULL DEFAULT 0,
21761
+ \u006b\u0065\u0072\u006e\u0065\u006c_seconds_total REAL NOT NULL DEFAULT 0,
21762
+ \u006b\u0065\u0072\u006e\u0065\u006c_tier_observed TEXT,
21763
+ est_\u006b\u0065\u0072\u006e\u0065\u006c_cost_usd_headless REAL NOT NULL DEFAULT 0,
21764
+ est_\u006b\u0065\u0072\u006e\u0065\u006c_cost_usd_headful REAL NOT NULL DEFAULT 0,
21765
+ vendor_cost_usd REAL NOT NULL DEFAULT 0,
21766
+ charged_credits REAL NOT NULL DEFAULT 0,
21767
+ margin_usd_headless_starter REAL NOT NULL DEFAULT 0,
21768
+ margin_usd_headful_starter REAL NOT NULL DEFAULT 0,
21769
+ notes TEXT
21770
+ )
21771
+ `),await e.execute("CREATE INDEX IF NOT EXISTS cost_probe_runs_tool ON cost_probe_runs(tool)");try{await e.execute("ALTER TABLE cost_probe_runs ADD COLUMN units REAL")}catch{}try{await e.execute("ALTER TABLE cost_probe_runs ADD COLUMN unit_type TEXT")}catch{}try{await e.execute("ALTER TABLE cost_probe_runs ADD COLUMN mode TEXT")}catch{}Ga=!0}async function to(e){try{await Zs();let t=le(),n=Math.max(0,e.closedAtMs-e.openedAtMs);await qe().execute({sql:`INSERT INTO \u006b\u0065\u0072\u006e\u0065\u006c_session_log
21772
+ (id, \u006b\u0065\u0072\u006e\u0065\u006c_session_id, op, source, probe_run_id, user_id, stealth, headless_sent, proxy_used, proxy_source, proxy_type, fallback, opened_at, closed_at, duration_ms, est_cost_usd_headless, est_cost_usd_headful, error, method)
21773
+ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,args:[(0,Va.randomUUID)(),e.\u006b\u0065\u0072\u006e\u0065\u006cSessionId??null,t?.op??null,e.source,t?.probeRunId??null,t?.userId??null,Fn(e.stealth),Fn(e.headlessSent),Fn(e.proxyUsed),e.proxySource??null,e.proxyType??null,e.fallback?1:0,new Date(e.openedAtMs).toISOString(),new Date(e.closedAtMs).toISOString(),n,Da(n,!1),Da(n,!0),e.error??null,t?.subOp??null]})}catch(t){console.warn("[cost-telemetry] record\u004b\u0065\u0072\u006e\u0065\u006cSession failed:",t instanceof Error?t.message:String(t))}}async function Ka(e){try{await Zs();let t=le();return(await qe().execute({sql:`INSERT OR IGNORE INTO vendor_usage_log
21774
+ (id, op, probe_run_id, user_id, vendor, model, units, unit_type, est_cost_usd, error, method, source_key, provider_duration_ms, provider_captcha, provider_status)
21775
+ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,args:[(0,Va.randomUUID)(),e.op??t?.op??null,e.probeRunId??t?.probeRunId??null,e.userId??t?.userId??null,e.vendor,e.model??null,e.units,e.unitType,Xs(e.vendor,e.units),e.error??null,e.method??t?.subOp??null,e.sourceKey??null,e.providerDurationMs??null,Fn(e.providerCaptcha),e.providerStatus??null]})).rowsAffected===1}catch(t){return console.warn("[cost-telemetry] recordVendorUsage failed:",t instanceof Error?t.message:String(t)),!1}}function Fn(e){return e==null?null:e?1:0}var ml=/\b(?:HeadlessChrome|Chrome|Chromium|Firefox)\/\d+|\bVersion\/\d+.*\bSafari\//;async function Ya(e){try{let t=await e.evaluate(()=>navigator.userAgent);return typeof t=="string"&&ml.test(t)?t:null}catch{return null}}async function Ja(e){let t=null;try{let n=e.contexts().flatMap(a=>a.pages())[0];return n||(t=await e.newContext(),n=t.pages()[0]??await t.newPage()),await Ya(n)}catch{return null}finally{t&&await t.close().catch(()=>{})}}function eo(e){let{headless:t,viewport:n,userAgent:a,user_agent:i,...s}=e;return s}async function no(e,t={}){return t.blockServiceWorkers?e.newContext({viewport:null,serviceWorkers:"block"}):e.contexts()[0]??await e.newContext({viewport:null})}async function ao(e){return e.pages()[0]??await e.newPage()}function dn(e){return e.reason??new DOMException("The operation was aborted.","AbortError")}async function pt(e,t){if(!t)return e;if(t.aborted)throw dn(t);let n,a=new Promise((i,s)=>{n=()=>s(dn(t)),t.addEventListener("abort",n,{once:!0})});e.catch(()=>{});try{return await Promise.race([e,a])}finally{n&&t.removeEventListener("abort",n)}}function io(e,t){let n=AbortSignal.timeout(e);return t?AbortSignal.any([t,n]):n}function _n(e={}){let t=e.nowMs??Date.now(),n=Math.max(0,e.waitMs??3e4);return Math.min(e.deadlineMs??1/0,t+n)}var Uw=_n({nowMs:0});async function so(e){let t=_n(e),n=async()=>{if(e.signal?.aborted)throw dn(e.signal);let i=t-Date.now();if(i<=0)return!0;let s;try{return await pt(Promise.race([e.observeChallenge(),new Promise(d=>{s=setTimeout(()=>d(!0),i)})]),e.signal)}finally{s&&clearTimeout(s)}},a=await n();if(!e.solverEnabled)return a;for(;a&&Date.now()<t;){let i;try{await pt(new Promise(s=>{i=setTimeout(s,Math.min(500,t-Date.now()))}),e.signal)}finally{i&&clearTimeout(i)}if(e.signal?.aborted)throw dn(e.signal);if(Date.now()>t)break;a=await n()}return a}var Cl=`#search h3, #rso h3, #search .related-question-pair, #rso .related-question-pair, #search ${sn.item}, #rso ${sn.item}, #search .isv-r, #rso .isv-r`,kl=75e3,Ml=3e3;async function qa(e,t){if(t.signal?.aborted)throw new dt;let n=Math.min(Date.now()+kl,t.deadlineMs===void 0?1/0:t.deadlineMs-Ml);if(n<=Date.now())throw new rt("Google search navigation has no remaining time");let a=io(Math.max(1,n-Date.now()),t.signal),i=!1,s,d=async()=>{if(!await pt(oo(e),a))return!1;if(i=!0,s??=_n({deadlineMs:n}),await so({solverEnabled:t.solverEnabled,deadlineMs:s,signal:a,observeChallenge:()=>oo(e)}))throw new Z("Google challenge did not clear within the remaining browser time.");return!0};try{await Tl(e,{params:fl(t),deadlineMs:n,signal:a},d,vl);let r=()=>pt(Nl(e,{query:t.query,deadlineMs:n,signal:a,readySelector:Cl},d),a);if(await r(),t.purpose==="paa"){let l=Math.min(n,Date.now()+4e3);await pt(e.waitForSelector(st.paaItem,{state:"visible",timeout:Math.max(1,l-Date.now())}).catch(()=>null),a);for(let S=1;S<=6&&Date.now()<n&&(await d(),!await pt(e.locator(st.paaItem).count(),a));S+=1)await pt(e.evaluate(c=>{window.scrollTo(0,document.body.scrollHeight*c)},S/6),a),await pt(new Promise(c=>setTimeout(c,Math.min(400,n-Date.now()))),a)}for(;Date.now()<n;){await r();let l=await pt(e.locator(st.paaItem).count(),a)>0;if(!await d())return{hasPaa:l,challengeObserved:i}}throw new rt("Google search results did not reach a readable state")}catch(r){throw t.signal?.aborted?new dt:r instanceof Z||r instanceof rt?r:r instanceof Error&&r.message==="Google search results did not reach a readable state"?new rt(r.message):r instanceof Error&&/^Google search (?:homepage|consent inspection|consent|search box readiness|search box inspection|search box focus|search box clear|query typing|suggestion dismissal|search parameters|search button inspection|search submit) (?:failed|timed out)$/.test(r.message)?new rt(r.message):r instanceof Error&&["Google homepage did not expose a visible search box","Google search form did not expose a visible Search button"].includes(r.message)?new rt(r.message):new rt(a.aborted?"Google search navigation timed out before results were ready":"Google homepage search interaction failed")}}async function oo(e){if(/google\.[^/]+\/sorry(?:\/|\?|$)/i.test(e.url())||await e.locator(st.captchaMarker).count())return!0;let t=await e.locator("body").innerText({timeout:1e3}).catch(()=>"");return/recaptcha|unusual traffic|are you a robot|about this page|detected unusual traffic/i.test(t.slice(0,3e3))}function fl(e){let t={...e.extraParams,q:e.query,gl:e.gl,hl:e.hl,pws:"0"};return e.tbs&&(t.tbs=e.tbs),e.uule&&(t.uule=e.uule),t}async function vl(e,t={}){let n=t.deadlineMs??Date.now()+1e4,a=async(r,l,S=8e3)=>{let c=Math.min(S,n-Date.now());if(t.signal?.aborted){let h=new Error("Google search navigation aborted");throw h.name="AbortError",h}if(c<=0)throw new Error("Google search navigation deadline exhausted");let o,U,u=new Promise((h,w)=>{o=setTimeout(()=>w(new Error(`Google search ${r} timed out`)),c),t.signal&&(U=()=>{let y=new Error("Google search navigation aborted");y.name="AbortError",w(y)},t.signal.addEventListener("abort",U,{once:!0}))});try{return await Promise.race([l(c),u])}catch{if(t.signal?.aborted){let h=new Error("Google search navigation aborted");throw h.name="AbortError",h}throw new Error(`Google search ${r} failed`)}finally{o&&clearTimeout(o),U&&t.signal?.removeEventListener("abort",U)}},i=/^(reject all|reject optional|continue without accepting|only necessary|alle ablehnen|tout refuser|rechazar todo|rifiuta tutto|rejeitar tudo|alles afwijzen)$/i;if(!await a("consent inspection",()=>e.evaluate(r=>{let l=new RegExp(r,"i");return/^consent\.google\./i.test(window.location.hostname)||!!document.querySelector("#W0wltc")||Array.from(document.querySelectorAll('button, [role="button"]')).some(S=>l.test(S.textContent?.trim()??""))},i.source),2e3))return!1;let d=e.locator("#W0wltc").or(e.getByRole("button",{name:i}));for(let r=0,l=await a("consent inspection",()=>d.count(),2e3);r<l;r+=1){let S=d.nth(r);if(await a("consent inspection",()=>S.isVisible(),2e3))return await a("consent",c=>S.click({timeout:c})),!0}if(/consent\.google\./i.test(e.url()))throw new Error("Google consent did not expose a reject option");return!1}async function Tl(e,t,n,a){let i=async(u,h,w=8e3)=>{let y=Math.min(w,t.deadlineMs-Date.now());if(t.signal?.aborted){let W=new Error("Google search navigation aborted");throw W.name="AbortError",W}if(y<=0)throw new Error("Google search navigation deadline exhausted");let N,C,M=new Promise((W,L)=>{N=setTimeout(()=>L(new Error(`Google search ${u} timed out`)),y),t.signal&&(C=()=>{let B=new Error("Google search navigation aborted");B.name="AbortError",L(B)},t.signal.addEventListener("abort",C,{once:!0}))});try{return await Promise.race([h(y),M])}catch{if(t.signal?.aborted){let L=new Error("Google search navigation aborted");throw L.name="AbortError",L}throw new Error(`Google search ${u} failed`)}finally{N&&clearTimeout(N),C&&t.signal?.removeEventListener("abort",C)}},s=()=>a(e,t);await i("homepage",u=>e.goto("https://www.google.com",{waitUntil:"domcontentloaded",timeout:u}),15e3),await n(),await s(),await n();let d='textarea[name="q"], input[name="q"]';await i("search box readiness",u=>e.waitForSelector(d,{state:"visible",timeout:u}));let r=e.locator(d),l;for(let u=0,h=await i("search box inspection",()=>r.count());u<h;u+=1)if(await i("search box inspection",()=>r.nth(u).isVisible())){l=r.nth(u);break}if(!l)throw new Error("Google homepage did not expose a visible search box");let S=l;await i("search box focus",u=>S.click({timeout:u})),await i("search box clear",u=>S.fill("",{timeout:u}));for(let u of t.params.q)await i("query typing",h=>S.pressSequentially(u,{delay:35+Math.floor(Math.random()*65),timeout:h}));let c=S.locator("xpath=ancestor::form[1]");await i("search parameters",()=>c.evaluate((u,h)=>{if(!(u instanceof HTMLFormElement))throw new Error("Google search form is unavailable");u.method="get";for(let[y,N]of Object.entries(h)){if(y==="q")continue;let C=Array.from(u.querySelectorAll("input")).filter(M=>M.name===y);for(let M of C)M.value=N,M.disabled=!1;if(C.length===0){let M=document.createElement("input");M.type="hidden",M.name=y,M.value=N,u.appendChild(M)}}let w=new URL(u.action,location.href);for(let y of Object.keys(h))w.searchParams.delete(y);u.action=w.toString()},t.params));let o=c.locator('input[name="btnK"], button[name="btnK"], button[type="submit"]'),U=!1;for(let u=0,h=await i("search button inspection",()=>o.count());u<h;u+=1){let w=o.nth(u);if(await i("search button inspection",()=>w.isVisible())){await i("search submit",y=>w.click({timeout:y,noWaitAfter:!0})),U=!0;break}}if(!U)throw new Error("Google search form did not expose a visible Search button");await n(),await s(),await n()}async function Nl(e,t,n){let a=t.readySelector.split(",").map(s=>`${s.trim()}:visible`).join(", "),i;for(;Date.now()<t.deadlineMs;){if(t.signal?.aborted)throw new Error("Google search navigation aborted");let s=await n();if((i===void 0||s===!0)&&(i=Math.min(t.deadlineMs,Date.now()+15e3)),Date.now()>=i)break;let d=!1;try{let l=new URL(e.url());d=/(^|\.)google\.[a-z.]+$/i.test(l.hostname)&&l.pathname==="/search"&&l.searchParams.get("q")===t.query}catch{}if(d){let l=await e.waitForSelector(a,{state:"visible",timeout:Math.min(500,Math.max(1,i-Date.now()))}).catch(()=>null),S=l?!1:await e.locator("body").innerText({timeout:Math.min(1e3,Math.max(1,i-Date.now()))}).then(c=>/did not match any documents|no results found/i.test(c)).catch(()=>!1);if(l||S){if(await n()===!0)continue;return}}if(t.signal?.aborted)throw new Error("Google search navigation aborted");let r=Math.min(200,i-Date.now(),t.deadlineMs-Date.now());r>0&&await e.waitForTimeout(r)}throw new Error("Google search results did not reach a readable state")}Dn.chromium.use((0,So.default)());var bl=180,Pl=3e3,Il=5e3,Al='#search, #rso, a[href] h3, [data-snhf], [role="main"]';function za(e,t){return e?Math.max(1,Math.min(t,e-Date.now())):t}function xl(e,t){let n=process.env[e];if(!n)return t;let a=Number(n);return Number.isInteger(a)&&a>0?a:t}function $a(e){return e?e.slice(-6):null}function ro(e,t){let n=(t??process.env.SERP_REDIRECT_BASE)?.trim().replace(/\/+$/,"");return n?`${n}/g/${Buffer.from(e,"utf8").toString("base64url")}`:e}function Wl(e){return e?/united states|u\.?s\.?a?\.?|^us$/i.test(e.trim()):!1}function Ge(e){return e instanceof Error?e.message:String(e)}function Ll(e){return/\b409\b|conflict|already exists/i.test(Ge(e))}function Ol(e){return/\b404\b|not[ _-]?found|already (?:gone|deleted|closed)|does not exist/i.test(Ge(e))}async function Bl(e,t){try{await e.profiles.create({name:t})}catch(n){if(!Ll(n))throw n}}function lo(e,t){return{viewport:e.viewport,locale:e.locale,...t?{userAgent:t}:{},...e.deviceScaleFactor?{deviceScaleFactor:e.deviceScaleFactor}:{},...e.isMobile!==void 0?{isMobile:e.isMobile}:{},...e.hasTouch!==void 0?{hasTouch:e.hasTouch}:{}}}async function Se(e,t,n){let a;try{return await Promise.race([e,new Promise((i,s)=>{a=setTimeout(()=>s(new Error(`${n} timed out after ${t}ms`)),t)})])}finally{a&&clearTimeout(a)}}function Rl(e){let t=e.trim();if(!t)throw new Error("channelHandle is required");if(/^https?:\/\//i.test(t)||/^(www\.|m\.)?youtube\.com\//i.test(t)){let d=new URL(/^https?:\/\//i.test(t)?t:`https://${t}`);if(d.hostname.replace(/^www\./,"").replace(/^m\./,"").toLowerCase()!=="youtube.com")throw new Error("channel URL must be on youtube.com");let l=d.pathname.split("/").filter(Boolean),S=l[0]??"",c=l[1]??"";if(S.startsWith("@"))return`https://www.youtube.com/${S}/videos`;if(S==="channel"&&c)return`https://www.youtube.com/channel/${c}/videos`;if((S==="c"||S==="user")&&c)return`https://www.youtube.com/${S}/${c}/videos`;throw new Error("channel URL must be a YouTube handle, /channel/UC..., /c/..., or /user/... URL")}let i=t.replace(/^\/+/,"").replace(/\/+$/,"").replace(/\/videos$/i,"");if(/^UC[\w-]{20,}$/.test(i))return`https://www.youtube.com/channel/${i}/videos`;let s=i.startsWith("@")?i:`@${i}`;if(!/^@[\w.-]+$/.test(s))throw new Error("channelHandle must be an @handle, UC channel ID, or YouTube channel URL");return`https://www.youtube.com/${s}/videos`}var Gn=class{browser=null;context=null;page=null;\u006b\u0065\u0072\u006e\u0065\u006cClient=null;\u006b\u0065\u0072\u006e\u0065\u006cSessionId=null;\u006b\u0065\u0072\u006e\u0065\u006cOpenedAtMs=null;\u006b\u0065\u0072\u006e\u0065\u006cStealth=null;\u006b\u0065\u0072\u006e\u0065\u006cSolverEnabled=!1;operationDeadlineMs;\u006b\u0065\u0072\u006e\u0065\u006cProxyUsed=null;\u006b\u0065\u0072\u006e\u0065\u006cProxySource=null;\u006b\u0065\u0072\u006e\u0065\u006cProxyType=null;\u006b\u0065\u0072\u006e\u0065\u006cHeadlessSent=null;last\u004b\u0065\u0072\u006e\u0065\u006cBillingMode=null;last\u004b\u0065\u0072\u006e\u0065\u006cOpenedAtMs=null;last\u004b\u0065\u0072\u006e\u0065\u006cClosedAtMs=null;debugEnabled=!1;debugSnapshot={\u006b\u0065\u0072\u006e\u0065\u006c:null,context:null,networkLocation:null,serpNavigation:null};async launch(t){if(t.\u006b\u0065\u0072\u006e\u0065\u006cApiKey&&t.isMobile)throw new rt("\u004b\u0065\u0072\u006e\u0065\u006c acquisition requires a native desktop browser; mobile capture needs provider-native mobile support.");this.operationDeadlineMs=t.operationDeadlineMs,this.debugEnabled=t.debug===!0;let n=t.proxyMode??(t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId?"configured":"none"),a=t.isMobile?"mobile":"desktop";if(this.debugSnapshot={\u006b\u0065\u0072\u006e\u0065\u006c:null,context:{viewport:t.viewport,locale:t.locale,device:a,userAgent:null,deviceScaleFactor:t.deviceScaleFactor??null,isMobile:t.isMobile===!0,hasTouch:t.hasTouch===!0},networkLocation:null,serpNavigation:null},t.\u006b\u0065\u0072\u006e\u0065\u006cApiKey){this.\u006b\u0065\u0072\u006e\u0065\u006cClient=new E({apiKey:t.\u006b\u0065\u0072\u006e\u0065\u006cApiKey});let s=Number.isInteger(t.\u006b\u0065\u0072\u006e\u0065\u006cTimeoutSeconds)&&Number(t.\u006b\u0065\u0072\u006e\u0065\u006cTimeoutSeconds)>0?Number(t.\u006b\u0065\u0072\u006e\u0065\u006cTimeoutSeconds):xl("\u004b\u0045\u0052\u004e\u0045\u004c_BROWSER_TIMEOUT_SECONDS",bl),d=Math.min(s,600);t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName&&t.\u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges===!0&&await Bl(this.\u006b\u0065\u0072\u006e\u0065\u006cClient,t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName);let r=le();this.\u006b\u0065\u0072\u006e\u0065\u006cHeadlessSent=null,this.last\u004b\u0065\u0072\u006e\u0065\u006cBillingMode="headful",r?.headlessSentOut&&(r.headlessSentOut.value=this.\u006b\u0065\u0072\u006e\u0065\u006cHeadlessSent);let l=await this.\u006b\u0065\u0072\u006e\u0065\u006cClient.browsers.create(eo({stealth:t.\u006b\u0065\u0072\u006e\u0065\u006cStealth===!0,timeout_seconds:d,...t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId?{proxy_id:t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId}:{},...t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName?{profile:{name:t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName,...typeof t.\u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges=="boolean"?{save_changes:t.\u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges}:{}}}:{}}));this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId=l.session_id,this.\u006b\u0065\u0072\u006e\u0065\u006cOpenedAtMs=Date.now(),this.last\u004b\u0065\u0072\u006e\u0065\u006cOpenedAtMs=this.\u006b\u0065\u0072\u006e\u0065\u006cOpenedAtMs,this.last\u004b\u0065\u0072\u006e\u0065\u006cClosedAtMs=null,this.\u006b\u0065\u0072\u006e\u0065\u006cStealth=typeof l.stealth=="boolean"?l.stealth:null,this.\u006b\u0065\u0072\u006e\u0065\u006cSolverEnabled=t.\u006b\u0065\u0072\u006e\u0065\u006cStealth===!0&&l.stealth!==!1,this.\u006b\u0065\u0072\u006e\u0065\u006cProxyUsed=typeof l.proxy_id=="string"?!!l.proxy_id:!!t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId,this.\u006b\u0065\u0072\u006e\u0065\u006cProxySource=t.\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution?.source??null,this.\u006b\u0065\u0072\u006e\u0065\u006cProxyType=t.\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution?.proxyType??null;let S=null,c=null;if(!t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId&&!t.keepDefaultProxy)try{await Se(this.\u006b\u0065\u0072\u006e\u0065\u006cClient.browsers.update(this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,{disable_default_proxy:!0}),5e3,`\u004b\u0065\u0072\u006e\u0065\u006c session ${this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId} disable default proxy`),S=!0}catch(U){S=!1,c=Ge(U)}let o={sessionId:this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,proxyMode:n,requestedProxyIdPresent:!!t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId,requestedProxyIdSuffix:$a(t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId),createdProxyIdPresent:typeof l.proxy_id=="string"?!!l.proxy_id:null,createdProxyIdSuffix:$a(l.proxy_id),retrievedProxyIdPresent:null,retrievedProxyIdSuffix:null,retrievedProxyIdMatchesRequested:null,defaultProxyDisabled:S,defaultProxyDisableError:c,proxyResolution:t.\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution??null,timeoutSeconds:d,stealth:typeof l.stealth=="boolean"?l.stealth:null,profilePresent:null,poolPresent:null,retrieveError:null};if(this.debugSnapshot.\u006b\u0065\u0072\u006e\u0065\u006c=o,console.info(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_browser_created",\u006b\u0065\u0072\u006e\u0065\u006c_session_id:this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,timeout_seconds:d,proxy_mode:n,proxy_id_present:!!t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId,profile_name_present:!!t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName,proxy_resolution_source:t.\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution?.source})),this.debugEnabled&&await this.populate\u004b\u0065\u0072\u006e\u0065\u006cRetrieveDebug(o,t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId),this.browser=await Uo.chromium.connectOverCDP(l.cdp_ws_url),this.context=await no(this.browser),this.page=await ao(this.context),await this.capture\u004b\u0065\u0072\u006e\u0065\u006cContextDebug(),await this.installEsbuildHelperShims(this.context),(this.debugEnabled||t.requireUsEgress)&&(this.debugSnapshot.networkLocation=await this.captureBrowserNetworkLocation()),t.requireUsEgress){let U=this.debugSnapshot.networkLocation?.country??null;if(!Wl(U))throw new Z(`Non-US egress (${U??"unknown"}) \u2014 retrying with a fresh session`)}return}let i={headless:t.headless,proxy:t.proxy?{server:t.proxy}:void 0,...t.browserExecutablePath?{executablePath:t.browserExecutablePath}:{},...t.ignoreDefaultArgs?{ignoreDefaultArgs:t.ignoreDefaultArgs}:{}};if(t.profileDir)this.context=await Dn.chromium.launchPersistentContext(t.profileDir,{...i,...lo(t)}),await this.installEsbuildHelperShims(this.context),this.page=await this.context.newPage(),this.debugSnapshot.context.userAgent=await Ya(this.page);else{this.browser=await Dn.chromium.launch(i);let s=await Ja(this.browser);this.debugSnapshot.context.userAgent=s,this.context=await this.browser.newContext(lo(t,s)),await this.installEsbuildHelperShims(this.context),this.page=await this.context.newPage()}this.debugEnabled&&(this.debugSnapshot.networkLocation=await this.captureBrowserNetworkLocation())}async capture\u004b\u0065\u0072\u006e\u0065\u006cContextDebug(){if(this.debugSnapshot.context={viewport:null,locale:null,device:"desktop",requestedDevice:"desktop",userAgent:null,deviceScaleFactor:null,isMobile:!1,hasTouch:!1},!this.page)return;let t=await this.page.evaluate(()=>({viewport:{width:window.innerWidth,height:window.innerHeight},locale:navigator.language,userAgent:navigator.userAgent,deviceScaleFactor:window.devicePixelRatio,isMobile:!1,hasTouch:navigator.maxTouchPoints>0})).catch(()=>null);!t||typeof t!="object"||!t.viewport||typeof t.viewport.width!="number"||typeof t.viewport.height!="number"||typeof t.locale!="string"||typeof t.userAgent!="string"||(this.debugSnapshot.context={...t,device:"desktop",requestedDevice:"desktop"})}async populate\u004b\u0065\u0072\u006e\u0065\u006cRetrieveDebug(t,n){if(!(!this.\u006b\u0065\u0072\u006e\u0065\u006cClient||!this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId))try{let a=await Se(this.\u006b\u0065\u0072\u006e\u0065\u006cClient.browsers.retrieve(this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId),5e3,`\u004b\u0065\u0072\u006e\u0065\u006c session ${this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId} retrieve`);t.retrievedProxyIdPresent=typeof a.proxy_id=="string"?!!a.proxy_id:!1,t.retrievedProxyIdSuffix=$a(a.proxy_id),t.retrievedProxyIdMatchesRequested=n?a.proxy_id===n:!a.proxy_id,t.timeoutSeconds=typeof a.timeout_seconds=="number"?a.timeout_seconds:t.timeoutSeconds,t.stealth=typeof a.stealth=="boolean"?a.stealth:t.stealth,t.profilePresent=!!a.profile,t.poolPresent=!!a.pool}catch(a){t.retrieveError=Ge(a)}}async captureBrowserNetworkLocation(){let t=(a,i="ipapi.co")=>({source:i,ip:null,city:null,region:null,country:null,org:null,timezone:null,error:a});if(!this.context)return t("browser context is not available");let n=null;try{n=await this.context.newPage();let a=await this.loadJsonInDebugPage(n,"https://ipwho.is/");if(a){let r=typeof a.connection=="object"&&a.connection!==null?a.connection:{};return{source:"ipwho.is",ip:typeof a.ip=="string"?a.ip:null,city:typeof a.city=="string"?a.city:null,region:typeof a.region=="string"?a.region:null,country:typeof a.country=="string"?a.country:null,org:typeof r.org=="string"?r.org:null,timezone:typeof a.timezone=="object"&&a.timezone!==null&&typeof a.timezone.id=="string"?a.timezone.id:null,error:null}}let i=await this.loadJsonInDebugPage(n,"https://api64.ipify.org?format=json");if(i)return{source:"api64.ipify.org",ip:typeof i.ip=="string"?i.ip:null,city:null,region:null,country:null,org:null,timezone:null,error:null};await Se(n.goto("https://ipapi.co/json/",{waitUntil:"domcontentloaded",timeout:7e3}),8e3,"browser network location navigation");let s=await n.locator("body").innerText({timeout:2e3}),d=JSON.parse(s);return{source:"ipapi.co",ip:typeof d.ip=="string"?d.ip:null,city:typeof d.city=="string"?d.city:null,region:typeof d.region=="string"?d.region:null,country:typeof d.country_name=="string"?d.country_name:typeof d.country=="string"?d.country:null,org:typeof d.org=="string"?d.org:null,timezone:typeof d.timezone=="string"?d.timezone:null,error:null}}catch(a){return t(Ge(a))}finally{await n?.close().catch(()=>{})}}async loadJsonInDebugPage(t,n){try{await Se(t.goto(n,{waitUntil:"domcontentloaded",timeout:7e3}),8e3,`browser network location navigation ${n}`);let a=await t.locator("body").innerText({timeout:2e3});return JSON.parse(a)}catch{return null}}async installEsbuildHelperShims(t){await t.addInitScript(()=>{let n=globalThis;typeof n.__name!="function"&&(n.__name=a=>a),typeof n.__publicField!="function"&&(n.__publicField=(a,i,s)=>(a[i]=s,s))})}async withTemporaryPage(t,n){if(!this.context)throw new Error("Browser context is not available");return En(this.context,async()=>{},t,n)}async navigateToSERP(t,n,a,i,s){let d=new URLSearchParams({q:t,gl:a,hl:i,pws:"0"});s?.tbs&&d.set("tbs",s.tbs),n&&d.set("uule",n);let r="https://www.google.com/search?"+d.toString(),l=ro(r),S=s?.debug?{requestedUrl:r,finalUrl:null,title:null,bodySnippet:null,hasPaa:null,captchaDetected:null,googleSorryUrl:null,redirected:null}:null;if(S&&(this.debugSnapshot.serpNavigation=S),this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId){let o={deadlineMs:s?.deadlineMs??this.operationDeadlineMs,signal:s?.signal};try{let U=await qa(this.page,{query:t,gl:a,hl:i,uule:n??void 0,tbs:s?.tbs,purpose:s?.purpose,deadlineMs:s?.deadlineMs??this.operationDeadlineMs,signal:s?.signal,solverEnabled:this.\u006b\u0065\u0072\u006e\u0065\u006cSolverEnabled});return await this.updateSerpNavigationDebug(S,r,{hasPaa:U.hasPaa,captchaDetected:U.challengeObserved===!0},o),{hasPaa:U.hasPaa}}catch(U){throw await this.updateSerpNavigationDebug(S,r,{hasPaa:null,captchaDetected:U instanceof Z?!0:null},o),U}}try{await this.page.goto(l,{waitUntil:"domcontentloaded",timeout:za(s?.deadlineMs,s?.purpose==="serp"?8e3:45e3)})}catch(o){await this.updateSerpNavigationDebug(S,r,{hasPaa:null,captchaDetected:null});let U=await this.captureDiagnostics(r);throw new rt(`page.goto failed: ${o.message} | ${U}`)}if(await this.isSerpChallengeVisible())throw await this.updateSerpNavigationDebug(S,r,{hasPaa:!1,captchaDetected:!0}),new Z(this.captchaMessage());if(s?.purpose==="serp"){await this.page.waitForSelector(Al,{timeout:za(s.deadlineMs,1500)}).catch(()=>null);let o=await this.page.locator(st.paaItem).count().catch(()=>0)>0;return await this.updateSerpNavigationDebug(S,r,{hasPaa:o,captchaDetected:!1}),{hasPaa:o}}if(await this.page.waitForSelector(st.paaItem,{timeout:za(s?.deadlineMs,4e3)}).catch(()=>null))return await this.updateSerpNavigationDebug(S,r,{hasPaa:!0,captchaDetected:!1}),{hasPaa:!0};if(await this.isSerpChallengeVisible())throw await this.updateSerpNavigationDebug(S,r,{hasPaa:!1,captchaDetected:!0}),new Z(this.captchaMessage());for(let o=1;o<=6;o++)if(await this.page.evaluate(u=>{window.scrollTo(0,document.body.scrollHeight*u)},o/6),await this.page.waitForTimeout(600),await this.page.locator(st.paaItem).count()>0)return await this.updateSerpNavigationDebug(S,r,{hasPaa:!0,captchaDetected:!1}),{hasPaa:!0};return await this.updateSerpNavigationDebug(S,r,{hasPaa:!1,captchaDetected:!1}),{hasPaa:!1}}async isSerpChallengeVisible(){if(!this.page)return!1;if(await this.page.locator(st.captchaMarker).count().catch(()=>0)>0)return!0;let n=this.page.url();if(/google\.[^/]+\/sorry\//i.test(n))return!0;let a=await this.page.evaluate(()=>(document.body?.innerText??"").replace(/\s+/g," ").trim().slice(0,1e3)).catch(()=>"");return/recaptcha|unusual traffic|are you a robot|about this page|detected unusual traffic/i.test(a)}async updateSerpNavigationDebug(t,n,a,i){if(!(!t||!this.page))try{let s=this.page.url();t.finalUrl=s,t.hasPaa=a.hasPaa,t.captchaDetected=a.captchaDetected,t.googleSorryUrl=/google\.[^/]+\/sorry\//i.test(s),t.redirected=s!==n;let d=Math.min(1e3,i?.deadlineMs===void 0?1e3:i.deadlineMs-Date.now());if(i&&(i.signal?.aborted||d<=0))return;let r=Promise.all([this.page.title().catch(()=>""),this.page.evaluate(()=>(document.body?.innerText??"").replace(/\s+/g," ").trim().slice(0,500)).catch(()=>"")]),[l,S]=i?await pt(Se(r,d,"\u004b\u0065\u0072\u006e\u0065\u006c navigation debug"),i.signal):await r;t.title=l,t.bodySnippet=S,t.captchaDetected=a.captchaDetected??/recaptcha|unusual traffic|are you a robot/i.test(S)}catch(s){t.bodySnippet=`debug capture failed: ${Ge(s)}`}}async captureDiagnostics(t){try{let n=this.page.url(),a=await this.page.title().catch(()=>""),i=await this.page.evaluate(()=>(document.body?.innerText??"").replace(/\s+/g," ").trim().slice(0,400)).catch(()=>""),s=/consent\.google\./.test(n)||/before you continue/i.test(i),d=/recaptcha|unusual traffic|are you a robot/i.test(i),r=[s?"CONSENT_WALL":"",d?"BOT_CHALLENGE":"",n!==t?"REDIRECTED":""].filter(Boolean).join(",");return`intended=${t} | final=${n} | title="${a}" | flags=[${r}] | body="${i}"`}catch(n){return`diagnostics-failed: ${n.message}`}}captchaMessage(){return this.\u006b\u0065\u0072\u006e\u0065\u006cClient?"Google returned a CAPTCHA on this session \u2014 retrying with a fresh session.":Bi}async navigateTo(t){if(this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId){let i=new URL(t);if(/^(?:www\.)?google\.[a-z.]+$/i.test(i.hostname)&&i.pathname==="/search"&&i.searchParams.has("q")){await qa(this.page,{query:i.searchParams.get("q"),gl:i.searchParams.get("gl")??"us",hl:i.searchParams.get("hl")??"en",uule:i.searchParams.get("uule")??void 0,tbs:i.searchParams.get("tbs")??void 0,extraParams:Object.fromEntries([...i.searchParams].filter(([s])=>!["q","gl","hl","uule","tbs","pws"].includes(s))),purpose:"serp",deadlineMs:this.operationDeadlineMs,solverEnabled:this.\u006b\u0065\u0072\u006e\u0065\u006cSolverEnabled});return}}let n=process.env.ADS_ARRIVAL_REDIRECT_BASE?.trim(),a=n?ro(t,n):t;try{if(await this.page.goto(a,{waitUntil:"domcontentloaded",timeout:45e3}),/google\.[^/]+\/search\?/i.test(t)&&await this.isSerpChallengeVisible())throw new Z(this.captchaMessage())}catch(i){if(i instanceof Z)throw i;let s=await this.captureDiagnostics(t);throw new rt(`page.goto failed: ${i.message} | ${s}`)}}async navigateToChannel(t){let n=Rl(t);try{await this.page.goto(n,{waitUntil:"networkidle",timeout:3e4})}catch(a){let i=await this.captureDiagnostics(n);throw new rt(`navigateToChannel failed: ${a.message} | ${i}`)}}async evaluate(t,n){return this.page.evaluate(t,n)}getPage(){return this.page}get\u004b\u0065\u0072\u006e\u0065\u006cSessionId(){return this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId}get\u004b\u0065\u0072\u006e\u0065\u006cMeteringEvidence(){return{sessionId:this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId??this.debugSnapshot.\u006b\u0065\u0072\u006e\u0065\u006c?.sessionId??null,billingMode:this.last\u004b\u0065\u0072\u006e\u0065\u006cBillingMode,openedAtMs:this.last\u004b\u0065\u0072\u006e\u0065\u006cOpenedAtMs,closedAtMs:this.last\u004b\u0065\u0072\u006e\u0065\u006cClosedAtMs}}getProviderSessionMetadata(){return{provider:this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId?"\u006b\u0065\u0072\u006e\u0065\u006c":"local",providerSessionId:this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,disconnectObservation:null,billingMode:this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId?this.\u006b\u0065\u0072\u006e\u0065\u006cHeadlessSent?"headless":"headful":null}}getDebugSnapshot(){return this.debugSnapshot}async close(){if(this.browser){let t=this.browser,n=this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,a=this.\u006b\u0065\u0072\u006e\u0065\u006cClient,i=this.\u006b\u0065\u0072\u006e\u0065\u006cOpenedAtMs,s=this.\u006b\u0065\u0072\u006e\u0065\u006cStealth,d=this.\u006b\u0065\u0072\u006e\u0065\u006cProxyUsed,r=this.\u006b\u0065\u0072\u006e\u0065\u006cProxySource,l=this.\u006b\u0065\u0072\u006e\u0065\u006cProxyType,S=this.\u006b\u0065\u0072\u006e\u0065\u006cHeadlessSent,c=this.getProviderSessionMetadata();if(this.browser=null,this.context=null,this.page=null,this.\u006b\u0065\u0072\u006e\u0065\u006cSessionId=null,this.\u006b\u0065\u0072\u006e\u0065\u006cClient=null,this.\u006b\u0065\u0072\u006e\u0065\u006cSolverEnabled=!1,this.\u006b\u0065\u0072\u006e\u0065\u006cOpenedAtMs=null,this.\u006b\u0065\u0072\u006e\u0065\u006cHeadlessSent=null,this.\u006b\u0065\u0072\u006e\u0065\u006cProxySource=null,this.\u006b\u0065\u0072\u006e\u0065\u006cProxyType=null,a&&n){console.info(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_browser_delete_started",\u006b\u0065\u0072\u006e\u0065\u006c_session_id:n}));let o=Se(a.browsers.deleteByID(n),Il,`\u004b\u0065\u0072\u006e\u0065\u006c session ${n} delete`),U=Se(t.close(),Pl,`\u004b\u0065\u0072\u006e\u0065\u006c browser ${n} close`),[u,h]=await Promise.allSettled([o,U]);this.last\u004b\u0065\u0072\u006e\u0065\u006cClosedAtMs=Date.now(),i!=null&&to({\u006b\u0065\u0072\u006e\u0065\u006cSessionId:n,source:"browser_driver",stealth:s,headlessSent:S,proxyUsed:d,proxySource:r,proxyType:l,openedAtMs:i,closedAtMs:this.last\u004b\u0065\u0072\u006e\u0065\u006cClosedAtMs});let w=u.status==="rejected"&&Ol(u.reason),y={\u006b\u0065\u0072\u006e\u0065\u006cSessionId:n,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!0,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:u.status==="fulfilled"||w,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:u.status==="rejected"&&!w?u.reason instanceof Error?u.reason.message:String(u.reason):null,browserCloseSucceeded:h.status==="fulfilled",browserCloseError:h.status==="rejected"?h.reason instanceof Error?h.reason.message:String(h.reason):null,provider:c.provider,providerSessionId:c.providerSessionId,providerDisconnectObserved:!1,providerDisconnectMessage:null};return u.status==="rejected"&&!w?(console.warn(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_browser_delete_failed",\u006b\u0065\u0072\u006e\u0065\u006c_session_id:n,message:y.\u006b\u0065\u0072\u006e\u0065\u006cDeleteError})),console.warn(`\u004b\u0065\u0072\u006e\u0065\u006c session cleanup failed for ${n}:`,u.reason)):console.info(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_browser_delete_succeeded",\u006b\u0065\u0072\u006e\u0065\u006c_session_id:n})),h.status==="rejected"&&(console.warn(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_browser_close_failed",\u006b\u0065\u0072\u006e\u0065\u006c_session_id:n,message:y.browserCloseError})),console.warn(`\u004b\u0065\u0072\u006e\u0065\u006c browser close failed for ${n}:`,h.reason)),y}return await t.close(),{\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:!0,browserCloseError:null,provider:c.provider,providerSessionId:c.providerSessionId,providerDisconnectObserved:!1,providerDisconnectMessage:null}}else if(this.context){let t=this.context;return this.context=null,this.page=null,await t.close(),{\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:!0,browserCloseError:null,provider:"local",providerSessionId:null,providerDisconnectObserved:!1,providerDisconnectMessage:null}}return{\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:null,browserCloseError:null,provider:"local",providerSessionId:null,providerDisconnectObserved:!1,providerDisconnectMessage:null}}};var uo=require("playwright");var Hl=new Set(["image","media","font","stylesheet","ping"]),El=["doubleclick.net","googleadservices.com","googlesyndication.com","google-analytics.com"],Fl='#search, #rso, a[href] h3, [data-snhf], [role="main"]',_l=3e4,co=1500;function Ue(e,t){return e?Math.max(1,Math.min(t,e-Date.now())):t}async function ja(e,t=!1){let n=e.request();try{let a=await n.allHeaders(),i=await fetch(n.url(),{method:n.method(),headers:{accept:a.accept??"*/*","accept-language":a["accept-language"]??"en-US,en;q=0.9","user-agent":a["user-agent"]??"Mozilla/5.0",...t?{cookie:a.cookie??"",referer:a.referer??"https://www.google.com/",...a["x-client-data"]?{"x-client-data":a["x-client-data"]}:{}}:{}},body:n.method()==="GET"||n.method()==="HEAD"?void 0:n.postData()});if(!i.ok)return!1;let s=Buffer.from(await i.arrayBuffer());return await e.fulfill({status:i.status,contentType:i.headers.get("content-type")??"application/octet-stream",headers:{"cache-control":"public, max-age=3600"},body:s}),!0}catch{return!1}}var Vn=class{constructor(t={}){this.resourcePolicy=t}resourcePolicy;browser=null;context=null;page=null;cdpSession=null;providerSessionId=null;disconnectObservation=null;closing=!1;connectionStarted=!1;closeReceipt=null;observeDisconnect(t,n){this.closing||this.disconnectObservation||(this.disconnectObservation=ea(t,n))}async launch(t){if(this.page)return;this.closing=!1,this.providerSessionId=null,this.disconnectObservation=null;let n=_a();if(!n)throw new Error("SERP browser service is not configured");if(this.connectionStarted)throw new Error("Previous browser connection outcome is unresolved");if(this.closeReceipt)throw new Error("Browser driver has already been closed");this.connectionStarted=!0;try{this.browser=await uo.chromium.connectOverCDP(n,{timeout:Ue(t.operationDeadlineMs,_l)})}catch(s){let d=(s instanceof Error?s.message:String(s)).replaceAll(n,"[redacted endpoint]");throw new Error(Wt(d)??"\u0042\u0072\u0069\u0067\u0068\u0074 \u0044\u0061\u0074\u0061 browser connection failed")}this.context=this.browser.contexts()[0]??await this.browser.newContext(),await this.context.addInitScript(()=>{let s=globalThis;typeof s.__name!="function"&&(s.__name=d=>d),typeof s.__publicField!="function"&&(s.__publicField=(d,r,l)=>(d[r]=l,l))}),this.page=this.context.pages()[0]??await this.context.newPage(),this.browser.on("disconnected",()=>this.observeDisconnect("browser_disconnected")),this.context.on("close",()=>this.observeDisconnect("context_closed")),this.page.on("close",()=>this.observeDisconnect("page_closed")),this.page.on("crash",()=>this.observeDisconnect("page_crashed")),this.cdpSession=await this.context.newCDPSession(this.page);let i=await this.cdpSession.send("Browser.getSessionId");this.providerSessionId=bi(i?.sessionId),await this.setupPage(this.page),this.resourcePolicy.startupSettleMs&&await this.page.waitForTimeout(this.resourcePolicy.startupSettleMs)}async setupPage(t){this.resourcePolicy.nativeGoogleAssets||await t.route("**/*",async n=>{let a=n.request(),i=a.resourceType(),s;try{s=new URL(a.url())}catch{await n.continue();return}let d=s.hostname.toLowerCase();if(!(s.pathname==="/sgasync"&&await ja(n,!0))&&!(s.pathname.includes("/shared_dict/")&&await ja(n))&&!(i==="script"&&(d==="www.google.com"||d==="www.gstatic.com")&&await ja(n))){if(Hl.has(i)&&!(i==="image"&&this.resourcePolicy.allowImages)&&!(i==="stylesheet"&&this.resourcePolicy.allowStylesheets)){await n.abort("blockedbyclient");return}if(El.some(r=>d===r||d.endsWith(`.${r}`))){await n.abort("blockedbyclient");return}await n.continue()}})}async withTemporaryPage(t,n){if(!this.context||this.closing)throw new Error("Browser context is not available");return En(this.context,a=>this.setupPage(a),t,n)}async navigateToSERP(t,n,a,i,s){if(!this.page)throw new Error("Browser page is not available");let d=new URLSearchParams({q:t,gl:a,hl:i,pws:"0"});if(s?.tbs&&d.set("tbs",s.tbs),n&&d.set("uule",n),await this.page.goto(`https://www.google.com/search?${d}`,{waitUntil:"domcontentloaded",timeout:Ue(s?.deadlineMs,s?.purpose==="serp"?12e4:45e3)}),s?.purpose==="serp"&&new URL(this.page.url()).pathname.startsWith("/sorry")&&this.cdpSession){let l=this.cdpSession,S;(await Promise.race([l.send("Captcha.solve",{detectTimeout:Ue(s.deadlineMs,3e4)}).catch(()=>null),new Promise(o=>{S=setTimeout(()=>o(null),Ue(s.deadlineMs,75e3))})]).finally(()=>{S&&clearTimeout(S)}))?.status==="solve_finished"&&await this.page.waitForURL(o=>new URL(o.toString()).pathname==="/search",{timeout:Ue(s.deadlineMs,25e3)}).catch(()=>{})}return s?.purpose==="serp"?(await this.page.waitForSelector(Fl,{timeout:Ue(s.deadlineMs,8e3)}).catch(()=>null),{hasPaa:await this.page.locator(st.paaItem).count().catch(()=>0)>0}):{hasPaa:!!await this.page.waitForSelector(st.paaItem,{timeout:Ue(s?.deadlineMs,8e3)}).catch(()=>null)}}async navigateTo(t){if(!this.page)throw new Error("Browser page is not available");await this.page.goto(t,{waitUntil:"load",timeout:45e3})}async navigateToChannel(){throw new Error("YouTube navigation is not supported by the SERP browser driver")}async evaluate(t,n){if(!this.page)throw new Error("Browser page is not available");return this.page.evaluate(t,n)}getPage(){if(!this.page)throw new Error("Browser page is not available");return this.page}get\u004b\u0065\u0072\u006e\u0065\u006cSessionId(){return null}get\u0042\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061SessionId(){return this.providerSessionId}getProviderSessionMetadata(){return{provider:"\u0062\u0072\u0069\u0067\u0068\u0074_\u0064\u0061\u0074\u0061_browser_api",providerSessionId:this.providerSessionId,disconnectObservation:this.disconnectObservation}}getDebugSnapshot(){return{\u006b\u0065\u0072\u006e\u0065\u006c:null,context:null,networkLocation:null,serpNavigation:null}}async close(){return this.closeReceipt??=this.closePhysicalSession()}async closePhysicalSession(){this.closing=!0;let t=Pi(this.getProviderSessionMetadata()),n=!1,a=null,i=null,s=null,d=async(r,l)=>{let S;try{await Promise.race([r(),new Promise((c,o)=>{S=setTimeout(()=>o(new Error(`${l} acknowledgement exceeded ${co}ms`)),co)})])}finally{S&&clearTimeout(S)}};if(this.connectionStarted)if(!this.browser)a="Browser connection outcome is unknown; no remote termination receipt";else{try{await d(async()=>{let r=this.cdpSession??(this.context&&this.page?await this.context.newCDPSession(this.page):null);if(!r)throw new Error("Remote browser termination channel is unavailable");await r.send("Browser.close")},"Remote browser close"),n=!0}catch(r){a=Wt(r instanceof Error?r.message:String(r))??"Remote browser termination is unconfirmed",this.disconnectObservation??=ea("browser_close_error",a)}try{await d(()=>this.browser.close(),"Local browser disconnect"),i=!0}catch(r){i=!1,s=Wt(r instanceof Error?r.message:String(r))??"Local browser disconnect failed"}}return this.browser=null,this.context=null,this.page=null,this.cdpSession=null,{\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:this.connectionStarted?n:null,browserCloseError:a,localDisconnectSucceeded:i,localDisconnectError:s,physicalOutcome:this.connectionStarted?n?"terminated":"unknown":"not_started",...t}}};function ho(e,t){return e.plannedProvider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?new Vn({nativeGoogleAssets:t?.nativeGoogleAssets}):new Gn}var z={container:".eJH8qe.adDDi",dataInitq:"[data-initq]",item:st.paaItem,itemDataQ:"data-q",itemDataInitQ:"data-initq",itemQuestionEl:".JlqpRe",answerContainer:".bCOlv, .hgKElc, .wDYxhc, .LGOjhe, .fo7IQd, .fmW3u",aiAnswerBody:".pWvJNd",answerBody:".hgKElc, .LGOjhe, .fo7IQd, .fmW3u",answerControl:'button, [role="button"], a',answerEntity:".q224lc",citationBadge:".WBgIic",sourceCard:"[data-src-id]",sourceCardTitle:".vFyWT",sourceDescription:"[data-crb-snippet-text]",aiCitation:"a.PMDqCb[href]",aiSourceCard:"a.vIWmYe[href], a.Zbfntb[href]",sourceTitle:"h3",sourceSite:".VuuXrf",sourceCite:"cite",clickTarget:".JlqpRe",expandedClass:"aoRk1c",captchaMarker:st.captchaMarker};var Qa={alabama:"AL",alaska:"AK",arizona:"AZ",arkansas:"AR",california:"CA",colorado:"CO",connecticut:"CT",delaware:"DE",florida:"FL",georgia:"GA",hawaii:"HI",idaho:"ID",illinois:"IL",indiana:"IN",iowa:"IA",kansas:"KS",kentucky:"KY",louisiana:"LA",maine:"ME",maryland:"MD",massachusetts:"MA",michigan:"MI",minnesota:"MN",mississippi:"MS",missouri:"MO",montana:"MT",nebraska:"NE",nevada:"NV","new hampshire":"NH","new jersey":"NJ","new mexico":"NM","new york":"NY","north carolina":"NC","north dakota":"ND",ohio:"OH",oklahoma:"OK",oregon:"OR",pennsylvania:"PA","rhode island":"RI","south carolina":"SC","south dakota":"SD",tennessee:"TN",texas:"TX",utah:"UT",vermont:"VT",virginia:"VA",washington:"WA","west virginia":"WV",wisconsin:"WI",wyoming:"WY","district of columbia":"DC"},Dl=[...Object.keys(Qa).map(e=>e.replace(/\s+/g,"\\s+")),...Object.values(Qa)].join("|"),Gl=new RegExp(`\\b([A-Z][A-Za-z]+(?:[\\s.-][A-Z][A-Za-z]+){0,4}),?\\s+(${Dl})\\b`,"gi");function wo(e){if(!e)return null;let t=e.trim();return/^[A-Z]{2}$/i.test(t)?t.toUpperCase():Qa[t.toLowerCase()]??null}function po(e){return e.replace(/\s+/g," ").trim().replace(/^.*\b(?:in|near|around|serving)\s+/i,"").toLowerCase().replace(/\b[a-z]/g,n=>n.toUpperCase())}function Vl(e){if(!e)return null;let[t="",n=""]=e.split(",").map(a=>a.trim());return{city:po(t),regionCode:wo(n),canonicalLocation:e}}function Kl(e,t,n,a){let i=po(t),s=wo(n);if(!i||!s)return;let d=`${i.toLowerCase()}|${s}`,r=e.get(d);if(r){r.count++,r.examples.length<3&&!r.examples.includes(a)&&r.examples.push(a);return}e.set(d,{city:i,regionCode:s,count:1,examples:[a]})}function Yl(e){try{return decodeURIComponent(e)}catch{}try{return decodeURIComponent(e.replace(/%(?![0-9a-fA-F]{2})/g,"%25"))}catch{return e}}function go(e,t){let n=Yl(t).replace(/[+/|_-]+/g," ");for(let a of n.matchAll(Gl))Kl(e,a[1]??"",a[2]??"",n.slice(0,180))}function ln(e,t,n){let a=Vl(e),i=new Map;for(let r of t)go(i,[r.title,r.snippet??"",r.cite??"",r.url].join(" "));for(let r of n)go(i,[r.name,...r.metadata,r.websiteUrl??"",r.directionsUrl??""].join(" "));let s=Array.from(i.values()).sort((r,l)=>l.count-r.count||r.city.localeCompare(l.city)).slice(0,8);return a?s.length===0?{status:"unknown",expected:a,candidates:[]}:{status:s.some(r=>r.city.toLowerCase()===a.city.toLowerCase()&&(a.regionCode==null||r.regionCode===a.regionCode))?"matched":"mismatch",expected:a,candidates:s}:{status:"not_requested",expected:null,candidates:s}}var Jl=/^(?:an error has occurred(?:[.!…]\s*)?(?:please try again later[.!…]?)?|loading|please wait|try again|something went wrong|an AI overview is not available for this search|can't generate an AI overview right now\.?\s*try again later\.?)[.!…\s]*$/i,ql=/^(?:AI Overview|View all|Show more|Show less|Related Links|Ask anything in AI Mode|AI can make mistakes)[.!…\s]*$/i;function Xa(e){return e.replace(/\u00a0/g," ").replace(/\s+/g," ").trim()}function yo(e,t){if(!e)return;let n=Xa(e.split(/\r?\n/).filter(i=>!ql.test(Xa(i))).join(`
21776
+ `)),a=t?Xa(t):"";return a&&n.toLowerCase().startsWith(a.toLowerCase())&&(n=n.slice(a.length).trim()),!n||Jl.test(n)?void 0:n}function Kn({selectors:e,onlyQuestion:t}){let n=l=>(l??"").replace(/\u00a0/g," ").replace(/\s+/g," ").trim(),a=l=>n(l).replace(/\s*\(\+\d+\)\s*-\s*View related links.*$/i,"").replace(/\s*(?:[-.]\s*)?Opens in new tab[.!]?$/i,"").trim(),i=l=>{if(l.matches(e.clickTarget)||l.getAttribute("aria-expanded")==="true")return!1;let S=l.getAttribute("href");return S&&!/^(?:#|javascript:void\(0\);?$)/i.test(S)||l.closest(e.aiSourceCard+","+e.sourceCard)?!1:[l.getAttribute("aria-label"),l.textContent].map(n).some(o=>/^(?:(?:show|read|see) more(?: (?:AI Overview|(?:of )?(?:this |the )?answer))?|continue reading|expand(?: (?:this |the )?answer)?)(?:[.!…]|\s*[▼⌄+])?$/i.test(o))},s=l=>l.hasAttribute("hidden")||l.getAttribute("aria-hidden")==="true"||/(?:display\s*:\s*none|visibility\s*:\s*hidden)/i.test(l.getAttribute("style")??""),d=l=>{let S=l.ownerDocument.defaultView?.getComputedStyle(l);return S?.display==="none"||S?.visibility==="hidden"},r=(l,S,c)=>{if(!l||l!==S&&(s(l)||l.matches("style,script,noscript,button")||l.matches('[role="button"]')&&!l.matches(e.answerEntity)||l.matches(e.aiSourceCard+","+e.sourceCard+","+e.citationBadge)||c&&(l.matches("cite,"+e.sourceSite)||l.matches("a[href]")&&l.querySelector("h3"))))return"";let o=[];for(let U of l.childNodes)U.nodeType===Node.TEXT_NODE?o.push(U.textContent??""):U.nodeType===Node.ELEMENT_NODE&&o.push(r(U,S,c));return n(o.join(" "))};return Array.from(document.querySelectorAll(e.item)).flatMap((l,S)=>{let c=n(l.getAttribute(e.itemDataQ)||l.getAttribute(e.itemDataInitQ)||l.querySelector(e.itemQuestionEl)?.innerText||l.querySelector(e.itemQuestionEl)?.textContent);if(!c||t&&c!==t)return[];let o=l.classList.contains(e.expandedClass)||l.querySelector(e.clickTarget)?.getAttribute("aria-expanded")==="true",U=l.querySelector(e.answerContainer),u=U?.querySelector(e.aiAnswerBody)||(U?.matches(e.aiAnswerBody)?U:null)||U?.querySelector(e.answerBody)||(U?.matches(e.answerBody)?U:null),h=u||U,w=r(h,h,!u),y=/^(?:an error has occurred(?:[.!…]\s*)?(?:please try again later[.!…]?)?|loading|please wait|try again|something went wrong)[.!…\s]*$/i.test(w),N=[...Array.from((h||l).querySelectorAll("a[href]")),...Array.from(U?.querySelectorAll("a[href]")||[]),...Array.from(l.querySelectorAll(e.aiCitation+","+e.aiSourceCard))],C=!y&&(o&&w.length>=10||w.length>30&&N.some(P=>/^https?:\/\//i.test(P.href))),M=Array.from(U?.querySelectorAll(e.answerControl)||[]),W=C?M.flatMap((P,m)=>{if(!i(P))return[];for(let v=P;v&&v!==U;v=v.parentElement)if(s(v)||d(v))return[];return[m]}):[],L=new Map;if(C)for(let P of N){if(!/^https?:\/\//i.test(P.href))continue;let m=P.closest(e.sourceCard),v=m?n(m.querySelector(e.sourceDescription)?.textContent):"",O=(m?n(m.querySelector(e.sourceCardTitle)?.textContent):"")||a(P.getAttribute("aria-label"))||n(P.querySelector("h3")?.textContent)||n(P.textContent),p=L.get(P.href);L.set(P.href,{title:m&&O?O:p?.title||O,rawHref:P.href,...v||p?.description?{description:v||p?.description}:{}})}let B=[...L.values()],f=C&&n(l.querySelector(e.sourceTitle)?.textContent)||void 0,F=C&&n(l.querySelector(e.sourceSite)?.textContent)||void 0;return f||=B.find(P=>P.title.length>2)?.title||B[0]?.title||void 0,[{googleLinkId:l.getAttribute("data-lk")||l.querySelector("[data-lk]")?.getAttribute("data-lk")||null,googleEvidenceId:l.getAttribute("data-ved")||l.querySelector("[data-ved]")?.getAttribute("data-ved")||null,question:c,answer:C?w:void 0,sourceTitle:f,sourceSite:F,sources:B,...W.length||l.getAttribute("data-mcp-answer-expansion")==="pending"?{answerExpansionIncomplete:!0}:{},itemIndex:S,expanded:o,answerControls:W}]})}async function Za(e,t,n,a){let i=Math.min(n.deadlineMs??1/0,Date.now()+1e4),s=()=>Math.max(0,i-Date.now()),d=async()=>(await e.evaluate(a,{selectors:n.selectors,onlyQuestion:t}))[0],r=await d(),l=async S=>{let c=Math.min(i,Date.now()+2500),o=null,U=S;for(;!n.signal?.aborted&&Date.now()<c;){if(await e.waitForTimeout(Math.min(150,c-Date.now())),r=await d(),!r||n.signal?.aborted)return;if(r.answer!==U&&(U=r.answer,o=Date.now()),!r.answerControls.length&&r.answer){o??=Date.now();let u=r.answer!==S?300:1e3;if(Date.now()-o>=u){await e.locator(n.selectors.item).nth(r.itemIndex).evaluate(h=>{h.removeAttribute("data-mcp-answer-expansion")}).catch(()=>{});return}}else if(r.answerControls.length&&r.answer!==S&&o!==null&&Date.now()-o>=300)return}};if(r?.answerExpansionIncomplete&&!r.answerControls.length){await l(r.answer);return}for(let S=0;r?.answerControls.length&&S<8;S+=1){if(n.signal?.aborted||s()<=0)return;let c=e.locator(n.selectors.item).nth(r.itemIndex);try{if(!r.expanded&&(await c.locator(n.selectors.clickTarget).first().click({timeout:Math.min(1200,s())}),s()<=0||n.signal?.aborted||(await e.waitForTimeout(Math.min(250,s())),r=await d(),!r?.answerControls.length))||n.signal?.aborted||s()<=0)return;let U=e.locator(n.selectors.item).nth(r.itemIndex).locator(n.selectors.answerContainer).first().locator(n.selectors.answerControl).nth(r.answerControls[0]);if(!await U.evaluate((h,w)=>h.getAttribute("data-mcp-answer-expansion")==="pending"?!1:(h.setAttribute("data-mcp-answer-expansion","pending"),h.closest(w)?.setAttribute("data-mcp-answer-expansion","pending"),!0),n.selectors.item)){await l(r.answer);return}if(n.signal?.aborted||s()<=0)return;await U.click({timeout:Math.min(1200,s())})}catch{return}let o=r.answer;if(await l(o),!r?.answerControls.length||r.answer===o)return;await e.locator(n.selectors.item).nth(r.itemIndex).locator(n.selectors.answerContainer).first().locator(n.selectors.answerControl).nth(r.answerControls[0]).evaluate(U=>{U.setAttribute("data-mcp-answer-expansion","confirmed")}).catch(()=>{})}}async function mo(e){let t=e??{aio:{root:"[data-lhcontainer][data-streaming-container][eid]",legacyRoot:'[data-hveid="CBMQAA"]',wrapper:".Fgyi2e",controller:'[jscontroller="AkrxPe"]',contentSubtree:'[data-subtree="mfc"]',heading:".Fzsovc.cwYVJe.RJPOee",header:".heWuVc",showMoreButton:'[aria-label="Show more AI Overview"]',sourcesPanel:".OZ9ddf.WAUd4",disclaimer:".DuQANe.MSJHRb"},aim:{root:'[data-hveid="CAUQAA"]',wrapper:".Fgyi2e"},expandWaitMs:1500},n=window.google?.sn??"unknown",a=n==="aim"?"aim":n==="web"?"web":"unknown";function i(m){return m?(m.innerText??m.textContent??"").trim():""}function s(m){if(!m)return!1;let v=m.replace(/\s+/g," ").trim();return v.length>=16&&v.split(" ").filter(Boolean).length>=2}function d(m){let v=m.querySelector(t.aio.heading);if(i(v)==="AI Overview")return!0;let O=m.querySelector(t.aio.header);return!!i(O).split(/\n|\s{2,}/).some(p=>p.trim()==="AI Overview")}function r(){let v=Array.from(document.querySelectorAll(t.aio.root)).find(d);if(v)return v;if(t.aio.legacyRoot){let p=document.querySelector(t.aio.legacyRoot);if(p&&d(p))return p}let O=document.querySelectorAll(`${t.aio.heading}, h1, h2, h3, [role="heading"]`);for(let p of O){if(i(p)!=="AI Overview")continue;let k=p.parentElement;for(let _=0;_<8&&k;_++){if(k.matches(t.aio.root)||k.querySelector(t.aio.controller)||k.querySelector(t.aio.contentSubtree))return k;k=k.parentElement}return p.parentElement}return null}function l(m){if(!m)return null;let v=m.cloneNode(!0);v.querySelectorAll(["script","style","noscript","img","picture","video",t.aio.header,t.aio.showMoreButton,t.aio.sourcesPanel,t.aio.disclaimer,'[data-subtree="dfa"]',"[data-src-id]",'[role="dialog"]',".HWMcu",".bTFeG",".CyMdWb",".MFrAxb",".F0OfWd.hfWAgb",".x2qcTc.fZavHb",".SvjEff",".sR2MY",".lKuDef",".GSPQcc","a[href]","button",'[role="button"]'].join(",")).forEach(A=>A.remove());let O=document.createElement("div");O.style.position="fixed",O.style.left="-10000px",O.style.top="0",O.style.width=`${Math.max(320,Math.round(m.getBoundingClientRect?.().width||960))}px`,O.style.opacity="0",O.style.pointerEvents="none",O.append(v),document.body.append(O);let p=v.innerText||v.textContent||"";O.remove();let k=p.replace(/\r/g,"").replace(/[ \t]+\n/g,`
21887
21777
  `).replace(/\n[ \t]+/g,`
21888
21778
  `).replace(/\n{3,}/g,`
21889
21779
 
21890
21780
  `).replace(/[ \t]{2,}/g," ").trim().split(`
21891
- `).map(x=>x.replace(/\u00a0/g," ").trim()).filter(Boolean),I=[];for(let x=0;x<N.length;x++){let O=N[x],j=N[x+1]??"";if(O!=="AI Overview"&&O!=="Show more"&&!/^AI can make mistakes/i.test(O)&&!/^Thank you\b/i.test(O)&&!/^Your feedback helps Google improve/i.test(O)&&!/^\+?\d+$/.test(O)){if(/^\+\d+$/.test(j)&&O.length<=80){x++;continue}I.push(O)}}let W=I.join(`
21781
+ `).map(A=>A.replace(/\u00a0/g," ").trim()).filter(Boolean),_=[];for(let A=0;A<k.length;A++){let b=k[A],R=k[A+1]??"";if(b!=="AI Overview"&&b!=="Show more"&&!/^AI can make mistakes/i.test(b)&&!/^Thank you\b/i.test(b)&&!/^Your feedback helps Google improve/i.test(b)&&!/^\+?\d+$/.test(b)){if(/^\+\d+$/.test(R)&&b.length<=80){A++;continue}_.push(b)}}let H=_.join(`
21892
21782
  `).replace(/\n{3,}/g,`
21893
21783
 
21894
- `).trim();return!W||/not available|try again|can't generate/i.test(W)?null:W}function S(y){if(!y||y.startsWith("javascript:"))return null;try{let E=new URL(y,window.location.href);return!["http:","https:"].includes(E.protocol)||E.username||E.password?null:{href:E.href,rawHref:E.href}}catch{return null}}function U(y){if(!y)return[];let E=new Set,p=[];for(let C of Array.from(y.querySelectorAll("a[href]"))){let N=S(C.getAttribute("href")??"");if(!N||E.has(N.rawHref))continue;E.add(N.rawHref);let I="";try{I=new URL(N.href).hostname.replace(/^www\./,"")}catch{}p.push({text:i(C)||I||N.href,href:N.href,rawHref:N.rawHref})}return p}async function r(y){let E=y.querySelector(t.aio.showMoreButton);if(!E||E.getAttribute("aria-expanded")!=="false")return!1;E.click();let p=t.expandWaitMs??1500;return p>0&&await new Promise(C=>setTimeout(C,p)),!0}let u=d(),c=null,h=[],w=!1,k=!1,f=[];if(u){w=await r(u);let y=u.querySelector(t.aio.controller),E=u.querySelector(t.aio.contentSubtree),p=u.querySelector(t.aio.showMoreButton);k=y?.getAttribute("data-trnct")==="false"||p?.getAttribute("aria-expanded")==="true"||!p,c=l(E??y??u),f=(c??"").split(`
21895
- `).map(C=>C.trim()).filter(C=>/^\d+\.\s+.+/.test(C)),h=U(u)}let m=document.querySelector(t.aim.root),L=a==="aim"&&!!m,R=m?.closest(t.aim.wrapper)??m,B=L?l(R):null,_=L&&s(B),M=_?B:null,H=_?U(R):[],P=!!u&&s(c);return{surface:a,aiOverview:{detected:P,text:P?c:null,citations:P?h:[],expanded:P?w:!1,fullyExpanded:P?k:!1,sections:P?f:[]},aiMode:{detected:_&&M!==null,text:M,citations:H}}}var Ks=require("crypto"),Js=8e3,Xs=3e3,qs=1e4,rl=8;function Rt(e){return/(^|\.)google\.(?:com|[a-z]{2,3}(?:\.[a-z]{2})?)$/i.test(e)}function nn(e){if(!e||e.length>Js)return null;try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"||t.username||t.password?null:t}catch{return null}}function dl(e,t){if(!e||e.length>Js||/^javascript:/i.test(e))return null;try{let n=new URL(e,t);return nn(n.href)}catch{return null}}function en(e){let t=nn(e);return!t||t.protocol!=="https:"||!Rt(t.hostname)||t.pathname!=="/goto"?null:t.searchParams.get("url")?t:null}function Ga(e){if(e.linkType!=="google_goto_redirect"||e.resolutionStatus!=="resolved"||!en(e.rawUrl)||!e.resolvedUrl)return!1;let t=nn(e.resolvedUrl);return!!(t&&!Rt(t.hostname)&&t.href===e.resolvedUrl&&e.url===t.href)}function ae(e){let t=e.normalize("NFKC").toLocaleLowerCase("en-US").replace(/[^\p{L}\p{N}\s]/gu,"").replace(/\s+/g," ").trim();return`paa_${(0,Ks.createHash)("sha256").update(t).digest("hex").slice(0,16)}`}function Dn(e,t){let n=dl(e,t);if(!n)return null;let a=n.href;if(!Rt(n.hostname))return{url:a,rawUrl:a,resolvedUrl:a,linkType:"plain",resolutionStatus:"not_needed"};if(n.pathname==="/url"){let i=nn(n.searchParams.get("q")??n.searchParams.get("url")??"");return!i||Rt(i.hostname)?null:{url:i.href,rawUrl:a,resolvedUrl:i.href,linkType:"google_url_redirect",resolutionStatus:"resolved"}}return n.pathname==="/goto"&&n.searchParams.get("url")?{url:a,rawUrl:a,resolvedUrl:null,linkType:"google_goto_redirect",resolutionStatus:"unresolved"}:null}function Va(e){return en(e)?.searchParams.get("url")??null}function js(e,t){try{let n=new URL(e),a=nn(new URL(t,n).href);return!a||Rt(a.hostname)?null:(!a.hash&&n.hash&&(a.hash=n.hash),a.href)}catch{return null}}async function zs(e,t={}){let n=[...new Set([...e].flatMap(r=>en(r)?[r]:[]))],a=new Map(n.map(r=>[r,{rawUrl:r,resolvedUrl:null,resolutionStatus:"unresolved"}])),i=typeof globalThis.fetch=="function"?globalThis.fetch.bind(globalThis):null,s=t.fetchImpl??i;if(n.length===0||!s)return{resolutions:[...a.values()],nonGoogleRequestsObserved:0};let o=Math.max(1,t.timeoutMs??Xs),d=Date.now()+Math.max(1,t.totalBudgetMs??qs),l=Math.max(1,Math.min(16,Math.floor(t.concurrency??rl))),S=0,U=async()=>{for(;S<n.length;){let r=n[S++],u=en(r),c=u?.searchParams.get("url");if(!u||!c){a.set(r,{rawUrl:r,resolvedUrl:null,resolutionStatus:"rejected"});continue}u.hash="";let h=u.href;for(let w=0;w<2;w++){let k=d-Date.now();if(k<=0)return;let f=new AbortController,m=setTimeout(()=>f.abort(),Math.min(o,k)),L;try{L=await s(h,{method:"GET",redirect:"manual",headers:{accept:"*/*","user-agent":"Mozilla/5.0"},signal:f.signal})}catch{break}finally{clearTimeout(m)}if(L.status<300||L.status>=400)break;let R=L.headers.get("location");if(!R)break;let B=js(r,R);if(B){a.set(r,{rawUrl:r,resolvedUrl:B,resolutionStatus:"resolved"});break}let _;try{_=new URL(R,h)}catch{a.set(r,{rawUrl:r,resolvedUrl:null,resolutionStatus:"rejected"});break}if(!Rt(_.hostname)||Va(_.href)!==c){a.set(r,{rawUrl:r,resolvedUrl:null,resolutionStatus:"rejected"});break}h=_.href}}};return await Promise.all(Array.from({length:Math.min(l,n.length)},()=>U())),{resolutions:[...a.values()],nonGoogleRequestsObserved:0}}function Ys(e,t){try{return new URL(e.resolvedUrl??e.url).hostname.replace(/^www\./,"")}catch{return t}}async function $s(e,t={}){let n=[],a=r=>{for(let u of r)n.push(u),a(u.children??[])};a(e.tree??[]);let i=[...e.flat.flatMap(r=>r.sources??[]),...n.flatMap(r=>r.sources),...e.organicResults??[],...(e.aiOverview?.citations??[]).map(({text:r,href:u,...c})=>({...c,url:u})),...(e.aiMode?.citations??[]).map(({text:r,href:u,...c})=>({...c,url:u}))],s=new Map(i.filter(r=>!!r?.rawUrl).map(r=>[r.rawUrl,r])),o=[...s.values()].filter(r=>r.linkType==="google_goto_redirect"&&r.resolutionStatus!=="resolved").map(r=>r.rawUrl);if(o.length>0){let r=await zs(o,t);for(let u of r.resolutions){let c=s.get(u.rawUrl);c&&s.set(u.rawUrl,u.resolutionStatus==="resolved"&&u.resolvedUrl?{...c,url:u.resolvedUrl,resolvedUrl:u.resolvedUrl,resolutionStatus:"resolved"}:{...c,resolutionStatus:u.resolutionStatus})}}let d=r=>({...r,...s.get(r.rawUrl)??r}),l=r=>r.map(u=>{let c=d(u);return{...c,site:Ys(c,u.site)}});for(let r of e.flat){r.sources=l(r.sources??[]);let u=r.sources[0];r.source_title=u?.title??r.source_title,r.source_site=u?.site??r.source_site,r.source_cite=u?.url??r.source_cite}for(let r of n){r.sources=l(r.sources??[]);let u=r.sources[0];r.sourceTitle=u?.title??r.sourceTitle,r.sourceSite=u?.site??r.sourceSite,r.sourceCite=u?.url??r.sourceCite}for(let r=0;r<(e.organicResults?.length??0);r++){let u=d(e.organicResults[r]);e.organicResults[r]={...u,domain:Ys(u,e.organicResults[r].domain)??""}}let S=r=>{let u=d({url:r.href,rawUrl:r.rawUrl,resolvedUrl:r.resolvedUrl,linkType:r.linkType,resolutionStatus:r.resolutionStatus}),{url:c,...h}=u;return{...r,...h,href:c}};e.aiOverview&&(e.aiOverview.citations=(e.aiOverview.citations??[]).map(S)),e.aiMode&&(e.aiMode.citations=(e.aiMode.citations??[]).map(S));let U=[...s.values()];return e.diagnostics.links={linkCandidatesObserved:s.size,plainLinksObserved:U.filter(r=>r.linkType==="plain").length,googleUrlRedirectsObserved:U.filter(r=>r.linkType==="google_url_redirect").length,googleGotoRedirectsObserved:U.filter(r=>r.linkType==="google_goto_redirect").length,redirectsResolved:U.filter(r=>r.linkType!=="plain"&&r.resolutionStatus==="resolved").length,redirectsUnresolved:U.filter(r=>r.resolutionStatus==="unresolved").length,redirectsRejected:U.filter(r=>r.resolutionStatus==="rejected").length,resolverNonGoogleRequestsObserved:0,paaSourcesPreserved:e.flat.reduce((r,u)=>r+u.sources.length,0),aiOverviewLabelValidated:e.aiOverview?.detected??!1},e}async function Qs(e,t,n={}){let a=new Map;for(let u of t){let c=a.get(u.rawUrl);c&&Ga(c)||a.set(u.rawUrl,u.linkType==="google_goto_redirect"&&!Ga(u)?{...u,url:u.rawUrl,resolvedUrl:null,resolutionStatus:"unresolved"}:u)}let i=[...a.values()].filter(u=>u.linkType==="google_goto_redirect"&&!Ga(u));if(i.length===0)return a;let s=Date.now()+(n.totalBudgetMs??qs),o=await zs(i.map(u=>u.rawUrl),n);for(let u of o.resolutions){let c=a.get(u.rawUrl);c&&a.set(u.rawUrl,u.resolutionStatus==="resolved"&&u.resolvedUrl?{...c,url:u.resolvedUrl,resolvedUrl:u.resolvedUrl,resolutionStatus:"resolved"}:{...c,resolutionStatus:u.resolutionStatus})}let d=i.filter(u=>a.get(u.rawUrl)?.resolutionStatus==="unresolved");if(d.length===0||n.browserFallback===!1||Date.now()>=s)return n.onNetworkAudit?.({nonGoogleRequestsObserved:0}),a;let l=n.timeoutMs??Xs,S=await e.context().newPage().catch(()=>null);if(!S)return n.onNetworkAudit?.({nonGoogleRequestsObserved:0}),a;let U=null,r=0;try{await S.route("**/*",async u=>{let c=u.request().url();try{Rt(new URL(c).hostname)||(r+=1)}catch{}let h=Va(c);if(!U||h!==U.token){await u.abort("blockedbyclient").catch(()=>{});return}let w=U;try{let k=await u.fetch({maxRedirects:0,timeout:w.timeoutMs});w.location=k.headers().location??null}finally{await u.abort("blockedbyclient").catch(()=>{}),w.finish()}});for(let u of d){let c=s-Date.now();if(c<=0)break;let h=en(u.rawUrl),w=h?.searchParams.get("url");if(!h||!w){a.set(u.rawUrl,{...u,resolutionStatus:"rejected"});continue}let k=Math.min(l,c);h.hash="";let f=h.href,m=!1;for(let L=0;L<2;L++){let R,B=new Promise(y=>{R=y}),_=`mcp-goto-${Math.random().toString(36).slice(2)}`;U={token:w,timeoutMs:k,location:null,finish:R},await S.evaluate(({url:y,id:E})=>{let p=document.createElement("iframe");p.id=E,p.hidden=!0,p.src=y,document.body.append(p)},{url:f,id:_}).catch(()=>null),await Promise.race([B,new Promise(y=>setTimeout(y,k))]);let M=U.location;if(U=null,await S.evaluate(y=>document.getElementById(y)?.remove(),_).catch(()=>null),!M)break;let H=js(u.rawUrl,M);if(H){a.set(u.rawUrl,{...u,url:H,resolvedUrl:H,resolutionStatus:"resolved"});break}let P;try{P=new URL(M,f)}catch{m=!0;break}if(!Rt(P.hostname)||Va(P.href)!==w){m=!0;break}f=P.href}m&&a.get(u.rawUrl)?.resolutionStatus!=="resolved"&&a.set(u.rawUrl,{...u,resolutionStatus:"rejected"})}}finally{U=null,await S.close().catch(()=>{}),n.onNetworkAudit?.({nonGoogleRequestsObserved:r})}return a}var Zs=String.raw`^(?:an error has occurred(?:[.!…]\s*)?(?:please try again later[.!…]?)?|loading|please wait|try again|something went wrong)[.!…\s]*$`,ll=700,Sl=1e3,Ul=1400,to=900,ul=3,eo=250,Bn=class{constructor(t,n,a,i){this.driver=t;this.reporter=n;this.onPaaProgress=a;this.onProviderSession=i}driver;reporter;onPaaProgress;onProviderSession;completeness={paaWithoutAnswer:0,paaWithoutSource:0,paaAnswersRecovered:0,aioShareCaptured:null};aioShareUrlEarly=null;linkDiagnostics=this.emptyLinkDiagnostics();collectedRows=[];partialContext=null;progressSequence=0;clickedQuestions=new Set;paaLifecycle=this.emptyPaaLifecycle(0);checkpointMaterial=null;interactionObservations=[];phaseTimings={};currentPhaseTimings(t){return{...this.phaseTimings,totalServerMs:Math.max(0,Date.now()-t)}}emptyPaaLifecycle(t){return{requestedQuestions:t,questionsFound:0,targetStatus:"not_met",discoveryStatus:"in_progress",materialStatus:"partial",completionReason:"PAA expansion is still running.",automaticRetries:0,retryBreakdown:{controlRetries:0,browserRetries:0,providerFallbacks:0,runtimeRecoveries:0,idempotentReplays:0},knownQuestions:0,processedQuestions:0,failedInteractions:0,noGrowthConfirmations:0,visibleControls:0,eligibleControls:0,dispatchedInteractions:0,confirmedInteractions:0,unconfirmedInteractions:0}}emptyLinkDiagnostics(){return{linkCandidatesObserved:0,plainLinksObserved:0,googleUrlRedirectsObserved:0,googleGotoRedirectsObserved:0,redirectsResolved:0,redirectsUnresolved:0,redirectsRejected:0,resolverNonGoogleRequestsObserved:0,paaSourcesPreserved:0,aiOverviewLabelValidated:!1}}mergePaaSources(t=[],n=[]){let a=new Map;for(let i of[...t,...n]){let s=a.get(i.rawUrl);if(!s){a.set(i.rawUrl,i);continue}let o=i.resolutionStatus==="resolved"&&s.resolutionStatus!=="resolved"?i:s;a.set(i.rawUrl,{...o,title:o.title??s.title??i.title,site:o.site??s.site??i.site})}return[...a.values()]}normalizeAICitations(t,n){let a=new Set;return n.flatMap(i=>{let s=Dn(i.rawHref??i.href,t);if(!s||a.has(s.rawUrl))return[];a.add(s.rawUrl);let{url:o,...d}=s;return[{...d,text:i.text,href:o}]})}async resolveMaterialLinks(t,n,a,i,s){let o=Date.now(),d=[...n.flatMap(h=>h.sources??[]),...a,...i.citations.map(({text:h,href:w,...k})=>({...k,url:w})),...s.citations.map(({text:h,href:w,...k})=>({...k,url:w}))],l=new Map(d.map(h=>[h.rawUrl,h])),S=0,U=await Qs(t,d,{onNetworkAudit:h=>{S=h.nonGoogleRequestsObserved}}),r=h=>({...h,...U.get(h.rawUrl)??h});for(let h of n){h.sources=(h.sources??[]).map(r);let w=h.sources[0];h.source_title=w?.title??h.source_title,h.source_site=w?.site??h.source_site,h.source_cite=w?.url??h.source_cite}for(let h=0;h<a.length;h++){let w=r(a[h]);if(w.resolvedUrl)try{w.domain=new URL(w.resolvedUrl).hostname.replace(/^www\./,"")}catch{}a[h]=w}let u=h=>{let w=r({url:h.href,rawUrl:h.rawUrl,resolvedUrl:h.resolvedUrl,linkType:h.linkType,resolutionStatus:h.resolutionStatus}),{url:k,...f}=w;return{...f,text:h.text,href:k}};i.citations=i.citations.map(u),s.citations=s.citations.map(u);let c=[...U.values()];this.linkDiagnostics={linkCandidatesObserved:l.size,plainLinksObserved:c.filter(h=>h.linkType==="plain").length,googleUrlRedirectsObserved:c.filter(h=>h.linkType==="google_url_redirect").length,googleGotoRedirectsObserved:c.filter(h=>h.linkType==="google_goto_redirect").length,redirectsResolved:c.filter(h=>h.linkType!=="plain"&&h.resolutionStatus==="resolved").length,redirectsUnresolved:c.filter(h=>h.resolutionStatus==="unresolved").length,redirectsRejected:c.filter(h=>h.resolutionStatus==="rejected").length,resolverNonGoogleRequestsObserved:S,paaSourcesPreserved:n.reduce((h,w)=>h+(w.sources??[]).length,0),aiOverviewLabelValidated:i.detected},this.phaseTimings.linkResolutionMs=(this.phaseTimings.linkResolutionMs??0)+(Date.now()-o)}normalizeQuestion(t){return t.toLowerCase().replace(/[^\w\s]/g,"").replace(/\s+/g," ").trim()}throwIfAborted(t){if(t?.aborted)throw t.reason instanceof DOMException&&t.reason.name==="TimeoutError"?t.reason:new pt}async throwIfCaptcha(t,n){if(await t.locator(q.captchaMarker).count().catch(()=>0)>0)throw new it(`${n} returned a CAPTCHA \u2014 retrying with a fresh session.`)}async extractVisibleItems(t,n){let a=q,i=await t.evaluate(({selectors:o,onlyQuestion:d,answerPlaceholderPattern:l})=>{function S(r){if(!r)return"";let u=[];for(let c of r.childNodes)if(c.nodeType===Node.TEXT_NODE){let h=c.textContent?.trim();h&&u.push(h)}else{if(c.tagName==="STYLE"||c.tagName==="SCRIPT")continue;{let h=S(c);h&&u.push(h)}}return u.join(" ").replace(/\s+/g," ").trim()}function U(r){return(r??"").replace(/\s*\(\+\d+\)\s*-\s*View related links.*$/i,"").replace(/\s*-\s*Opens in new tab.*$/i,"").trim()}return Array.from(document.querySelectorAll(o.item)).filter(r=>!d||(r.getAttribute(o.itemDataQ)||r.getAttribute(o.itemDataInitQ)||r.querySelector(o.itemQuestionEl)?.innerText?.trim()||"")===d).map(r=>{let u=r.querySelector(o.clickTarget),c=r.classList.contains(o.expandedClass)||u?.getAttribute("aria-expanded")==="true",h=r.querySelector(o.answerContainer),k=h?.querySelector(o.aiAnswerBody)??h,f=S(k),m=new RegExp(l,"i").test(f),L=[...Array.from((k??r).querySelectorAll("a[href]")),...Array.from(r.querySelectorAll(o.aiCitation)),...Array.from(r.querySelectorAll(o.aiSourceCard))],R=!m&&(c&&f.length>=10||f.length>30&&L.some(H=>/^https?:\/\//.test(H.href))),B=R&&r.querySelector(o.sourceTitle)?.innerText?.trim()||void 0,_=R&&r.querySelector(o.sourceSite)?.innerText?.trim()||void 0,M=[];if(R){let H=new Set;for(let y of L)!/^https?:\/\//.test(y.href)||H.has(y.href)||(H.add(y.href),M.push({title:U(y.getAttribute("aria-label"))||(y.textContent||"").trim(),rawHref:y.href}));let P=M.find(y=>y.title.length>2)??M[0];P&&(B=B||P.title||void 0)}return{googleLinkId:r.getAttribute("data-lk")||r.querySelector("[data-lk]")?.getAttribute("data-lk")||null,googleEvidenceId:r.getAttribute("data-ved")||r.querySelector("[data-ved]")?.getAttribute("data-ved")||null,question:r.getAttribute(o.itemDataQ)||r.getAttribute(o.itemDataInitQ)||r.querySelector(o.itemQuestionEl)?.innerText?.trim()||"",answer:R&&f||void 0,sourceTitle:B,sourceSite:_,sources:M}})},{selectors:a,onlyQuestion:n,answerPlaceholderPattern:Zs}),s=typeof t.url=="function"?t.url():"https://www.google.com/";return i.flatMap(o=>{let d=[],l=new Set;for(let u of o.sources){let c=Dn(u.rawHref,s);if(!c||l.has(c.rawUrl))continue;l.add(c.rawUrl);let h=o.sourceSite??null;try{h||=new URL(c.resolvedUrl??c.rawUrl).hostname.replace(/^www\./,"")}catch{}d.push({...c,title:u.title||o.sourceTitle||null,site:h})}let S=d[0],U={questionId:ae(o.question),googleLinkId:o.googleLinkId,googleEvidenceId:o.googleEvidenceId,question:o.question,answer:Gs(o.answer,o.question,o.sourceTitle),sourceTitle:S?.title??o.sourceTitle,sourceSite:S?.site??o.sourceSite,sourceCite:S?.url,sources:d},r=gi.safeParse(U);return r.success?[r.data]:(console.warn("[PAAExtractor] item parse failed:",o.question,r.error.issues[0]?.message),[])})}jitteredDelayMs(t,n){return t+Math.floor(Math.random()*(n-t+1))}async clickItem(t,n){try{await t.locator(`${q.item}[data-q="${n}"], ${q.item}[data-initq="${n}"]`).first().click()}catch{}}toFlatRow(t,n,a,i){return{seed_query:i,question_id:t.questionId??ae(t.question),google_link_id:t.googleLinkId??"",google_evidence_id:t.googleEvidenceId??"",question:t.question,answer:t.answer??"",source_title:t.sourceTitle??"",source_site:t.sourceSite??"",source_cite:t.sourceCite??"",sources:t.sources??[],depth:n,parent_question:a??"",extracted_at:new Date().toISOString()}}upsertCollectedRow(t){let n=this.normalizeQuestion(t.question),a=this.collectedRows.findIndex(d=>this.normalizeQuestion(d.question)===n);if(a<0)return this.collectedRows.push({...t}),!0;let i=this.collectedRows[a],s={...i,...t,answer:t.answer||i.answer,source_title:t.source_title||i.source_title,source_site:t.source_site||i.source_site,source_cite:t.source_cite||i.source_cite,sources:this.mergePaaSources(i.sources,t.sources),extracted_at:t.extracted_at||i.extracted_at},o=s.answer!==i.answer||s.source_title!==i.source_title||s.source_site!==i.source_site||s.source_cite!==i.source_cite||JSON.stringify(s.sources)!==JSON.stringify(i.sources);return o&&(this.collectedRows[a]=s),o}async emitProgress(t){if(!this.onPaaProgress||this.collectedRows.length===0&&!this.checkpointMaterial)return;let n={sequence:++this.progressSequence,observedAt:new Date().toISOString(),clickedQuestions:[...this.clickedQuestions],phase:t,records:this.collectedRows.map(a=>({...a})),lifecycle:{...this.paaLifecycle},...this.checkpointMaterial?{material:structuredClone(this.checkpointMaterial)}:{},interactions:this.interactionObservations.map(a=>({...a,confirmationSignals:[...a.confirmationSignals]}))};try{await this.onPaaProgress(n)}catch(a){console.warn(JSON.stringify({event:"paa_progress_sink_failed",sequence:n.sequence,phase:n.phase,message:a instanceof Error?a.message:String(a)}))}}getPartialResult(){let t=this.partialContext;if(!t||this.collectedRows.length===0&&!this.checkpointMaterial)return null;let n=this.collectedRows.map(d=>({...d})),a=this.checkpointMaterial,i=t.questionsOnly?0:n.filter(d=>!d.answer?.trim()).length,s=t.questionsOnly?0:n.filter(d=>(d.sources??[]).length===0).length,o={seed:t.seed,totalQuestions:n.length,maxDepthReached:n.reduce((d,l)=>Math.max(d,l.depth),0),durationMs:Date.now()-t.startMs,errorCount:0};return{seed:t.seed,location:t.location,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(t.startMs),completionStatus:"paa_found",problem:null,...a?.pagination?{pagination:{...a.pagination}}:{},resultQuality:"partial",degradedResult:!1,retryRecommended:!0,paaLifecycle:{...this.paaLifecycle,questionsFound:n.length,targetStatus:n.length>=(t.maxQuestions??0)?"met":"not_met",discoveryStatus:"interrupted",materialStatus:i>0||s>0?"partial":"complete",completionReason:"The browser attempt ended before frontier exhaustion could be proven."},completeness:{...this.completeness,paaWithoutAnswer:i,paaWithoutSource:s,paaRequested:t.maxQuestions,paaReturned:n.length,paaUnique:n.length},warnings:[{code:"paa_partial",surface:"paa",message:`Harvest stopped before finishing; returning the ${n.length} question(s) collected up to that point.`,retryable:!0}]},totalQuestions:n.length,surface:a?.surface??"web",aiOverview:a?.aiOverview??{detected:!1,text:null,citations:[]},aiMode:a?.aiMode??{detected:!1,text:null,citations:[]},whatPeopleSaying:a?.whatPeopleSaying??[],tree:this.buildTree(n,t.seed),flat:n,videos:a?.videos??[],forums:a?.forums??[],organicResults:a?.organicResults??[],localPack:a?.localPack??[],entityIds:a?.entityIds??{entities:[],kgIds:[],cids:[],gcids:[]},stats:o}}async runBFS(t,n,a){await t.waitForTimeout(700);let i=new Set,s=new Set,o=[];this.clickedQuestions=new Set,this.interactionObservations=[],this.phaseTimings={};let d=new Set,l=new Map,S=new Set,U=new Set,r=new Map,u=2,c=3,h=0,w={sel:q.item,dataQ:q.itemDataQ,dataInitQ:q.itemDataInitQ,questionEl:q.itemQuestionEl,answerSel:q.answerContainer,expandedClass:q.expandedClass,clickTarget:q.clickTarget,answerPlaceholderPattern:Zs,questionsOnly:n.questionsOnly,sourceSel:"a[href]"},k=()=>t.evaluate(({sel:_,dataQ:M,dataInitQ:H,questionEl:P,expandedClass:y,clickTarget:E,answerSel:p,answerPlaceholderPattern:C,questionsOnly:N})=>{let I=W=>{if(!W)return"";let x=[];for(let O of W.childNodes){if(O.nodeType===Node.TEXT_NODE){let st=O.textContent?.trim();st&&x.push(st);continue}if(O.nodeType!==Node.ELEMENT_NODE)continue;let j=O;if(j.tagName==="STYLE"||j.tagName==="SCRIPT"||j.getAttribute("aria-hidden")==="true")continue;let ct=I(j);ct&&x.push(ct)}return x.join(" ").replace(/\s+/g," ").trim()};return Array.from(document.querySelectorAll(_)).map((W,x)=>{let O=I(W.querySelector(p)).replace(/An AI Overview is not available for this search/gi," ").replace(/Can't generate an AI overview right now\.?\s*Try again later\.?/gi," ").replace(/\bAI Overview\b/gi," ").replace(/\s+/g," ").trim(),j=W.classList.contains(y)||W.querySelector(E)?.getAttribute("aria-expanded")==="true",ct=O.length>=10&&!new RegExp(C,"i").test(O);return{q:W.getAttribute(M)||W.getAttribute(H)||W.querySelector(P)?.innerText?.trim()||"",done:j&&(N||ct),expanded:j,index:x}}).filter(W=>W.q)},w),f=async(_,M,H,P,y,E)=>{let p=Date.now(),C={id:`${E}:${ae(_)}:${y}`,questionId:ae(_),question:_,batchNumber:E,controlAttempt:y,observedAt:new Date(p).toISOString(),beforeQuestionCount:M,expandedBefore:P},N=H>=0?t.locator(w.sel).nth(H).locator(w.clickTarget):null,I=null,W=N?await(async()=>(P&&(await N.click({timeout:to,force:!0}),await t.waitForTimeout(120)),await N.click({timeout:to,force:!0}),!0))().catch(G=>(I=G instanceof Error&&(G.name==="TimeoutError"||/timeout/i.test(G.message))?"click_ack_timeout":"click_failed",!1)):!1,x=Date.now()-p;if(!W&&I!=="click_ack_timeout")return{dispatched:!1,confirmed:!1,observation:{...C,dispatched:!1,outcome:"dispatch_failed",confirmationSignals:[],confirmationCheckpointMs:null,confirmedAtMs:null,dispatchDurationMs:x,totalDurationMs:x,afterQuestionCount:M,newQuestionCount:0,expandedAfter:P,answerObserved:!1,sourceCount:0,errorCode:H<0?"control_missing":I??"click_failed"}};let O={exists:!0,expanded:P,answerReady:!1,sourceCount:0,questionCount:M},j=[],ct=null,st=null,X=!1;for(let G of[ll,Sl,Ul]){let Ct=p+G-Date.now();if(Ct>0&&await t.waitForTimeout(Ct),O=await t.evaluate(({sel:V,dataQ:tt,dataInitQ:J,questionEl:Q,expandedClass:wt,clickTarget:kt,answerSel:rn,answerPlaceholderPattern:re,sourceSel:Be,target:dn})=>{let ft=de=>{if(!de)return"";let Zn=[];for(let Sn of de.childNodes){if(Sn.nodeType===Node.TEXT_NODE){let Ui=Sn.textContent?.trim();Ui&&Zn.push(Ui);continue}if(Sn.nodeType!==Node.ELEMENT_NODE)continue;let Un=Sn;if(Un.tagName==="STYLE"||Un.tagName==="SCRIPT"||Un.getAttribute("aria-hidden")==="true")continue;let Si=ft(Un);Si&&Zn.push(Si)}return Zn.join(" ").replace(/\s+/g," ").trim()},Qn=Array.from(document.querySelectorAll(V)),ln=Qn.find(de=>(de.getAttribute(tt)||de.getAttribute(J)||de.querySelector(Q)?.innerText?.trim())===dn);if(!ln)return{exists:!1,expanded:!1,answerReady:!1,sourceCount:0,questionCount:Qn.length};let Ro=ln.classList.contains(wt)||ln.querySelector(kt)?.getAttribute("aria-expanded")==="true",ri=ln.querySelector(rn),di=ft(ri).replace(/An AI Overview is not available for this search/gi," ").replace(/Can't generate an AI overview right now\.?\s*Try again later\.?/gi," ").replace(/\bAI Overview\b/gi," ").replace(/\s+/g," ").trim(),li=di.length>=10&&!new RegExp(re,"i").test(di);return{exists:!0,expanded:Ro,answerReady:li,sourceCount:li?ri?.querySelectorAll(Be).length??0:0,questionCount:Qn.length}},{...w,target:_}).catch(()=>O),j=[...O.expanded?["expanded"]:[],...O.answerReady?["answer"]:[],...O.sourceCount>0?["source"]:[],...O.questionCount>M?["question_growth"]:[]],O.answerReady||O.sourceCount>0||O.questionCount>M){X=!0,ct=G,st=Date.now()-p;break}}let ht=Date.now()-p,De={...C,dispatched:W,outcome:X?"confirmed":W?"unconfirmed":"dispatch_failed",confirmationSignals:j,confirmationCheckpointMs:ct,confirmedAtMs:st,dispatchDurationMs:x,totalDurationMs:ht,afterQuestionCount:O.questionCount,newQuestionCount:Math.max(0,O.questionCount-M),expandedAfter:O.expanded,answerObserved:O.answerReady,sourceCount:O.sourceCount,errorCode:W?X?null:O.exists?"confirmation_timeout":"control_missing":I};return{dispatched:W,confirmed:X,observation:De}},m=0;t:for(;;){if(n.softDeadlineMs&&Date.now()>=n.softDeadlineMs)throw this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"interrupted",completionReason:"The execution deadline arrived before frontier exhaustion could be proven."},new Zt(this.paaLifecycle.completionReason);this.throwIfAborted(a);let _=await k(),M=!1;for(let p of _)s.has(p.q)||(s.add(p.q),o.push(p.q),o.length<=n.maxQuestions&&(M=this.upsertCollectedRow(this.toFlatRow({questionId:ae(p.q),googleLinkId:null,googleEvidenceId:null,question:p.q,sources:[]},1,null,n.query))||M)),p.done&&S.add(p.q);if(this.paaLifecycle={...this.paaLifecycle,questionsFound:Math.min(o.length,n.maxQuestions),targetStatus:o.length>=n.maxQuestions?"met":"not_met",knownQuestions:o.length,processedQuestions:S.size,failedInteractions:U.size,visibleControls:_.length},M&&await this.emitProgress("discovered"),n.questionsOnly&&s.size>=n.maxQuestions){this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"target_reached",targetStatus:"met",completionReason:"The requested unique-question count was observed."};break}if(!n.questionsOnly&&s.size>=n.maxQuestions){let p=!1,C=new Set(o.slice(0,n.maxQuestions));for(let N of await this.extractVisibleItems(t)){if(!C.has(N.question))continue;let I=r.get(N.question),W={...N,answer:N.answer??I?.answer,sourceTitle:N.sourceTitle??I?.sourceTitle,sourceSite:N.sourceSite??I?.sourceSite,sourceCite:N.sourceCite??I?.sourceCite,sources:this.mergePaaSources(I?.sources,N.sources)};r.set(N.question,W),p=this.upsertCollectedRow(this.toFlatRow(W,1,null,n.query))||p}if(p&&await this.emitProgress("answer_captured"),[...C].every(N=>{let I=r.get(N);return!!(I?.answer?.trim()&&I.sources.length>0)})){U.clear(),this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"target_reached",targetStatus:"met",failedInteractions:0,completionReason:"The requested unique-question count and its answer/source material were observed."};break}}let H=new Set(o.slice(0,n.maxQuestions)),P=_.filter(p=>H.has(p.q)&&!p.done&&(l.get(p.q)??0)<u&&!d.has(p.q)),y=P.slice(-ul);if(this.paaLifecycle={...this.paaLifecycle,eligibleControls:P.length},y.length===0){if(s.size>=n.maxQuestions){this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"target_reached",targetStatus:"met",completionReason:"The requested unique-question count was observed."};break}let p=new Set(_.map(N=>N.q)),C=o.slice(0,n.maxQuestions).filter(N=>!S.has(N)&&(U.has(N)||!p.has(N)));if(C.length>0)throw this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"interrupted",failedInteractions:new Set([...U,...C]).size,completionReason:"At least one known PAA control failed or disappeared before it could be confirmed."},await this.emitProgress("expansion_finished"),new Zt(this.paaLifecycle.completionReason);for(let N=1;N<=c;N++){this.throwIfAborted(a),await this.throwIfCaptcha(t,"Google PAA exhaustion confirmation"),await t.mouse.wheel(0,320);let I=await t.waitForFunction(({sel:x,min:O})=>document.querySelectorAll(x).length>O,{sel:q.item,min:_.length},{timeout:1500,polling:100}).catch(()=>null);if(this.paaLifecycle={...this.paaLifecycle,noGrowthConfirmations:N},I||(await k()).some(x=>!s.has(x.q)))continue t}this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"frontier_exhausted",targetStatus:"not_met",failedInteractions:0,noGrowthConfirmations:c,completionReason:"Every known eligible PAA control was processed and three healthy no-growth confirmations found no additional questions."};break}await this.throwIfCaptcha(t,"Google PAA expansion"),h+=1;for(let p of y){if(this.reporter.onDepth(++m),(l.get(p.q)??0)>0){let C=this.paaLifecycle.retryBreakdown.controlRetries+1;this.paaLifecycle={...this.paaLifecycle,automaticRetries:C+this.paaLifecycle.retryBreakdown.browserRetries+this.paaLifecycle.retryBreakdown.runtimeRecoveries,retryBreakdown:{...this.paaLifecycle.retryBreakdown,controlRetries:C}}}l.set(p.q,(l.get(p.q)??0)+1)}let E=await Promise.all(y.map(async p=>({target:p,result:await f(p.q,_.length,p.index,p.expanded,l.get(p.q)??1,h)})));for(let{target:p,result:C}of E)(C.dispatched||C.confirmed)&&this.clickedQuestions.add(p.q),this.interactionObservations.push(C.observation);if(this.interactionObservations.length>eo&&this.interactionObservations.splice(0,this.interactionObservations.length-eo),!n.questionsOnly){let p=new Set(y.map(C=>C.q));for(let C of await this.extractVisibleItems(t))p.has(C.question)&&(r.set(C.question,C),this.upsertCollectedRow(this.toFlatRow(C,1,null,n.query))&&await this.emitProgress("answer_captured"))}for(let{target:p,result:C}of E){let N=r.get(p.q);C.confirmed||N?.answer?.trim()?(S.add(p.q),U.delete(p.q)):(l.get(p.q)??0)>=u&&(U.add(p.q),d.add(p.q))}this.paaLifecycle={...this.paaLifecycle,processedQuestions:S.size,failedInteractions:U.size,noGrowthConfirmations:0,dispatchedInteractions:this.interactionObservations.filter(p=>p.dispatched).length,confirmedInteractions:this.interactionObservations.filter(p=>p.outcome==="confirmed").length,unconfirmedInteractions:this.interactionObservations.filter(p=>p.outcome!=="confirmed").length},await this.emitProgress("click_observed")}let L=n.questionsOnly?new Map:new Map(r);n.questionsOnly||await this.fillIncompleteItems(t,o,L,n,d);let R=[];for(let _ of o){if(R.length>=n.maxQuestions)break;let M=this.normalizeQuestion(_);if(i.has(M))continue;i.add(M);let H=L.get(_);if(H){let P=this.toFlatRow(H,1,null,n.query);this.upsertCollectedRow(P),R.push(P),this.reporter.onQuestion({questionId:H.questionId,googleLinkId:H.googleLinkId,googleEvidenceId:H.googleEvidenceId,question:H.question,answer:H.answer??null,sourceTitle:H.sourceTitle??null,sourceSite:H.sourceSite??null,sourceCite:H.sourceCite??null,sources:H.sources,depth:1,parentQuestion:null,children:[]})}else{let P=this.toFlatRow({questionId:ae(_),googleLinkId:null,googleEvidenceId:null,question:_,answer:void 0,sourceTitle:void 0,sourceSite:void 0,sourceCite:void 0,sources:[]},1,null,n.query);this.upsertCollectedRow(P),R.push(P)}}this.completeness.paaWithoutAnswer=n.questionsOnly?0:R.filter(_=>!_.answer).length,this.completeness.paaWithoutSource=n.questionsOnly?0:R.filter(_=>(_.sources??[]).length===0).length,this.completeness.paaRequested=n.maxQuestions,this.completeness.paaReturned=R.length,this.completeness.paaUnique=i.size;let B=!n.questionsOnly&&(this.completeness.paaWithoutAnswer>0||this.completeness.paaWithoutSource>0);return this.paaLifecycle={...this.paaLifecycle,questionsFound:R.length,targetStatus:R.length>=n.maxQuestions?"met":"not_met",materialStatus:B?"partial":"complete",processedQuestions:S.size,failedInteractions:U.size},await this.emitProgress("fill_incomplete"),await this.emitProgress("expansion_finished"),R}async fillIncompleteItems(t,n,a,i,s){let o=new Set(n.slice(0,i.maxQuestions)),d=U=>!U?.answer||(U.sources??[]).length===0,l=new Set([...o].filter(U=>d(a.get(U)))),S=new Set([...l].filter(U=>!a.get(U)?.answer));if(l.size!==0){for(let U of l){if(i.softDeadlineMs&&Date.now()>=i.softDeadlineMs)break;let r=(await this.extractVisibleItems(t,U))[0];if(!r)continue;let u=a.get(U);a.set(U,{...r,answer:r.answer??u?.answer,sourceTitle:r.sourceTitle??u?.sourceTitle,sourceSite:r.sourceSite??u?.sourceSite,sourceCite:r.sourceCite??u?.sourceCite,sources:this.mergePaaSources(u?.sources,r.sources)});let c=a.get(U);c&&this.upsertCollectedRow(this.toFlatRow(c,1,null,i.query))&&await this.emitProgress("fill_incomplete")}this.completeness.paaAnswersRecovered=[...S].filter(U=>a.get(U)?.answer).length}}async reExpandCollapsedItems(t){let n=`${q.item}:not(.${q.expandedClass}) ${q.clickTarget}`,a=await t.locator(n).count().catch(()=>0);if(a===0)return!1;for(let i=0;i<a;i++)try{let s=t.locator(n).first();await s.scrollIntoViewIfNeeded(),await s.click({force:!0}),await t.waitForTimeout(this.jitteredDelayMs(300,500))}catch{}return!0}async extractVideos(t){let n=as;return t.evaluate(a=>{let i=[],s=Array.from(document.querySelectorAll(a.container));for(let o of s){let S=(o.querySelector(a.sectionHeading)?.textContent?.trim()??"").toLowerCase().includes("short")?"short_video":"video",U=Array.from(o.querySelectorAll(a.item));for(let r of U){let u=r.href;if(!u||!u.includes("youtube")&&!u.includes("youtu.be"))continue;let c=r.textContent?.trim()??"",h=c.indexOf("YouTube");if(h===-1)continue;let w=c.slice(0,h).trim(),f=c.slice(h+7).replace(/^[·\s·]+/,"").match(/^([^·\n]+)/),m=f?f[1].trim():"";w&&i.push({type:S,title:w,channel:m,platform:"YouTube",duration:"",url:u})}}return i},n)}async extractForums(t){let n=is;return t.evaluate(a=>{let i=[],o=Array.from(document.querySelectorAll(a.section)).find(l=>l.textContent?.includes("Discussions"));if(!o)return i;let d=Array.from(o.querySelectorAll(a.item));for(let l of d){let S=l.href;if(!S)continue;let U=l.querySelector(a.title),r=l.querySelector(a.source),u=U?.textContent?.trim()??"",c=r?.textContent?.trim()??"";u&&i.push({title:u,source:c,url:S})}return i},n)}async extractShortVideos(t,n){try{await t.goto(n,{waitUntil:"domcontentloaded"}),await t.waitForTimeout(1500)}catch{return[]}await this.throwIfCaptcha(t,"Google short video search");let a={item:bn.item,platforms:[...bn.platforms]};return(await t.evaluate(s=>{let o=new Set,d=[],l=Array.from(document.querySelectorAll(s.item)),S=["youtube.com","youtu.be","tiktok.com","instagram.com","facebook.com","fb.watch"],U=new Map;for(let r of l){let u=r.href;if(!u||!S.some(h=>u.includes(h)))continue;let c=r.textContent?.trim()??"";U.has(u)||U.set(u,[]),U.get(u).push(c)}for(let[r,u]of U.entries()){if(o.has(r))continue;o.add(r);let c=u.find(m=>/^\d+:\d+$/.test(m))??"",h=u.find(m=>!/^\d+:\d+$/.test(m)&&m.length>5)??"";if(!h)continue;let w=h,k="",f="";for(let m of s.platforms){let L=-1,R=0;for(;;){let P=h.indexOf(m,R);if(P===-1)break;L=P,R=P+1}if(L===-1)continue;let B=h.slice(L+m.length);if(!(/^[\s·]/.test(B)||B.trim()===""))continue;w=h.slice(0,L).trim(),k=m;let M=B.replace(/^[\s·]+/,""),H=M.indexOf("\xB7");f=(H===-1?M:M.slice(0,H)).trim();break}w&&d.push({title:w,channel:f,platform:k,duration:c,url:r})}return d},a)).map(s=>({type:"short_video",...s}))}async extractWhatPeopleSaying(t){let n=ss;return t.evaluate(a=>{let i=Array.from(document.querySelectorAll(a.sectionTag)).find(s=>s.textContent?.includes(a.sectionHeadingText))??document.querySelector(".yG4QQe.TBC9ub.NbhJ1c");return i?Array.from(i.querySelectorAll(a.card)).map(s=>{let d=s.querySelector(a.cardLink)?.href??"",l=s.querySelector(a.titleH1)?.textContent?.trim(),S=s.querySelector(a.titleDiv)?.textContent?.trim(),U=l??S??"",r=s.querySelector(a.source)?.textContent?.trim()??"",c=s.querySelector(a.platformBadge)?.textContent?.trim()??"",h=s.querySelector(a.ytChannel)?.textContent?.trim()??"",w=s.querySelector(a.ytDate)?.textContent?.trim()??"",k=s.querySelector(a.authorNote)?.textContent?.trim()??null,f=s.querySelector(a.popularCommentLabel),m=null;if(f){let I=f.nextSibling;for(;I;){let W=I.textContent?.trim();if(W){m=W;break}I=I.nextSibling}}let L=Array.from(s.querySelectorAll("span")),R=L.find(I=>/^\d+:\d+$/.test(I.textContent?.trim()??""))?.textContent?.trim()??null,_=L.map(I=>I.textContent?.trim()??"").filter(I=>/\d/.test(I)&&(I.includes("comment")||I.includes("reaction")||I.includes("view")||I.includes("like")||I.includes("share")))[0]??"",M=L.map(I=>I.textContent?.trim()??"").filter(I=>/\d+ (day|week|month|year|hour)s? ago|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/.test(I)),H=w||(M[0]??""),P=c||(h?"YouTube":""),y=h||r,E="unknown",p=P.toLowerCase(),C=y.toLowerCase(),N=r.toLowerCase();return p.includes("reddit")||C.startsWith("r/")?E="reddit":p.includes("facebook")||N.includes("facebook")?E="facebook":p.includes("instagram")||N.includes("instagram")?E="instagram":p.includes("tiktok")||N.includes("tiktok")?E="tiktok":p.includes("youtube")||h?E="youtube":E="news",{type:E,title:U,url:d,source:y,platform:P,popularComment:m,engagement:_,date:H,duration:R,authorNote:k}}):[]},n)}async extractOrganicResults(t){let n=ds,a=await t.evaluate(s=>{let o=[],d=0;return document.querySelectorAll(s.result).forEach(l=>{let S=l.querySelector(s.title);if(!S)return;let U=S.textContent?.trim()??"",u=S.closest("a")?.href??"";if(!U||!u)return;d++;let c=l.querySelector(s.cite)?.textContent?.trim()??null,h=l.querySelector(s.snippet)?.textContent?.trim()??null,w=!!l.querySelector(s.redditCite),k=l.querySelector(s.ratingWrap),f=k?{value:k.querySelector(s.ratingValue)?.textContent?.trim()??"",count:k.querySelector(s.reviewCount)?.textContent?.trim()??""}:null,m="";try{m=new URL(u).hostname.replace(/^www\./,"")}catch{m=l.querySelector(s.siteName)?.textContent?.trim()??""}o.push({position:d,title:U,url:u,domain:m,cite:c,snippet:h,isRedditStyle:w,inlineRating:f})}),o},n),i=typeof t.url=="function"?t.url():"https://www.google.com/";return a.flatMap(s=>{let o=Dn(s.url,i);if(!o)return[];let d=s.domain;try{d=new URL(o.resolvedUrl??o.rawUrl).hostname.replace(/^www\./,"")}catch{}return[{...s,...o,domain:d}]})}async extractLocalPack(t){let n=ls;return t.evaluate(a=>{let i=[],s=null;return document.querySelectorAll('[role="heading"]').forEach(o=>{!s&&o.textContent?.includes(a.headingText)&&(s=o.closest("[data-hveid]"))}),s&&s.querySelectorAll(a.card).forEach((o,d)=>{let l=o.querySelector(a.name)?.textContent?.trim()??"";if(!l)return;let S=o.querySelector(a.ratingValue)?.textContent?.trim()??null,U=o.querySelector(a.reviewCount)?.textContent?.trim()??null,r=U?U.replace(/[()]/g,"").trim():null,u=o.querySelector("a[data-cid]")?.getAttribute("data-cid")??null;if(!u)for(let f of Array.from(o.querySelectorAll("a[href]"))){let m=f.href.match(/[?&]cid=(\d+)/);if(m){u=m[1];break}let L=f.href.match(/!1s0x[0-9a-f]+:0x([0-9a-f]+)/i);if(L){try{u=BigInt("0x"+L[1]).toString()}catch{}if(u)break}}let c=[];o.querySelectorAll("div, span").forEach(f=>{let m=Array.from(f.childNodes).filter(L=>L.nodeType===3).map(L=>L.textContent?.trim()??"").filter(L=>L.length>1&&L.length<120).join(" ");m&&!c.includes(m)&&c.push(m)});let h=Array.from(o.querySelectorAll("a[href]")),w=h.find(f=>f.href.includes("google.com/maps"))?.href??null,k=h.find(f=>!f.href.includes("google.com")&&f.href.startsWith("http"))?.href??null;i.push({position:d+1,name:l,cid:u,rating:S,reviewCount:r,metadata:c,websiteUrl:k,directionsUrl:w})}),i},n)}async extractEntityIds(t){return t.evaluate(()=>{let n=new Set,a=new Set,i=new Set,s=new Map;function o(l){let S=[".OSrXXb",".dbg0pd",".tzt0oe",'[role="heading"]',"h3"];for(let U of S){let r=l.querySelector(U);if(r?.textContent?.trim())return r.textContent.trim()}return""}document.querySelectorAll('[id^="pv-/g/"]').forEach(l=>{let S=l.getAttribute("id");if(!S)return;let U=S.replace("pv-","");n.add(U);let r=o(l),c=l.querySelector("a[data-cid]")?.getAttribute("data-cid")??null;c&&a.add(c),r&&s.set(U,{name:r,kgId:U,cid:c,gcid:null})}),document.querySelectorAll("[data-mid]").forEach(l=>{let S=l.getAttribute("data-mid");if(S?.startsWith("/g/")&&(n.add(S),!s.has(S))){let U=o(l);U&&s.set(S,{name:U,kgId:S,cid:null,gcid:null})}}),document.querySelectorAll(".w7Dbne").forEach(l=>{let U=l.querySelector("a[data-cid]")?.getAttribute("data-cid")??null;if(!U)return;a.add(U);let r=l.querySelector(".OSrXXb")?.textContent?.trim()??"";if(!r)return;let u=l.querySelector('[id^="pv-/g/"]'),c=u?u.getAttribute("id").replace("pv-",""):null,h=c??`cid:${U}`;if(s.has(h)){let w=s.get(h);w.cid||s.set(h,{...w,cid:U})}else s.set(h,{name:r,kgId:c,cid:U,gcid:null})}),document.querySelectorAll("a[data-cid]").forEach(l=>{let S=l.getAttribute("data-cid");if(!S)return;if(a.add(S),![...s.values()].some(r=>r.cid===S)){let r=l.parentElement,u="";for(let c=0;c<8&&r;c++){let h=r.querySelector('.OSrXXb, .dbg0pd, [role="heading"], h3');if(h?.textContent?.trim()){u=h.textContent.trim();break}r=r.parentElement}u&&s.set(`cid:${S}`,{name:u,kgId:null,cid:S,gcid:null})}});let d=Array.from(document.querySelectorAll("script:not([src])")).map(l=>l.textContent??"").filter(l=>l.length>1e4).join(`
21896
- `);for(let l of d.matchAll(/\/g\/[a-zA-Z0-9_-]{5,20}/g))n.add(l[0]);for(let l of d.matchAll(/gcid:[a-zA-Z0-9_]+/g))i.add(l[0]);for(let l of d.matchAll(/0x[0-9a-f]+:0x([0-9a-f]+)/gi))try{a.add(BigInt("0x"+l[1]).toString())}catch{}return{entities:[...s.values()],kgIds:[...n],cids:[...a],gcids:[...i]}})}mergeLocalPackIntoEntities(t,n){let a=new Set(t.cids),i=t.entities.map(s=>({...s}));for(let s of n){if(!s.cid)continue;a.add(s.cid);let o=s.name.toLowerCase().trim(),d=i.find(l=>l.name.toLowerCase().trim()===o);d?d.cid||(d.cid=s.cid):i.find(l=>l.cid===s.cid)||i.push({name:s.name,kgId:null,cid:s.cid,gcid:null})}return{...t,entities:i,cids:[...a]}}async extractAISurfaces(t,n){let a=await t.evaluate(Vs,{aio:os,aim:rs,expandWaitMs:1500}),i=typeof t.url=="function"?t.url():"https://www.google.com/",s={surface:a.surface,aiOverview:{...a.aiOverview,citations:this.normalizeAICitations(i,a.aiOverview.citations)},aiMode:{...a.aiMode,citations:this.normalizeAICitations(i,a.aiMode.citations)}};if(!s.aiOverview.detected)return this.completeness.aioShareCaptured=null,s;let o=this.aioShareUrlEarly??await this.captureAIOverviewShareUrl(t,n).catch(()=>null);return this.completeness.aioShareCaptured=o!==null,{...s,aiOverview:{...s.aiOverview,shareUrl:o}}}async captureAIOverviewShareUrl(t,n){if(n?.softDeadlineMs&&Date.now()>=n.softDeadlineMs||!await t.evaluate(()=>{let s=Array.from(document.querySelectorAll('h1,h2,h3,[role="heading"],div')).filter(o=>(o.textContent||"").trim()==="AI Overview");for(let o of s){let d=o;for(let l=0;l<8&&d;l++){let S=d.querySelector('[aria-label="Share"]');if(S)return S.scrollIntoView({block:"center"}),S.click(),!0;d=d.parentElement}}return!1}).catch(()=>!1))return null;let i=null;try{i=await(await t.waitForFunction(()=>{let o=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let d=(o.currentNode.textContent||"").match(/https:\/\/share\.google\/aimode\/\S+/);if(d)return d[0]}return!1},void 0,{timeout:4500,polling:250})).jsonValue()}catch{i=null}return await t.keyboard.press("Escape").catch(()=>{}),i}buildTree(t,n){let a=[],i=new Map;for(let s of t){let o={questionId:s.question_id,googleLinkId:s.google_link_id||null,googleEvidenceId:s.google_evidence_id||null,question:s.question,answer:s.answer||null,sourceTitle:s.source_title||null,sourceSite:s.source_site||null,sourceCite:s.source_cite||null,sources:s.sources??[],depth:s.depth,parentQuestion:s.parent_question||null,children:[]};i.set(s.question,o)}for(let s of i.values())s.parentQuestion&&i.has(s.parentQuestion)?i.get(s.parentQuestion).children.push(s):a.push(s);return a}getBrowserDebugSnapshot(){return this.driver.getDebugSnapshot()}buildHarvestDebugSnapshot(t,n,a,i,s){if(t.debug)return{enabled:!0,request:{query:t.query,locationInput:t.location??null,canonicalLocation:n,locationResolved:s?s.matched:null,locationMatchSource:s?s.source:null,locationAmbiguousCandidates:s?s.ambiguousCandidates:null,uule:a,gl:t.gl,hl:t.hl,device:t.device,proxyMode:t.proxyMode,proxyZip:t.proxyZip??null,serpIdentity:t.serpIdentity??null,serpOnly:t.serpOnly,pages:t.pages??1},browser:this.getBrowserDebugSnapshot(),...i?{locationEvidence:i}:{}}}async captureSecondOrganicPage(t,n,a){if(this.throwIfAborted(a),!n.serpOnly&&!this.driver.withTemporaryPage)return{organic:[],status:"failed",failureCode:"unsupported_driver"};let i;try{let s=new URL(t.url()),o=S=>{try{let U=new URL(S,s);return s.origin==="https://www.google.com"&&U.origin===s.origin&&!U.username&&!U.password&&U.pathname==="/search"&&U.searchParams.getAll("q").length===1&&U.searchParams.get("q")===n.query&&U.searchParams.getAll("start").length===1&&U.searchParams.get("start")==="10"&&(!U.searchParams.has("num")||U.searchParams.get("num")==="10")&&["gl","hl"].every(r=>!U.searchParams.has(r)||U.searchParams.getAll(r).length===1&&U.searchParams.get(r)===n[r])&&["uule","tbs","udm","tbm","pws"].every(r=>U.searchParams.getAll(r).length<=1&&U.searchParams.get(r)===s.searchParams.get(r))}catch{return!1}},d=await t.evaluate(S=>document.querySelector(S?'a[aria-label="Page 2"], a#pnnext, a[rel="next"]':'a#pnnext, a[rel="next"]')?.getAttribute("href")??null,n.serpOnly);if(!d)return{organic:[],status:"unavailable",failureCode:"missing_next"};if(!o(d))return{organic:[],status:"unavailable",failureCode:"invalid_next"};if(n.serpOnly){let S=t.locator('a[aria-label="Page 2"], a#pnnext, a[rel="next"]').first();if(await S.scrollIntoViewIfNeeded({timeout:1e4}),await S.click({timeout:2e4}),this.throwIfAborted(a),await this.throwIfCaptcha(t,"Google SERP page 2"),!o(t.url()))throw i="invalid_next",new Error("Invalid pagination landing");let U=await this.extractOrganicResults(t);return U.length>0?{organic:U.map(r=>({...r,position:r.position+10})),status:"captured"}:{organic:[],status:"unavailable",failureCode:"empty_page"}}let l=await this.driver.withTemporaryPage(async S=>{if(await S.route("**/*",async U=>{let r=U.request();r.isNavigationRequest()&&r.frame()===S.mainFrame()&&!o(r.url())?(i=/^https:\/\/www\.google\.com\/sorry(?:\/|\?)/.test(r.url())?"captcha":"invalid_next",await U.abort("blockedbyclient")):await U.fallback()}),await S.goto(new URL(d,s).href,{waitUntil:"domcontentloaded",timeout:2e4}),this.throwIfAborted(a),await this.throwIfCaptcha(S,"Google SERP page 2"),!o(S.url()))throw i="invalid_next",new Error("Invalid pagination landing");return this.extractOrganicResults(S)},a);return this.throwIfAborted(a),l.length>0?{organic:l.map(S=>({...S,position:S.position+10})),status:"captured"}:{organic:[],status:"unavailable",failureCode:"empty_page"}}catch(s){if(this.throwIfAborted(a),s instanceof pt)throw s;return{organic:[],status:"failed",failureCode:i??(s instanceof it?"captcha":s instanceof Error&&(s.name==="TimeoutError"||/timed? ?out/i.test(s.message))?"timeout":"navigation_error")}}}async extract(t,n){let a=Date.now();this.completeness={paaWithoutAnswer:0,paaWithoutSource:0,paaAnswersRecovered:0,aioShareCaptured:null},this.linkDiagnostics=this.emptyLinkDiagnostics(),this.aioShareUrlEarly=null,this.collectedRows=[],this.progressSequence=0,this.checkpointMaterial=null,this.clickedQuestions=new Set,this.paaLifecycle=this.emptyPaaLifecycle(t.maxQuestions),this.partialContext={seed:t.query,location:t.location??null,startMs:a,maxQuestions:t.maxQuestions,questionsOnly:t.questionsOnly};let i=t.device==="mobile",s={headless:t.headless,profileDir:t.profileDir,proxy:t.proxy,kernelApiKey:t.kernelApiKey,kernelProxyId:t.kernelProxyId,kernelProfileName:t.kernelProfileName,kernelProfileSaveChanges:t.kernelProfileSaveChanges,kernelStealth:t.kernelStealth,kernelProxyResolution:t.kernelProxyResolution,proxyMode:t.proxyMode,keepDefaultProxy:t.keepDefaultProxy,requireUsEgress:t.requireUsEgress,viewport:i?{width:390,height:844}:{width:1280,height:800},locale:`${t.hl}-${t.gl.toUpperCase()}`,deviceScaleFactor:i?3:1,isMobile:i,hasTouch:i,debug:t.debug,operationDeadlineMs:t.softDeadlineMs},o=0,d=[];try{this.throwIfAborted(n);let l=Date.now();await this.driver.launch(s),this.phaseTimings.providerConnectMs=Date.now()-l;let S=this.driver.getProviderSessionMetadata();if(S?.providerSessionId&&this.onProviderSession)try{await this.onProviderSession(S)}catch(V){console.warn(JSON.stringify({event:"paa_provider_session_sink_failed",provider:S.provider,message:V instanceof Error?V.message:String(V)}))}this.throwIfAborted(n);let U=t.location?Ba(t.location):null,r=t.location?U?.canonical??t.location:null,u=r?Ws(r):null,c=t,h=t.includeAllSerpFeatures,w=h||t.includeLocalPack,k=h||t.includeForums,f=h||t.includeVideos,m=h||t.includeAiOverview,L=h||t.includeWhatPeopleSaying,R={surface:"web",aiOverview:{detected:!1,text:null,citations:[]},aiMode:{detected:!1,text:null,citations:[]}},B=Date.now(),{hasPaa:_}=await this.driver.navigateToSERP(c.query,u,t.gl,t.hl,{...ta(t.recency)?{tbs:ta(t.recency)}:{},debug:t.debug,purpose:t.serpOnly?"serp":"paa",pages:t.pages===2?2:1,...t.softDeadlineMs?{deadlineMs:t.softDeadlineMs}:{}});this.phaseTimings.navigationMs=Date.now()-B,this.throwIfAborted(n);let M=this.driver.getPage();if(await this.throwIfCaptcha(M,"Google SERP"),_||(this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"no_paa_observed",materialStatus:"complete",completionReason:"A readable Google SERP was observed without a People Also Ask block."}),t.questionsOnly){let V=Date.now(),tt=_?await this.runBFS(M,c,n):[];this.phaseTimings.paaExpansionMs=Date.now()-V,await this.resolveMaterialLinks(M,tt,[],R.aiOverview,R.aiMode);let J={seed:c.query,totalQuestions:tt.length,maxDepthReached:tt.reduce((Q,wt)=>Math.max(Q,wt.depth),0),durationMs:Date.now()-a,errorCount:o};return this.reporter.onComplete(J),{seed:c.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:_?"paa_found":"no_paa",..._?{}:{noPaaObserved:!0},problem:null,paaLifecycle:{...this.paaLifecycle},completeness:{...this.completeness},links:{...this.linkDiagnostics},...t.debug?{debug:this.buildHarvestDebugSnapshot(c,r,u,void 0,U)}:{}},totalQuestions:tt.length,surface:"web",aiOverview:{detected:!1,text:null,citations:[]},aiMode:{detected:!1,text:null,citations:[]},whatPeopleSaying:[],tree:this.buildTree(tt,c.query),flat:tt,videos:[],forums:[],organicResults:[],localPack:[],entityIds:{entities:[],kgIds:[],cids:[],gcids:[]},stats:J}}if(m&&(this.aioShareUrlEarly=await this.captureAIOverviewShareUrl(M,t).catch(()=>null)),t.serpOnly){let V=Date.now(),[tt,J,Q]=await Promise.all([this.extractOrganicResults(M),w?this.extractLocalPack(M):Promise.resolve([]),this.extractEntityIds(M)]),wt=this.mergeLocalPackIntoEntities(Q,J),kt=m?await this.extractAISurfaces(M,t):R;this.phaseTimings.serpParseMs=Date.now()-V;let rn=t.debug?tn(r,tt,J):void 0,re=tt,Be={requestedPages:(t.pages??1)>=2?2:1,capturedPages:1,page2Status:(t.pages??1)>=2?"not_attempted":"not_requested",page1OrganicCount:tt.length,page2OrganicCount:0};if((t.pages??1)>=2){let ft=await this.captureSecondOrganicPage(M,c,n);re=[...tt,...ft.organic],Be={...Be,capturedPages:ft.status==="captured"?2:1,page2Status:ft.status,page2OrganicCount:ft.organic.length,...ft.failureCode?{failureCode:ft.failureCode}:{}},t.debug&&(rn=tn(r,re,J))}await this.resolveMaterialLinks(M,[],re,kt.aiOverview,kt.aiMode);let dn={seed:c.query,totalQuestions:0,maxDepthReached:0,durationMs:Date.now()-a,errorCount:o};return this.reporter.onComplete(dn),{seed:c.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:"serp_only",problem:null,pagination:Be,completeness:{...this.completeness},links:{...this.linkDiagnostics},...t.debug?{debug:this.buildHarvestDebugSnapshot(c,r,u,rn,U)}:{}},totalQuestions:0,surface:kt.surface,aiOverview:kt.aiOverview,aiMode:kt.aiMode,whatPeopleSaying:[],tree:[],flat:[],videos:[],forums:[],organicResults:re,localPack:J,entityIds:wt,stats:dn}}let[H,P,y,E,p,C]=await Promise.all([f?this.extractVideos(M):Promise.resolve([]),k?this.extractForums(M):Promise.resolve([]),L?this.extractWhatPeopleSaying(M):Promise.resolve([]),this.extractEntityIds(M),this.extractOrganicResults(M),w?this.extractLocalPack(M):Promise.resolve([])]),N=this.mergeLocalPackIntoEntities(E,C),I=t.debug?tn(r,p,C):void 0;this.reporter.onVideos(H),this.reporter.onForums(P);let W=m?await this.extractAISurfaces(M,t):R,x={requestedPages:(t.pages??1)>=2?2:1,capturedPages:1,page2Status:(t.pages??1)>=2?"not_attempted":"not_requested",page1OrganicCount:p.length,page2OrganicCount:0},O=p;if(this.checkpointMaterial={surface:W.surface,aiOverview:W.aiOverview,aiMode:W.aiMode,whatPeopleSaying:y,videos:H,forums:P,organicResults:O,localPack:C,entityIds:N,pagination:x},await this.emitProgress("serp_captured"),x.requestedPages===2){let V=await this.captureSecondOrganicPage(M,c,n);O=[...p,...V.organic],x={...x,capturedPages:V.status==="captured"?2:1,page2Status:V.status,page2OrganicCount:V.organic.length,...V.failureCode?{failureCode:V.failureCode}:{}},this.checkpointMaterial={...this.checkpointMaterial,organicResults:O,pagination:x},await this.emitProgress("serp_captured"),await this.resolveMaterialLinks(M,[],O,W.aiOverview,W.aiMode),this.checkpointMaterial={...this.checkpointMaterial,organicResults:O},await this.emitProgress("serp_captured")}let j=t.debug?tn(r,O,C):I;if(!_){await this.resolveMaterialLinks(M,[],O,W.aiOverview,W.aiMode),this.checkpointMaterial={...this.checkpointMaterial,organicResults:O},await this.emitProgress("serp_captured");let V={seed:c.query,totalQuestions:0,maxDepthReached:0,durationMs:Date.now()-a,errorCount:o};return this.reporter.onComplete(V),{seed:c.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:"no_paa",noPaaObserved:!0,problem:null,pagination:x,paaLifecycle:{...this.paaLifecycle},completeness:{...this.completeness},links:{...this.linkDiagnostics},...t.debug?{debug:this.buildHarvestDebugSnapshot(c,r,u,j,U)}:{}},totalQuestions:0,surface:W.surface,aiOverview:W.aiOverview,aiMode:W.aiMode,whatPeopleSaying:y,tree:[],flat:[],videos:H,forums:P,organicResults:O,localPack:C,entityIds:N,stats:V}}let ct=Date.now(),st=await this.runBFS(M,c,n);this.phaseTimings.paaExpansionMs=Date.now()-ct,this.throwIfAborted(n);let X=new URLSearchParams({q:c.query,gl:t.gl,hl:t.hl,pws:"0",udm:bn.udm});u&&X.set("uule",u);let ht=[];if(t.includeShortVideos!==!1)try{ht=await this.extractShortVideos(M,"https://www.google.com/search?"+X.toString())}catch(V){if(!(V instanceof it))throw V;o++,d.push({code:"short_videos_captcha_skipped",surface:"short_videos",message:V.message,retryable:!0})}this.reporter.onVideos(ht),await this.resolveMaterialLinks(M,st,O,W.aiOverview,W.aiMode),this.checkpointMaterial={...this.checkpointMaterial,surface:W.surface,aiOverview:W.aiOverview,aiMode:W.aiMode,videos:[...H,...ht],organicResults:O},await this.emitProgress("expansion_finished");let De=[...H,...ht],G=this.buildTree(st,c.query),Ct={seed:c.query,totalQuestions:st.length,maxDepthReached:st.reduce((V,tt)=>Math.max(V,tt.depth),0),durationMs:Date.now()-a,errorCount:o};return this.reporter.onComplete(Ct),{seed:c.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:"paa_found",problem:null,pagination:x,paaLifecycle:{...this.paaLifecycle},completeness:{...this.completeness},links:{...this.linkDiagnostics},...d.length>0?{warnings:d}:{},...t.debug?{debug:this.buildHarvestDebugSnapshot(c,r,u,j,U)}:{}},totalQuestions:st.length,surface:W.surface,aiOverview:W.aiOverview,aiMode:W.aiMode,whatPeopleSaying:y,tree:G,flat:st,videos:De,forums:P,organicResults:O,localPack:C,entityIds:N,stats:Ct}}catch(l){throw o++,this.paaLifecycle.discoveryStatus==="in_progress"&&(this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"interrupted",completionReason:"The browser attempt ended before frontier exhaustion could be proven."}),await this.emitProgress("attempt_ending").catch(()=>{}),this.reporter.onError(l instanceof Error?l:new Error(String(l))),l}}};var rt=require("fs"),Wt=cn(require("path"),1),ie=cn(require("papaparse"),1);async function no(e){if((process.env.NODE_ENV==="test"||process.env.VITEST)&&process.env.MCP_SCRAPER_ENABLE_MEMORY_LIBRARY_SINK_IN_TESTS!=="1")return;let t=process.env.MCP_SCRAPER_API_KEY?.trim(),n=(process.env.MCP_SCRAPER_BASE_URL??"https://mcpscraper.dev").replace(/\/$/,"");if(t)try{let a=await fetch(`${n}/memory/mcp-call`,{method:"POST",headers:{"content-type":"application/json","x-api-key":t},body:JSON.stringify({toolName:"libraryIngestTool",args:e})}),i=await a.json().catch(()=>null);(!a.ok||i?.ok===!1)&&console.warn("[memory-library-sink] ingest not accepted:",a.status,i?.error??"")}catch(a){console.warn("[memory-library-sink] ingest failed:",a?.message)}}var Fn=class{async writeJSON(t,n){await rt.promises.mkdir(n,{recursive:!0});let i=`${t.seed.toLowerCase().replace(/\W+/g,"-").slice(0,40)}-${Date.now()}.json`,s=Wt.default.join(n,i);return await rt.promises.writeFile(s,JSON.stringify(t,null,2),"utf8"),await no({title:`${t.seed} scrape`,content:JSON.stringify(t),source:`mcp-scraper:${s}`}),s}async writeCSV(t,n){await rt.promises.mkdir(n,{recursive:!0});let i=(t[0]?.seed_query??"paa").toLowerCase().replace(/\W+/g,"-").slice(0,40),s=ie.default.unparse(t.map(({sources:l,...S})=>({...S,sources_json:JSON.stringify(l)})),{header:!0}),o=`${i}-${Date.now()}.csv`,d=Wt.default.join(n,o);return await rt.promises.writeFile(d,s,"utf8"),d}async writeVideoCSV(t,n,a){await rt.promises.mkdir(a,{recursive:!0});let i=n.toLowerCase().replace(/\W+/g,"-").slice(0,40),s=ie.default.unparse(t,{header:!0}),o=`${i}-videos-${Date.now()}.csv`,d=Wt.default.join(a,o);return await rt.promises.writeFile(d,s,"utf8"),d}async writeForumCSV(t,n,a){await rt.promises.mkdir(a,{recursive:!0});let i=n.toLowerCase().replace(/\W+/g,"-").slice(0,40),s=ie.default.unparse(t,{header:!0}),o=`${i}-forums-${Date.now()}.csv`,d=Wt.default.join(a,o);return await rt.promises.writeFile(d,s,"utf8"),d}async writeAIOverviewCSV(t,n,a,i){await rt.promises.mkdir(i,{recursive:!0});let s=a.toLowerCase().replace(/\W+/g,"-").slice(0,40),o=t.map((U,r)=>({seed_query:a,response_text:r===0?n??"":"",citation_text:U.text,citation_href:U.href})),d=ie.default.unparse(o,{header:!0}),l=`${s}-ai-overview-${Date.now()}.csv`,S=Wt.default.join(i,l);return await rt.promises.writeFile(S,d,"utf8"),S}async writeAIModeCSV(t,n,a,i){await rt.promises.mkdir(i,{recursive:!0});let s=a.toLowerCase().replace(/\W+/g,"-").slice(0,40),o=t.map((U,r)=>({seed_query:a,response_text:r===0?n??"":"",citation_text:U.text,citation_href:U.href})),d=ie.default.unparse(o,{header:!0}),l=`${s}-ai-mode-${Date.now()}.csv`,S=Wt.default.join(i,l);return await rt.promises.writeFile(S,d,"utf8"),S}async writeWhatPeopleSayingCSV(t,n,a){await rt.promises.mkdir(a,{recursive:!0});let i=n.toLowerCase().replace(/\W+/g,"-").slice(0,40),s=t.map(S=>({seed_query:n,...S})),o=ie.default.unparse(s,{header:!0}),d=`${i}-what-people-saying-${Date.now()}.csv`,l=Wt.default.join(a,d);return await rt.promises.writeFile(l,o,"utf8"),l}};var Gn=class{onQuestion(t){process.stdout.write(JSON.stringify({event:"question",depth:t.depth,question:t.question})+`
21784
+ `).trim();return!H||/not available|try again|can't generate/i.test(H)?null:H}function S(m){if(!m||m.startsWith("javascript:"))return null;try{let v=new URL(m,window.location.href);return!["http:","https:"].includes(v.protocol)||v.username||v.password?null:{href:v.href,rawHref:v.href}}catch{return null}}function c(m){if(!m)return[];let v=new Set,O=[];for(let p of Array.from(m.querySelectorAll("a[href]"))){let k=S(p.getAttribute("href")??"");if(!k||v.has(k.rawHref))continue;v.add(k.rawHref);let _="";try{_=new URL(k.href).hostname.replace(/^www\./,"")}catch{}O.push({text:i(p)||_||k.href,href:k.href,rawHref:k.rawHref})}return O}async function o(m){let v=m.querySelector(t.aio.showMoreButton);if(!v||v.getAttribute("aria-expanded")!=="false")return!1;v.click();let O=t.expandWaitMs??1500;return O>0&&await new Promise(p=>setTimeout(p,O)),!0}let U=r(),u=null,h=[],w=!1,y=!1,N=[];if(U){w=await o(U);let m=U.querySelector(t.aio.controller),v=U.querySelector(t.aio.contentSubtree),O=U.querySelector(t.aio.showMoreButton);y=m?.getAttribute("data-trnct")==="false"||O?.getAttribute("aria-expanded")==="true"||!O,u=l(v??m??U),N=(u??"").split(`
21785
+ `).map(p=>p.trim()).filter(p=>/^\d+\.\s+.+/.test(p)),h=c(U)}let C=document.querySelector(t.aim.root),M=a==="aim"&&!!C,W=C?.closest(t.aim.wrapper)??C,L=M?l(W):null,B=M&&s(L),f=B?L:null,F=B?c(W):[],P=!!U&&s(u);return{surface:a,aiOverview:{detected:P,text:P?u:null,citations:P?h:[],expanded:P?w:!1,fullyExpanded:P?y:!1,sections:P?N:[]},aiMode:{detected:B&&f!==null,text:f,citations:F}}}var ko=require("crypto"),Mo=8e3,fo=3e3,vo=1e4,zl=8;function Gt(e){return/(^|\.)google\.(?:com|[a-z]{2,3}(?:\.[a-z]{2})?)$/i.test(e)}function Un(e){if(!e||e.length>Mo)return null;try{let t=new URL(e);return t.protocol!=="http:"&&t.protocol!=="https:"||t.username||t.password?null:t}catch{return null}}function $l(e,t){if(!e||e.length>Mo||/^javascript:/i.test(e))return null;try{let n=new URL(e,t);return Un(n.href)}catch{return null}}function Sn(e){let t=Un(e);return!t||t.protocol!=="https:"||!Gt(t.hostname)||t.pathname!=="/goto"?null:t.searchParams.get("url")?t:null}function ti(e){if(e.linkType!=="google_goto_redirect"||e.resolutionStatus!=="resolved"||!Sn(e.rawUrl)||!e.resolvedUrl)return!1;let t=Un(e.resolvedUrl);return!!(t&&!Gt(t.hostname)&&t.href===e.resolvedUrl&&e.url===t.href)}function ce(e){let t=e.normalize("NFKC").toLocaleLowerCase("en-US").replace(/[^\p{L}\p{N}\s]/gu,"").replace(/\s+/g," ").trim();return`paa_${(0,ko.createHash)("sha256").update(t).digest("hex").slice(0,16)}`}function cn(e,t){let n=$l(e,t);if(!n)return null;let a=n.href;if(!Gt(n.hostname))return{url:a,rawUrl:a,resolvedUrl:a,linkType:"plain",resolutionStatus:"not_needed"};if(n.pathname==="/url"){let i=Un(n.searchParams.get("q")??n.searchParams.get("url")??"");return!i||Gt(i.hostname)?null:{url:i.href,rawUrl:a,resolvedUrl:i.href,linkType:"google_url_redirect",resolutionStatus:"resolved"}}return n.pathname==="/goto"&&n.searchParams.get("url")?{url:a,rawUrl:a,resolvedUrl:null,linkType:"google_goto_redirect",resolutionStatus:"unresolved"}:null}function ei(e){return Sn(e)?.searchParams.get("url")??null}function To(e,t){try{let n=new URL(e),a=Un(new URL(t,n).href);return!a||Gt(a.hostname)?null:(!a.hash&&n.hash&&(a.hash=n.hash),a.href)}catch{return null}}async function No(e,t={}){let n=[...new Set([...e].flatMap(o=>Sn(o)?[o]:[]))],a=new Map(n.map(o=>[o,{rawUrl:o,resolvedUrl:null,resolutionStatus:"unresolved"}])),i=typeof globalThis.fetch=="function"?globalThis.fetch.bind(globalThis):null,s=t.fetchImpl??i;if(n.length===0||!s)return{resolutions:[...a.values()],nonGoogleRequestsObserved:0};let d=Math.max(1,t.timeoutMs??fo),r=Date.now()+Math.max(1,t.totalBudgetMs??vo),l=Math.max(1,Math.min(16,Math.floor(t.concurrency??zl))),S=0,c=async()=>{for(;S<n.length;){let o=n[S++],U=Sn(o),u=U?.searchParams.get("url");if(!U||!u){a.set(o,{rawUrl:o,resolvedUrl:null,resolutionStatus:"rejected"});continue}U.hash="";let h=U.href;for(let w=0;w<2;w++){let y=r-Date.now();if(y<=0)return;let N=new AbortController,C=setTimeout(()=>N.abort(),Math.min(d,y)),M;try{M=await s(h,{method:"GET",redirect:"manual",headers:{accept:"*/*","user-agent":"Mozilla/5.0"},signal:N.signal})}catch{break}finally{clearTimeout(C)}if(M.status<300||M.status>=400)break;let W=M.headers.get("location");if(!W)break;let L=To(o,W);if(L){a.set(o,{rawUrl:o,resolvedUrl:L,resolutionStatus:"resolved"});break}let B;try{B=new URL(W,h)}catch{a.set(o,{rawUrl:o,resolvedUrl:null,resolutionStatus:"rejected"});break}if(!Gt(B.hostname)||ei(B.href)!==u){a.set(o,{rawUrl:o,resolvedUrl:null,resolutionStatus:"rejected"});break}h=B.href}}};return await Promise.all(Array.from({length:Math.min(l,n.length)},()=>c())),{resolutions:[...a.values()],nonGoogleRequestsObserved:0}}function Co(e,t){try{return new URL(e.resolvedUrl??e.url).hostname.replace(/^www\./,"")}catch{return t}}async function bo(e,t={}){let n=[],a=o=>{for(let U of o)n.push(U),a(U.children??[])};a(e.tree??[]);let i=[...e.flat.flatMap(o=>o.sources??[]),...n.flatMap(o=>o.sources),...e.organicResults??[],...(e.aiOverview?.citations??[]).map(({text:o,href:U,...u})=>({...u,url:U})),...(e.aiMode?.citations??[]).map(({text:o,href:U,...u})=>({...u,url:U}))],s=new Map(i.filter(o=>!!o?.rawUrl).map(o=>[o.rawUrl,o])),d=[...s.values()].filter(o=>o.linkType==="google_goto_redirect"&&o.resolutionStatus!=="resolved").map(o=>o.rawUrl);if(d.length>0){let o=await No(d,t);for(let U of o.resolutions){let u=s.get(U.rawUrl);u&&s.set(U.rawUrl,U.resolutionStatus==="resolved"&&U.resolvedUrl?{...u,url:U.resolvedUrl,resolvedUrl:U.resolvedUrl,resolutionStatus:"resolved"}:{...u,resolutionStatus:U.resolutionStatus})}}let r=o=>({...o,...s.get(o.rawUrl)??o}),l=o=>o.map(U=>{let u=r(U);return{...u,site:Co(u,U.site)}});for(let o of e.flat){o.sources=l(o.sources??[]);let U=o.sources[0];o.source_title=U?.title??o.source_title,o.source_site=U?.site??o.source_site,o.source_cite=U?.url??o.source_cite}for(let o of n){o.sources=l(o.sources??[]);let U=o.sources[0];o.sourceTitle=U?.title??o.sourceTitle,o.sourceSite=U?.site??o.sourceSite,o.sourceCite=U?.url??o.sourceCite}for(let o=0;o<(e.organicResults?.length??0);o++){let U=r(e.organicResults[o]);e.organicResults[o]={...U,domain:Co(U,e.organicResults[o].domain)??""}}let S=o=>{let U=r({url:o.href,rawUrl:o.rawUrl,resolvedUrl:o.resolvedUrl,linkType:o.linkType,resolutionStatus:o.resolutionStatus}),{url:u,...h}=U;return{...o,...h,href:u}};e.aiOverview&&(e.aiOverview.citations=(e.aiOverview.citations??[]).map(S)),e.aiMode&&(e.aiMode.citations=(e.aiMode.citations??[]).map(S));let c=[...s.values()];return e.diagnostics.links={linkCandidatesObserved:s.size,plainLinksObserved:c.filter(o=>o.linkType==="plain").length,googleUrlRedirectsObserved:c.filter(o=>o.linkType==="google_url_redirect").length,googleGotoRedirectsObserved:c.filter(o=>o.linkType==="google_goto_redirect").length,redirectsResolved:c.filter(o=>o.linkType!=="plain"&&o.resolutionStatus==="resolved").length,redirectsUnresolved:c.filter(o=>o.resolutionStatus==="unresolved").length,redirectsRejected:c.filter(o=>o.resolutionStatus==="rejected").length,resolverNonGoogleRequestsObserved:0,paaSourcesPreserved:e.flat.reduce((o,U)=>o+U.sources.length,0),aiOverviewLabelValidated:e.aiOverview?.detected??!1},e}async function Po(e,t,n={}){let a=new Map;for(let U of t){let u=a.get(U.rawUrl);u&&ti(u)||a.set(U.rawUrl,U.linkType==="google_goto_redirect"&&!ti(U)?{...U,url:U.rawUrl,resolvedUrl:null,resolutionStatus:"unresolved"}:U)}let i=[...a.values()].filter(U=>U.linkType==="google_goto_redirect"&&!ti(U));if(i.length===0)return a;let s=Date.now()+(n.totalBudgetMs??vo),d=await No(i.map(U=>U.rawUrl),n);for(let U of d.resolutions){let u=a.get(U.rawUrl);u&&a.set(U.rawUrl,U.resolutionStatus==="resolved"&&U.resolvedUrl?{...u,url:U.resolvedUrl,resolvedUrl:U.resolvedUrl,resolutionStatus:"resolved"}:{...u,resolutionStatus:U.resolutionStatus})}let r=i.filter(U=>a.get(U.rawUrl)?.resolutionStatus==="unresolved");if(r.length===0||n.browserFallback===!1||Date.now()>=s)return n.onNetworkAudit?.({nonGoogleRequestsObserved:0}),a;let l=n.timeoutMs??fo,S=await e.context().newPage().catch(()=>null);if(!S)return n.onNetworkAudit?.({nonGoogleRequestsObserved:0}),a;let c=null,o=0;try{await S.route("**/*",async U=>{let u=U.request().url();try{Gt(new URL(u).hostname)||(o+=1)}catch{}let h=ei(u);if(!c||h!==c.token){await U.abort("blockedbyclient").catch(()=>{});return}let w=c;try{let y=await U.fetch({maxRedirects:0,timeout:w.timeoutMs});w.location=y.headers().location??null}finally{await U.abort("blockedbyclient").catch(()=>{}),w.finish()}});for(let U of r){let u=s-Date.now();if(u<=0)break;let h=Sn(U.rawUrl),w=h?.searchParams.get("url");if(!h||!w){a.set(U.rawUrl,{...U,resolutionStatus:"rejected"});continue}let y=Math.min(l,u);h.hash="";let N=h.href,C=!1;for(let M=0;M<2;M++){let W,L=new Promise(m=>{W=m}),B=`mcp-goto-${Math.random().toString(36).slice(2)}`;c={token:w,timeoutMs:y,location:null,finish:W},await S.evaluate(({url:m,id:v})=>{let O=document.createElement("iframe");O.id=v,O.hidden=!0,O.src=m,document.body.append(O)},{url:N,id:B}).catch(()=>null),await Promise.race([L,new Promise(m=>setTimeout(m,y))]);let f=c.location;if(c=null,await S.evaluate(m=>document.getElementById(m)?.remove(),B).catch(()=>null),!f)break;let F=To(U.rawUrl,f);if(F){a.set(U.rawUrl,{...U,url:F,resolvedUrl:F,resolutionStatus:"resolved"});break}let P;try{P=new URL(f,N)}catch{C=!0;break}if(!Gt(P.hostname)||ei(P.href)!==w){C=!0;break}N=P.href}C&&a.get(U.rawUrl)?.resolutionStatus!=="resolved"&&a.set(U.rawUrl,{...U,resolutionStatus:"rejected"})}}finally{c=null,await S.close().catch(()=>{}),n.onNetworkAudit?.({nonGoogleRequestsObserved:o})}return a}async function Io(e){let t=sn;return e.evaluate(n=>{let a=[],i=Array.from(document.querySelectorAll(n.container));for(let s of i){let l=(s.querySelector(n.sectionHeading)?.textContent?.trim()??"").toLowerCase().includes("short")?"short_video":"video",S=Array.from(s.querySelectorAll(n.item));for(let c of S){let o=c.href;if(!o||!o.includes("youtube")&&!o.includes("youtu.be"))continue;let U=c.textContent?.trim()??"",u=U.indexOf("YouTube");if(u===-1)continue;let h=U.slice(0,u).trim(),y=U.slice(u+7).replace(/^[·\s·]+/,"").match(/^([^·\n]+)/),N=y?y[1].trim():"";h&&a.push({type:l,title:h,channel:N,platform:"YouTube",duration:"",url:o})}}return a},t)}async function Ao(e){let t=Ys;return e.evaluate(n=>{let a=[],s=Array.from(document.querySelectorAll(n.section)).find(r=>r.textContent?.includes("Discussions"));if(!s)return a;let d=Array.from(s.querySelectorAll(n.item));for(let r of d){let l=r.href;if(!l)continue;let S=r.querySelector(n.title),c=r.querySelector(n.source),o=S?.textContent?.trim()??"",U=c?.textContent?.trim()??"";o&&a.push({title:o,source:U,url:l})}return a},t)}async function xo(e,t,n){try{await e.goto(t,{waitUntil:"domcontentloaded"}),await e.waitForTimeout(1500)}catch{return[]}await n(e,"Google short video search");let a={item:on.item,platforms:[...on.platforms]};return(await e.evaluate(s=>{let d=new Set,r=[],l=Array.from(document.querySelectorAll(s.item)),S=["youtube.com","youtu.be","tiktok.com","instagram.com","facebook.com","fb.watch"],c=new Map;for(let o of l){let U=o.href;if(!U||!S.some(h=>U.includes(h)))continue;let u=o.textContent?.trim()??"";c.has(U)||c.set(U,[]),c.get(U).push(u)}for(let[o,U]of c.entries()){if(d.has(o))continue;d.add(o);let u=U.find(C=>/^\d+:\d+$/.test(C))??"",h=U.find(C=>!/^\d+:\d+$/.test(C)&&C.length>5)??"";if(!h)continue;let w=h,y="",N="";for(let C of s.platforms){let M=-1,W=0;for(;;){let P=h.indexOf(C,W);if(P===-1)break;M=P,W=P+1}if(M===-1)continue;let L=h.slice(M+C.length);if(!(/^[\s·]/.test(L)||L.trim()===""))continue;w=h.slice(0,M).trim(),y=C;let f=L.replace(/^[\s·]+/,""),F=f.indexOf("\xB7");N=(F===-1?f:f.slice(0,F)).trim();break}w&&r.push({title:w,channel:N,platform:y,duration:u,url:o})}return r},a)).map(s=>({type:"short_video",...s}))}async function Wo(e){let t=Js;return e.evaluate(n=>{let a=Array.from(document.querySelectorAll(n.sectionTag)).find(i=>i.textContent?.includes(n.sectionHeadingText))??document.querySelector(".yG4QQe.TBC9ub.NbhJ1c");return a?Array.from(a.querySelectorAll(n.card)).map(i=>{let d=i.querySelector(n.cardLink)?.href??"",r=i.querySelector(n.titleH1)?.textContent?.trim(),l=i.querySelector(n.titleDiv)?.textContent?.trim(),S=r??l??"",c=i.querySelector(n.source)?.textContent?.trim()??"",U=i.querySelector(n.platformBadge)?.textContent?.trim()??"",u=i.querySelector(n.ytChannel)?.textContent?.trim()??"",h=i.querySelector(n.ytDate)?.textContent?.trim()??"",w=i.querySelector(n.authorNote)?.textContent?.trim()??null,y=i.querySelector(n.popularCommentLabel),N=null;if(y){let k=y.nextSibling;for(;k;){let _=k.textContent?.trim();if(_){N=_;break}k=k.nextSibling}}let C=Array.from(i.querySelectorAll("span")),M=C.find(k=>/^\d+:\d+$/.test(k.textContent?.trim()??""))?.textContent?.trim()??null,L=C.map(k=>k.textContent?.trim()??"").filter(k=>/\d/.test(k)&&(k.includes("comment")||k.includes("reaction")||k.includes("view")||k.includes("like")||k.includes("share")))[0]??"",B=C.map(k=>k.textContent?.trim()??"").filter(k=>/\d+ (day|week|month|year|hour)s? ago|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/.test(k)),f=h||(B[0]??""),F=U||(u?"YouTube":""),P=u||c,m="unknown",v=F.toLowerCase(),O=P.toLowerCase(),p=c.toLowerCase();return v.includes("reddit")||O.startsWith("r/")?m="reddit":v.includes("facebook")||p.includes("facebook")?m="facebook":v.includes("instagram")||p.includes("instagram")?m="instagram":v.includes("tiktok")||p.includes("tiktok")?m="tiktok":v.includes("youtube")||u?m="youtube":m="news",{type:m,title:S,url:d,source:P,platform:F,popularComment:N,engagement:L,date:f,duration:M,authorNote:w}}):[]},t)}async function Lo(e){let t=$s,n=await e.evaluate(i=>{let s=[],d=0;return document.querySelectorAll(i.result).forEach(r=>{let l=r.querySelector(i.title);if(!l)return;let S=l.textContent?.trim()??"",o=l.closest("a")?.href??"";if(!S||!o)return;d++;let U=r.querySelector(i.cite)?.textContent?.trim()??null,u=r.querySelector(i.snippet)?.textContent?.trim()??null,h=!!r.querySelector(i.redditCite),w=r.querySelector(i.ratingWrap),y=w?{value:w.querySelector(i.ratingValue)?.textContent?.trim()??"",count:w.querySelector(i.reviewCount)?.textContent?.trim()??""}:null,N="";try{N=new URL(o).hostname.replace(/^www\./,"")}catch{N=r.querySelector(i.siteName)?.textContent?.trim()??""}s.push({position:d,title:S,url:o,domain:N,cite:U,snippet:u,isRedditStyle:h,inlineRating:y})}),s},t),a=typeof e.url=="function"?e.url():"https://www.google.com/";return n.flatMap(i=>{let s=cn(i.url,a);if(!s)return[];let d=i.domain;try{d=new URL(s.resolvedUrl??s.rawUrl).hostname.replace(/^www\./,"")}catch{}return[{...i,...s,domain:d}]})}async function Oo(e){let t=js;return e.evaluate(n=>{let a=[],i=null;return document.querySelectorAll('[role="heading"]').forEach(s=>{!i&&s.textContent?.includes(n.headingText)&&(i=s.closest("[data-hveid]"))}),i&&i.querySelectorAll(n.card).forEach((s,d)=>{let r=s.querySelector(n.name)?.textContent?.trim()??"";if(!r)return;let l=s.querySelector(n.ratingValue)?.textContent?.trim()??null,S=s.querySelector(n.reviewCount)?.textContent?.trim()??null,c=S?S.replace(/[()]/g,"").trim():null,o=s.querySelector("a[data-cid]")?.getAttribute("data-cid")??null;if(!o)for(let y of Array.from(s.querySelectorAll("a[href]"))){let N=y.href.match(/[?&]cid=(\d+)/);if(N){o=N[1];break}let C=y.href.match(/!1s0x[0-9a-f]+:0x([0-9a-f]+)/i);if(C){try{o=BigInt("0x"+C[1]).toString()}catch{}if(o)break}}let U=[];s.querySelectorAll("div, span").forEach(y=>{let N=Array.from(y.childNodes).filter(C=>C.nodeType===3).map(C=>C.textContent?.trim()??"").filter(C=>C.length>1&&C.length<120).join(" ");N&&!U.includes(N)&&U.push(N)});let u=Array.from(s.querySelectorAll("a[href]")),h=u.find(y=>y.href.includes("google.com/maps"))?.href??null,w=u.find(y=>!y.href.includes("google.com")&&y.href.startsWith("http"))?.href??null;a.push({position:d+1,name:r,cid:o,rating:l,reviewCount:c,metadata:U,websiteUrl:w,directionsUrl:h})}),a},t)}async function Bo(e){return e.evaluate(()=>{let t=new Set,n=new Set,a=new Set,i=new Map;function s(r){let l=[".OSrXXb",".dbg0pd",".tzt0oe",'[role="heading"]',"h3"];for(let S of l){let c=r.querySelector(S);if(c?.textContent?.trim())return c.textContent.trim()}return""}document.querySelectorAll('[id^="pv-/g/"]').forEach(r=>{let l=r.getAttribute("id");if(!l)return;let S=l.replace("pv-","");t.add(S);let c=s(r),U=r.querySelector("a[data-cid]")?.getAttribute("data-cid")??null;U&&n.add(U),c&&i.set(S,{name:c,kgId:S,cid:U,gcid:null})}),document.querySelectorAll("[data-mid]").forEach(r=>{let l=r.getAttribute("data-mid");if(l?.startsWith("/g/")&&(t.add(l),!i.has(l))){let S=s(r);S&&i.set(l,{name:S,kgId:l,cid:null,gcid:null})}}),document.querySelectorAll(".w7Dbne").forEach(r=>{let S=r.querySelector("a[data-cid]")?.getAttribute("data-cid")??null;if(!S)return;n.add(S);let c=r.querySelector(".OSrXXb")?.textContent?.trim()??"";if(!c)return;let o=r.querySelector('[id^="pv-/g/"]'),U=o?o.getAttribute("id").replace("pv-",""):null,u=U??`cid:${S}`;if(i.has(u)){let h=i.get(u);h.cid||i.set(u,{...h,cid:S})}else i.set(u,{name:c,kgId:U,cid:S,gcid:null})}),document.querySelectorAll("a[data-cid]").forEach(r=>{let l=r.getAttribute("data-cid");if(!l)return;if(n.add(l),![...i.values()].some(c=>c.cid===l)){let c=r.parentElement,o="";for(let U=0;U<8&&c;U++){let u=c.querySelector('.OSrXXb, .dbg0pd, [role="heading"], h3');if(u?.textContent?.trim()){o=u.textContent.trim();break}c=c.parentElement}o&&i.set(`cid:${l}`,{name:o,kgId:null,cid:l,gcid:null})}});let d=Array.from(document.querySelectorAll("script:not([src])")).map(r=>r.textContent??"").filter(r=>r.length>1e4).join(`
21786
+ `);for(let r of d.matchAll(/\/g\/[a-zA-Z0-9_-]{5,20}/g))t.add(r[0]);for(let r of d.matchAll(/gcid:[a-zA-Z0-9_]+/g))a.add(r[0]);for(let r of d.matchAll(/0x[0-9a-f]+:0x([0-9a-f]+)/gi))try{n.add(BigInt("0x"+r[1]).toString())}catch{}return{entities:[...i.values()],kgIds:[...t],cids:[...n],gcids:[...a]}})}function Ro(e,t){let n=new Set(e.cids),a=e.entities.map(i=>({...i}));for(let i of t){if(!i.cid)continue;n.add(i.cid);let s=i.name.toLowerCase().trim(),d=a.find(r=>r.name.toLowerCase().trim()===s);d?d.cid||(d.cid=i.cid):a.find(r=>r.cid===i.cid)||a.push({name:i.name,kgId:null,cid:i.cid,gcid:null})}return{...e,entities:a,cids:[...n]}}var Ql=String.raw`^(?:an error has occurred(?:[.!…]\s*)?(?:please try again later[.!…]?)?|loading|please wait|try again|something went wrong)[.!…\s]*$`,Xl=700,Zl=1e3,tS=1400,Ho=900,eS=3,Eo=250,Yn=class{constructor(t,n,a,i){this.driver=t;this.reporter=n;this.onPaaProgress=a;this.onProviderSession=i}driver;reporter;onPaaProgress;onProviderSession;completeness={paaWithoutAnswer:0,paaWithoutSource:0,paaAnswersRecovered:0,aioShareCaptured:null};aioShareUrlEarly=null;linkDiagnostics=this.emptyLinkDiagnostics();collectedRows=[];partialContext=null;progressSequence=0;clickedQuestions=new Set;paaLifecycle=this.emptyPaaLifecycle(0);checkpointMaterial=null;interactionObservations=[];phaseTimings={};currentPhaseTimings(t){return{...this.phaseTimings,totalServerMs:Math.max(0,Date.now()-t)}}emptyPaaLifecycle(t){return{requestedQuestions:t,questionsFound:0,targetStatus:"not_met",discoveryStatus:"in_progress",materialStatus:"partial",completionReason:"PAA expansion is still running.",automaticRetries:0,retryBreakdown:{controlRetries:0,browserRetries:0,providerFallbacks:0,runtimeRecoveries:0,idempotentReplays:0},knownQuestions:0,processedQuestions:0,failedInteractions:0,noGrowthConfirmations:0,visibleControls:0,eligibleControls:0,dispatchedInteractions:0,confirmedInteractions:0,unconfirmedInteractions:0}}emptyLinkDiagnostics(){return{linkCandidatesObserved:0,plainLinksObserved:0,googleUrlRedirectsObserved:0,googleGotoRedirectsObserved:0,redirectsResolved:0,redirectsUnresolved:0,redirectsRejected:0,resolverNonGoogleRequestsObserved:0,paaSourcesPreserved:0,aiOverviewLabelValidated:!1}}mergePaaSources(t=[],n=[]){let a=new Map;for(let i of[...t,...n]){let s=a.get(i.rawUrl);if(!s){a.set(i.rawUrl,i);continue}let d=i.resolutionStatus==="resolved"&&s.resolutionStatus!=="resolved"?i:s,r=i.description?.trim()&&!s.description?.trim()?i:s.description?.trim()?s:d;a.set(i.rawUrl,{...d,title:r.title??d.title??s.title??i.title,site:d.site??s.site??i.site,...(r.description??s.description??i.description)!==void 0?{description:r.description??s.description??i.description}:{}})}return[...a.values()]}normalizeAICitations(t,n){let a=new Set;return n.flatMap(i=>{let s=cn(i.rawHref??i.href,t);if(!s||a.has(s.rawUrl))return[];a.add(s.rawUrl);let{url:d,...r}=s;return[{...r,text:i.text,href:d}]})}async resolveMaterialLinks(t,n,a,i,s){let d=Date.now(),r=[...n.flatMap(h=>h.sources??[]),...a,...i.citations.map(({text:h,href:w,...y})=>({...y,url:w})),...s.citations.map(({text:h,href:w,...y})=>({...y,url:w}))],l=new Map(r.map(h=>[h.rawUrl,h])),S=0,c=await Po(t,r,{onNetworkAudit:h=>{S=h.nonGoogleRequestsObserved}}),o=h=>({...h,...c.get(h.rawUrl)??h});for(let h of n){h.sources=(h.sources??[]).map(o);let w=h.sources[0];h.source_title=w?.title??h.source_title,h.source_site=w?.site??h.source_site,h.source_cite=w?.url??h.source_cite}for(let h=0;h<a.length;h++){let w=o(a[h]);if(w.resolvedUrl)try{w.domain=new URL(w.resolvedUrl).hostname.replace(/^www\./,"")}catch{}a[h]=w}let U=h=>{let w=o({url:h.href,rawUrl:h.rawUrl,resolvedUrl:h.resolvedUrl,linkType:h.linkType,resolutionStatus:h.resolutionStatus}),{url:y,...N}=w;return{...N,text:h.text,href:y}};i.citations=i.citations.map(U),s.citations=s.citations.map(U);let u=[...c.values()];this.linkDiagnostics={linkCandidatesObserved:l.size,plainLinksObserved:u.filter(h=>h.linkType==="plain").length,googleUrlRedirectsObserved:u.filter(h=>h.linkType==="google_url_redirect").length,googleGotoRedirectsObserved:u.filter(h=>h.linkType==="google_goto_redirect").length,redirectsResolved:u.filter(h=>h.linkType!=="plain"&&h.resolutionStatus==="resolved").length,redirectsUnresolved:u.filter(h=>h.resolutionStatus==="unresolved").length,redirectsRejected:u.filter(h=>h.resolutionStatus==="rejected").length,resolverNonGoogleRequestsObserved:S,paaSourcesPreserved:n.reduce((h,w)=>h+(w.sources??[]).length,0),aiOverviewLabelValidated:i.detected},this.phaseTimings.linkResolutionMs=(this.phaseTimings.linkResolutionMs??0)+(Date.now()-d)}normalizeQuestion(t){return t.toLowerCase().replace(/[^\w\s]/g,"").replace(/\s+/g," ").trim()}throwIfAborted(t){if(t?.aborted)throw t.reason instanceof DOMException&&t.reason.name==="TimeoutError"?t.reason:new dt}async throwIfCaptcha(t,n){if(await t.locator(z.captchaMarker).count().catch(()=>0)>0)throw new Z(`${n} returned a CAPTCHA \u2014 retrying with a fresh session.`)}async extractVisibleItems(t,n){let a=await t.evaluate(Kn,{selectors:z,onlyQuestion:n}),i=typeof t.url=="function"?t.url():"https://www.google.com/";return a.flatMap(s=>{let d=[],r=new Set;for(let o of s.sources){let U=cn(o.rawHref,i);if(!U||r.has(U.rawUrl))continue;r.add(U.rawUrl);let u=s.sourceSite??null;try{u||=new URL(U.resolvedUrl??U.rawUrl).hostname.replace(/^www\./,"")}catch{}d.push({...U,title:o.title||s.sourceTitle||null,site:u,...o.description?{description:o.description}:{}})}let l=d[0],S={questionId:ce(s.question),googleLinkId:s.googleLinkId,googleEvidenceId:s.googleEvidenceId,question:s.question,answer:yo(s.answer,s.question),sourceTitle:l?.title??s.sourceTitle,sourceSite:l?.site??s.sourceSite,sourceCite:l?.url,sources:d,...s.answerExpansionIncomplete?{answerExpansionIncomplete:!0}:{}},c=Wi.safeParse(S);return c.success?[c.data]:(console.warn("[PAAExtractor] item parse failed:",s.question,c.error.issues[0]?.message),[])})}jitteredDelayMs(t,n){return t+Math.floor(Math.random()*(n-t+1))}async clickItem(t,n){try{await t.locator(`${z.item}[data-q="${n}"], ${z.item}[data-initq="${n}"]`).first().click()}catch{}}toFlatRow(t,n,a,i){return{seed_query:i,question_id:t.questionId??ce(t.question),google_link_id:t.googleLinkId??"",google_evidence_id:t.googleEvidenceId??"",question:t.question,answer:t.answer??"",...t.answerExpansionIncomplete?{answerExpansionIncomplete:!0}:{},source_title:t.sourceTitle??"",source_site:t.sourceSite??"",source_cite:t.sourceCite??"",sources:t.sources??[],depth:n,parent_question:a??"",extracted_at:new Date().toISOString()}}upsertCollectedRow(t){let n=this.normalizeQuestion(t.question),a=this.collectedRows.findIndex(r=>this.normalizeQuestion(r.question)===n);if(a<0)return this.collectedRows.push({...t}),!0;let i=this.collectedRows[a],s={...i,...t,answer:t.answer||i.answer,answerExpansionIncomplete:t.answer?t.answerExpansionIncomplete:i.answerExpansionIncomplete,source_title:t.source_title||i.source_title,source_site:t.source_site||i.source_site,source_cite:t.source_cite||i.source_cite,sources:this.mergePaaSources(i.sources,t.sources),extracted_at:t.extracted_at||i.extracted_at},d=s.answerExpansionIncomplete!==i.answerExpansionIncomplete||s.answer!==i.answer||s.source_title!==i.source_title||s.source_site!==i.source_site||s.source_cite!==i.source_cite||JSON.stringify(s.sources)!==JSON.stringify(i.sources);return d&&(this.collectedRows[a]=s),d}async emitProgress(t){if(!this.onPaaProgress||this.collectedRows.length===0&&!this.checkpointMaterial)return;let n={sequence:++this.progressSequence,observedAt:new Date().toISOString(),clickedQuestions:[...this.clickedQuestions],phase:t,records:this.collectedRows.map(a=>({...a})),lifecycle:{...this.paaLifecycle},...this.checkpointMaterial?{material:structuredClone(this.checkpointMaterial)}:{},interactions:this.interactionObservations.map(a=>({...a,confirmationSignals:[...a.confirmationSignals]}))};try{await this.onPaaProgress(n)}catch(a){console.warn(JSON.stringify({event:"paa_progress_sink_failed",sequence:n.sequence,phase:n.phase,message:a instanceof Error?a.message:String(a)}))}}getPartialResult(){let t=this.partialContext;if(!t||this.collectedRows.length===0&&!this.checkpointMaterial)return null;let n=this.collectedRows.map(l=>({...l})),a=this.checkpointMaterial,i=t.questionsOnly?0:n.filter(l=>!l.answer?.trim()).length,s=t.questionsOnly?0:n.filter(l=>(l.sources??[]).length===0).length,d=t.questionsOnly?0:n.filter(l=>l.answerExpansionIncomplete).length,r={seed:t.seed,totalQuestions:n.length,maxDepthReached:n.reduce((l,S)=>Math.max(l,S.depth),0),durationMs:Date.now()-t.startMs,errorCount:0};return{seed:t.seed,location:t.location,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(t.startMs),completionStatus:"paa_found",problem:null,...a?.pagination?{pagination:{...a.pagination}}:{},resultQuality:"partial",degradedResult:!1,retryRecommended:!0,paaLifecycle:{...this.paaLifecycle,questionsFound:n.length,targetStatus:n.length>=(t.maxQuestions??0)?"met":"not_met",discoveryStatus:"interrupted",materialStatus:i>0||s>0||d>0?"partial":"complete",completionReason:"The browser attempt ended before frontier exhaustion could be proven."},completeness:{...this.completeness,paaWithoutAnswer:i,paaWithoutSource:s,paaIncompleteAnswers:d,paaRequested:t.maxQuestions,paaReturned:n.length,paaUnique:n.length},warnings:[{code:"paa_partial",surface:"paa",message:`Harvest stopped before finishing; returning the ${n.length} question(s) collected up to that point.`,retryable:!0}]},totalQuestions:n.length,surface:a?.surface??"web",aiOverview:a?.aiOverview??{detected:!1,text:null,citations:[]},aiMode:a?.aiMode??{detected:!1,text:null,citations:[]},whatPeopleSaying:a?.whatPeopleSaying??[],tree:this.buildTree(n,t.seed),flat:n,videos:a?.videos??[],forums:a?.forums??[],organicResults:a?.organicResults??[],localPack:a?.localPack??[],entityIds:a?.entityIds??{entities:[],kgIds:[],cids:[],gcids:[]},stats:r}}async runBFS(t,n,a){await t.waitForTimeout(700);let i=new Set,s=new Set,d=[];this.clickedQuestions=new Set,this.interactionObservations=[],this.phaseTimings={};let r=new Set,l=new Map,S=new Set,c=new Set,o=new Map,U=new Set,u=2,h=3,w=0,y={sel:z.item,dataQ:z.itemDataQ,dataInitQ:z.itemDataInitQ,questionEl:z.itemQuestionEl,answerSel:z.answerContainer,expandedClass:z.expandedClass,clickTarget:z.clickTarget,answerPlaceholderPattern:Ql,questionsOnly:n.questionsOnly,sourceSel:"a[href]"},N=()=>t.evaluate(({sel:f,dataQ:F,dataInitQ:P,questionEl:m,expandedClass:v,clickTarget:O,answerSel:p,answerPlaceholderPattern:k,questionsOnly:_})=>{let H=A=>{if(!A)return"";let b=[];for(let R of A.childNodes){if(R.nodeType===Node.TEXT_NODE){let mt=R.textContent?.trim();mt&&b.push(mt);continue}if(R.nodeType!==Node.ELEMENT_NODE)continue;let Q=R;if(Q.tagName==="STYLE"||Q.tagName==="SCRIPT"||Q.getAttribute("aria-hidden")==="true")continue;let $=H(Q);$&&b.push($)}return b.join(" ").replace(/\s+/g," ").trim()};return Array.from(document.querySelectorAll(f)).map((A,b)=>{let R=H(A.querySelector(p)).replace(/An AI Overview is not available for this search/gi," ").replace(/Can't generate an AI overview right now\.?\s*Try again later\.?/gi," ").replace(/\bAI Overview\b/gi," ").replace(/\s+/g," ").trim(),Q=A.classList.contains(v)||A.querySelector(O)?.getAttribute("aria-expanded")==="true",$=R.length>=10&&!new RegExp(k,"i").test(R);return{q:A.getAttribute(F)||A.getAttribute(P)||A.querySelector(m)?.innerText?.trim()||"",done:Q&&(_||$),expanded:Q,index:b}}).filter(A=>A.q)},y),C=async(f,F,P,m,v,O)=>{let p=Date.now(),k={id:`${O}:${ce(f)}:${v}`,questionId:ce(f),question:f,batchNumber:O,controlAttempt:v,observedAt:new Date(p).toISOString(),beforeQuestionCount:F,expandedBefore:m},_=P>=0?t.locator(y.sel).nth(P).locator(y.clickTarget):null,H=null,A=_?await(async()=>(m&&(await _.click({timeout:Ho,force:!0}),await t.waitForTimeout(120)),await _.click({timeout:Ho,force:!0}),!0))().catch(ut=>(H=ut instanceof Error&&(ut.name==="TimeoutError"||/timeout/i.test(ut.message))?"click_ack_timeout":"click_failed",!1)):!1,b=Date.now()-p;if(!A&&H!=="click_ack_timeout")return{dispatched:!1,confirmed:!1,observation:{...k,dispatched:!1,outcome:"dispatch_failed",confirmationSignals:[],confirmationCheckpointMs:null,confirmedAtMs:null,dispatchDurationMs:b,totalDurationMs:b,afterQuestionCount:F,newQuestionCount:0,expandedAfter:m,answerObserved:!1,sourceCount:0,errorCode:P<0?"control_missing":H??"click_failed"}};let R={exists:!0,expanded:m,answerReady:!1,sourceCount:0,questionCount:F},Q=[],$=null,mt=null,K=!1;for(let ut of[Xl,Zl,tS]){let Y=p+ut-Date.now();if(Y>0&&await t.waitForTimeout(Y),R=await t.evaluate(({sel:D,dataQ:ht,dataInitQ:Ct,questionEl:Yt,expandedClass:V,clickTarget:It,answerSel:kt,answerPlaceholderPattern:Jt,sourceSel:j,target:X})=>{let At=ge=>{if(!ge)return"";let ta=[];for(let gn of ge.childNodes){if(gn.nodeType===Node.TEXT_NODE){let Mi=gn.textContent?.trim();Mi&&ta.push(Mi);continue}if(gn.nodeType!==Node.ELEMENT_NODE)continue;let wn=gn;if(wn.tagName==="STYLE"||wn.tagName==="SCRIPT"||wn.getAttribute("aria-hidden")==="true")continue;let ki=At(wn);ki&&ta.push(ki)}return ta.join(" ").replace(/\s+/g," ").trim()},Je=Array.from(document.querySelectorAll(D)),hn=Je.find(ge=>(ge.getAttribute(ht)||ge.getAttribute(Ct)||ge.querySelector(Yt)?.innerText?.trim())===X);if(!hn)return{exists:!1,expanded:!1,answerReady:!1,sourceCount:0,questionCount:Je.length};let er=hn.classList.contains(V)||hn.querySelector(It)?.getAttribute("aria-expanded")==="true",yi=hn.querySelector(kt),mi=At(yi).replace(/An AI Overview is not available for this search/gi," ").replace(/Can't generate an AI overview right now\.?\s*Try again later\.?/gi," ").replace(/\bAI Overview\b/gi," ").replace(/\s+/g," ").trim(),Ci=mi.length>=10&&!new RegExp(Jt,"i").test(mi);return{exists:!0,expanded:er,answerReady:Ci,sourceCount:Ci?yi?.querySelectorAll(j).length??0:0,questionCount:Je.length}},{...y,target:f}).catch(()=>R),Q=[...R.expanded?["expanded"]:[],...R.answerReady?["answer"]:[],...R.sourceCount>0?["source"]:[],...R.questionCount>F?["question_growth"]:[]],R.answerReady||R.sourceCount>0||R.questionCount>F){K=!0,$=ut,mt=Date.now()-p;break}}let Kt=Date.now()-p,Pt={...k,dispatched:A,outcome:K?"confirmed":A?"unconfirmed":"dispatch_failed",confirmationSignals:Q,confirmationCheckpointMs:$,confirmedAtMs:mt,dispatchDurationMs:b,totalDurationMs:Kt,afterQuestionCount:R.questionCount,newQuestionCount:Math.max(0,R.questionCount-F),expandedAfter:R.expanded,answerObserved:R.answerReady,sourceCount:R.sourceCount,errorCode:A?K?null:R.exists?"confirmation_timeout":"control_missing":H};return{dispatched:A,confirmed:K,observation:Pt}},M=0;t:for(;;){if(n.softDeadlineMs&&Date.now()>=n.softDeadlineMs)throw this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"interrupted",completionReason:"The execution deadline arrived before frontier exhaustion could be proven."},new zt(this.paaLifecycle.completionReason);this.throwIfAborted(a);let f=await N(),F=!1;for(let p of f)s.has(p.q)||(s.add(p.q),d.push(p.q),d.length<=n.maxQuestions&&(F=this.upsertCollectedRow(this.toFlatRow({questionId:ce(p.q),googleLinkId:null,googleEvidenceId:null,question:p.q,sources:[]},1,null,n.query))||F)),p.done&&S.add(p.q);if(this.paaLifecycle={...this.paaLifecycle,questionsFound:Math.min(d.length,n.maxQuestions),targetStatus:d.length>=n.maxQuestions?"met":"not_met",knownQuestions:d.length,processedQuestions:S.size,failedInteractions:c.size,visibleControls:f.length},F&&await this.emitProgress("discovered"),n.questionsOnly&&s.size>=n.maxQuestions){this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"target_reached",targetStatus:"met",completionReason:"The requested unique-question count was observed."};break}if(!n.questionsOnly&&s.size>=n.maxQuestions){let p=!1,k=new Set(d.slice(0,n.maxQuestions)),_=await this.extractVisibleItems(t),H=_.filter(A=>k.has(A.question)&&A.answerExpansionIncomplete&&!U.has(A.question));for(let A of H)U.add(A.question),await Za(t,A.question,{selectors:z,deadlineMs:n.softDeadlineMs,signal:a},Kn);H.length&&(_=await this.extractVisibleItems(t));for(let A of _){if(!k.has(A.question))continue;let b=o.get(A.question),R={...A,answer:A.answer||b?.answer,answerExpansionIncomplete:A.answer?A.answerExpansionIncomplete:b?.answerExpansionIncomplete,sourceTitle:A.sourceTitle??b?.sourceTitle,sourceSite:A.sourceSite??b?.sourceSite,sourceCite:A.sourceCite??b?.sourceCite,sources:this.mergePaaSources(b?.sources,A.sources)};o.set(A.question,R),p=this.upsertCollectedRow(this.toFlatRow(R,1,null,n.query))||p}if(p&&await this.emitProgress("answer_captured"),[...k].every(A=>{let b=o.get(A);return!!(b?.answer?.trim()&&b.sources.length>0&&!b.answerExpansionIncomplete)})){c.clear(),this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"target_reached",targetStatus:"met",failedInteractions:0,completionReason:"The requested unique-question count and its answer/source material were observed."};break}}let P=new Set(d.slice(0,n.maxQuestions)),m=f.filter(p=>P.has(p.q)&&!p.done&&(l.get(p.q)??0)<u&&!r.has(p.q)),v=m.slice(-eS);if(this.paaLifecycle={...this.paaLifecycle,eligibleControls:m.length},v.length===0){if(s.size>=n.maxQuestions){this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"target_reached",targetStatus:"met",completionReason:"The requested unique-question count was observed."};break}let p=new Set(f.map(_=>_.q)),k=d.slice(0,n.maxQuestions).filter(_=>!S.has(_)&&(c.has(_)||!p.has(_)));if(k.length>0)throw this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"interrupted",failedInteractions:new Set([...c,...k]).size,completionReason:"At least one known PAA control failed or disappeared before it could be confirmed."},await this.emitProgress("expansion_finished"),new zt(this.paaLifecycle.completionReason);for(let _=1;_<=h;_++){this.throwIfAborted(a),await this.throwIfCaptcha(t,"Google PAA exhaustion confirmation"),await t.mouse.wheel(0,320);let H=await t.waitForFunction(({sel:b,min:R})=>document.querySelectorAll(b).length>R,{sel:z.item,min:f.length},{timeout:1500,polling:100}).catch(()=>null);if(this.paaLifecycle={...this.paaLifecycle,noGrowthConfirmations:_},H||(await N()).some(b=>!s.has(b.q)))continue t}this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"frontier_exhausted",targetStatus:"not_met",failedInteractions:0,noGrowthConfirmations:h,completionReason:"Every known eligible PAA control was processed and three healthy no-growth confirmations found no additional questions."};break}await this.throwIfCaptcha(t,"Google PAA expansion"),w+=1;for(let p of v){if(this.reporter.onDepth(++M),(l.get(p.q)??0)>0){let k=this.paaLifecycle.retryBreakdown.controlRetries+1;this.paaLifecycle={...this.paaLifecycle,automaticRetries:k+this.paaLifecycle.retryBreakdown.browserRetries+this.paaLifecycle.retryBreakdown.runtimeRecoveries,retryBreakdown:{...this.paaLifecycle.retryBreakdown,controlRetries:k}}}l.set(p.q,(l.get(p.q)??0)+1)}let O=await Promise.all(v.map(async p=>({target:p,result:await C(p.q,f.length,p.index,p.expanded,l.get(p.q)??1,w)})));for(let{target:p,result:k}of O)(k.dispatched||k.confirmed)&&this.clickedQuestions.add(p.q),this.interactionObservations.push(k.observation);if(this.interactionObservations.length>Eo&&this.interactionObservations.splice(0,this.interactionObservations.length-Eo),!n.questionsOnly){let p=new Set(v.map(k=>k.q));for(let k of await this.extractVisibleItems(t))p.has(k.question)&&(o.set(k.question,k),this.upsertCollectedRow(this.toFlatRow(k,1,null,n.query))&&await this.emitProgress("answer_captured"))}for(let{target:p,result:k}of O){let _=o.get(p.q);k.confirmed||_?.answer?.trim()?(S.add(p.q),c.delete(p.q)):(l.get(p.q)??0)>=u&&(c.add(p.q),r.add(p.q))}this.paaLifecycle={...this.paaLifecycle,processedQuestions:S.size,failedInteractions:c.size,noGrowthConfirmations:0,dispatchedInteractions:this.interactionObservations.filter(p=>p.dispatched).length,confirmedInteractions:this.interactionObservations.filter(p=>p.outcome==="confirmed").length,unconfirmedInteractions:this.interactionObservations.filter(p=>p.outcome!=="confirmed").length},await this.emitProgress("click_observed")}let W=n.questionsOnly?new Map:new Map(o);n.questionsOnly||await this.fillIncompleteItems(t,d,W,n,r,a);let L=[];for(let f of d){if(L.length>=n.maxQuestions)break;let F=this.normalizeQuestion(f);if(i.has(F))continue;i.add(F);let P=W.get(f);if(P){let m=this.toFlatRow(P,1,null,n.query);this.upsertCollectedRow(m),L.push(m),this.reporter.onQuestion({questionId:P.questionId,googleLinkId:P.googleLinkId,googleEvidenceId:P.googleEvidenceId,question:P.question,answer:P.answer??null,sourceTitle:P.sourceTitle??null,sourceSite:P.sourceSite??null,sourceCite:P.sourceCite??null,sources:P.sources,...P.answerExpansionIncomplete?{answerExpansionIncomplete:!0}:{},depth:1,parentQuestion:null,children:[]})}else{let m=this.toFlatRow({questionId:ce(f),googleLinkId:null,googleEvidenceId:null,question:f,answer:void 0,sourceTitle:void 0,sourceSite:void 0,sourceCite:void 0,sources:[]},1,null,n.query);this.upsertCollectedRow(m),L.push(m)}}this.completeness.paaWithoutAnswer=n.questionsOnly?0:L.filter(f=>!f.answer).length,this.completeness.paaWithoutSource=n.questionsOnly?0:L.filter(f=>(f.sources??[]).length===0).length,this.completeness.paaIncompleteAnswers=n.questionsOnly?0:L.filter(f=>f.answerExpansionIncomplete).length,this.completeness.paaRequested=n.maxQuestions,this.completeness.paaReturned=L.length,this.completeness.paaUnique=i.size;let B=!n.questionsOnly&&(this.completeness.paaWithoutAnswer>0||this.completeness.paaWithoutSource>0||this.completeness.paaIncompleteAnswers>0);return this.paaLifecycle={...this.paaLifecycle,questionsFound:L.length,targetStatus:L.length>=n.maxQuestions?"met":"not_met",materialStatus:B?"partial":"complete",processedQuestions:S.size,failedInteractions:c.size},await this.emitProgress("fill_incomplete"),await this.emitProgress("expansion_finished"),L}async fillIncompleteItems(t,n,a,i,s,d){let r=new Set(n.slice(0,i.maxQuestions)),l=o=>!o?.answer||(o.sources??[]).length===0||!!o.answerExpansionIncomplete,S=new Set([...r].filter(o=>l(a.get(o)))),c=new Set([...S].filter(o=>!a.get(o)?.answer));if(S.size!==0){for(let o of S){if(i.softDeadlineMs&&Date.now()>=i.softDeadlineMs)break;let U=(await this.extractVisibleItems(t,o))[0];if(U?.answerExpansionIncomplete&&(await Za(t,o,{selectors:z,deadlineMs:i.softDeadlineMs,signal:d},Kn),U=(await this.extractVisibleItems(t,o))[0]),!U)continue;let u=a.get(o);a.set(o,{...U,answer:U.answer||u?.answer,answerExpansionIncomplete:U.answer?U.answerExpansionIncomplete:u?.answerExpansionIncomplete,sourceTitle:U.sourceTitle??u?.sourceTitle,sourceSite:U.sourceSite??u?.sourceSite,sourceCite:U.sourceCite??u?.sourceCite,sources:this.mergePaaSources(u?.sources,U.sources)});let h=a.get(o);h&&this.upsertCollectedRow(this.toFlatRow(h,1,null,i.query))&&await this.emitProgress("fill_incomplete")}this.completeness.paaAnswersRecovered=[...c].filter(o=>a.get(o)?.answer).length}}async reExpandCollapsedItems(t){let n=`${z.item}:not(.${z.expandedClass}) ${z.clickTarget}`,a=await t.locator(n).count().catch(()=>0);if(a===0)return!1;for(let i=0;i<a;i++)try{let s=t.locator(n).first();await s.scrollIntoViewIfNeeded(),await s.click({force:!0}),await t.waitForTimeout(this.jitteredDelayMs(300,500))}catch{}return!0}extractVideos(t){return Io(t)}extractForums(t){return Ao(t)}extractShortVideos(t,n){return xo(t,n,(a,i)=>this.throwIfCaptcha(a,i))}extractWhatPeopleSaying(t){return Wo(t)}extractOrganicResults(t){return Lo(t)}extractLocalPack(t){return Oo(t)}extractEntityIds(t){return Bo(t)}mergeLocalPackIntoEntities(t,n){return Ro(t,n)}async extractAISurfaces(t,n){let a=await t.evaluate(mo,{aio:qs,aim:zs,expandWaitMs:1500}),i=typeof t.url=="function"?t.url():"https://www.google.com/",s={surface:a.surface,aiOverview:{...a.aiOverview,citations:this.normalizeAICitations(i,a.aiOverview.citations)},aiMode:{...a.aiMode,citations:this.normalizeAICitations(i,a.aiMode.citations)}};if(!s.aiOverview.detected)return this.completeness.aioShareCaptured=null,s;let d=this.aioShareUrlEarly??await this.captureAIOverviewShareUrl(t,n).catch(()=>null);return this.completeness.aioShareCaptured=d!==null,{...s,aiOverview:{...s.aiOverview,shareUrl:d}}}async captureAIOverviewShareUrl(t,n){if(n?.softDeadlineMs&&Date.now()>=n.softDeadlineMs||!await t.evaluate(()=>{let s=Array.from(document.querySelectorAll('h1,h2,h3,[role="heading"],div')).filter(d=>(d.textContent||"").trim()==="AI Overview");for(let d of s){let r=d;for(let l=0;l<8&&r;l++){let S=r.querySelector('[aria-label="Share"]');if(S)return S.scrollIntoView({block:"center"}),S.click(),!0;r=r.parentElement}}return!1}).catch(()=>!1))return null;let i=null;try{i=await(await t.waitForFunction(()=>{let d=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);for(;d.nextNode();){let r=(d.currentNode.textContent||"").match(/https:\/\/share\.google\/aimode\/\S+/);if(r)return r[0]}return!1},void 0,{timeout:4500,polling:250})).jsonValue()}catch{i=null}return await t.keyboard.press("Escape").catch(()=>{}),i}buildTree(t,n){let a=[],i=new Map;for(let s of t){let d={questionId:s.question_id,googleLinkId:s.google_link_id||null,googleEvidenceId:s.google_evidence_id||null,question:s.question,answer:s.answer||null,...s.answerExpansionIncomplete?{answerExpansionIncomplete:!0}:{},sourceTitle:s.source_title||null,sourceSite:s.source_site||null,sourceCite:s.source_cite||null,sources:s.sources??[],depth:s.depth,parentQuestion:s.parent_question||null,children:[]};i.set(s.question,d)}for(let s of i.values())s.parentQuestion&&i.has(s.parentQuestion)?i.get(s.parentQuestion).children.push(s):a.push(s);return a}getBrowserDebugSnapshot(){return this.driver.getDebugSnapshot()}buildHarvestDebugSnapshot(t,n,a,i,s){if(t.debug)return{enabled:!0,request:{query:t.query,locationInput:t.location??null,canonicalLocation:n,locationResolved:s?s.matched:null,locationMatchSource:s?s.source:null,locationAmbiguousCandidates:s?s.ambiguousCandidates:null,uule:a,gl:t.gl,hl:t.hl,device:t.device,proxyMode:t.proxyMode,proxyZip:t.proxyZip??null,serpIdentity:t.serpIdentity??null,serpOnly:t.serpOnly,pages:t.pages??1},browser:this.getBrowserDebugSnapshot(),...i?{locationEvidence:i}:{}}}async captureSecondOrganicPage(t,n,a){if(this.throwIfAborted(a),!n.serpOnly&&!this.driver.withTemporaryPage)return{organic:[],status:"failed",failureCode:"unsupported_driver"};let i;try{let s=new URL(t.url()),d=S=>{try{let c=new URL(S,s);return s.origin==="https://www.google.com"&&c.origin===s.origin&&!c.username&&!c.password&&c.pathname==="/search"&&c.searchParams.getAll("q").length===1&&c.searchParams.get("q")===n.query&&c.searchParams.getAll("start").length===1&&c.searchParams.get("start")==="10"&&(!c.searchParams.has("num")||c.searchParams.get("num")==="10")&&["gl","hl"].every(o=>!c.searchParams.has(o)||c.searchParams.getAll(o).length===1&&c.searchParams.get(o)===n[o])&&["uule","tbs","udm","tbm","pws"].every(o=>c.searchParams.getAll(o).length<=1&&c.searchParams.get(o)===s.searchParams.get(o))}catch{return!1}},r=await t.evaluate(S=>document.querySelector(S?'a[aria-label="Page 2"], a#pnnext, a[rel="next"]':'a#pnnext, a[rel="next"]')?.getAttribute("href")??null,n.serpOnly);if(!r)return{organic:[],status:"unavailable",failureCode:"missing_next"};if(!d(r))return{organic:[],status:"unavailable",failureCode:"invalid_next"};if(n.serpOnly){let S=t.locator('a[aria-label="Page 2"], a#pnnext, a[rel="next"]').first();if(await S.scrollIntoViewIfNeeded({timeout:1e4}),await S.click({timeout:2e4}),this.throwIfAborted(a),await this.throwIfCaptcha(t,"Google SERP page 2"),!d(t.url()))throw i="invalid_next",new Error("Invalid pagination landing");let c=await this.extractOrganicResults(t);return c.length>0?{organic:c.map(o=>({...o,position:o.position+10})),status:"captured"}:{organic:[],status:"unavailable",failureCode:"empty_page"}}let l=await this.driver.withTemporaryPage(async S=>{if(await S.route("**/*",async c=>{let o=c.request();o.isNavigationRequest()&&o.frame()===S.mainFrame()&&!d(o.url())?(i=/^https:\/\/www\.google\.com\/sorry(?:\/|\?)/.test(o.url())?"captcha":"invalid_next",await c.abort("blockedbyclient")):await c.fallback()}),await S.goto(new URL(r,s).href,{waitUntil:"domcontentloaded",timeout:2e4}),this.throwIfAborted(a),await this.throwIfCaptcha(S,"Google SERP page 2"),!d(S.url()))throw i="invalid_next",new Error("Invalid pagination landing");return this.extractOrganicResults(S)},a);return this.throwIfAborted(a),l.length>0?{organic:l.map(S=>({...S,position:S.position+10})),status:"captured"}:{organic:[],status:"unavailable",failureCode:"empty_page"}}catch(s){if(this.throwIfAborted(a),s instanceof dt)throw s;return{organic:[],status:"failed",failureCode:i??(s instanceof Z?"captcha":s instanceof Error&&(s.name==="TimeoutError"||/timed? ?out/i.test(s.message))?"timeout":"navigation_error")}}}async extract(t,n){let a=Date.now();this.completeness={paaWithoutAnswer:0,paaWithoutSource:0,paaAnswersRecovered:0,aioShareCaptured:null},this.linkDiagnostics=this.emptyLinkDiagnostics(),this.aioShareUrlEarly=null,this.collectedRows=[],this.progressSequence=0,this.checkpointMaterial=null,this.clickedQuestions=new Set,this.paaLifecycle=this.emptyPaaLifecycle(t.maxQuestions),this.partialContext={seed:t.query,location:t.location??null,startMs:a,maxQuestions:t.maxQuestions,questionsOnly:t.questionsOnly};let i=t.device==="mobile",s={headless:t.headless,profileDir:t.profileDir,proxy:t.proxy,\u006b\u0065\u0072\u006e\u0065\u006cApiKey:t.\u006b\u0065\u0072\u006e\u0065\u006cApiKey,\u006b\u0065\u0072\u006e\u0065\u006cProxyId:t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId,\u006b\u0065\u0072\u006e\u0065\u006cProfileName:t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName,\u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges:t.\u006b\u0065\u0072\u006e\u0065\u006cProfileSaveChanges,\u006b\u0065\u0072\u006e\u0065\u006cStealth:t.\u006b\u0065\u0072\u006e\u0065\u006cStealth,\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution:t.\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution,proxyMode:t.proxyMode,keepDefaultProxy:t.keepDefaultProxy,requireUsEgress:t.requireUsEgress,viewport:i?{width:390,height:844}:{width:1280,height:800},locale:`${t.hl}-${t.gl.toUpperCase()}`,deviceScaleFactor:i?3:1,isMobile:i,hasTouch:i,debug:t.debug,operationDeadlineMs:t.softDeadlineMs},d=0,r=[];try{this.throwIfAborted(n);let l=Date.now();await this.driver.launch(s),this.phaseTimings.providerConnectMs=Date.now()-l;let S=this.driver.getProviderSessionMetadata();if(S?.providerSessionId&&this.onProviderSession)try{await this.onProviderSession(S)}catch(Y){console.warn(JSON.stringify({event:"paa_provider_session_sink_failed",provider:S.provider,message:Y instanceof Error?Y.message:String(Y)}))}this.throwIfAborted(n);let c=t.location?Ra(t.location):null,o=t.location?c?.canonical??t.location:null,U=o?Ws(o):null,u=t,h=t.includeAllSerpFeatures,w=h||t.includeLocalPack,y=h||t.includeForums,N=h||t.includeVideos,C=h||t.includeAiOverview,M=h||t.includeWhatPeopleSaying,W={surface:"web",aiOverview:{detected:!1,text:null,citations:[]},aiMode:{detected:!1,text:null,citations:[]}},L=Date.now(),{hasPaa:B}=await this.driver.navigateToSERP(u.query,U,t.gl,t.hl,{...sa(t.recency)?{tbs:sa(t.recency)}:{},debug:t.debug,purpose:t.serpOnly?"serp":"paa",pages:t.pages===2?2:1,...t.softDeadlineMs?{deadlineMs:t.softDeadlineMs}:{},...n?{signal:n}:{}});this.phaseTimings.navigationMs=Date.now()-L,this.throwIfAborted(n);let f=this.driver.getPage();if(await this.throwIfCaptcha(f,"Google SERP"),B||(this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"no_paa_observed",materialStatus:"complete",completionReason:"A readable Google SERP was observed without a People Also Ask block."}),t.questionsOnly){let Y=Date.now(),D=B?await this.runBFS(f,u,n):[];this.phaseTimings.paaExpansionMs=Date.now()-Y,await this.resolveMaterialLinks(f,D,[],W.aiOverview,W.aiMode);let ht={seed:u.query,totalQuestions:D.length,maxDepthReached:D.reduce((Ct,Yt)=>Math.max(Ct,Yt.depth),0),durationMs:Date.now()-a,errorCount:d};return this.reporter.onComplete(ht),{seed:u.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:B?"paa_found":"no_paa",...B?{}:{noPaaObserved:!0},problem:null,paaLifecycle:{...this.paaLifecycle},completeness:{...this.completeness},links:{...this.linkDiagnostics},...t.debug?{debug:this.buildHarvestDebugSnapshot(u,o,U,void 0,c)}:{}},totalQuestions:D.length,surface:"web",aiOverview:{detected:!1,text:null,citations:[]},aiMode:{detected:!1,text:null,citations:[]},whatPeopleSaying:[],tree:this.buildTree(D,u.query),flat:D,videos:[],forums:[],organicResults:[],localPack:[],entityIds:{entities:[],kgIds:[],cids:[],gcids:[]},stats:ht}}if(C&&(this.aioShareUrlEarly=await this.captureAIOverviewShareUrl(f,t).catch(()=>null)),t.serpOnly){let Y=Date.now(),[D,ht,Ct]=await Promise.all([this.extractOrganicResults(f),w?this.extractLocalPack(f):Promise.resolve([]),this.extractEntityIds(f)]),Yt=this.mergeLocalPackIntoEntities(Ct,ht),V=C?await this.extractAISurfaces(f,t):W;this.phaseTimings.serpParseMs=Date.now()-Y;let It=t.debug?ln(o,D,ht):void 0,kt=D,Jt={requestedPages:(t.pages??1)>=2?2:1,capturedPages:1,page2Status:(t.pages??1)>=2?"not_attempted":"not_requested",page1OrganicCount:D.length,page2OrganicCount:0};if((t.pages??1)>=2){let X=await this.captureSecondOrganicPage(f,u,n);kt=[...D,...X.organic],Jt={...Jt,capturedPages:X.status==="captured"?2:1,page2Status:X.status,page2OrganicCount:X.organic.length,...X.failureCode?{failureCode:X.failureCode}:{}},t.debug&&(It=ln(o,kt,ht))}await this.resolveMaterialLinks(f,[],kt,V.aiOverview,V.aiMode);let j={seed:u.query,totalQuestions:0,maxDepthReached:0,durationMs:Date.now()-a,errorCount:d};return this.reporter.onComplete(j),{seed:u.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:"serp_only",problem:null,pagination:Jt,completeness:{...this.completeness},links:{...this.linkDiagnostics},...t.debug?{debug:this.buildHarvestDebugSnapshot(u,o,U,It,c)}:{}},totalQuestions:0,surface:V.surface,aiOverview:V.aiOverview,aiMode:V.aiMode,whatPeopleSaying:[],tree:[],flat:[],videos:[],forums:[],organicResults:kt,localPack:ht,entityIds:Yt,stats:j}}let[F,P,m,v,O,p]=await Promise.all([N?this.extractVideos(f):Promise.resolve([]),y?this.extractForums(f):Promise.resolve([]),M?this.extractWhatPeopleSaying(f):Promise.resolve([]),this.extractEntityIds(f),this.extractOrganicResults(f),w?this.extractLocalPack(f):Promise.resolve([])]),k=this.mergeLocalPackIntoEntities(v,p),_=t.debug?ln(o,O,p):void 0;this.reporter.onVideos(F),this.reporter.onForums(P);let H=C?await this.extractAISurfaces(f,t):W,A={requestedPages:(t.pages??1)>=2?2:1,capturedPages:1,page2Status:(t.pages??1)>=2?"not_attempted":"not_requested",page1OrganicCount:O.length,page2OrganicCount:0},b=O;if(this.checkpointMaterial={surface:H.surface,aiOverview:H.aiOverview,aiMode:H.aiMode,whatPeopleSaying:m,videos:F,forums:P,organicResults:b,localPack:p,entityIds:k,pagination:A},await this.emitProgress("serp_captured"),A.requestedPages===2){let Y=await this.captureSecondOrganicPage(f,u,n);b=[...O,...Y.organic],A={...A,capturedPages:Y.status==="captured"?2:1,page2Status:Y.status,page2OrganicCount:Y.organic.length,...Y.failureCode?{failureCode:Y.failureCode}:{}},this.checkpointMaterial={...this.checkpointMaterial,organicResults:b,pagination:A},await this.emitProgress("serp_captured"),await this.resolveMaterialLinks(f,[],b,H.aiOverview,H.aiMode),this.checkpointMaterial={...this.checkpointMaterial,organicResults:b},await this.emitProgress("serp_captured")}let R=t.debug?ln(o,b,p):_;if(!B){await this.resolveMaterialLinks(f,[],b,H.aiOverview,H.aiMode),this.checkpointMaterial={...this.checkpointMaterial,organicResults:b},await this.emitProgress("serp_captured");let Y={seed:u.query,totalQuestions:0,maxDepthReached:0,durationMs:Date.now()-a,errorCount:d};return this.reporter.onComplete(Y),{seed:u.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:"no_paa",noPaaObserved:!0,problem:null,pagination:A,paaLifecycle:{...this.paaLifecycle},completeness:{...this.completeness},links:{...this.linkDiagnostics},...t.debug?{debug:this.buildHarvestDebugSnapshot(u,o,U,R,c)}:{}},totalQuestions:0,surface:H.surface,aiOverview:H.aiOverview,aiMode:H.aiMode,whatPeopleSaying:m,tree:[],flat:[],videos:F,forums:P,organicResults:b,localPack:p,entityIds:k,stats:Y}}let Q=Date.now(),$=await this.runBFS(f,u,n);this.phaseTimings.paaExpansionMs=Date.now()-Q,this.throwIfAborted(n);let mt=new URLSearchParams({q:u.query,gl:t.gl,hl:t.hl,pws:"0",udm:on.udm});U&&mt.set("uule",U);let K=[];if(t.includeShortVideos!==!1)try{K=await this.extractShortVideos(f,"https://www.google.com/search?"+mt.toString())}catch(Y){if(!(Y instanceof Z))throw Y;d++,r.push({code:"short_videos_captcha_skipped",surface:"short_videos",message:Y.message,retryable:!0})}this.reporter.onVideos(K),await this.resolveMaterialLinks(f,$,b,H.aiOverview,H.aiMode),this.checkpointMaterial={...this.checkpointMaterial,surface:H.surface,aiOverview:H.aiOverview,aiMode:H.aiMode,videos:[...F,...K],organicResults:b},await this.emitProgress("expansion_finished");let Kt=[...F,...K],Pt=this.buildTree($,u.query),ut={seed:u.query,totalQuestions:$.length,maxDepthReached:$.reduce((Y,D)=>Math.max(Y,D.depth),0),durationMs:Date.now()-a,errorCount:d};return this.reporter.onComplete(ut),{seed:u.query,location:t.location??null,extractedAt:new Date().toISOString(),diagnostics:{phaseTimings:this.currentPhaseTimings(a),completionStatus:"paa_found",problem:null,pagination:A,paaLifecycle:{...this.paaLifecycle},completeness:{...this.completeness},links:{...this.linkDiagnostics},...r.length>0?{warnings:r}:{},...t.debug?{debug:this.buildHarvestDebugSnapshot(u,o,U,R,c)}:{}},totalQuestions:$.length,surface:H.surface,aiOverview:H.aiOverview,aiMode:H.aiMode,whatPeopleSaying:m,tree:Pt,flat:$,videos:Kt,forums:P,organicResults:b,localPack:p,entityIds:k,stats:ut}}catch(l){throw d++,this.paaLifecycle.discoveryStatus==="in_progress"&&(this.paaLifecycle={...this.paaLifecycle,discoveryStatus:"interrupted",completionReason:"The browser attempt ended before frontier exhaustion could be proven."}),await this.emitProgress("attempt_ending").catch(()=>{}),this.reporter.onError(l instanceof Error?l:new Error(String(l))),l}}};var Jn=class{onQuestion(t){process.stdout.write(JSON.stringify({event:"question",depth:t.depth,question:t.question})+`
21897
21787
  `)}onDepth(t){process.stdout.write(JSON.stringify({event:"depth",depth:t})+`
21898
21788
  `)}onVideos(t){for(let n of t)process.stdout.write(JSON.stringify({event:"video",type:n.type,platform:n.platform,duration:n.duration,title:n.title,channel:n.channel,url:n.url})+`
21899
21789
  `)}onForums(t){for(let n of t)process.stdout.write(JSON.stringify({event:"forum",title:n.title,source:n.source,url:n.url})+`
21900
21790
  `)}onComplete(t){process.stdout.write(JSON.stringify({event:"complete",...t})+`
21901
21791
  `)}onError(t){process.stderr.write(JSON.stringify({event:"error",type:t.constructor.name,message:t.message})+`
21902
- `)}};var ao=require("crypto");var cl="pr.oxylabs.io",hl=7777,gl=10;function io(){return process.env.OXYLABS_USERNAME?.trim()||void 0}function so(){return process.env.OXYLABS_PASSWORD?.trim()||void 0}function pl(){return(process.env.OXYLABS_COUNTRY?.trim()||"US").toUpperCase()}function oo(){return!!(io()&&so())}function wl(){let e="";for(let t=0;t<10;t++)e+=String((0,ao.randomInt)(0,10));return e}function ml(e={}){let t=io();if(!t)return;let n=t.startsWith("customer-")?t:`customer-${t}`,a=(e.country?.trim()||pl()).toUpperCase(),i=e.sticky?`-sessid-${wl()}-sesstime-${gl}`:"";return`${n}-cc-${a}${i}`}function Ya(e){return e.replace(/pr\.oxylabs\.io(:\d+)?/gi,"backup proxy").replace(/oxylabs/gi,"backup proxy")}function yl(e){return`mcp-backup-custom-${`${Date.now()}-${e??0}-${Math.random().toString(36).slice(2,8)}`}`}async function ro(e,t={}){let n=ml({sticky:t.sticky}),a=so();if(!n||!a)throw new Error("backup proxy pool is not configured");let i=new D({apiKey:e});try{let s=await i.proxies.create({type:"custom",name:yl(t.attemptIndex),protocol:"http",config:{host:cl,port:hl,username:n,password:a}});if(!s.id)throw new Error("backup proxy creation did not return a proxy id");return s.id}catch(s){let o=s instanceof Error?s.message:String(s);throw new Error(Ya(o))}}var lo={alabama:"AL",alaska:"AK",arizona:"AZ",arkansas:"AR",california:"CA",colorado:"CO",connecticut:"CT",delaware:"DE",florida:"FL",georgia:"GA",hawaii:"HI",idaho:"ID",illinois:"IL",indiana:"IN",iowa:"IA",kansas:"KS",kentucky:"KY",louisiana:"LA",maine:"ME",maryland:"MD",massachusetts:"MA",michigan:"MI",minnesota:"MN",mississippi:"MS",missouri:"MO",montana:"MT",nebraska:"NE",nevada:"NV","new hampshire":"NH","new jersey":"NJ","new mexico":"NM","new york":"NY","north carolina":"NC","north dakota":"ND",ohio:"OH",oklahoma:"OK",oregon:"OR",pennsylvania:"PA","rhode island":"RI","south carolina":"SC","south dakota":"SD",tennessee:"TN",texas:"TX",utah:"UT",vermont:"VT",virginia:"VA",washington:"WA","west virginia":"WV",wisconsin:"WI",wyoming:"WY"},Tl={"atlanta|GA":"30303","austin|TX":"78701","baltimore|MD":"21201","boston|MA":"02108","boulder|CO":"80302","charlotte|NC":"28202","chicago|IL":"60601","colorado_springs|CO":"80903","columbus|OH":"43215","dallas|TX":"75201","denver|CO":"80202","detroit|MI":"48226","fort_collins|CO":"80524","fort_worth|TX":"76102","houston|TX":"77002","indianapolis|IN":"46204","jacksonville|FL":"32202","las_vegas|NV":"89101","los_angeles|CA":"90012","louisville|KY":"40202","loveland|CO":"80537","memphis|TN":"38103","miami|FL":"33131","minneapolis|MN":"55401","nashville|TN":"37203","new_york|NY":"10001","orlando|FL":"32801","philadelphia|PA":"19103","phoenix|AZ":"85004","portland|OR":"97205","raleigh|NC":"27601","richmond|VA":"23219","sacramento|CA":"95814","salt_lake_city|UT":"84101","san_antonio|TX":"78205","san_diego|CA":"92101","san_francisco|CA":"94103","san_jose|CA":"95113","seattle|WA":"98101"};function Cl(e){return e?e.slice(-6):null}function dt(e,t,n,a,i,s=!1){return{kernelProxyId:n,...s&&n?{disposableProxyId:n}:{},resolution:{source:e,proxyType:e==="disabled"?"none":e==="configured_fallback"?"configured":e==="mobile_created"?"mobile":e==="isp_created"?"isp":e==="backup_custom"?"custom":e==="location_created"||e==="location_reused"?"residential":"unknown",proxyMode:t,proxyIdPresent:!!n,proxyIdSuffix:Cl(n),target:a,error:i,disposable:s}}}function kl(e){return e.trim().toLowerCase().replace(/\s+/g," ")}function fl(e){return e.trim().toLowerCase().replace(/\./g,"").replace(/\s+/g," ")}function Ml(e){if(!e)return!0;let t=fl(e);return t==="united states"||t==="united states of america"||t==="usa"||t==="us"}function So(e){let t=e.trim();if(/^[A-Za-z]{2}$/.test(t)){let n=t.toUpperCase();return Object.values(lo).includes(n)?n:null}return lo[kl(t)]??null}function Nl(e){let n=e.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),a=n.join("_"),i=n.join("");return Array.from(new Set([a,i].filter(Boolean)))}function Dt(e,t,n){return n?`mcp-serp-residential-${e.toLowerCase()}-${t.toLowerCase()}-${n}`:`mcp-serp-residential-${e.toLowerCase()}-${t.toLowerCase()}`}function Vn(e,t){let n=`${Date.now()}-${t??0}-${Math.random().toString(36).slice(2,8)}`;return`${e}-fresh-${n}`}function vl(e){return`mcp-serp-residential-us-zip-${e}`}function _l(e,t){if(!e||t.toLowerCase()!=="us")return null;let n=Hs(e),a=n.split(",").map(S=>S.trim()).filter(Boolean);if(a.length>1&&Ml(a[a.length-1])&&(a=a.slice(0,-1)),a.length===1){let S=So(a[0]);return S?{canonicalLocation:n,level:"state",country:"US",state:S,city:"",cityCandidates:[],proxyName:Dt("US",S),config:{country:"US",state:S}}:null}let[i="",s=""]=a;if(!i||!s)return null;let o=So(s);if(!o)return null;let d=Nl(i),l=d[0];return l?{canonicalLocation:n,level:"city",country:"US",state:o,city:l,cityCandidates:d,proxyName:Dt("US",o,l),config:{country:"US",state:o,city:l}}:null}function bl(e){return`${e.city}|${e.state}`}function Uo(e,t){return t&&/^\d{5}$/.test(t)?t:Tl[bl(e)]??null}function uo(e,t){return{...e,level:"zip",zip:t,proxyName:vl(t),config:{country:e.country,state:e.state,zip:t}}}function Ka(e,t){return{...e,proxyName:t}}function Xa(e,t,n){return t.level==="zip"?e?.country?.toUpperCase()===t.country&&e?.zip===t.zip:e?.country?.toUpperCase()===t.country&&e?.state?.toUpperCase()===t.state&&(n?e?.city===n:!e?.city)}function El(e,t){return e.find(n=>n.type==="residential"&&n.status!=="unavailable"&&!!n.id&&(n.name===t.proxyName||Xa(n.config,t,t.level==="city"?t.city:void 0)))??null}function Pl(e,t){for(let n of t.cityCandidates){let a=Dt(t.country,t.state,n),i=e.find(s=>s.type==="residential"&&s.status!=="unavailable"&&!!s.id&&(s.name===a||Xa(s.config,t,n)));if(i)return i}return null}function Yn(e){return{...e,level:"state",proxyName:Dt(e.country,e.state),config:{country:e.country,state:e.state}}}function Il(e,t){let n=Dt(t.country,t.state);return e.find(a=>a.type==="residential"&&a.status!=="unavailable"&&!!a.id&&(a.name===n||Xa(a.config,t)))??null}function Al(e,t){return Yn(e)}function Ht(e){return e instanceof Error?e.message:String(e)}function Ll(e,t,n){let a=[],i=Uo(e,t);if(i){let o=uo(e,i);a.push(Ka(o,Vn(o.proxyName,n)))}for(let o of e.cityCandidates){let d={...e,level:"city",city:o,proxyName:Dt(e.country,e.state,o),config:{country:e.country,state:e.state,city:o}};a.push(Ka(d,Vn(d.proxyName,n)))}let s=Yn(e);return a.push(Ka(s,Vn(s.proxyName,n))),a}async function Ja(e,t,n){if(e.backupOnExhaustion&&n.length>0&&e.kernelApiKey&&oo())try{let a=await ro(e.kernelApiKey,{attemptIndex:e.attemptIndex});return dt("backup_custom",e.proxyMode,a,t,null,!0)}catch(a){n.push(`backup: ${Ya(Ht(a))}`)}return dt("configured_fallback",e.proxyMode,e.configuredKernelProxyId,t,n.join(" | "))}async function xl(e,t,n){let a=[];for(let i of Ll(n,t.proxyZip,t.attemptIndex))try{let s=await e.proxies.create({type:"residential",name:i.proxyName,config:i.level==="zip"?{country:i.country,zip:i.zip}:i.config});if(s.id)return dt("location_created",t.proxyMode,s.id,i,null,!0);a.push(`${i.proxyName}: Kernel did not return a proxy id`)}catch(s){a.push(`${i.proxyName}: ${Ht(s)}`)}if(process.env.KERNEL_PROXY_TYPE!=="residential"){let i=Yn(n);try{let s=await e.proxies.create({type:"isp",name:Vn(`mcp-serp-isp-${i.country.toLowerCase()}-${(i.state??"").toLowerCase()}`,t.attemptIndex),config:{country:i.country,...i.state?{state:i.state}:{}}});if(s.id)return dt("isp_created",t.proxyMode,s.id,i,null,!0);a.push("isp: Kernel did not return a proxy id")}catch(s){a.push(`isp: ${Ht(s)}`)}}return Ja(t,n,a)}async function co(e,t){if(!e||!t)return;await new D({apiKey:e}).proxies.delete(t)}async function ho(e){if(e.proxyMode==="none")return dt("disabled",e.proxyMode,void 0,null,null);if(e.proxyMode==="configured")return dt("configured_fallback",e.proxyMode,e.configuredKernelProxyId,null,null);let t=_l(e.location,e.gl);if(!t||!e.kernelApiKey)return dt("configured_fallback",e.proxyMode,e.configuredKernelProxyId,t,t?null:"location could not be normalized to a US city/state proxy target");let n=new D({apiKey:e.kernelApiKey});try{let a=e.attemptIndex??0;if(e.fresh)return await xl(n,e,t);if(a>=1){let U=Al(t,a),r=[];try{let u=await n.proxies.create({type:"residential",name:U.proxyName,config:U.config});if(u.id)return dt("location_created",e.proxyMode,u.id,U,null);r.push(`${U.state}: Kernel did not return a proxy id`)}catch(u){r.push(`${U.state}: ${Ht(u)}`)}return Ja(e,U,r)}let i=[];for await(let U of await n.proxies.list())i.push(U);let s=Uo(t,e.proxyZip),o=[];if(s){let U=uo(t,s),r=El(i,U);if(r?.id)return dt("location_reused",e.proxyMode,r.id,U,null);try{let u=await n.proxies.create({type:"residential",name:U.proxyName,config:{country:U.country,zip:s}});if(u.id)return dt("location_created",e.proxyMode,u.id,U,null);o.push(`${s}: Kernel did not return a proxy id`)}catch(u){o.push(`${s}: ${Ht(u)}`)}}let d=Pl(i,t);if(d?.id)return dt("location_reused",e.proxyMode,d.id,t,o.join(" | ")||null);for(let U of t.cityCandidates)try{let r=await n.proxies.create({type:"residential",name:Dt(t.country,t.state,U),config:{country:t.country,state:t.state,city:U}});if(r.id)return dt("location_created",e.proxyMode,r.id,{...t,level:"city",city:U,proxyName:Dt(t.country,t.state,U),config:{country:t.country,state:t.state,city:U}},null);o.push(`${U}: Kernel did not return a proxy id`)}catch(r){o.push(`${U}: ${Ht(r)}`)}let l=Yn(t),S=Il(i,l);if(S?.id)return dt("location_reused",e.proxyMode,S.id,l,o.join(" | "));try{let U=await n.proxies.create({type:"residential",name:l.proxyName,config:l.config});if(U.id)return dt("location_created",e.proxyMode,U.id,l,o.join(" | "));o.push(`${l.state}: Kernel did not return a proxy id`)}catch(U){o.push(`${l.state}: ${Ht(U)}`)}return Ja(e,t,o)}catch(a){return dt("configured_fallback",e.proxyMode,e.configuredKernelProxyId,t,Ht(a))}}var an=class extends Error{constructor(t,n){super(`SERP provider mismatch: planned ${t}, observed ${n}`),this.name="SerpProviderMismatchError"}};function go(e){return e==="bright_data_browser_api"?"brightdata":"kernel"}function po(e){return Ol({intent:e.intent,brightDataAvailable:e.brightDataAvailable,kernelAvailable:!0,persistentKernelIdentityRequested:e.persistentKernelIdentityRequested,retryIndex:e.retryIndex,priorTerminalReason:e.priorTerminalReason,allowedFallbacks:e.kernelFallbackAvailable&&e.intent!=="kernel"?["kernel"]:[],timeoutMs:e.softDeadlineMs==null?4e5:Math.max(1,e.softDeadlineMs-Date.now())})}function wo(e){if(e.forceManagedSerp&&e.forceKernelSerp)throw new Error("forceManagedSerp and forceKernelSerp cannot both be true");return e.forceManagedSerp?"brightdata":e.forceKernelSerp?"kernel":"auto"}function Kn(e,t){if(!t)throw new Error(`Requested SERP provider is unavailable: ${e}`);return e}function Ol(e){if(!Number.isInteger(e.retryIndex)||e.retryIndex<0)throw new Error("retryIndex must be a non-negative integer");if(!Number.isFinite(e.timeoutMs)||e.timeoutMs<=0)throw new Error("timeoutMs must be a positive number");let t,n;e.intent==="brightdata"?(t=Kn("brightdata",e.brightDataAvailable),n="explicit_brightdata"):e.intent==="kernel"?(t=Kn("kernel",e.kernelAvailable),n="explicit_kernel"):e.persistentKernelIdentityRequested?(t=Kn("kernel",e.kernelAvailable),n="persistent_kernel_identity"):e.brightDataAvailable?(t="brightdata",n="managed_default"):(t=Kn("kernel",e.kernelAvailable),n="kernel_default");let a=e.allowedFallbacks.find(o=>o!==t&&(o==="brightdata"?e.brightDataAvailable:e.kernelAvailable)),i=e.retryIndex>0&&a?a:t,s=e.retryIndex===0?"primary":i===t?"same_provider_retry":"provider_fallback";return Object.freeze({plannedProvider:i,attemptKind:s,reasonCode:s==="primary"?n:s==="provider_fallback"?"provider_fallback":"same_provider_retry",retryIndex:e.retryIndex,priorTerminalReason:e.priorTerminalReason??null,timeoutMs:Math.floor(e.timeoutMs),fallbackAllowed:!!a})}var ja=2,Rl=2,Wl=3e3;function za(e){return e.reason instanceof DOMException&&e.reason.name==="TimeoutError"?e.reason:new pt}function Hl(e){if(!e||typeof e!="object")return;let t=e.signal;if(t instanceof AbortSignal)return t}function Dl(e){if(!e||typeof e!="object")return;let t=e.onAttemptEvent;return typeof t=="function"?t:void 0}function Bl(e){if(!e||typeof e!="object")return;let t=e.onPaaProgress;return typeof t=="function"?t:void 0}function Fl(e){if(!e||typeof e!="object")return;let t=e.onPaaDomEvidence;return typeof t=="function"?t:void 0}async function Gl(e){let t=await e.evaluate(n=>{let a=n,i=Array.from(document.querySelectorAll(a.item)),s=i.map(l=>l.querySelector(a.clickTarget)).filter(l=>l!=null),o=l=>{let S=l.getBoundingClientRect();if(S.width<=0||S.height<=0)return!1;let U=S.left+S.width/2,r=S.top+S.height/2;if(U<0||r<0||U>=window.innerWidth||r>=window.innerHeight)return!1;let u=document.elementFromPoint(U,r);return u!=null&&u!==l&&!l.contains(u)&&!u.contains(l)},d=Array.from(document.querySelectorAll("body *")).filter(l=>{let S=window.getComputedStyle(l);if(S.position!=="fixed"&&S.position!=="sticky")return!1;let U=l.getBoundingClientRect();return U.width*U.height>=window.innerWidth*window.innerHeight*.15&&S.visibility!=="hidden"&&S.display!=="none"});return{itemCount:i.length,expandedItemCount:i.filter(l=>l.classList.contains(a.expandedClass)||l.querySelector(a.clickTarget)?.getAttribute("aria-expanded")==="true").length,answeredItemCount:i.filter(l=>(l.querySelector(a.answerContainer)?.textContent?.trim().length??0)>=10).length,sourcedItemCount:i.filter(l=>l.querySelector(`${a.answerContainer} a[href]`)!=null).length,clickTargetCount:s.length,clickTargetsWithButtonRole:s.filter(l=>l.getAttribute("role")==="button"||l.tagName==="BUTTON").length,clickTargetsWithExpandedState:s.filter(l=>l.hasAttribute("aria-expanded")).length,clickTargetsOffscreen:s.filter(l=>{let S=l.getBoundingClientRect(),U=S.left+S.width/2,r=S.top+S.height/2;return U<0||r<0||U>=window.innerWidth||r>=window.innerHeight}).length,clickTargetsBlockedAtCenter:s.filter(o).length,fixedOrStickyOverlayCount:d.length}},{item:q.item,answerContainer:q.answerContainer,clickTarget:q.clickTarget,expandedClass:q.expandedClass});return{capturedAt:new Date().toISOString(),...t,selectorVersion:Ss}}async function We(e,t){if(e)try{await e(t)}catch(n){console.warn(JSON.stringify({event:"harvest_attempt_log_failed",attempt_number:t.attemptNumber,message:n instanceof Error?n.message:String(n)}))}}function sn(e){if(e instanceof an)return"error";if(e instanceof it)return"captcha";if(e instanceof $e)return"location_mismatch";if(e instanceof pt)return"request_aborted";if(e instanceof Zt)return"browser_session_interrupted";if(e instanceof DOMException&&(e.name==="TimeoutError"||e.name==="AbortError"))return"timeout";let t=e instanceof Error?e.message:String(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(t)?"browser_session_interrupted":Xl(t)?"proxy_tunnel_failed":ql(t)?"proxy_unavailable":/timeout|timed out|Timeout \d+ms exceeded|deadline/i.test(t)?"timeout":"error"}function Vl(e){return e.diagnostics.degradedResult?"degraded_result":e.diagnostics?.completionStatus??(e.totalQuestions>0?"paa_found":"no_paa")}function Yl(e){return e.flat.length>0||e.organicResults.length>0||e.localPack.length>0||e.videos.length>0||e.forums.length>0||e.whatPeopleSaying.length>0||e.aiOverview.detected||e.aiMode.detected}function mo(e,t,n){let a=Yl(e),i=(e.diagnostics.warnings?.length??0)>0,s=new Set(e.flat.map(w=>w.question.toLowerCase().replace(/[^\w\s]/g,"").replace(/\s+/g," ").trim())).size,o=n?0:e.flat.filter(w=>!w.answer?.trim()).length,d=n?0:e.flat.filter(w=>!w.source_cite?.trim()).length,l=e.diagnostics.completionStatus==="no_paa"&&(e.diagnostics.noPaaObserved===!0||a),S=e.diagnostics.completionStatus==="paa_found",U=e.diagnostics.paaLifecycle?.discoveryStatus,r=U==="interrupted"||U==="recovery_exhausted",u=S&&(s<t&&U!=="frontier_exhausted"||o>0||d>0||!!e.diagnostics.interruption||r),c=l?"complete":S&&s>0?u||i?"partial":"complete":a?i?"partial":"complete":"degraded",h=c==="degraded";return e.diagnostics={...e.diagnostics,resultQuality:c,degradedResult:h,degradationReasons:h?["empty_primary_serp"]:[],retryRecommended:h||c==="partial"&&(u||e.diagnostics.warnings?.some(w=>w.retryable)===!0),completeness:{paaWithoutAnswer:o,paaWithoutSource:d,paaAnswersRecovered:e.diagnostics.completeness?.paaAnswersRecovered??0,aioShareCaptured:e.diagnostics.completeness?.aioShareCaptured??null,paaRequested:t,paaReturned:e.flat.length,paaUnique:s},...e.diagnostics.paaLifecycle?{paaLifecycle:{...e.diagnostics.paaLifecycle,questionsFound:s,targetStatus:s>=t?"met":"not_met",materialStatus:o>0||d>0?"partial":"complete"}}:{}},e}function yo(e,t,n){let a=e.diagnostics.paaLifecycle;if(!a)return e;let i={...a.retryBreakdown,browserRetries:t,providerFallbacks:n};return{...e,diagnostics:{...e.diagnostics,paaLifecycle:{...a,retryBreakdown:i,automaticRetries:i.controlRetries+i.browserRetries+i.runtimeRecoveries}}}}function Kl(e){return(e.diagnostics.degradationReasons??[]).includes("empty_primary_serp")?"No usable primary SERP surface was captured; the result may be incomplete.":"The harvest result was marked degraded."}function Tt(e){return e instanceof Error?e.message:String(e)}function Jl(e){return e==="location"?Rl:ja}function Xl(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 ql(e){return/proxy unavailable|proxy_unavailable|connection_test_failed|did not return a proxy id|configured fallback/i.test(e)}function To(e){return e==="captcha"||e==="proxy_tunnel_failed"||e==="proxy_unavailable"}function Co(e){return e==="browser_session_interrupted"}function jl(e){let t=e.diagnostics.debug?.locationEvidence,n=t?.expected?.canonicalLocation??e.location??"requested location",a=t?.candidates.slice(0,3).map(i=>`${i.city}, ${i.regionCode}`).join("; ");return a?`Google returned results for ${a}, not ${n}`:`Google returned results for a different location than ${n}`}function zl(e,t){return t==="location"&&e.diagnostics.debug?.locationEvidence?.status==="mismatch"}function ko(e,t){if(t||!e.diagnostics.debug)return e;let n={...e.diagnostics};return delete n.debug,{...e,diagnostics:n}}async function fo(e,t){let n=t==null?3e3:t-Date.now();if(n<=0)return e;try{return await $s(e,{totalBudgetMs:Math.min(3e3,n)})}catch(a){return console.warn(JSON.stringify({event:"harvest_goto_resolution_failed",message:Tt(a)})),e}}async function qa(e,t){if(!(!e||!t))try{await co(e,t),console.info(JSON.stringify({event:"kernel_proxy_deleted",proxy_id_suffix:t.slice(-6)}))}catch(n){console.warn(JSON.stringify({event:"kernel_proxy_delete_failed",proxy_id_suffix:t.slice(-6),message:Tt(n)}))}}async function Mo(e,t,n,a,i,s){let o=As(t,{nativeGoogleAssets:e.serpOnly}),d=new Gn,l=new Bn(o,d,a,i);if(n?.aborted)return{result:null,error:za(n),cleanup:await o.close(),debug:null};let S,U=n?new Promise((w,k)=>{S=()=>k(za(n)),n.addEventListener("abort",S,{once:!0})}):null,r=null,u=null,c,h=null;try{let w=l.extract(e,n);U&&w.catch(()=>{}),r=await(U?Promise.race([w,U]):w)}catch(w){u=w}finally{if(n&&S&&n.removeEventListener("abort",S),s){let w;try{let k=Gl(o);k.catch(()=>{});let f=await Promise.race([k,new Promise((m,L)=>{w=setTimeout(()=>L(new DOMException("PAA DOM evidence timed out","TimeoutError")),2e3)})]);await s(f)}catch(k){console.warn(JSON.stringify({event:"paa_dom_evidence_failed",message:Tt(k)}))}finally{w&&clearTimeout(w)}}h=r?.diagnostics.debug??(e.debug?{enabled:!0,request:{query:e.query,locationInput:e.location??null,canonicalLocation:null,locationResolved:null,locationMatchSource:null,locationAmbiguousCandidates:null,uule:null,gl:e.gl,hl:e.hl,device:e.device,proxyMode:e.proxyMode,proxyZip:e.proxyZip??null,serpIdentity:e.serpIdentity??null,serpOnly:e.serpOnly,pages:e.pages??1},browser:o.getDebugSnapshot()}:null),c=await o.close()}if(u){let w=sn(u),k=w==="timeout"||w==="request_aborted"||w==="browser_session_interrupted"?w:null,f=null;if(k)try{f=typeof l.getPartialResult=="function"?l.getPartialResult():null}catch{f=null}return f&&k?(f.diagnostics={...f.diagnostics,interruption:{code:k,reasonSource:"client_runtime",message:Tt(u)}},{result:f,error:u,cleanup:c,debug:h,salvagedFrom:u}):{result:null,error:u,cleanup:c,debug:h}}return{result:r,error:null,cleanup:c,debug:h}}async function No(e){let t=typeof e=="object"&&e!==null?e:{},n=Hl(e),a=Dl(e),i=Bl(e),s=Fl(e),o=t.forceManagedSerp===!0,d=t.forceKernelSerp===!0,l=wo({forceManagedSerp:o,forceKernelSerp:d}),S=t.proxyMode,U=S==="location"||S==="none"||S==="configured"?S:hn,r=typeof t.kernelApiKey=="string"?t.kernelApiKey.trim():pi(),u=typeof t.kernelProxyId=="string"?t.kernelProxyId.trim():void 0,c={kernelApiKey:r,proxyMode:U,configuredKernelProxyId:u,location:typeof t.location=="string"?t.location:void 0,proxyZip:typeof t.proxyZip=="string"?t.proxyZip:void 0,gl:typeof t.gl=="string"?t.gl:"us"},h=typeof t.debug=="boolean"?t.debug:!1,w=U==="location"&&!!c.location,k=t.maxAttempts,f=typeof k=="number"&&Number.isInteger(k)&&k>=1?Math.min(ja,k):Jl(U),m=Math.min(ja,f),L=typeof t.softDeadlineMs=="number"?t.softDeadlineMs:null,R=new Fn,B=null,_=U,M=0,H=()=>L==null||L-Date.now()>=Wl;for(let P=0;P<m;P++){let y=P+1,E=Date.now();try{if(n?.aborted)throw za(n);let p=po({intent:l,brightDataAvailable:Es(),kernelFallbackAvailable:!!r,persistentKernelIdentityRequested:!!(t.serpIdentity||t.kernelProfileName),retryIndex:P,priorTerminalReason:B==null?null:sn(B),softDeadlineMs:L}),C=ea.parse({...t,kernelApiKey:r,proxyMode:_,debug:h||w}),N=p.plannedProvider==="brightdata"?"brightdata_browser":C.serpIdentity?"kernel_persistent_identity":"kernel_browser";await We(a,{type:"started",attemptNumber:y,maxAttempts:m,method:N,provider:N==="brightdata_browser"?"brightdata":"kernel",planReason:p.reasonCode,planTimeoutMs:p.timeoutMs,retryKind:y===1?null:p.attemptKind==="provider_fallback"?"provider_fallback":"same_method",retryReason:y===1||B==null?null:sn(B),query:C.query,location:C.location??null,maxQuestions:C.maxQuestions,startedAt:new Date(E).toISOString()});let I=p.plannedProvider==="brightdata"?null:await ho({...c,proxyMode:_,attemptIndex:P,fresh:_==="location"});if(p.plannedProvider==="kernel"&&!I)throw new Error("Kernel proxy resolution did not produce an execution plan");let W={...t,kernelApiKey:r,...I?{kernelProxyId:I.kernelProxyId,kernelProxyResolution:I.resolution}:{},proxyMode:_,keepDefaultProxy:P>0,softDeadlineMs:L==null?void 0:E+p.timeoutMs,debug:h||w};_==="none"&&(W.kernelProxyId=void 0);let x=ea.parse(W);console.info(JSON.stringify({event:"harvest_attempt_started",attempt_number:y,max_attempts:m,query:x.query,location:x.location??null,max_questions:x.maxQuestions}));let O=te(),j=null,ct=async J=>{go(J.provider)!==p.plannedProvider&&(j=new an(p.plannedProvider,J.provider)),await We(a,{type:"provider_session_started",attemptNumber:y,maxAttempts:m,provider:J.provider,providerSessionId:J.providerSessionId,billingMode:J.billingMode,observedAt:new Date().toISOString()})},st=O?.harvestBrowserMode==="headless-test"&&process.env[gs]==="true",X=O?await ws({...O,forceHeadless:st,forceHeadful:!st},()=>Mo(x,p,n,i,ct,s)):await Mo(x,p,n,i,ct,s);if(X.error||j){let J=j??X.error,Q=sn(J);(Q==="captcha"||Q==="proxy_tunnel_failed")&&_==="location"&&(M++,M>=2&&(_="none"));let wt=!X.result&&P<m-1&&H()&&(Q==="captcha"||Co(Q)||U==="location"&&To(Q));if(Q==="captcha"?console.warn(JSON.stringify({event:"harvest_attempt_captcha",attempt_number:y,max_attempts:m,message:Tt(J),will_retry:wt})):wt&&console.warn(JSON.stringify({event:"harvest_attempt_proxy_retry",attempt_number:y,max_attempts:m,outcome:Q,message:Tt(J),will_retry:wt})),await We(a,{type:"finished",attemptNumber:y,maxAttempts:m,outcome:Q,kernelSessionId:X.cleanup.kernelSessionId,questionCount:X.result?.totalQuestions??0,durationMs:Date.now()-E,error:Tt(J),willRetry:wt,cleanup:X.cleanup,debug:X.debug,completedAt:new Date().toISOString()}),await qa(r,I?.disposableProxyId),B=J,wt)continue;if(X.result&&!j){let kt=await fo(X.result,L);return yo(mo(ko(kt,h),x.maxQuestions,x.questionsOnly),P,p.attemptKind==="provider_fallback"?1:0)}break}let ht=X.result;if(!ht)throw new Error("Harvest attempt completed without a result");if(zl(ht,U)){let J=new $e(jl(ht)),Q=P<m-1&&H();if(console.warn(JSON.stringify({event:"harvest_attempt_location_mismatch",attempt_number:y,max_attempts:m,message:J.message,will_retry:Q})),await We(a,{type:"finished",attemptNumber:y,maxAttempts:m,outcome:"location_mismatch",kernelSessionId:X.cleanup.kernelSessionId,questionCount:ht.totalQuestions,durationMs:Date.now()-E,error:J.message,willRetry:Q,cleanup:X.cleanup,debug:X.debug,completedAt:new Date().toISOString()}),await qa(r,I?.disposableProxyId),B=J,Q)continue;break}let De=await fo(ht,L),G=yo(mo(ko(De,h),x.maxQuestions,x.questionsOnly),P,p.attemptKind==="provider_fallback"?1:0),Ct=Vl(G),V=Ct==="degraded_result"&&P<m-1&&H(),tt=Ct==="degraded_result"?Kl(G):null;if(V&&console.warn(JSON.stringify({event:"harvest_attempt_degraded_result",attempt_number:y,max_attempts:m,degradation_reasons:G.diagnostics.degradationReasons,will_retry:!0})),await We(a,{type:"finished",attemptNumber:y,maxAttempts:m,outcome:Ct,kernelSessionId:X.cleanup.kernelSessionId,questionCount:G.totalQuestions,durationMs:Date.now()-E,error:tt,willRetry:V,cleanup:X.cleanup,debug:X.debug,completedAt:new Date().toISOString()}),await qa(r,I?.disposableProxyId),V)continue;return(x.format==="json"||x.format==="both")&&await R.writeJSON(G,x.outputDir),(x.format==="csv"||x.format==="both")&&await Promise.all([R.writeCSV(G.flat,x.outputDir),G.videos.length>0?R.writeVideoCSV(G.videos,G.seed,x.outputDir):Promise.resolve(""),G.forums.length>0?R.writeForumCSV(G.forums,G.seed,x.outputDir):Promise.resolve(""),G.aiOverview.detected?R.writeAIOverviewCSV(G.aiOverview.citations,G.aiOverview.text,G.seed,x.outputDir):Promise.resolve(""),G.aiMode.detected?R.writeAIModeCSV(G.aiMode.citations,G.aiMode.text,G.seed,x.outputDir):Promise.resolve(""),G.whatPeopleSaying.length>0?R.writeWhatPeopleSayingCSV(G.whatPeopleSaying,G.seed,x.outputDir):Promise.resolve("")]),G}catch(p){let C=sn(p);(C==="captcha"||C==="proxy_tunnel_failed")&&_==="location"&&(M++,M>=2&&(_="none"));let N=P<m-1&&H()&&(C==="captcha"||Co(C)||U==="location"&&To(C));if(C==="captcha"?console.warn(JSON.stringify({event:"harvest_attempt_captcha",attempt_number:y,max_attempts:m,message:Tt(p),will_retry:N})):N&&console.warn(JSON.stringify({event:"harvest_attempt_proxy_retry",attempt_number:y,max_attempts:m,outcome:C,message:Tt(p),will_retry:N})),await We(a,{type:"finished",attemptNumber:y,maxAttempts:m,outcome:C,kernelSessionId:null,questionCount:0,durationMs:Date.now()-E,error:Tt(p),willRetry:N,cleanup:{kernelSessionId:null,kernelDeleteStarted:!1,kernelDeleteSucceeded:null,kernelDeleteError:null,browserCloseSucceeded:null,browserCloseError:null},debug:null,completedAt:new Date().toISOString()}),B=p,N)continue;if(C==="captcha")break;throw p}}throw B&&!(B instanceof it)?B:(console.warn(JSON.stringify({event:"harvest_captcha_exhausted",max_attempts:m,session_kind:r?"kernel":"local"})),new it(us(`CAPTCHA on all ${m} fresh sessions. Try again in a few minutes.`)))}var Oo=require("child_process"),St=require("fs"),oi=require("os"),se=require("path"),oe=require("@fal-ai/client");var $l="https://api.deepinfra.com/v1/openai/chat/completions",_o="https://openrouter.ai/api/v1/chat/completions",$a="Qwen/Qwen3.6-35B-A3B",Ql=`You are a video prompt engineer for Seedance 2.0 text-to-video AI.
21792
+ `)}};function qn(e){return e.reason instanceof DOMException&&e.reason.name==="TimeoutError"?e.reason:new dt}async function nS(e){let t=await e.evaluate(n=>{let a=n,i=Array.from(document.querySelectorAll(a.item)),s=i.map(l=>l.querySelector(a.clickTarget)).filter(l=>l!=null),d=l=>{let S=l.getBoundingClientRect();if(S.width<=0||S.height<=0)return!1;let c=S.left+S.width/2,o=S.top+S.height/2;if(c<0||o<0||c>=window.innerWidth||o>=window.innerHeight)return!1;let U=document.elementFromPoint(c,o);return U!=null&&U!==l&&!l.contains(U)&&!U.contains(l)},r=Array.from(document.querySelectorAll("body *")).filter(l=>{let S=window.getComputedStyle(l);if(S.position!=="fixed"&&S.position!=="sticky")return!1;let c=l.getBoundingClientRect();return c.width*c.height>=window.innerWidth*window.innerHeight*.15&&S.visibility!=="hidden"&&S.display!=="none"});return{itemCount:i.length,expandedItemCount:i.filter(l=>l.classList.contains(a.expandedClass)||l.querySelector(a.clickTarget)?.getAttribute("aria-expanded")==="true").length,answeredItemCount:i.filter(l=>(l.querySelector(a.answerContainer)?.textContent?.trim().length??0)>=10).length,sourcedItemCount:i.filter(l=>l.querySelector(`${a.answerContainer} a[href]`)!=null).length,clickTargetCount:s.length,clickTargetsWithButtonRole:s.filter(l=>l.getAttribute("role")==="button"||l.tagName==="BUTTON").length,clickTargetsWithExpandedState:s.filter(l=>l.hasAttribute("aria-expanded")).length,clickTargetsOffscreen:s.filter(l=>{let S=l.getBoundingClientRect(),c=S.left+S.width/2,o=S.top+S.height/2;return c<0||o<0||c>=window.innerWidth||o>=window.innerHeight}).length,clickTargetsBlockedAtCenter:s.filter(d).length,fixedOrStickyOverlayCount:r.length}},{item:z.item,answerContainer:z.answerContainer,clickTarget:z.clickTarget,expandedClass:z.expandedClass});return{capturedAt:new Date().toISOString(),...t,selectorVersion:Qs}}function Ve(e){if(e instanceof xt)return"error";if(e instanceof Z)return"captcha";if(e instanceof we)return"location_mismatch";if(e instanceof dt)return"request_aborted";if(e instanceof zt)return"browser_session_interrupted";if(e instanceof DOMException&&(e.name==="TimeoutError"||e.name==="AbortError"))return"timeout";let t=e instanceof Error?e.message:String(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(t)?"browser_session_interrupted":aS(t)?"proxy_tunnel_failed":iS(t)?"proxy_unavailable":/timeout|timed out|Timeout \d+ms exceeded|deadline/i.test(t)?"timeout":"error"}function aS(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 iS(e){return/proxy unavailable|proxy_unavailable|connection_test_failed|did not return a proxy id|configured fallback/i.test(e)}async function ni(e,t,n,a,i,s,d){let r=ho(t,{nativeGoogleAssets:e.serpOnly}),l=d?Ii(r,d.execution,d.permit,t.plannedProvider):r,S=new Jn,c=new Yn(l,S,a,i);if(n?.aborted)return{result:null,error:qn(n),cleanup:await l.close(),debug:null};let o,U=n?new Promise((M,W)=>{o=()=>W(qn(n)),n.addEventListener("abort",o,{once:!0})}):null,u=null,h=null,w,y=null,N=!1,C;try{C=c.extract(e,n),C.then(()=>{N=!0},()=>{N=!0}),u=await(U?Promise.race([C,U]):C)}catch(M){h=M}finally{if(n&&o&&n.removeEventListener("abort",o),s){let M;try{let W=nS(l);W.catch(()=>{});let L=await Promise.race([W,new Promise((B,f)=>{M=setTimeout(()=>f(new DOMException("PAA DOM evidence timed out","TimeoutError")),2e3)})]);await s(L)}catch(W){console.warn(JSON.stringify({event:"paa_dom_evidence_failed",message:W instanceof Error?W.message:String(W)}))}finally{M&&clearTimeout(M)}}y=u?.diagnostics.debug??(e.debug?{enabled:!0,request:{query:e.query,locationInput:e.location??null,canonicalLocation:null,locationResolved:null,locationMatchSource:null,locationAmbiguousCandidates:null,uule:null,gl:e.gl,hl:e.hl,device:e.device,proxyMode:e.proxyMode,proxyZip:e.proxyZip??null,serpIdentity:e.serpIdentity??null,serpOnly:e.serpOnly,pages:e.pages??1},browser:l.getDebugSnapshot()}:null);try{w=await l.close()}catch(M){w={\u006b\u0065\u0072\u006e\u0065\u006cSessionId:l.get\u004b\u0065\u0072\u006e\u0065\u006cSessionId?.()??null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:!1,browserCloseError:M instanceof Error?M.message:String(M),physicalOutcome:"unknown"}}if(C&&!N){let M;try{await Promise.race([C.then(()=>{},()=>{}),new Promise(W=>{M=setTimeout(W,2e3)})])}finally{M&&clearTimeout(M)}}w.extractionDrained=N,N||(w.physicalOutcome="unknown")}if(h){let M=Ve(h),W=M==="timeout"||M==="request_aborted"||M==="browser_session_interrupted"?M:null,L=null;if(W)try{L=typeof c.getPartialResult=="function"?c.getPartialResult():null}catch{L=null}return L&&W?(L.diagnostics={...L.diagnostics,interruption:{code:W,reasonSource:"client_runtime",message:h instanceof Error?h.message:String(h)}},{result:L,error:h,cleanup:w,debug:y,salvagedFrom:h}):{result:null,error:h,cleanup:w,debug:y}}return{result:u,error:null,cleanup:w,debug:y}}function Fo(e){return e.diagnostics.degradedResult?"degraded_result":e.diagnostics?.completionStatus??(e.totalQuestions>0?"paa_found":"no_paa")}function sS(e){return e.flat.length>0||e.organicResults.length>0||e.localPack.length>0||e.videos.length>0||e.forums.length>0||e.whatPeopleSaying.length>0||e.aiOverview.detected||e.aiMode.detected}function ai(e,t,n){let a=sS(e),i=(e.diagnostics.warnings?.length??0)>0,s=new Set(e.flat.map(y=>y.question.toLowerCase().replace(/[^\w\s]/g,"").replace(/\s+/g," ").trim())).size,d=n?0:e.flat.filter(y=>!y.answer?.trim()).length,r=n?0:e.flat.filter(y=>!y.source_cite?.trim()).length,l=n?0:e.flat.filter(y=>y.answerExpansionIncomplete===!0).length,S=e.diagnostics.completionStatus==="no_paa"&&(e.diagnostics.noPaaObserved===!0||a),c=e.diagnostics.completionStatus==="paa_found",o=e.diagnostics.paaLifecycle?.discoveryStatus,U=o==="interrupted"||o==="recovery_exhausted",u=c&&(s<t&&o!=="frontier_exhausted"||d>0||r>0||l>0||!!e.diagnostics.interruption||U),h=S?"complete":c&&s>0?u||i?"partial":"complete":a?i?"partial":"complete":"degraded",w=h==="degraded";return e.diagnostics={...e.diagnostics,resultQuality:h,degradedResult:w,degradationReasons:w?["empty_primary_serp"]:[],retryRecommended:w||h==="partial"&&(u||e.diagnostics.warnings?.some(y=>y.retryable)===!0),completeness:{paaWithoutAnswer:d,paaWithoutSource:r,paaIncompleteAnswers:l,paaAnswersRecovered:e.diagnostics.completeness?.paaAnswersRecovered??0,aioShareCaptured:e.diagnostics.completeness?.aioShareCaptured??null,paaRequested:t,paaReturned:e.flat.length,paaUnique:s},...e.diagnostics.paaLifecycle?{paaLifecycle:{...e.diagnostics.paaLifecycle,questionsFound:s,targetStatus:s>=t?"met":"not_met",materialStatus:d>0||r>0||l>0?"partial":"complete"}}:{}},e}function ii(e,t,n){let a=e.diagnostics.paaLifecycle;if(!a)return e;let i={...a.retryBreakdown,browserRetries:t,providerFallbacks:n};return{...e,diagnostics:{...e.diagnostics,paaLifecycle:{...a,retryBreakdown:i,automaticRetries:i.controlRetries+i.browserRetries+i.runtimeRecoveries}}}}function _o(e){return(e.diagnostics.degradationReasons??[]).includes("empty_primary_serp")?"No usable primary SERP surface was captured; the result may be incomplete.":"The harvest result was marked degraded."}function si(e,t){if(t||!e.diagnostics.debug)return e;let n={...e.diagnostics};return delete n.debug,{...e,diagnostics:n}}async function oi(e,t){let n=t==null?3e3:t-Date.now();if(n<=0)return e;try{return await bo(e,{totalBudgetMs:Math.min(3e3,n)})}catch(a){return console.warn(JSON.stringify({event:"harvest_goto_resolution_failed",message:a instanceof Error?a.message:String(a)})),e}}var ri=2,oS=2,rS=3e3;function dS(e){if(!e||typeof e!="object")return;let t=e.signal;if(t instanceof AbortSignal)return t}function lS(e){if(!e||typeof e!="object")return;let t=e.onAttemptEvent;return typeof t=="function"?t:void 0}function SS(e){if(!e||typeof e!="object")return;let t=e.onPaaProgress;return typeof t=="function"?t:void 0}function US(e){if(!e||typeof e!="object")return;let t=e.onPaaDomEvidence;return typeof t=="function"?t:void 0}async function Ke(e,t){if(e)try{await e(t)}catch(n){console.warn(JSON.stringify({event:"harvest_attempt_log_failed",attempt_number:t.attemptNumber,message:n instanceof Error?n.message:String(n)}))}}function Vt(e){return e instanceof Error?e.message:String(e)}function cS(e){return e==="location"?oS:ri}function Do(e){return e==="captcha"||e==="proxy_tunnel_failed"||e==="proxy_unavailable"}function Go(e){return e==="browser_session_interrupted"}function uS(e){let t=e.diagnostics.debug?.locationEvidence,n=t?.expected?.canonicalLocation??e.location??"requested location",a=t?.candidates.slice(0,3).map(i=>`${i.city}, ${i.regionCode}`).join("; ");return a?`Google returned results for ${a}, not ${n}`:`Google returned results for a different location than ${n}`}function hS(e,t){return t==="location"&&e.diagnostics.debug?.locationEvidence?.status==="mismatch"}function Vo(e){return e.extractionDrained===!0&&e.browserCloseSucceeded===!0&&e.localDisconnectSucceeded!==!1&&(e.\u006b\u0065\u0072\u006e\u0065\u006cSessionId==null||e.\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded===!0)&&e.physicalOutcome!=="unknown"}async function gS(e,t){if(!t)return!0;if(!e)return!1;try{return await Es(e,t),console.info(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_proxy_deleted",proxy_id_suffix:t.slice(-6)})),!0}catch(n){return console.warn(JSON.stringify({event:"\u006b\u0065\u0072\u006e\u0065\u006c_proxy_delete_failed",proxy_id_suffix:t.slice(-6),message:Vt(n)})),!1}}async function Ko(e){let t=typeof e=="object"&&e!==null?e:{},n=dS(e),a=xi(e),i=lS(e),s=SS(e),d=US(e),r=t.forceManagedSerp===!0,l=t.force\u004b\u0065\u0072\u006e\u0065\u006cSerp===!0,S=Ti({forceManagedSerp:r,force\u004b\u0065\u0072\u006e\u0065\u006cSerp:l}),c=t.proxyMode,o=c==="location"||c==="none"||c==="configured"?c:kn,U=typeof t.\u006b\u0065\u0072\u006e\u0065\u006cApiKey=="string"?t.\u006b\u0065\u0072\u006e\u0065\u006cApiKey.trim():Li(),u=typeof t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId=="string"?t.\u006b\u0065\u0072\u006e\u0065\u006cProxyId.trim():void 0,h={\u006b\u0065\u0072\u006e\u0065\u006cApiKey:U,proxyMode:o,configured\u004b\u0065\u0072\u006e\u0065\u006cProxyId:u,location:typeof t.location=="string"?t.location:void 0,proxyZip:typeof t.proxyZip=="string"?t.proxyZip:void 0,gl:typeof t.gl=="string"?t.gl:"us"},w=typeof t.debug=="boolean"?t.debug:!1,y=o==="location"&&!!h.location,N=t.maxAttempts,C=typeof N=="number"&&Number.isInteger(N)&&N>=1?Math.min(ri,N):cS(o),M=Math.min(ri,C),W=typeof t.softDeadlineMs=="number"?t.softDeadlineMs:null,L=new Mn,B=null,f=o,F=0,P=()=>W==null||W-Date.now()>=rS;for(let m=0;m<M;m++){let v=m+1,O=Date.now(),p=!0,k,_=!1,H=n,A;try{if(H?.aborted)throw qn(H);let b=vi({intent:S,\u0062\u0072\u0069\u0067\u0068\u0074\u0044\u0061\u0074\u0061Available:Ks(),\u006b\u0065\u0072\u006e\u0065\u006cFallbackAvailable:!!U,persistent\u004b\u0065\u0072\u006e\u0065\u006cIdentityRequested:!!(t.serpIdentity||t.\u006b\u0065\u0072\u006e\u0065\u006cProfileName),retryIndex:m,priorTerminalReason:B==null?null:Ve(B),softDeadlineMs:W}),R=oa.parse({...t,\u006b\u0065\u0072\u006e\u0065\u006cApiKey:U,proxyMode:f,debug:w||y});a&&(k=await a.prepare(b.plannedProvider,v),A=a.watch(k,n),H=A.signal);let Q=b.plannedProvider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser":R.serpIdentity?"\u006b\u0065\u0072\u006e\u0065\u006c_persistent_identity":"\u006b\u0065\u0072\u006e\u0065\u006c_browser";await Ke(i,{type:"started",attemptNumber:v,maxAttempts:M,method:Q,provider:Q==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061_browser"?"\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061":"\u006b\u0065\u0072\u006e\u0065\u006c",planReason:b.reasonCode,planTimeoutMs:b.timeoutMs,retryKind:v===1?null:b.attemptKind==="provider_fallback"?"provider_fallback":"same_method",retryReason:v===1||B==null?null:Ve(B),query:R.query,location:R.location??null,maxQuestions:R.maxQuestions,startedAt:new Date(O).toISOString()}),b.plannedProvider==="\u006b\u0065\u0072\u006e\u0065\u006c"&&(p=!1,a&&k&&await a.start(k,"proxy"));let $=b.plannedProvider==="\u0062\u0072\u0069\u0067\u0068\u0074\u0064\u0061\u0074\u0061"?null:await Fs({...h,proxyMode:f,attemptIndex:m,fresh:f==="location"});if(b.plannedProvider==="\u006b\u0065\u0072\u006e\u0065\u006c"&&!$)throw new Error("\u004b\u0065\u0072\u006e\u0065\u006c proxy resolution did not produce an execution plan");a&&k&&b.plannedProvider==="\u006b\u0065\u0072\u006e\u0065\u006c"&&await a.resource(k,"proxy",$?.disposableProxyId??null);let mt={...t,\u006b\u0065\u0072\u006e\u0065\u006cApiKey:U,...$?{\u006b\u0065\u0072\u006e\u0065\u006cProxyId:$.\u006b\u0065\u0072\u006e\u0065\u006cProxyId,\u006b\u0065\u0072\u006e\u0065\u006cProxyResolution:$.resolution}:{},proxyMode:f,keepDefaultProxy:m>0,softDeadlineMs:W==null?void 0:O+b.timeoutMs,debug:w||y};f==="none"&&(mt.\u006b\u0065\u0072\u006e\u0065\u006cProxyId=void 0);let K=oa.parse(mt);console.info(JSON.stringify({event:"harvest_attempt_started",attempt_number:v,max_attempts:M,query:K.query,location:K.location??null,max_questions:K.maxQuestions}));let Kt=le(),Pt=null,ut=async j=>{Cn(j.provider)!==b.plannedProvider&&(Pt=new xt(b.plannedProvider,j.provider)),await Ke(i,{type:"provider_session_started",attemptNumber:v,maxAttempts:M,provider:j.provider,providerSessionId:j.providerSessionId,billingMode:j.billingMode,observedAt:new Date().toISOString()})},Y=Kt?.harvestBrowserMode==="headless-test"&&process.env[Ds]==="true";p=!1;let D=Kt?await Vs({...Kt,forceHeadless:Y,forceHeadful:!Y},()=>ni(K,b,H,s,ut,d,a&&k?{execution:a,permit:k}:void 0)):await ni(K,b,H,s,ut,d,a&&k?{execution:a,permit:k}:void 0),ht=await gS(U,$?.disposableProxyId);if(D.cleanup.disposableProxyDeleted=ht,a&&k){let j=await na(a,k,D.cleanup,$?.disposableProxyId??null);_=!0,A?.stop(),p=j.state!=="unknown"&&Vo(D.cleanup)&&ht}else p=Vo(D.cleanup)&&ht;if(D.error||Pt){let j=Pt??D.error,X=Ve(j);(X==="captcha"||X==="proxy_tunnel_failed")&&f==="location"&&(F++,F>=2&&(f="none"));let At=!D.result&&p&&!H?.aborted&&m<M-1&&P()&&(X==="captcha"||Go(X)||o==="location"&&Do(X));if(X==="captcha"?console.warn(JSON.stringify({event:"harvest_attempt_captcha",attempt_number:v,max_attempts:M,message:Vt(j),will_retry:At})):At&&console.warn(JSON.stringify({event:"harvest_attempt_proxy_retry",attempt_number:v,max_attempts:M,outcome:X,message:Vt(j),will_retry:At})),await Ke(i,{type:"finished",attemptNumber:v,maxAttempts:M,outcome:X,\u006b\u0065\u0072\u006e\u0065\u006cSessionId:D.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,questionCount:D.result?.totalQuestions??0,durationMs:Date.now()-O,error:Vt(j),willRetry:At,cleanup:D.cleanup,debug:D.debug,completedAt:new Date().toISOString()}),B=j,At)continue;if(D.result&&!Pt){let Je=await oi(D.result,W);return ii(ai(si(Je,w),K.maxQuestions,K.questionsOnly),m,b.attemptKind==="provider_fallback"?1:0)}break}let Ct=D.result;if(!Ct)throw new Error("Harvest attempt completed without a result");if(hS(Ct,o)){let j=new we(uS(Ct)),X=p&&!H?.aborted&&m<M-1&&P();if(console.warn(JSON.stringify({event:"harvest_attempt_location_mismatch",attempt_number:v,max_attempts:M,message:j.message,will_retry:X})),await Ke(i,{type:"finished",attemptNumber:v,maxAttempts:M,outcome:"location_mismatch",\u006b\u0065\u0072\u006e\u0065\u006cSessionId:D.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,questionCount:Ct.totalQuestions,durationMs:Date.now()-O,error:j.message,willRetry:X,cleanup:D.cleanup,debug:D.debug,completedAt:new Date().toISOString()}),B=j,X)continue;break}let Yt=await oi(Ct,W),V=ii(ai(si(Yt,w),K.maxQuestions,K.questionsOnly),m,b.attemptKind==="provider_fallback"?1:0),It=Fo(V),kt=It==="degraded_result"&&p&&!H?.aborted&&m<M-1&&P(),Jt=It==="degraded_result"?_o(V):null;if(kt&&console.warn(JSON.stringify({event:"harvest_attempt_degraded_result",attempt_number:v,max_attempts:M,degradation_reasons:V.diagnostics.degradationReasons,will_retry:!0})),await Ke(i,{type:"finished",attemptNumber:v,maxAttempts:M,outcome:It,\u006b\u0065\u0072\u006e\u0065\u006cSessionId:D.cleanup.\u006b\u0065\u0072\u006e\u0065\u006cSessionId,questionCount:V.totalQuestions,durationMs:Date.now()-O,error:Jt,willRetry:kt,cleanup:D.cleanup,debug:D.debug,completedAt:new Date().toISOString()}),kt)continue;return(K.format==="json"||K.format==="both")&&await L.writeJSON(V,K.outputDir),(K.format==="csv"||K.format==="both")&&await Promise.all([L.writeCSV(V.flat,K.outputDir),V.videos.length>0?L.writeVideoCSV(V.videos,V.seed,K.outputDir):Promise.resolve(""),V.forums.length>0?L.writeForumCSV(V.forums,V.seed,K.outputDir):Promise.resolve(""),V.aiOverview.detected?L.writeAIOverviewCSV(V.aiOverview.citations,V.aiOverview.text,V.seed,K.outputDir):Promise.resolve(""),V.aiMode.detected?L.writeAIModeCSV(V.aiMode.citations,V.aiMode.text,V.seed,K.outputDir):Promise.resolve(""),V.whatPeopleSaying.length>0?L.writeWhatPeopleSayingCSV(V.whatPeopleSaying,V.seed,K.outputDir):Promise.resolve("")]),V}catch(b){a&&k&&!_&&(p=!1,await na(a,k,{\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:null,browserCloseError:Vt(b),physicalOutcome:"unknown",extractionDrained:!0,disposableProxyDeleted:!1}).catch(()=>{}));let R=Ve(b);(R==="captcha"||R==="proxy_tunnel_failed")&&f==="location"&&(F++,F>=2&&(f="none"));let Q=p&&!H?.aborted&&m<M-1&&P()&&(R==="captcha"||Go(R)||o==="location"&&Do(R));if(R==="captcha"?console.warn(JSON.stringify({event:"harvest_attempt_captcha",attempt_number:v,max_attempts:M,message:Vt(b),will_retry:Q})):Q&&console.warn(JSON.stringify({event:"harvest_attempt_proxy_retry",attempt_number:v,max_attempts:M,outcome:R,message:Vt(b),will_retry:Q})),await Ke(i,{type:"finished",attemptNumber:v,maxAttempts:M,outcome:R,\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,questionCount:0,durationMs:Date.now()-O,error:Vt(b),willRetry:Q,cleanup:{\u006b\u0065\u0072\u006e\u0065\u006cSessionId:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteStarted:!1,\u006b\u0065\u0072\u006e\u0065\u006cDeleteSucceeded:null,\u006b\u0065\u0072\u006e\u0065\u006cDeleteError:null,browserCloseSucceeded:null,browserCloseError:null},debug:null,completedAt:new Date().toISOString()}),B=b,Q)continue;if(R==="captcha")break;throw b}finally{A?.stop()}}throw B&&!(B instanceof Z)?B:(console.warn(JSON.stringify({event:"harvest_captcha_exhausted",max_attempts:M,session_kind:U?"\u006b\u0065\u0072\u006e\u0065\u006c":"local"})),new Z(Ri(`CAPTCHA on all ${M} fresh sessions. Try again in a few minutes.`)))}var tr=require("child_process"),ct=require("fs"),pi=require("os"),ue=require("path"),he=require("@fal-ai/client");var wS="https://api.deepinfra.com/v1/openai/chat/completions",Jo="https://openrouter.ai/api/v1/chat/completions",di="Qwen/Qwen3.6-35B-A3B",pS=`You are a video prompt engineer for Seedance 2.0 text-to-video AI.
21903
21793
 
21904
21794
  IMPORTANT TECHNICAL CONTEXT: Clip 2 will be generated using image-to-video, meaning it will start from the exact last frame of Clip 1. The two clips will be visually seamless \u2014 same location, same characters, continuous motion. You must write prompts that make this feel like one uninterrupted 16-second video.
21905
21795
 
@@ -21921,20 +21811,20 @@ Rules for visuals:
21921
21811
  - Describe exactly what the camera sees
21922
21812
 
21923
21813
  Respond with JSON only:
21924
- {"clip1": "...", "clip2": "...", "voiceover": "...", "audioMood": "..."}`;async function vo(e,t,n,a){let i=await fetch(t,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({model:$a,temperature:.7,messages:[{role:"system",content:Ql},{role:"user",content:`Question: ${n}
21814
+ {"clip1": "...", "clip2": "...", "voiceover": "...", "audioMood": "..."}`;async function Yo(e,t,n,a){let i=await fetch(t,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({model:di,temperature:.7,messages:[{role:"system",content:pS},{role:"user",content:`Question: ${n}
21925
21815
 
21926
- Answer: ${a.slice(0,500)}`}]})});if(!i.ok)throw new Error(`LLM call failed (${i.status}): ${await i.text()}`);let s=await i.json();t===_o?Aa({vendor:"openrouter",model:$a,units:s.usage?.cost??0,unitType:"usd"}):Aa({vendor:"deepinfra_qwen",model:$a,units:s.usage?.completion_tokens??0,unitType:"tokens"});let o=s.choices[0]?.message?.content?.trim()??"",d=o.match(/\{[\s\S]*\}/);if(!d)throw new Error(`No JSON in QWEN response: ${o.slice(0,200)}`);let l=JSON.parse(d[0]);if(!l.clip1||!l.clip2||!l.voiceover||!l.audioMood)throw new Error(`QWEN response missing fields: ${o.slice(0,200)}`);return l}async function Jn(e,t){let n=process.env.DEEPINFRA_API_KEY,a=process.env.OPENROUTER_API_KEY;if(n)try{return await vo(n,$l,e,t)}catch(i){console.warn("[promptBuilder] DeepInfra failed, trying OpenRouter:",i.message)}if(a)return await vo(a,_o,e,t);throw new Error("No LLM key \u2014 set DEEPINFRA_API_KEY or OPENROUTER_API_KEY")}function bo(e){if(!e.clip1||!e.clip2||!e.voiceover||!e.audioMood)throw new Error("Episode brief is missing prompt fields \u2014 run blog-to-video skill to regenerate");return{clip1:e.clip1,clip2:e.clip2,voiceover:e.voiceover,audioMood:e.audioMood}}var on=require("fs"),Qa=require("path"),Po=require("os"),Xn=require("@fal-ai/client"),Zl="fal-ai/mmaudio-v2",tS="fal-ai/elevenlabs/tts",eS="fal-ai/google/gemini-2.5-flash-preview-tts";async function Eo(e){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to download TTS audio (${t.status})`);return Buffer.from(await t.arrayBuffer())}async function Za(e){console.log("[AudioGenerator] Generating voiceover...");let t=(0,Qa.join)((0,Po.tmpdir)(),`tts-${Date.now()}`);(0,on.mkdirSync)(t,{recursive:!0});let n=(0,Qa.join)(t,"voiceover.mp3");try{let s=process.env.ELEVENLABS_VOICE_ID??"pNInz6obpgDQGcFmaJgB",o=await Xn.fal.run(tS,{input:{text:e,voice_id:s,model_id:"eleven_v3"}});return(0,on.writeFileSync)(n,await Eo(o.audio.url)),console.log("[AudioGenerator] TTS: ElevenLabs via fal"),n}catch(s){console.warn("[AudioGenerator] ElevenLabs via fal failed, trying Gemini:",s.message)}let a=process.env.GEMINI_TTS_VOICE??"Kore",i=await Xn.fal.run(eS,{input:{text:e,voice:a}});return(0,on.writeFileSync)(n,await Eo(i.audio.url)),console.log("[AudioGenerator] TTS: Gemini via fal"),n}async function ti(e,t,n){return console.log("[AudioGenerator] Adding background audio via MMAudio V2..."),(await Xn.fal.run(Zl,{input:{video_url:e,prompt:t,negative_prompt:"speech, voice, talking, dialogue, narration, vocals, singing, human voice, conversation, words, lyrics, announcer, commentary",duration:n,cfg_strength:4.5}})).video.url}var ni=require("child_process"),qn=require("fs"),He=require("path"),Io=require("@fal-ai/client");async function ei(e,t){let n=await fetch(e);if(!n.ok)throw new Error(`Download failed (${n.status}): ${e}`);(0,qn.writeFileSync)(t,Buffer.from(await n.arrayBuffer()))}async function ai(e,t,n){(0,qn.mkdirSync)(n,{recursive:!0});let a=Date.now(),i=(0,He.join)(n,`clip1-${a}.mp4`),s=(0,He.join)(n,`clip2-${a}.mp4`),o=(0,He.join)(n,`combined-${a}.mp4`);return console.log("[VideoMixer] Downloading clips..."),await Promise.all([ei(e,i),ei(t,s)]),console.log("[VideoMixer] Concatenating..."),(0,ni.execSync)(`ffmpeg -i "${i}" -i "${s}" -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[v]" -map "[v]" -y "${o}" -loglevel error`),o}async function ii(e){let{readFileSync:t}=await import("fs"),n=new Blob([t(e)],{type:"video/mp4"}),a=await Io.fal.storage.upload(n);return console.log("[VideoMixer] Uploaded to fal:",a),a}async function si(e,t,n){let a=Date.now(),i=(0,He.join)(n,`voiceover-${a}.wav`),s=(0,He.join)(n,`final-${a}.mp4`);return console.log("[VideoMixer] Downloading voiceover..."),await ei(t,i),console.log("[VideoMixer] Mixing voiceover over background audio..."),(0,ni.execSync)(`ffmpeg -i "${e}" -i "${i}" -filter_complex "[0:a]volume=0.2[bg];[1:a]volume=1.0[vo];[bg][vo]amix=inputs=2:duration=first[a]" -map 0:v -map "[a]" -c:v copy -y "${s}" -loglevel error`),s}var Ao="bytedance/seedance-2.0/text-to-video",Lo="bytedance/seedance-2.0/image-to-video";function jn(e,t,n,a){return{prompt:e,resolution:t.resolution??"720p",duration:t.clipDurationSeconds??8,aspect_ratio:t.aspectRatio??"16:9",generate_audio:!1,...n!==void 0?{seed:n}:{},...a!==void 0?{image_url:a}:{}}}async function zn(e,t){let{request_id:n}=await oe.fal.queue.submit(e,{input:t});for(console.log(`[fal] submitted ${e} \u2192 ${n}`);;){await new Promise(s=>setTimeout(s,5e3));let a=await oe.fal.queue.status(e,{requestId:n,logs:!1});if(console.log(`[fal] ${n} \u2192 ${a.status}`),a.status==="FAILED")throw new Error(`Request ${n} failed`);if(a.status!=="COMPLETED")continue;return(await oe.fal.queue.result(e,{requestId:n})).data}}async function xo(e,t){let n=Date.now(),a=(0,se.join)(t,`clip1-raw-${n}.mp4`),i=(0,se.join)(t,`last-frame-${n}.jpg`),s=await fetch(e);if(!s.ok)throw new Error(`Failed to download clip 1 (${s.status})`);(0,St.writeFileSync)(a,Buffer.from(await s.arrayBuffer()));try{(0,Oo.execSync)(`ffmpeg -sseof -0.1 -i "${a}" -vframes 1 -y "${i}" -loglevel error`)}finally{try{(0,St.unlinkSync)(a)}catch{}}return i}var $n=class{constructor(t){let n=t??process.env.FAL_KEY;if(!n)throw new Error("FAL_KEY is required");oe.fal.config({credentials:n})}async generateClipPair(t,n,a={}){let i=a.outputDir??(0,se.join)((0,oi.tmpdir)(),`paa-video-${Date.now()}`);(0,St.mkdirSync)(i,{recursive:!0}),console.log(`
21927
- [1/7] Generating prompts via QWEN 3.6...`);let s=await Jn(t,n);console.log(" Voiceover:",s.voiceover),console.log(" Audio mood:",s.audioMood),console.log(`
21928
- [2/7] Generating clip 1 (text-to-video)...`);let o=await zn(Ao,jn(s.clip1,a,a.seed));console.log(`
21929
- [3/7] Extracting last frame \u2192 clip 2 start...`);let d=await xo(o.video.url,i),l=new Blob([(0,St.readFileSync)(d)],{type:"image/jpeg"}),S=await oe.fal.storage.upload(l);try{(0,St.unlinkSync)(d)}catch{}console.log(`
21930
- [4/7] Generating clip 2 (image-to-video from last frame)...`);let U=a.seed!==void 0?a.seed+1:void 0,r=await zn(Lo,jn(s.clip2,a,U,S));console.log(`
21931
- [5/7] Concatenating clips + generating voiceover (parallel)...`);let[u,c]=await Promise.all([ai(o.video.url,r.video.url,i),Za(s.voiceover)]);console.log(`
21932
- [6/7] Adding background audio via MMAudio V2...`);let h=await ii(u),w=(a.clipDurationSeconds??8)*2,k=await ti(h,s.audioMood,w);console.log(`
21933
- [7/7] Overlaying voiceover on final video...`);let f=(0,se.join)(i,`with-bg-audio-${Date.now()}.mp4`),m=await fetch(k);(0,St.writeFileSync)(f,Buffer.from(await m.arrayBuffer()));let L=await si(f,c,i);return{clip1Url:o.video.url,clip2Url:r.video.url,finalVideoPath:L,seed:o.seed,promptClip1:s.clip1,promptClip2:s.clip2,voiceover:s.voiceover,audioMood:s.audioMood}}async generateEpisode(t,n={}){let a=n.outputDir??(0,se.join)((0,oi.tmpdir)(),`episode-${t.episodeNumber}-${Date.now()}`);(0,St.mkdirSync)(a,{recursive:!0});let i=bo(t);console.log(`
21816
+ Answer: ${a.slice(0,500)}`}]})});if(!i.ok)throw new Error(`LLM call failed (${i.status}): ${await i.text()}`);let s=await i.json();t===Jo?Ka({vendor:"openrouter",model:di,units:s.usage?.cost??0,unitType:"usd"}):Ka({vendor:"deepinfra_qwen",model:di,units:s.usage?.completion_tokens??0,unitType:"tokens"});let d=s.choices[0]?.message?.content?.trim()??"",r=d.match(/\{[\s\S]*\}/);if(!r)throw new Error(`No JSON in QWEN response: ${d.slice(0,200)}`);let l=JSON.parse(r[0]);if(!l.clip1||!l.clip2||!l.voiceover||!l.audioMood)throw new Error(`QWEN response missing fields: ${d.slice(0,200)}`);return l}async function zn(e,t){let n=process.env.DEEPINFRA_API_KEY,a=process.env.OPENROUTER_API_KEY;if(n)try{return await Yo(n,wS,e,t)}catch(i){console.warn("[promptBuilder] DeepInfra failed, trying OpenRouter:",i.message)}if(a)return await Yo(a,Jo,e,t);throw new Error("No LLM key \u2014 set DEEPINFRA_API_KEY or OPENROUTER_API_KEY")}function qo(e){if(!e.clip1||!e.clip2||!e.voiceover||!e.audioMood)throw new Error("Episode brief is missing prompt fields \u2014 run blog-to-video skill to regenerate");return{clip1:e.clip1,clip2:e.clip2,voiceover:e.voiceover,audioMood:e.audioMood}}var un=require("fs"),li=require("path"),$o=require("os"),$n=require("@fal-ai/client"),yS="fal-ai/mmaudio-v2",mS="fal-ai/elevenlabs/tts",CS="fal-ai/google/gemini-2.5-flash-preview-tts";async function zo(e){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to download TTS audio (${t.status})`);return Buffer.from(await t.arrayBuffer())}async function Si(e){console.log("[AudioGenerator] Generating voiceover...");let t=(0,li.join)((0,$o.tmpdir)(),`tts-${Date.now()}`);(0,un.mkdirSync)(t,{recursive:!0});let n=(0,li.join)(t,"voiceover.mp3");try{let s=process.env.ELEVENLABS_VOICE_ID??"pNInz6obpgDQGcFmaJgB",d=await $n.fal.run(mS,{input:{text:e,voice_id:s,model_id:"eleven_v3"}});return(0,un.writeFileSync)(n,await zo(d.audio.url)),console.log("[AudioGenerator] TTS: ElevenLabs via fal"),n}catch(s){console.warn("[AudioGenerator] ElevenLabs via fal failed, trying Gemini:",s.message)}let a=process.env.GEMINI_TTS_VOICE??"Kore",i=await $n.fal.run(CS,{input:{text:e,voice:a}});return(0,un.writeFileSync)(n,await zo(i.audio.url)),console.log("[AudioGenerator] TTS: Gemini via fal"),n}async function Ui(e,t,n){return console.log("[AudioGenerator] Adding background audio via MMAudio V2..."),(await $n.fal.run(yS,{input:{video_url:e,prompt:t,negative_prompt:"speech, voice, talking, dialogue, narration, vocals, singing, human voice, conversation, words, lyrics, announcer, commentary",duration:n,cfg_strength:4.5}})).video.url}var ui=require("child_process"),jn=require("fs"),Ye=require("path"),jo=require("@fal-ai/client");async function ci(e,t){let n=await fetch(e);if(!n.ok)throw new Error(`Download failed (${n.status}): ${e}`);(0,jn.writeFileSync)(t,Buffer.from(await n.arrayBuffer()))}async function hi(e,t,n){(0,jn.mkdirSync)(n,{recursive:!0});let a=Date.now(),i=(0,Ye.join)(n,`clip1-${a}.mp4`),s=(0,Ye.join)(n,`clip2-${a}.mp4`),d=(0,Ye.join)(n,`combined-${a}.mp4`);return console.log("[VideoMixer] Downloading clips..."),await Promise.all([ci(e,i),ci(t,s)]),console.log("[VideoMixer] Concatenating..."),(0,ui.execSync)(`ffmpeg -i "${i}" -i "${s}" -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[v]" -map "[v]" -y "${d}" -loglevel error`),d}async function gi(e){let{readFileSync:t}=await import("fs"),n=new Blob([t(e)],{type:"video/mp4"}),a=await jo.fal.storage.upload(n);return console.log("[VideoMixer] Uploaded to fal:",a),a}async function wi(e,t,n){let a=Date.now(),i=(0,Ye.join)(n,`voiceover-${a}.wav`),s=(0,Ye.join)(n,`final-${a}.mp4`);return console.log("[VideoMixer] Downloading voiceover..."),await ci(t,i),console.log("[VideoMixer] Mixing voiceover over background audio..."),(0,ui.execSync)(`ffmpeg -i "${e}" -i "${i}" -filter_complex "[0:a]volume=0.2[bg];[1:a]volume=1.0[vo];[bg][vo]amix=inputs=2:duration=first[a]" -map 0:v -map "[a]" -c:v copy -y "${s}" -loglevel error`),s}var Qo="bytedance/seedance-2.0/text-to-video",Xo="bytedance/seedance-2.0/image-to-video";function Qn(e,t,n,a){return{prompt:e,resolution:t.resolution??"720p",duration:t.clipDurationSeconds??8,aspect_ratio:t.aspectRatio??"16:9",generate_audio:!1,...n!==void 0?{seed:n}:{},...a!==void 0?{image_url:a}:{}}}async function Xn(e,t){let{request_id:n}=await he.fal.queue.submit(e,{input:t});for(console.log(`[fal] submitted ${e} \u2192 ${n}`);;){await new Promise(s=>setTimeout(s,5e3));let a=await he.fal.queue.status(e,{requestId:n,logs:!1});if(console.log(`[fal] ${n} \u2192 ${a.status}`),a.status==="FAILED")throw new Error(`Request ${n} failed`);if(a.status!=="COMPLETED")continue;return(await he.fal.queue.result(e,{requestId:n})).data}}async function Zo(e,t){let n=Date.now(),a=(0,ue.join)(t,`clip1-raw-${n}.mp4`),i=(0,ue.join)(t,`last-frame-${n}.jpg`),s=await fetch(e);if(!s.ok)throw new Error(`Failed to download clip 1 (${s.status})`);(0,ct.writeFileSync)(a,Buffer.from(await s.arrayBuffer()));try{(0,tr.execSync)(`ffmpeg -sseof -0.1 -i "${a}" -vframes 1 -y "${i}" -loglevel error`)}finally{try{(0,ct.unlinkSync)(a)}catch{}}return i}var Zn=class{constructor(t){let n=t??process.env.FAL_KEY;if(!n)throw new Error("FAL_KEY is required");he.fal.config({credentials:n})}async generateClipPair(t,n,a={}){let i=a.outputDir??(0,ue.join)((0,pi.tmpdir)(),`paa-video-${Date.now()}`);(0,ct.mkdirSync)(i,{recursive:!0}),console.log(`
21817
+ [1/7] Generating prompts via QWEN 3.6...`);let s=await zn(t,n);console.log(" Voiceover:",s.voiceover),console.log(" Audio mood:",s.audioMood),console.log(`
21818
+ [2/7] Generating clip 1 (text-to-video)...`);let d=await Xn(Qo,Qn(s.clip1,a,a.seed));console.log(`
21819
+ [3/7] Extracting last frame \u2192 clip 2 start...`);let r=await Zo(d.video.url,i),l=new Blob([(0,ct.readFileSync)(r)],{type:"image/jpeg"}),S=await he.fal.storage.upload(l);try{(0,ct.unlinkSync)(r)}catch{}console.log(`
21820
+ [4/7] Generating clip 2 (image-to-video from last frame)...`);let c=a.seed!==void 0?a.seed+1:void 0,o=await Xn(Xo,Qn(s.clip2,a,c,S));console.log(`
21821
+ [5/7] Concatenating clips + generating voiceover (parallel)...`);let[U,u]=await Promise.all([hi(d.video.url,o.video.url,i),Si(s.voiceover)]);console.log(`
21822
+ [6/7] Adding background audio via MMAudio V2...`);let h=await gi(U),w=(a.clipDurationSeconds??8)*2,y=await Ui(h,s.audioMood,w);console.log(`
21823
+ [7/7] Overlaying voiceover on final video...`);let N=(0,ue.join)(i,`with-bg-audio-${Date.now()}.mp4`),C=await fetch(y);(0,ct.writeFileSync)(N,Buffer.from(await C.arrayBuffer()));let M=await wi(N,u,i);return{clip1Url:d.video.url,clip2Url:o.video.url,finalVideoPath:M,seed:d.seed,promptClip1:s.clip1,promptClip2:s.clip2,voiceover:s.voiceover,audioMood:s.audioMood}}async generateEpisode(t,n={}){let a=n.outputDir??(0,ue.join)((0,pi.tmpdir)(),`episode-${t.episodeNumber}-${Date.now()}`);(0,ct.mkdirSync)(a,{recursive:!0});let i=qo(t);console.log(`
21934
21824
  [Episode ${t.episodeNumber}/${t.episodeCount}] ${t.sectionTitle}`),console.log(" Voiceover:",i.voiceover),console.log(`
21935
- [2/7] Generating clip 1 (text-to-video)...`);let s=await zn(Ao,jn(i.clip1,n,n.seed));console.log(`
21936
- [3/7] Extracting last frame \u2192 clip 2 start...`);let o=await xo(s.video.url,a),d=new Blob([(0,St.readFileSync)(o)],{type:"image/jpeg"}),l=await oe.fal.storage.upload(d);try{(0,St.unlinkSync)(o)}catch{}console.log(`
21937
- [4/7] Generating clip 2 (image-to-video from last frame)...`);let S=n.seed!==void 0?n.seed+1:void 0,U=await zn(Lo,jn(i.clip2,n,S,l));console.log(`
21938
- [5/7] Concatenating clips + generating voiceover (parallel)...`);let[r,u]=await Promise.all([ai(s.video.url,U.video.url,a),Za(i.voiceover)]);console.log(`
21939
- [6/7] Adding background audio via MMAudio V2...`);let c=await ii(r),h=(n.clipDurationSeconds??8)*2,w=await ti(c,i.audioMood,h);console.log(`
21940
- [7/7] Overlaying voiceover on final video...`);let k=(0,se.join)(a,`with-bg-audio-${Date.now()}.mp4`),f=await fetch(w);(0,St.writeFileSync)(k,Buffer.from(await f.arrayBuffer()));let m=await si(k,u,a);return{clip1Url:s.video.url,clip2Url:U.video.url,finalVideoPath:m,seed:s.seed,promptClip1:i.clip1,promptClip2:i.clip2,voiceover:i.voiceover,audioMood:i.audioMood}}};0&&(module.exports={VideoGenerator,buildClipPrompts,harvest});
21825
+ [2/7] Generating clip 1 (text-to-video)...`);let s=await Xn(Qo,Qn(i.clip1,n,n.seed));console.log(`
21826
+ [3/7] Extracting last frame \u2192 clip 2 start...`);let d=await Zo(s.video.url,a),r=new Blob([(0,ct.readFileSync)(d)],{type:"image/jpeg"}),l=await he.fal.storage.upload(r);try{(0,ct.unlinkSync)(d)}catch{}console.log(`
21827
+ [4/7] Generating clip 2 (image-to-video from last frame)...`);let S=n.seed!==void 0?n.seed+1:void 0,c=await Xn(Xo,Qn(i.clip2,n,S,l));console.log(`
21828
+ [5/7] Concatenating clips + generating voiceover (parallel)...`);let[o,U]=await Promise.all([hi(s.video.url,c.video.url,a),Si(i.voiceover)]);console.log(`
21829
+ [6/7] Adding background audio via MMAudio V2...`);let u=await gi(o),h=(n.clipDurationSeconds??8)*2,w=await Ui(u,i.audioMood,h);console.log(`
21830
+ [7/7] Overlaying voiceover on final video...`);let y=(0,ue.join)(a,`with-bg-audio-${Date.now()}.mp4`),N=await fetch(w);(0,ct.writeFileSync)(y,Buffer.from(await N.arrayBuffer()));let C=await wi(y,U,a);return{clip1Url:s.video.url,clip2Url:c.video.url,finalVideoPath:C,seed:s.seed,promptClip1:i.clip1,promptClip2:i.clip2,voiceover:i.voiceover,audioMood:i.audioMood}}};0&&(module.exports={VideoGenerator,buildClipPrompts,harvest});