mcp-scraper 0.97.0 → 0.98.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 (97) hide show
  1. package/CHANGELOG.md +5 -2425
  2. package/README.md +16 -412
  3. package/dist/bin/api-server.js +3 -2
  4. package/dist/bin/mcp-scraper-cli.js +33 -27
  5. package/dist/bin/mcp-scraper-core.js +9 -1
  6. package/dist/bin/mcp-scraper-install.js +17 -2
  7. package/dist/bin/mcp-stdio-server.js +9 -1
  8. package/dist/bin/paa-harvest.js +8 -1
  9. package/dist/index.cjs +5 -21830
  10. package/dist/index.d.ts +14 -607
  11. package/dist/index.js +5 -39
  12. package/dist/transport.d.ts +35 -0
  13. package/package.json +11 -51
  14. package/THIRD_PARTY_NOTICES.html +0 -203
  15. package/dist/actions-NCZNPYEY.js +0 -1
  16. package/dist/artifacts-4ZDNP2JW.js +0 -1
  17. package/dist/artifacts-N62OPIT5.js +0 -1
  18. package/dist/artifacts-PSADD5OC.js +0 -1
  19. package/dist/artifacts-RUR3OHAK.js +0 -1
  20. package/dist/blob-store-GIH26EDO.js +0 -1
  21. package/dist/bundle-XR6XKYJM.js +0 -1
  22. package/dist/chunk-24YDQ3EO.js +0 -5
  23. package/dist/chunk-3F7AFM53.js +0 -1
  24. package/dist/chunk-4HZXATHB.js +0 -27
  25. package/dist/chunk-4P3LZNVA.js +0 -954
  26. package/dist/chunk-4ZVO6GX4.js +0 -1
  27. package/dist/chunk-55ZANTHL.js +0 -3
  28. package/dist/chunk-63VWBMYR.js +0 -3
  29. package/dist/chunk-6FAMBNHY.js +0 -1
  30. package/dist/chunk-6N5EC7ZO.js +0 -1
  31. package/dist/chunk-7POHNTVW.js +0 -1
  32. package/dist/chunk-7SR7MEU5.js +0 -62
  33. package/dist/chunk-A4UASMEQ.js +0 -1
  34. package/dist/chunk-AMYPXA2F.js +0 -930
  35. package/dist/chunk-ANQ4JJVI.js +0 -71
  36. package/dist/chunk-B3JRL45T.js +0 -1
  37. package/dist/chunk-B4ZKPLSP.js +0 -1
  38. package/dist/chunk-B5Y26E3A.js +0 -1
  39. package/dist/chunk-C7MGJUTU.js +0 -1
  40. package/dist/chunk-CNSVZTTT.js +0 -13
  41. package/dist/chunk-EYGA6LOU.js +0 -1
  42. package/dist/chunk-GLCR4KJI.js +0 -21722
  43. package/dist/chunk-HCK6PLM3.js +0 -3
  44. package/dist/chunk-HNNYXMSI.js +0 -1
  45. package/dist/chunk-IFPION5D.js +0 -121
  46. package/dist/chunk-JMZIDHYQ.js +0 -2
  47. package/dist/chunk-JNPM3U3L.js +0 -189
  48. package/dist/chunk-K3VDGJNK.js +0 -1
  49. package/dist/chunk-KJQXUZ4Y.js +0 -4
  50. package/dist/chunk-KXJCGV3H.js +0 -1
  51. package/dist/chunk-M5QHXNFZ.js +0 -10
  52. package/dist/chunk-MVMWPKRC.js +0 -2
  53. package/dist/chunk-NALXKTUU.js +0 -1
  54. package/dist/chunk-ND4WIBXT.js +0 -16
  55. package/dist/chunk-NNOX3FYG.js +0 -198
  56. package/dist/chunk-NULRGHJ4.js +0 -41
  57. package/dist/chunk-OILOHQNL.js +0 -2
  58. package/dist/chunk-OLYPLX5C.js +0 -1
  59. package/dist/chunk-OOB3RKWD.js +0 -4
  60. package/dist/chunk-OSKCHEVM.js +0 -218
  61. package/dist/chunk-PD7BI7TR.js +0 -12
  62. package/dist/chunk-PKQHHCO4.js +0 -20
  63. package/dist/chunk-PQRT4T2G.js +0 -159
  64. package/dist/chunk-QER2ELZP.js +0 -1
  65. package/dist/chunk-RDHGQ2WZ.js +0 -1
  66. package/dist/chunk-SDQW7IJN.js +0 -1
  67. package/dist/chunk-SEZETSB3.js +0 -1
  68. package/dist/chunk-U3NV72AL.js +0 -8
  69. package/dist/chunk-U4WIJZCX.js +0 -1
  70. package/dist/chunk-UIOSADPB.js +0 -1718
  71. package/dist/chunk-UNEJYZ4T.js +0 -102
  72. package/dist/chunk-VVSHZV5S.js +0 -73
  73. package/dist/chunk-WHVK6FUB.js +0 -11
  74. package/dist/chunk-WNUXMPVX.js +0 -1
  75. package/dist/chunk-XYUJTIPE.js +0 -203
  76. package/dist/chunk-YJPFEL2E.js +0 -1
  77. package/dist/chunk-Z4EHBBL4.js +0 -41
  78. package/dist/contracts-GUXGFCVV.js +0 -1
  79. package/dist/core-schema-Y47YFKH2.js +0 -899
  80. package/dist/dispatch-ILBBKOSW.js +0 -1
  81. package/dist/editorial-reading-room/assets/app.js +0 -433
  82. package/dist/editorial-reading-room/assets/index.html +0 -139
  83. package/dist/editorial-reading-room/assets/styles.css +0 -1091
  84. package/dist/index.d.cts +0 -607
  85. package/dist/media-artifacts-67CJWI7O.js +0 -1
  86. package/dist/metering-YHZ46GV4.js +0 -1
  87. package/dist/migrations-3AKEC5QE.js +0 -1
  88. package/dist/queue-VOGXQDPR.js +0 -1
  89. package/dist/reconciliation-OXBG7JA2.js +0 -1
  90. package/dist/report-artifact-offload-6OOY2PTM.js +0 -1
  91. package/dist/repository-CYXVMYAI.js +0 -1
  92. package/dist/repository-UKDA4IWP.js +0 -1
  93. package/dist/server-6HUBN3OR.js +0 -5547
  94. package/dist/settlement-3PS32LQO.js +0 -1
  95. package/dist/worker-NXRU3TT3.js +0 -1
  96. package/public/.well-known/xray-install.json +0 -183
  97. package/public/agent-install.md +0 -200
@@ -1,10 +0,0 @@
1
- function Ue(r){return typeof r=="object"&&r!==null&&("name"in r&&r.name==="AbortError"||"message"in r&&String(r.message).includes("FetchRequestCanceledException"))}var ve=r=>{if(r instanceof Error)return r;if(typeof r=="object"&&r!==null){try{if(Object.prototype.toString.call(r)==="[object Error]"){let e=new Error(r.message,r.cause?{cause:r.cause}:{});return r.stack&&(e.stack=r.stack),r.cause&&!e.cause&&(e.cause=r.cause),r.name&&(e.name=r.name),e}}catch{}try{return new Error(JSON.stringify(r))}catch{}}return new Error(r)};var x=class extends Error{},I=class r extends x{constructor(e,t,n,o){super(`${r.makeMessage(e,t,n)}`),this.status=e,this.headers=o,this.error=t}static makeMessage(e,t,n){let o=t?.message?typeof t.message=="string"?t.message:JSON.stringify(t.message):t?JSON.stringify(t):n;return e&&o?`${e} ${o}`:e?`${e} status code (no body)`:o||"(no status code or body)"}static generate(e,t,n,o){if(!e||!o)return new K({message:n,cause:ve(t)});let s=t;return e===400?new fe(e,s,n,o):e===401?new de(e,s,n,o):e===403?new pe(e,s,n,o):e===404?new he(e,s,n,o):e===409?new me(e,s,n,o):e===422?new ye(e,s,n,o):e===429?new ge(e,s,n,o):e>=500?new we(e,s,n,o):new r(e,s,n,o)}},T=class extends I{constructor({message:e}={}){super(void 0,void 0,e||"Request was aborted.",void 0)}},K=class extends I{constructor({message:e,cause:t}){super(void 0,void 0,e||"Connection error.",void 0),t&&(this.cause=t)}},D=class extends K{constructor({message:e}={}){super({message:e??"Request timed out."})}},fe=class extends I{},de=class extends I{},pe=class extends I{},he=class extends I{},me=class extends I{},ye=class extends I{},ge=class extends I{},we=class extends I{};function S(r,e,t,n,o){if(n==="m")throw new TypeError("Private method is not writable");if(n==="a"&&!o)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?r!==e||!o:!e.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return n==="a"?o.call(r,t):o?o.value=t:e.set(r,t),t}function _(r,e,t,n){if(t==="a"&&!n)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?r!==e||!n:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return t==="m"?n:t==="a"?n.call(r):n?n.value:e.get(r)}var ct=function(){let{crypto:r}=globalThis;if(r?.randomUUID)return ct=r.randomUUID.bind(r),r.randomUUID();let e=new Uint8Array(1),t=r?()=>r.getRandomValues(e)[0]:()=>Math.random()*255&255;return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,n=>(+n^t()&15>>+n/4).toString(16))};var Er=/^[a-z][a-z0-9+.-]*:/i,vt=r=>Er.test(r),$=r=>($=Array.isArray,$(r)),lt=$;function ut(r){return typeof r!="object"?{}:r??{}}function ft(r){if(!r)return!0;for(let e in r)return!1;return!0}function Dt(r,e){return Object.prototype.hasOwnProperty.call(r,e)}var Nt=(r,e)=>{if(typeof e!="number"||!Number.isInteger(e))throw new x(`${r} must be an integer`);if(e<0)throw new x(`${r} must be a positive integer`);return e},Sr=r=>{if(typeof r=="number")return Math.round(r);if(typeof r=="string")return parseInt(r,10);throw new x(`Could not coerce ${r} (type: ${typeof r}) into a number`)};var Ir=r=>typeof r=="boolean"?r:typeof r=="string"?r==="true":!!r,Ht=r=>{if(r!=null)return Sr(r)};var dt=r=>{if(r!=null)return Ir(r)},Bt=r=>{try{return JSON.parse(r)}catch{return}};var Mt=r=>new Promise(e=>setTimeout(e,r));var W="0.93.0";function $r(){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 Lr=()=>{let r=$r();if(r==="deno")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":W,"X-Stainless-OS":Kt(Deno.build.os),"X-Stainless-Arch":qt(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":W,"X-Stainless-OS":"Unknown","X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":"edge","X-Stainless-Runtime-Version":globalThis.process.version};if(r==="node")return{"X-Stainless-Lang":"js","X-Stainless-Package-Version":W,"X-Stainless-OS":Kt(globalThis.process.platform??"unknown"),"X-Stainless-Arch":qt(globalThis.process.arch??"unknown"),"X-Stainless-Runtime":"node","X-Stainless-Runtime-Version":globalThis.process.version??"unknown"};let e=Tr();return e?{"X-Stainless-Lang":"js","X-Stainless-Package-Version":W,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":`browser:${e.browser}`,"X-Stainless-Runtime-Version":e.version}:{"X-Stainless-Lang":"js","X-Stainless-Package-Version":W,"X-Stainless-OS":"Unknown","X-Stainless-Arch":"unknown","X-Stainless-Runtime":"unknown","X-Stainless-Runtime-Version":"unknown"}};function Tr(){if(typeof navigator>"u"||!navigator)return null;let r=[{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:e,pattern:t}of r){let n=t.exec(navigator.userAgent);if(n){let o=n[1]||0,s=n[2]||0,a=n[3]||0;return{browser:e,version:`${o}.${s}.${a}`}}}return null}var qt=r=>r==="x32"?"x32":r==="x86_64"||r==="x64"?"x64":r==="arm"?"arm":r==="aarch64"||r==="arm64"?"arm64":r?`other:${r}`:"unknown",Kt=r=>(r=r.toLowerCase(),r.includes("ios")?"iOS":r==="android"?"Android":r==="darwin"?"MacOS":r==="win32"?"Windows":r==="freebsd"?"FreeBSD":r==="openbsd"?"OpenBSD":r==="linux"?"Linux":r?`Other:${r}`:"Unknown"),Wt,Xt=()=>Wt??(Wt=Lr());function zt(){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 pt(...r){let e=globalThis.ReadableStream;if(typeof e>"u")throw new Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new e(...r)}function ze(r){let e=Symbol.asyncIterator in r?r[Symbol.asyncIterator]():r[Symbol.iterator]();return pt({start(){},async pull(t){let{done:n,value:o}=await e.next();n?t.close():t.enqueue(o)},async cancel(){await e.return?.()}})}function ht(r){if(r[Symbol.asyncIterator])return r;let e=r.getReader();return{async next(){try{let t=await e.read();return t?.done&&e.releaseLock(),t}catch(t){throw e.releaseLock(),t}},async return(){let t=e.cancel();return e.releaseLock(),await t,{done:!0,value:void 0}},[Symbol.asyncIterator](){return this}}}async function Vt(r){if(r===null||typeof r!="object")return;if(r[Symbol.asyncIterator]){await r[Symbol.asyncIterator]().return?.();return}let e=r.getReader(),t=e.cancel();e.releaseLock(),await t}var Jt=({headers:r,body:e})=>({bodyHeaders:{"content-type":"application/json"},body:JSON.stringify(e)});var mt="RFC3986",yt=r=>String(r),gt={RFC1738:r=>String(r).replace(/%20/g,"+"),RFC3986:yt},Gt="RFC1738";var Ve=(r,e)=>(Ve=Object.hasOwn??Function.prototype.call.bind(Object.prototype.hasOwnProperty),Ve(r,e)),v=(()=>{let r=[];for(let e=0;e<256;++e)r.push("%"+((e<16?"0":"")+e.toString(16)).toUpperCase());return r})();var wt=1024,Qt=(r,e,t,n,o)=>{if(r.length===0)return r;let s=r;if(typeof r=="symbol"?s=Symbol.prototype.toString.call(r):typeof r!="string"&&(s=String(r)),t==="iso-8859-1")return escape(s).replace(/%u[0-9a-f]{4}/gi,function(c){return"%26%23"+parseInt(c.slice(2),16)+"%3B"});let a="";for(let c=0;c<s.length;c+=wt){let f=s.length>=wt?s.slice(c,c+wt):s,d=[];for(let m=0;m<f.length;++m){let l=f.charCodeAt(m);if(l===45||l===46||l===95||l===126||l>=48&&l<=57||l>=65&&l<=90||l>=97&&l<=122||o===Gt&&(l===40||l===41)){d[d.length]=f.charAt(m);continue}if(l<128){d[d.length]=v[l];continue}if(l<2048){d[d.length]=v[192|l>>6]+v[128|l&63];continue}if(l<55296||l>=57344){d[d.length]=v[224|l>>12]+v[128|l>>6&63]+v[128|l&63];continue}m+=1,l=65536+((l&1023)<<10|f.charCodeAt(m)&1023),d[d.length]=v[240|l>>18]+v[128|l>>12&63]+v[128|l>>6&63]+v[128|l&63]}a+=d.join("")}return a};function Yt(r){return!r||typeof r!="object"?!1:!!(r.constructor&&r.constructor.isBuffer&&r.constructor.isBuffer(r))}function bt(r,e){if($(r)){let t=[];for(let n=0;n<r.length;n+=1)t.push(e(r[n]));return t}return e(r)}var er={brackets(r){return String(r)+"[]"},comma:"comma",indices(r,e){return String(r)+"["+e+"]"},repeat(r){return String(r)}},tr=function(r,e){Array.prototype.push.apply(r,$(e)?e:[e])},Zt,R={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:Qt,encodeValuesOnly:!1,format:mt,formatter:yt,indices:!1,serializeDate(r){return(Zt??(Zt=Function.prototype.call.bind(Date.prototype.toISOString)))(r)},skipNulls:!1,strictNullHandling:!1};function Cr(r){return typeof r=="string"||typeof r=="number"||typeof r=="boolean"||typeof r=="symbol"||typeof r=="bigint"}var xt={};function rr(r,e,t,n,o,s,a,c,f,d,m,l,g,h,A,E,U,k){let b=r,J=k,G=0,it=!1;for(;(J=J.get(xt))!==void 0&&!it;){let L=J.get(r);if(G+=1,typeof L<"u"){if(L===G)throw new RangeError("Cyclic object value");it=!0}typeof J.get(xt)>"u"&&(G=0)}if(typeof d=="function"?b=d(e,b):b instanceof Date?b=g?.(b):t==="comma"&&$(b)&&(b=bt(b,function(L){return L instanceof Date?g?.(L):L})),b===null){if(s)return f&&!E?f(e,R.encoder,U,"key",h):e;b=""}if(Cr(b)||Yt(b)){if(f){let L=E?e:f(e,R.encoder,U,"key",h);return[A?.(L)+"="+A?.(f(b,R.encoder,U,"value",h))]}return[A?.(e)+"="+A?.(String(b))]}let q=[];if(typeof b>"u")return q;let Fe;if(t==="comma"&&$(b))E&&f&&(b=bt(b,f)),Fe=[{value:b.length>0?b.join(",")||null:void 0}];else if($(d))Fe=d;else{let L=Object.keys(b);Fe=m?L.sort(m):L}let kt=c?String(e).replace(/\./g,"%2E"):String(e),Xe=n&&$(b)&&b.length===1?kt+"[]":kt;if(o&&$(b)&&b.length===0)return Xe+"[]";for(let L=0;L<Fe.length;++L){let ue=Fe[L],Ft=typeof ue=="object"&&typeof ue.value<"u"?ue.value:b[ue];if(a&&Ft===null)continue;let at=l&&c?ue.replace(/\./g,"%2E"):ue,Rr=$(b)?typeof t=="function"?t(Xe,at):Xe:Xe+(l?"."+at:"["+at+"]");k.set(r,G);let Ut=new WeakMap;Ut.set(xt,k),tr(q,rr(Ft,Rr,t,n,o,s,a,c,t==="comma"&&E&&$(b)?null:f,d,m,l,g,h,A,E,U,Ut))}return q}function kr(r=R){if(typeof r.allowEmptyArrays<"u"&&typeof r.allowEmptyArrays!="boolean")throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(typeof r.encodeDotInKeys<"u"&&typeof r.encodeDotInKeys!="boolean")throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(r.encoder!==null&&typeof r.encoder<"u"&&typeof r.encoder!="function")throw new TypeError("Encoder has to be a function.");let e=r.charset||R.charset;if(typeof r.charset<"u"&&r.charset!=="utf-8"&&r.charset!=="iso-8859-1")throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");let t=mt;if(typeof r.format<"u"){if(!Ve(gt,r.format))throw new TypeError("Unknown format option provided.");t=r.format}let n=gt[t],o=R.filter;(typeof r.filter=="function"||$(r.filter))&&(o=r.filter);let s;if(r.arrayFormat&&r.arrayFormat in er?s=r.arrayFormat:"indices"in r?s=r.indices?"indices":"repeat":s=R.arrayFormat,"commaRoundTrip"in r&&typeof r.commaRoundTrip!="boolean")throw new TypeError("`commaRoundTrip` must be a boolean, or absent");let a=typeof r.allowDots>"u"?r.encodeDotInKeys?!0:R.allowDots:!!r.allowDots;return{addQueryPrefix:typeof r.addQueryPrefix=="boolean"?r.addQueryPrefix:R.addQueryPrefix,allowDots:a,allowEmptyArrays:typeof r.allowEmptyArrays=="boolean"?!!r.allowEmptyArrays:R.allowEmptyArrays,arrayFormat:s,charset:e,charsetSentinel:typeof r.charsetSentinel=="boolean"?r.charsetSentinel:R.charsetSentinel,commaRoundTrip:!!r.commaRoundTrip,delimiter:typeof r.delimiter>"u"?R.delimiter:r.delimiter,encode:typeof r.encode=="boolean"?r.encode:R.encode,encodeDotInKeys:typeof r.encodeDotInKeys=="boolean"?r.encodeDotInKeys:R.encodeDotInKeys,encoder:typeof r.encoder=="function"?r.encoder:R.encoder,encodeValuesOnly:typeof r.encodeValuesOnly=="boolean"?r.encodeValuesOnly:R.encodeValuesOnly,filter:o,format:t,formatter:n,serializeDate:typeof r.serializeDate=="function"?r.serializeDate:R.serializeDate,skipNulls:typeof r.skipNulls=="boolean"?r.skipNulls:R.skipNulls,sort:typeof r.sort=="function"?r.sort:null,strictNullHandling:typeof r.strictNullHandling=="boolean"?r.strictNullHandling:R.strictNullHandling}}function nr(r,e={}){let t=r,n=kr(e),o,s;typeof n.filter=="function"?(s=n.filter,t=s("",t)):$(n.filter)&&(s=n.filter,o=s);let a=[];if(typeof t!="object"||t===null)return"";let c=er[n.arrayFormat],f=c==="comma"&&n.commaRoundTrip;o||(o=Object.keys(t)),n.sort&&o.sort(n.sort);let d=new WeakMap;for(let g=0;g<o.length;++g){let h=o[g];n.skipNulls&&t[h]===null||tr(a,rr(t[h],h,c,f,n.allowEmptyArrays,n.strictNullHandling,n.skipNulls,n.encodeDotInKeys,n.encode?n.encoder:null,n.filter,n.sort,n.allowDots,n.serializeDate,n.format,n.formatter,n.encodeValuesOnly,n.charset,d))}let m=a.join(n.delimiter),l=n.addQueryPrefix===!0?"?":"";return n.charsetSentinel&&(n.charset==="iso-8859-1"?l+="utf8=%26%2310003%3B&":l+="utf8=%E2%9C%93&"),m.length>0?l+m:""}function or(r){return nr(r,{arrayFormat:"comma"})}function ar(r){let e=0;for(let o of r)e+=o.length;let t=new Uint8Array(e),n=0;for(let o of r)t.set(o,n),n+=o.length;return t}var sr;function De(r){let e;return(sr??(e=new globalThis.TextEncoder,sr=e.encode.bind(e)))(r)}var ir;function _t(r){let e;return(ir??(e=new globalThis.TextDecoder,ir=e.decode.bind(e)))(r)}var j,C,Q=class{constructor(){j.set(this,void 0),C.set(this,void 0),S(this,j,new Uint8Array,"f"),S(this,C,null,"f")}decode(e){if(e==null)return[];let t=e instanceof ArrayBuffer?new Uint8Array(e):typeof e=="string"?De(e):e;S(this,j,ar([_(this,j,"f"),t]),"f");let n=[],o;for(;(o=Ur(_(this,j,"f"),_(this,C,"f")))!=null;){if(o.carriage&&_(this,C,"f")==null){S(this,C,o.index,"f");continue}if(_(this,C,"f")!=null&&(o.index!==_(this,C,"f")+1||o.carriage)){n.push(_t(_(this,j,"f").subarray(0,_(this,C,"f")-1))),S(this,j,_(this,j,"f").subarray(_(this,C,"f")),"f"),S(this,C,null,"f");continue}let s=_(this,C,"f")!==null?o.preceding-1:o.preceding,a=_t(_(this,j,"f").subarray(0,s));n.push(a),S(this,j,_(this,j,"f").subarray(o.index),"f"),S(this,C,null,"f")}return n}flush(){return _(this,j,"f").length?this.decode(`
2
- `):[]}};j=new WeakMap,C=new WeakMap;Q.NEWLINE_CHARS=new Set([`
3
- `,"\r"]);Q.NEWLINE_REGEXP=/\r\n|[\n\r]/g;function Ur(r,e){for(let o=e??0;o<r.length;o++){if(r[o]===10)return{preceding:o,index:o+1,carriage:!1};if(r[o]===13)return{preceding:o,index:o+1,carriage:!0}}return null}function cr(r){for(let n=0;n<r.length-1;n++){if(r[n]===10&&r[n+1]===10||r[n]===13&&r[n+1]===13)return n+2;if(r[n]===13&&r[n+1]===10&&n+3<r.length&&r[n+2]===13&&r[n+3]===10)return n+4}return-1}var Ge={off:0,error:200,warn:300,info:400,debug:500},At=(r,e,t)=>{if(r){if(Dt(Ge,r))return r;P(t).warn(`${e} was set to ${JSON.stringify(r)}, expected one of ${JSON.stringify(Object.keys(Ge))}`)}};function Ne(){}function Je(r,e,t){return!e||Ge[r]>Ge[t]?Ne:e[r].bind(e)}var vr={error:Ne,warn:Ne,info:Ne,debug:Ne},lr=new WeakMap;function P(r){let e=r.logger,t=r.logLevel??"off";if(!e)return vr;let n=lr.get(e);if(n&&n[0]===t)return n[1];let o={error:Je("error",e,t),warn:Je("warn",e,t),info:Je("info",e,t),debug:Je("debug",e,t)};return lr.set(e,[t,o]),o}var N=r=>(r.options&&(r.options={...r.options},delete r.options.headers),r.headers&&(r.headers=Object.fromEntries((r.headers instanceof Headers?[...r.headers]:Object.entries(r.headers)).map(([e,t])=>[e,e.toLowerCase()==="authorization"||e.toLowerCase()==="api-key"||e.toLowerCase()==="x-api-key"||e.toLowerCase()==="cookie"||e.toLowerCase()==="set-cookie"?"***":t]))),"retryOfRequestLogID"in r&&(r.retryOfRequestLogID&&(r.retryOf=r.retryOfRequestLogID),delete r.retryOfRequestLogID),r);var He,Qe=class r{constructor(e,t,n){this.iterator=e,He.set(this,void 0),this.controller=t,S(this,He,n,"f")}static fromSSEResponse(e,t,n){let o=!1,s=n?P(n):console;async function*a(){if(o)throw new x("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");o=!0;let c=!1;try{for await(let f of Dr(e,t))try{yield JSON.parse(f.data)}catch(d){throw s.error("Could not parse message into JSON:",f.data),s.error("From chunk:",f.raw),d}c=!0}catch(f){if(Ue(f))return;throw f}finally{c||t.abort()}}return new r(a,t,n)}static fromReadableStream(e,t,n){let o=!1;async function*s(){let c=new Q,f=ht(e);for await(let d of f)for(let m of c.decode(d))yield m;for(let d of c.flush())yield d}async function*a(){if(o)throw new x("Cannot iterate over a consumed stream, use `.tee()` to split the stream.");o=!0;let c=!1;try{for await(let f of s())c||f&&(yield JSON.parse(f));c=!0}catch(f){if(Ue(f))return;throw f}finally{c||t.abort()}}return new r(a,t,n)}[(He=new WeakMap,Symbol.asyncIterator)](){return this.iterator()}tee(){let e=[],t=[],n=this.iterator(),o=s=>({next:()=>{if(s.length===0){let a=n.next();e.push(a),t.push(a)}return s.shift()}});return[new r(()=>o(e),this.controller,_(this,He,"f")),new r(()=>o(t),this.controller,_(this,He,"f"))]}toReadableStream(){let e=this,t;return pt({async start(){t=e[Symbol.asyncIterator]()},async pull(n){try{let{value:o,done:s}=await t.next();if(s)return n.close();let a=De(JSON.stringify(o)+`
4
- `);n.enqueue(a)}catch(o){n.error(o)}},async cancel(){await t.return?.()}})}};async function*Dr(r,e){if(!r.body)throw e.abort(),typeof globalThis.navigator<"u"&&globalThis.navigator.product==="ReactNative"?new x("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 x("Attempted to iterate over a response with no body");let t=new Rt,n=new Q,o=ht(r.body);for await(let s of Nr(o))for(let a of n.decode(s)){let c=t.decode(a);c&&(yield c)}for(let s of n.flush()){let a=t.decode(s);a&&(yield a)}}async function*Nr(r){let e=new Uint8Array;for await(let t of r){if(t==null)continue;let n=t instanceof ArrayBuffer?new Uint8Array(t):typeof t=="string"?De(t):t,o=new Uint8Array(e.length+n.length);o.set(e),o.set(n,e.length),e=o;let s;for(;(s=cr(e))!==-1;)yield e.slice(0,s),e=e.slice(s)}e.length>0&&(yield e)}var Rt=class{constructor(){this.event=null,this.data=[],this.chunks=[]}decode(e){if(e.endsWith("\r")&&(e=e.substring(0,e.length-1)),!e){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(e),e.startsWith(":"))return null;let[t,n,o]=Hr(e,":");return o.startsWith(" ")&&(o=o.substring(1)),t==="event"?this.event=o:t==="data"&&this.data.push(o),null}};function Hr(r,e){let t=r.indexOf(e);return t!==-1?[r.substring(0,t),e,r.substring(t+e.length)]:[r,"",""]}async function Ye(r,e){let{response:t,requestLogID:n,retryOfRequestLogID:o,startTime:s}=e,a=await(async()=>{if(e.options.stream)return P(r).debug("response",t.status,t.url,t.headers,t.body),e.options.__streamClass?e.options.__streamClass.fromSSEResponse(t,e.controller,r):Qe.fromSSEResponse(t,e.controller,r);if(t.status===204)return null;if(e.options.__binaryResponse)return t;let f=t.headers.get("content-type")?.split(";")[0]?.trim();return f?.includes("application/json")||f?.endsWith("+json")?t.headers.get("content-length")==="0"?void 0:await t.json():await t.text()})();return P(r).debug(`[${n}] response parsed`,N({retryOfRequestLogID:o,url:t.url,status:t.status,body:a,durationMs:Date.now()-s})),a}var Be,Y=class r extends Promise{constructor(e,t,n=Ye){super(o=>{o(null)}),this.responsePromise=t,this.parseResponse=n,Be.set(this,void 0),S(this,Be,e,"f")}_thenUnwrap(e){return new r(_(this,Be,"f"),this.responsePromise,async(t,n)=>e(await this.parseResponse(t,n),n))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t}}parse(){return this.parsedPromise||(this.parsedPromise=this.responsePromise.then(e=>this.parseResponse(_(this,Be,"f"),e))),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};Be=new WeakMap;var Ze,et=class{constructor(e,t,n,o){Ze.set(this,void 0),S(this,Ze,e,"f"),this.options=o,this.response=t,this.body=n}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new x("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await _(this,Ze,"f").requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(Ze=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},Me=class extends Y{constructor(e,t,n){super(e,t,async(o,s)=>new n(o,s.response,await Ye(o,s),s.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},tt=class extends et{constructor(e,t,n,o){super(e,t,n,o),this.items=n||[],this.next_page_token=this.response.headers.get("x-next-page-token")??null,this.has_more=dt(this.response.headers.get("x-has-more"))??null}getPaginatedItems(){return this.items??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let e=this.next_page_token;return e?{...this.options,query:{...ut(this.options.query),page_token:e}}:null}},w=class extends et{constructor(e,t,n,o){super(e,t,n,o),this.items=n||[],this.has_more=dt(this.response.headers.get("x-has-more"))??null,this.next_offset=Ht(this.response.headers.get("x-next-offset"))??null}getPaginatedItems(){return this.items??[]}hasNextPage(){return this.has_more===!1?!1:super.hasNextPage()}nextPageRequestOptions(){let e=this.next_offset;if(e==null){if(this.has_more)throw new x("Server reported X-Has-More: true without an X-Next-Offset header; refusing to silently truncate pagination");return null}return e===0?null:{...this.options,query:{...ut(this.options.query),offset:e}}}};var St=()=>{if(typeof File>"u"){let{process:r}=globalThis,e=typeof r?.versions?.node=="string"&&parseInt(r.versions.node.split("."))<20;throw new Error("`File` is not defined as a global, which is required for file uploads."+(e?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":""))}};function be(r,e,t){return St(),new File(r,e??"unknown_file",t)}function qe(r){return(typeof r=="object"&&r!==null&&("name"in r&&r.name&&String(r.name)||"url"in r&&r.url&&String(r.url)||"filename"in r&&r.filename&&String(r.filename)||"path"in r&&r.path&&String(r.path))||"").split(/[\\/]/).pop()||void 0}var rt=r=>r!=null&&typeof r=="object"&&typeof r[Symbol.asyncIterator]=="function";var H=async(r,e)=>({...r,body:await qr(r.body,e)}),ur=new WeakMap;function Mr(r){let e=typeof r=="function"?r:r.fetch,t=ur.get(e);if(t)return t;let n=(async()=>{try{let o="Response"in e?e.Response:(await e("data:,")).constructor,s=new FormData;return s.toString()!==await new o(s).text()}catch{return!0}})();return ur.set(e,n),n}var qr=async(r,e)=>{if(!await Mr(e))throw new TypeError("The provided fetch function does not support file uploads with the current global FormData class.");let t=new FormData;return await Promise.all(Object.entries(r||{}).map(([n,o])=>Et(t,n,o))),t},fr=r=>r instanceof Blob&&"name"in r,Kr=r=>typeof r=="object"&&r!==null&&(r instanceof Response||rt(r)||fr(r)),Pt=r=>{if(Kr(r))return!0;if(Array.isArray(r))return r.some(Pt);if(r&&typeof r=="object"){for(let e in r)if(Pt(r[e]))return!0}return!1},Et=async(r,e,t)=>{if(t!==void 0){if(t==null)throw new TypeError(`Received null for "${e}"; to pass null in FormData, you must use the string 'null'`);if(typeof t=="string"||typeof t=="number"||typeof t=="boolean")r.append(e,String(t));else if(t instanceof Response)r.append(e,be([await t.blob()],qe(t)));else if(rt(t))r.append(e,be([await new Response(ze(t)).blob()],qe(t)));else if(fr(t))r.append(e,t,qe(t));else if(Array.isArray(t))await Promise.all(t.map((n,o)=>Et(r,`${e}[${o}]`,n)));else if(typeof t=="object")!(e==="env_vars")&&!Pt(t)?Object.entries(t).filter(([s,a])=>a!==void 0).length>0&&r.append(e,JSON.stringify(t)):await Promise.all(Object.entries(t).map(([o,s])=>Et(r,`${e}[${o}]`,s)));else throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${t} instead`)}};var dr=r=>r!=null&&typeof r=="object"&&typeof r.size=="number"&&typeof r.type=="string"&&typeof r.text=="function"&&typeof r.slice=="function"&&typeof r.arrayBuffer=="function",Wr=r=>r!=null&&typeof r=="object"&&typeof r.name=="string"&&typeof r.lastModified=="number"&&dr(r),Xr=r=>r!=null&&typeof r=="object"&&typeof r.url=="string"&&typeof r.blob=="function";async function nt(r,e,t){if(St(),r=await r,Wr(r))return r instanceof File?r:be([await r.arrayBuffer()],r.name);if(Xr(r)){let o=await r.blob();return e||(e=new URL(r.url).pathname.split(/[\\/]/).pop()),be(await It(o),e,t)}let n=await It(r);if(e||(e=qe(r)),!t?.type){let o=n.find(s=>typeof s=="object"&&"type"in s&&s.type);typeof o=="string"&&(t={...t,type:o})}return be(n,e,t)}async function It(r){let e=[];if(typeof r=="string"||ArrayBuffer.isView(r)||r instanceof ArrayBuffer)e.push(r);else if(dr(r))e.push(r instanceof Blob?r:await r.arrayBuffer());else if(rt(r))for await(let t of r)e.push(...await It(t));else{let t=r?.constructor?.name;throw new Error(`Unexpected data type: ${typeof r}${t?`; constructor: ${t}`:""}${zr(r)}`)}return e}function zr(r){return typeof r!="object"||r===null?"":`; props: [${Object.getOwnPropertyNames(r).map(t=>`"${t}"`).join(", ")}]`}var p=class{constructor(e){this._client=e}};var pr=Symbol("brand.privateNullableHeaders");function*Jr(r){if(!r)return;if(pr in r){let{values:n,nulls:o}=r;yield*n.entries();for(let s of o)yield[s,null];return}let e=!1,t;r instanceof Headers?t=r.entries():lt(r)?t=r:(e=!0,t=Object.entries(r??{}));for(let n of t){let o=n[0];if(typeof o!="string")throw new TypeError("expected header name to be a string");let s=lt(n[1])?n[1]:[n[1]],a=!1;for(let c of s)c!==void 0&&(e&&!a&&(a=!0,yield[o,null]),yield[o,c])}}var u=r=>{let e=new Headers,t=new Set;for(let n of r){let o=new Set;for(let[s,a]of Jr(n)){let c=s.toLowerCase();o.has(c)||(e.delete(s),o.add(c)),a===null?(e.delete(s),t.add(c)):(e.append(s,a),t.delete(c))}}return{[pr]:!0,values:e,nulls:t}};function mr(r){return r.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}var hr=Object.freeze(Object.create(null)),Gr=(r=mr)=>function(t,...n){if(t.length===1)return t[0];let o=!1,s=[],a=t.reduce((m,l,g)=>{/[?#]/.test(l)&&(o=!0);let h=n[g],A=(o?encodeURIComponent:r)(""+h);return g!==n.length&&(h==null||typeof h=="object"&&h.toString===Object.getPrototypeOf(Object.getPrototypeOf(h.hasOwnProperty??hr)??hr)?.toString)&&(A=h+"",s.push({start:m.length+l.length,length:A.length,error:`Value of type ${Object.prototype.toString.call(h).slice(8,-1)} is not a valid path parameter`})),m+l+(g===n.length?"":A)},""),c=a.split(/[?#]/,1)[0],f=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,d;for(;(d=f.exec(c))!==null;)s.push({start:d.index,length:d[0].length,error:`Value "${d[0]}" can't be safely passed as a path parameter`});if(s.sort((m,l)=>m.start-l.start),s.length>0){let m=0,l=s.reduce((g,h)=>{let A=" ".repeat(h.start-m),E="^".repeat(h.length);return m=h.start+h.length,g+A+E},"");throw new x(`Path parameters result in path with invalid segments:
6
- ${s.map(g=>g.error).join(`
7
- `)}
8
- ${a}
9
- ${l}`)}return a},i=Gr(mr);var Z=class extends p{create(e,t){return this._client.post("/org/api_keys",{body:e,...t})}retrieve(e,t={},n){return this._client.get(i`/org/api_keys/${e}`,{query:t,...n})}update(e,t,n){return this._client.patch(i`/org/api_keys/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/org/api_keys",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/org/api_keys/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}rotate(e,t={},n){return this._client.post(i`/org/api_keys/${e}/rotate`,{body:t,...n})}};var ee=class extends p{list(e={},t){return this._client.getAPIList("/apps",w,{query:e,...t})}};var xe=class extends p{create(e,t){return this._client.post("/audit-logs/export/destinations",{body:e,...t})}retrieve(e,t){return this._client.get(i`/audit-logs/export/destinations/${e}`,t)}update(e,t,n){return this._client.patch(i`/audit-logs/export/destinations/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/audit-logs/export/destinations",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/audit-logs/export/destinations/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}test(e,t){return this._client.post(i`/audit-logs/export/destinations/${e}/test`,t)}};var Yr=6,Zr=5e4,en=8e3,F=class extends x{};async function gr(r,e,t,n,o={}){if(!t||typeof t.write!="function")throw new TypeError("audit log download destination must provide write()");let{onProgress:s,maxTransferRetries:a=Yr,...c}=o;if(!Number.isInteger(a)||a<0)throw new TypeError("maxTransferRetries must be a non-negative integer");let f=c.timeout??n,d,m={bytesWritten:0,chunks:0,rows:0},l=new Set;for(;;){let g=await tn(r,d?{...e,cursor:d}:e,c,a,f),{nextCursor:h,hasMore:A,rows:E}=rn(g.headers,d);if(A&&h){if(l.has(h))throw new F("response repeated X-Next-Cursor header");l.add(h)}if(await sn(t,g.body),d=h,m.bytesWritten+=g.body.byteLength,m.chunks+=1,m.rows+=E,s&&await s({...m,chunkRows:E}),!A)return m}}async function tn(r,e,t,n,o){for(let s=0;;s+=1){let a=new AbortController,c=()=>a.abort();t.signal?.aborted?a.abort():t.signal?.addEventListener("abort",c,{once:!0});let f;try{f=await r(e,{...t,signal:a.signal})}catch(l){throw t.signal?.removeEventListener("abort",c),l}let d=!1,m=setTimeout(()=>{d=!0,a.abort()},o);try{let l=new Uint8Array(await f.arrayBuffer());if(clearTimeout(m),t.signal?.aborted)throw new T;if(d)throw new D;let g=f.headers.get("x-content-sha256");if(!g)throw new F("response missing X-Content-Sha256 header");let h=await nn(l);if(t.signal?.aborted)throw new T;if(h!==g)throw new F(`audit log chunk checksum mismatch (got ${h}, want ${g})`);return{body:l,headers:f.headers}}catch(l){if(t.signal?.aborted&&!(l instanceof T)?l=new T:d&&(l=new D),s===n||l instanceof T)throw l;await on(s+1,t.signal)}finally{clearTimeout(m),t.signal?.removeEventListener("abort",c)}}}function rn(r,e){let t=r.get("x-has-more");if(t!=="true"&&t!=="false")throw new F("response missing or invalid X-Has-More header");let n=t==="true",o=r.get("x-row-count");if(o===null||!/^[0-9]+$/.test(o))throw new F("response missing or invalid X-Row-Count header");let s=Number(o);if(!Number.isSafeInteger(s)||s>Zr)throw new F("response missing or invalid X-Row-Count header");let a=r.get("x-next-cursor")||void 0;if(n&&(!a||a===e))throw new F("response has invalid X-Next-Cursor header");if(!n&&a)throw new F("response returned a cursor after the final chunk");return{rows:s,nextCursor:a,hasMore:n}}async function nn(r){let e=await globalThis.crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(e),t=>t.toString(16).padStart(2,"0")).join("")}async function on(r,e){let t=Math.min(1e3*2**(r-1),en);await new Promise((n,o)=>{if(e?.aborted){o(new T);return}let s=()=>{clearTimeout(a),o(new T)},a=setTimeout(()=>{e?.removeEventListener("abort",s),n()},t);e?.addEventListener("abort",s,{once:!0})})}async function sn(r,e){let t=0;for(;t<e.byteLength;){let n=await r.write(t===0?e:e.subarray(t));if(typeof n=="number"){t+=yr(n,e.byteLength-t);continue}if(n&&typeof n=="object"&&"bytesWritten"in n){let o=n.bytesWritten;t+=yr(o,e.byteLength-t);continue}return}}function yr(r,e){if(!Number.isSafeInteger(r)||r<=0||r>e)throw new F("audit log download destination performed a short write");return r}var X=class extends p{constructor(){super(...arguments),this.exportDestinations=new xe(this._client)}list(e,t){return this._client.getAPIList("/audit-logs",tt,{query:e,...t})}exportChunk(e,t){return this._client.get("/audit-logs/export/chunk",{query:e,...t,headers:u([{Accept:"application/octet-stream"},t?.headers]),__binaryResponse:!0})}download(e,t,n){return gr((o,s)=>this.exportChunk(o,s),e,t,this._client.timeout,n)}};X.ExportDestinations=xe;var _e=class extends p{create(e,t){return this._client.post("/auth/connections",{body:e,...t})}retrieve(e,t){return this._client.get(i`/auth/connections/${e}`,t)}update(e,t,n){return this._client.patch(i`/auth/connections/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/auth/connections",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/auth/connections/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}follow(e,t){return this._client.get(i`/auth/connections/${e}/events`,{...t,headers:u([{Accept:"text/event-stream"},t?.headers]),stream:!0})}login(e,t={},n){return this._client.post(i`/auth/connections/${e}/login`,{body:t,...n})}submit(e,t,n){return this._client.post(i`/auth/connections/${e}/submit`,{body:t,...n})}timeline(e,t={},n){return this._client.getAPIList(i`/auth/connections/${e}/timeline`,w,{query:t,...n})}};var Ae=class extends p{retrieve(e){return this._client.get("/auth/context",e)}};var B=class extends p{constructor(){super(...arguments),this.context=new Ae(this._client),this.connections=new _e(this._client)}};B.Context=Ae;B.Connections=_e;var te=class extends p{create(e,t){return this._client.post("/browser_pools",{body:e,...t})}retrieve(e,t){return this._client.get(i`/browser_pools/${e}`,t)}update(e,t,n){return this._client.patch(i`/browser_pools/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/browser_pools",w,{query:e,...t})}delete(e,t={},n){return this._client.delete(i`/browser_pools/${e}`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}acquire(e,t,n){return this._client.post(i`/browser_pools/${e}/acquire`,{body:t,...n})}flush(e,t){return this._client.post(i`/browser_pools/${e}/flush`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}release(e,t,n){return this._client.post(i`/browser_pools/${e}/release`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}};var Re=class extends p{batch(e,t,n){return this._client.post(i`/browsers/${e}/computer/batch`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}captureScreenshot(e,t={},n){return this._client.post(i`/browsers/${e}/computer/screenshot`,{body:t,...n,headers:u([{Accept:"image/png"},n?.headers]),__binaryResponse:!0})}clickMouse(e,t,n){return this._client.post(i`/browsers/${e}/computer/click_mouse`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}dragMouse(e,t,n){return this._client.post(i`/browsers/${e}/computer/drag_mouse`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}getMousePosition(e,t){return this._client.post(i`/browsers/${e}/computer/get_mouse_position`,t)}moveMouse(e,t,n){return this._client.post(i`/browsers/${e}/computer/move_mouse`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}pressKey(e,t,n){return this._client.post(i`/browsers/${e}/computer/press_key`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}readClipboard(e,t){return this._client.post(i`/browsers/${e}/computer/clipboard/read`,t)}scroll(e,t,n){return this._client.post(i`/browsers/${e}/computer/scroll`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}setCursorVisibility(e,t,n){return this._client.post(i`/browsers/${e}/computer/cursor`,{body:t,...n})}typeText(e,t,n){return this._client.post(i`/browsers/${e}/computer/type`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}writeClipboard(e,t,n){return this._client.post(i`/browsers/${e}/computer/clipboard/write`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}};var Pe=class extends p{stream(e,t,n){return this._client.get(i`/browsers/${e}/logs/stream`,{query:t,...n,headers:u([{Accept:"text/event-stream"},n?.headers]),stream:!0})}};var Ee=class extends p{execute(e,t,n){return this._client.post(i`/browsers/${e}/playwright/execute`,{body:t,...n})}};var Se=class extends p{exec(e,t,n){return this._client.post(i`/browsers/${e}/process/exec`,{body:t,...n})}kill(e,t,n){let{id:o,...s}=t;return this._client.post(i`/browsers/${o}/process/${e}/kill`,{body:s,...n})}resize(e,t,n){let{id:o,...s}=t;return this._client.post(i`/browsers/${o}/process/${e}/resize`,{body:s,...n})}spawn(e,t,n){return this._client.post(i`/browsers/${e}/process/spawn`,{body:t,...n})}status(e,t,n){let{id:o}=t;return this._client.get(i`/browsers/${o}/process/${e}/status`,n)}stdin(e,t,n){let{id:o,...s}=t;return this._client.post(i`/browsers/${o}/process/${e}/stdin`,{body:s,...n})}stdoutStream(e,t,n){let{id:o}=t;return this._client.get(i`/browsers/${o}/process/${e}/stdout/stream`,{...n,headers:u([{Accept:"text/event-stream"},n?.headers]),stream:!0})}};var Ie=class extends p{list(e,t){return this._client.get(i`/browsers/${e}/replays`,t)}download(e,t,n){let{id:o}=t;return this._client.get(i`/browsers/${o}/replays/${e}`,{...n,headers:u([{Accept:"video/mp4"},n?.headers]),__binaryResponse:!0})}start(e,t={},n){return this._client.post(i`/browsers/${e}/replays`,{body:t,...n})}stop(e,t,n){let{id:o}=t;return this._client.post(i`/browsers/${o}/replays/${e}/stop`,{...n,headers:u([{Accept:"*/*"},n?.headers])})}};var $e=class extends p{events(e,t={},n){return this._client.getAPIList(i`/browsers/${e}/telemetry/events`,w,{query:t,...n})}stream(e,t={},n){let{"Last-Event-ID":o,...s}=t??{};return this._client.get(i`/browsers/${e}/telemetry/stream`,{query:s,...n,headers:u([{Accept:"text/event-stream",...o!=null?{"Last-Event-ID":o}:void 0},n?.headers]),stream:!0})}};var Le=class extends p{events(e,t,n){let{id:o}=t;return this._client.get(i`/browsers/${o}/fs/watch/${e}/events`,{...n,headers:u([{Accept:"text/event-stream"},n?.headers]),stream:!0})}start(e,t,n){return this._client.post(i`/browsers/${e}/fs/watch`,{body:t,...n})}stop(e,t,n){let{id:o}=t;return this._client.delete(i`/browsers/${o}/fs/watch/${e}`,{...n,headers:u([{Accept:"*/*"},n?.headers])})}};var re=class extends p{constructor(){super(...arguments),this.watch=new Le(this._client)}createDirectory(e,t,n){return this._client.put(i`/browsers/${e}/fs/create_directory`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}deleteDirectory(e,t,n){return this._client.put(i`/browsers/${e}/fs/delete_directory`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}deleteFile(e,t,n){return this._client.put(i`/browsers/${e}/fs/delete_file`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}downloadDirZip(e,t,n){return this._client.get(i`/browsers/${e}/fs/download_dir_zip`,{query:t,...n,headers:u([{Accept:"application/zip"},n?.headers]),__binaryResponse:!0})}fileInfo(e,t,n){return this._client.get(i`/browsers/${e}/fs/file_info`,{query:t,...n})}listFiles(e,t,n){return this._client.get(i`/browsers/${e}/fs/list_files`,{query:t,...n})}move(e,t,n){return this._client.put(i`/browsers/${e}/fs/move`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}readFile(e,t,n){return this._client.get(i`/browsers/${e}/fs/read_file`,{query:t,...n,headers:u([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}setFilePermissions(e,t,n){return this._client.put(i`/browsers/${e}/fs/set_file_permissions`,{body:t,...n,headers:u([{Accept:"*/*"},n?.headers])})}upload(e,t,n){return this._client.post(i`/browsers/${e}/fs/upload`,H({body:t,...n,headers:u([{Accept:"*/*"},n?.headers])},this._client))}uploadZip(e,t,n){return this._client.post(i`/browsers/${e}/fs/upload_zip`,H({body:t,...n,headers:u([{Accept:"*/*"},n?.headers])},this._client))}writeFile(e,t,n,o){let{path:s,mode:a}=n;return this._client.put(i`/browsers/${e}/fs/write_file`,{body:t,query:{path:s,mode:a},...o,headers:u([{"Content-Type":"application/octet-stream",Accept:"*/*"},o?.headers])})}};re.Watch=Le;function ot(r,e){return`${r.replace(/\/+$/,"")}${e.startsWith("/")?e:`/${e}`}`}async function wr(r,e,t,n){let o=r.browserRouteCache.get(e);if(!o)throw new x(`browser route cache does not contain session ${e}; create, retrieve, or list the browser before calling browser.fetch`);let{url:s,method:a,headers:c,body:f,signal:d,duplex:m,timeout_ms:l}=wn(t,n);bn(s);let g={url:s,jwt:o.jwt};l!==void 0&&(g.timeout_ms=l);let h=c.get("accept"),A={method:gn(a),path:ot(o.baseURL,"/curl/raw"),query:g,body:f,headers:u([{Authorization:null},h?{Accept:h}:{Accept:"*/*"},xn(c)]),signal:d??null,__binaryResponse:!0};return m&&(A.fetchOptions={duplex:m}),r.request(A).asResponse()}function gn(r){let e=r.toLowerCase();if(!new Set(["get","post","put","patch","delete"]).has(e))throw new x(`browser.fetch unsupported HTTP method: ${r}`);return e}function wn(r,e){let t=e&&"timeout_ms"in e?e.timeout_ms:void 0;if(r instanceof Request){let o=new Headers(r.headers);e?.headers&&new Headers(e.headers).forEach((d,m)=>{o.set(m,d)});let s={url:r.url,method:(e?.method??r.method)?.toUpperCase()||"GET",headers:o},a=e?.body??r.body;a!=null&&(s.body=a);let c=e?.signal??r.signal;return c!==void 0&&(s.signal=c),e?.duplex!==void 0&&(s.duplex=e.duplex),t!==void 0&&(s.timeout_ms=t),s}let n={url:r instanceof URL?r.href:String(r),method:(e?.method??"GET").toUpperCase(),headers:new Headers(e?.headers)};return e?.body!==void 0&&(n.body=e.body),e?.signal!==void 0&&(n.signal=e.signal),e?.duplex!==void 0&&(n.duplex=e.duplex),t!==void 0&&(n.timeout_ms=t),n}function bn(r){let e;try{e=new URL(r)}catch{throw new x(`browser.fetch target must be an absolute URL; received: ${r}`)}if(e.protocol!=="http:"&&e.protocol!=="https:")throw new x(`browser.fetch only supports http(s) URLs; received: ${e.protocol}`)}function xn(r){let e={};return r.forEach((t,n)=>{switch(n.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:e[n]=t}}),e}var O=class extends p{constructor(){super(...arguments),this.telemetry=new $e(this._client),this.replays=new Ie(this._client),this.fs=new re(this._client),this.process=new Se(this._client),this.logs=new Pe(this._client),this.computer=new Re(this._client),this.playwright=new Ee(this._client)}create(e={},t){return this._client.post("/browsers",{body:e,...t})}retrieve(e,t={},n){return this._client.get(i`/browsers/${e}`,{query:t,...n})}update(e,t,n){return this._client.patch(i`/browsers/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/browsers",w,{query:e,...t})}curl(e,t,n){return this._client.post(i`/browsers/${e}/curl`,{body:t,...n})}fetch(e,t,n){return wr(this._client,e,t,n)}deleteByID(e,t){return this._client.delete(i`/browsers/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}loadExtensions(e,t,n){return this._client.post(i`/browsers/${e}/extensions`,H({body:t,...n,headers:u([{Accept:"*/*"},n?.headers])},this._client))}};O.Telemetry=$e;O.Replays=Ie;O.Fs=re;O.Process=Se;O.Logs=Pe;O.Computer=Re;O.Playwright=Ee;var ne=class extends p{create(e,t){return this._client.post("/org/credential_providers",{body:e,...t})}retrieve(e,t){return this._client.get(i`/org/credential_providers/${e}`,t)}update(e,t,n){return this._client.patch(i`/org/credential_providers/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/org/credential_providers",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/org/credential_providers/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}listItems(e,t){return this._client.get(i`/org/credential_providers/${e}/items`,t)}test(e,t){return this._client.post(i`/org/credential_providers/${e}/test`,t)}};var oe=class extends p{create(e,t){return this._client.post("/credentials",{body:e,...t})}retrieve(e,t){return this._client.get(i`/credentials/${e}`,t)}update(e,t,n){return this._client.patch(i`/credentials/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/credentials",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/credentials/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}totpCode(e,t){return this._client.get(i`/credentials/${e}/totp-code`,t)}};var se=class extends p{create(e,t){return this._client.post("/deployments",H({body:e,...t},this._client))}retrieve(e,t){return this._client.get(i`/deployments/${e}`,t)}list(e={},t){return this._client.getAPIList("/deployments",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/deployments/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}follow(e,t={},n){return this._client.get(i`/deployments/${e}/events`,{query:t,...n,headers:u([{Accept:"text/event-stream"},n?.headers]),stream:!0})}};var ie=class extends p{list(e={},t){return this._client.getAPIList("/extensions",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/extensions/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}download(e,t){return this._client.get(i`/extensions/${e}`,{...t,headers:u([{Accept:"application/octet-stream"},t?.headers]),__binaryResponse:!0})}downloadFromChromeStore(e,t){return this._client.get("/extensions/from_chrome_store",{query:e,...t,headers:u([{Accept:"application/octet-stream"},t?.headers]),__binaryResponse:!0})}get(e,t){return this._client.get(i`/extensions/${e}/metadata`,t)}upload(e,t){return this._client.post("/extensions",H({body:e,...t},this._client))}};var ae=class extends p{create(e,t){return this._client.post("/invocations",{body:e,...t})}retrieve(e,t){return this._client.get(i`/invocations/${e}`,t)}update(e,t,n){return this._client.patch(i`/invocations/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/invocations",w,{query:e,...t})}deleteBrowsers(e,t){return this._client.delete(i`/invocations/${e}/browsers`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}follow(e,t={},n){return this._client.get(i`/invocations/${e}/events`,{query:t,...n,headers:u([{Accept:"text/event-stream"},n?.headers]),stream:!0})}listBrowsers(e,t){return this._client.get(i`/invocations/${e}/browsers`,t)}};var Te=class extends p{retrieve(e){return this._client.get("/org/entitlements",e)}};var Oe=class extends p{retrieve(e){return this._client.get("/org/limits",e)}update(e,t){return this._client.patch("/org/limits",{body:e,...t})}};var M=class extends p{constructor(){super(...arguments),this.entitlements=new Te(this._client),this.limits=new Oe(this._client)}};M.Entitlements=Te;M.Limits=Oe;var ce=class extends p{create(e,t){return this._client.post("/profiles",{body:e,...t})}retrieve(e,t){return this._client.get(i`/profiles/${e}`,t)}update(e,t,n){return this._client.patch(i`/profiles/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/profiles",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/profiles/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}download(e,t={},n){return this._client.get(i`/profiles/${e}/download`,{query:t,...n,headers:u([{Accept:"application/octet-stream"},n?.headers]),__binaryResponse:!0})}};var je=class extends p{retrieve(e,t){return this._client.get(i`/org/projects/${e}/limits`,t)}update(e,t,n){return this._client.patch(i`/org/projects/${e}/limits`,{body:t,...n})}};var z=class extends p{constructor(){super(...arguments),this.limits=new je(this._client)}create(e,t){return this._client.post("/org/projects",{body:e,...t})}retrieve(e,t){return this._client.get(i`/org/projects/${e}`,t)}update(e,t,n){return this._client.patch(i`/org/projects/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/org/projects",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/org/projects/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}};z.Limits=je;var le=class extends p{create(e,t){return this._client.post("/proxies",{body:e,...t})}retrieve(e,t){return this._client.get(i`/proxies/${e}`,t)}update(e,t,n){return this._client.patch(i`/proxies/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/proxies",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/proxies/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}check(e,t={},n){return this._client.post(i`/proxies/${e}/check`,{body:t,...n})}};var Ce=class extends p{create(e,t){return this._client.post("/telemetry/destinations",{body:e,...t})}retrieve(e,t){return this._client.get(i`/telemetry/destinations/${e}`,t)}update(e,t,n){return this._client.patch(i`/telemetry/destinations/${e}`,{body:t,...n})}list(e={},t){return this._client.getAPIList("/telemetry/destinations",w,{query:e,...t})}delete(e,t){return this._client.delete(i`/telemetry/destinations/${e}`,{...t,headers:u([{Accept:"*/*"},t?.headers])})}};var V=class extends p{constructor(){super(...arguments),this.destinations=new Ce(this._client)}};V.Destinations=Ce;var Ke=class{constructor(){this.entries=new Map}get(e){return this.entries.get(e)}set(e){this.entries.set(e.sessionId,e)}delete(e){this.entries.delete(e)}clear(){this.entries.clear()}},br="\u004b\u0045\u0052\u004e\u0045\u004c_BROWSER_ROUTING_SUBRESOURCES",Sn=["curl","telemetry/stream"],In=/^\/(?:v\d+\/)?browsers(?:\/[^/]+)?\/?$/,$n=/^\/(?:v\d+\/)?browser_pools\/[^/]+\/acquire\/?$/,Ln=/^\/(?:v\d+\/)?browsers\/([^/]+)\/?$/,Tn=/^\/(?:v\d+\/)?browser_pools\/[^/]+\/release\/?$/;function Lt(){let r=qn();return r===void 0?[...Sn]:r.trim()===""?[]:r.split(",").map(e=>e.trim()).filter(Boolean)}function Tt(r,{apiBaseURL:e,subresources:t,cache:n}){let o=[...t].map(a=>a.trim().replace(/^\/+|\/+$/g,"")).filter(Boolean),s=new URL(e).origin;return async(a,c)=>{let f=new Request(a,c),d=On(f,s),m=await Dn(r,{input:a,init:c,request:f},s,o,n);return d&&await Un(m,n),await jn(f,m,s,n),m}}function On(r,e){let t=new URL(r.url);return t.origin===e&&(In.test(t.pathname)||$n.test(t.pathname))}async function jn(r,e,t,n){if(!e.ok)return;let o=new URL(r.url);if(o.origin!==t)return;let s=Cn(r,o.pathname)??await kn(r,o.pathname);s&&n.delete(s)}function Cn(r,e){if(r.method.toUpperCase()!=="DELETE")return;let t=e.match(Ln);return t&&decodeURIComponent(t[1]??"")||void 0}async function kn(r,e){if(!(r.method.toUpperCase()!=="POST"||!Tn.test(e)))try{let t=await r.clone().json();if(!t||typeof t!="object")return;let n=t.session_id;return typeof n=="string"&&n.trim()?n.trim():void 0}catch{return}}function Fn(r){if(!r||typeof r!="object")return;let e=r,t=typeof e.session_id=="string"?e.session_id.trim():"",n=typeof e.base_url=="string"?e.base_url.trim():"";if(!t||!n)return;let o=typeof e.jwt=="string"?e.jwt.trim():"",s=typeof e.cdp_ws_url=="string"?e.cdp_ws_url:void 0,a=o||Mn(s)||"";if(a)return{sessionId:t,baseURL:n,jwt:a}}async function Un(r,e){if((r.headers.get("content-type")?.toLowerCase()??"").includes("application/json"))try{$t(await r.clone().json(),e)}catch{}}function $t(r,e){let t=Fn(r);if(t&&e.set(t),Array.isArray(r)){for(let n of r)$t(n,e);return}if(!(!r||typeof r!="object"))for(let n of Object.values(r))typeof n=="object"&&n!==null&&$t(n,e)}function vn(r,e){let t=r.replace(/^\/+|\/+$/g,"");return e.some(n=>t===n||t.startsWith(n+"/"))}async function Dn(r,{input:e,init:t,request:n},o,s,a){let c=new URL(n.url);if(c.origin!==o)return r(e,t);let f=c.pathname.match(/^\/(?:v\d+\/)?browsers\/([^/]+)\/([^/]+)(\/.*)?$/);if(!f)return r(e,t);let d=decodeURIComponent(f[1]??""),m=f[2]??"";if(!d||!vn(m+(f[3]??""),s))return r(e,t);let l=a.get(d);if(l===void 0)return r(e,t);let g=new URL(ot(l.baseURL,`/${m}${f[3]??""}`));c.searchParams.forEach((A,E)=>{E!=="jwt"&&g.searchParams.append(E,A)}),g.searchParams.get("jwt")||g.searchParams.set("jwt",l.jwt);let h=new Headers(n.headers);return h.delete("authorization"),r(g.toString(),Nn(e,n,t,h))}function Nn(r,e,t,n){let o=e.method.toUpperCase(),s={...t??{},method:o,headers:n,redirect:e.redirect,signal:t?.signal??(r instanceof Request?r.signal:void 0)};if(delete s.body,delete s.duplex,o!=="GET"&&o!=="HEAD"){let a=Hn(e,t);a!==void 0&&(s.body=a),t?.duplex!==void 0?s.duplex=t.duplex:Bn(a)&&(s.duplex="half")}return s}function Hn(r,e){return e?.body!==void 0&&e.body!==null?e.body:r.body??void 0}function Bn(r){return globalThis.ReadableStream&&r instanceof globalThis.ReadableStream||typeof r=="object"&&r!==null&&Symbol.asyncIterator in r}function Mn(r){if(r)try{return new URL(r).searchParams.get("jwt")??void 0}catch{return}}function qn(){if(typeof globalThis.process<"u"){let r=globalThis.process.env?.[br];return typeof r=="string"?r:void 0}if(typeof globalThis.Deno<"u"){let r=globalThis.Deno.env?.get?.(br);return typeof r=="string"?r:void 0}}var st=class{constructor(e){this.actions=new Map,this.name=e,xr.registerApp(this)}action(e,t){let n;if(t.length===0)throw new Error("Action handlers must accept at least the context parameter");if(t.length===1){let o=t;n=async(s,a)=>o(s)}else n=t;return this.actions.set(e,{name:e,handler:n}),n}getActions(){return Array.from(this.actions.values())}getAction(e){return this.actions.get(e)}toJSON(){return{name:this.name,actions:this.getActions().map(e=>({name:e.name}))}}},Ot=class{constructor(){this.apps=new Map}registerApp(e){this.apps.set(e.name,e)}getApps(){return Array.from(this.apps.values())}getAppByName(e){return this.apps.get(e)}export(){return{apps:this.getApps().map(e=>e.toJSON())}}exportJSON(){return JSON.stringify(this.export(),null,2)}},xr=new Ot;var ke=r=>{if(typeof globalThis.process<"u")return globalThis.process.env?.[r]?.trim()||void 0;if(typeof globalThis.Deno<"u")return globalThis.Deno.env?.get?.(r)?.trim()||void 0};var jt,Ct,We,_r,Ar={production:"https://api.on\u006b\u0065\u0072\u006e\u0065\u006c.com/",development:"https://localhost:3001/"},y=class{constructor({baseURL:e=ke("\u004b\u0045\u0052\u004e\u0045\u004c_BASE_URL"),apiKey:t=ke("\u004b\u0045\u0052\u004e\u0045\u004c_API_KEY"),projectID:n=null,project:o=null,...s}={}){if(jt.add(this),We.set(this,void 0),this.deployments=new se(this),this.apps=new ee(this),this.invocations=new ae(this),this.browsers=new O(this),this.profiles=new ce(this),this.auth=new B(this),this.telemetry=new V(this),this.proxies=new le(this),this.extensions=new ie(this),this.browserPools=new te(this),this.credentials=new oe(this),this.projects=new z(this),this.organization=new M(this),this.auditLogs=new X(this),this.apiKeys=new Z(this),this.credentialProviders=new ne(this),typeof globalThis<"u"&&typeof globalThis.Bun<"u"&&globalThis.Bun.version&&!ke("\u004b\u0045\u0052\u004e\u0045\u004c_SUPPRESS_BUN_WARNING")&&P(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"),t===void 0)throw new x("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 a={apiKey:t,projectID:n,project:o,...s,baseURL:e,environment:s.environment??"production"};if(e&&s.environment)throw new x("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=a.baseURL||Ar[a.environment||"production"],this.timeout=a.timeout??Ct.DEFAULT_TIMEOUT,this.logger=a.logger??console;let c="warn";this.logLevel=c,this.logLevel=At(a.logLevel,"ClientOptions.logLevel",this)??At(ke("\u004b\u0045\u0052\u004e\u0045\u004c_LOG"),"process.env['\u004b\u0045\u0052\u004e\u0045\u004c_LOG']",this)??c,this.fetchOptions=a.fetchOptions,this.maxRetries=a.maxRetries??2,this.rawFetch=a.fetch??zt(),this.browserRouteCache=new Ke,this.fetch=Tt(this.rawFetch,{apiBaseURL:this.baseURL,subresources:Lt(),cache:this.browserRouteCache}),S(this,We,Jt,"f");let f=ke("\u004b\u0045\u0052\u004e\u0045\u004c_CUSTOM_HEADERS");if(f){let d={};for(let m of f.split(`
10
- `)){let l=m.indexOf(":");l>=0&&(d[m.substring(0,l).trim()]=m.substring(l+1).trim())}a.defaultHeaders={...d,...a.defaultHeaders}}this._options=a,this.apiKey=t,this.projectID=n,this.project=o}withOptions(e){let t=new this.constructor({...this._options,environment:e.environment?e.environment:void 0,baseURL:e.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,...e});return t.browserRouteCache=this.browserRouteCache,t.fetch=Tt(t.rawFetch,{apiBaseURL:t.baseURL,subresources:Lt(),cache:t.browserRouteCache}),t}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){}async authHeaders(e){return u([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return or(e)}getUserAgent(){return`${this.constructor.name}/JS ${W}`}defaultIdempotencyKey(){return`stainless-node-retry-${ct()}`}makeStatusError(e,t,n,o){return I.generate(e,t,n,o)}buildURL(e,t,n){let o=!_(this,jt,"m",_r).call(this)&&n||this.baseURL,s=vt(e)?new URL(e):new URL(o+(o.endsWith("/")&&e.startsWith("/")?e.slice(1):e)),a=this.defaultQuery(),c=Object.fromEntries(s.searchParams);return(!ft(a)||!ft(c))&&(t={...c,...a,...t}),typeof t=="object"&&t&&!Array.isArray(t)&&(s.search=this.stringifyQuery(t)),s.toString()}async prepareOptions(e){}async prepareRequest(e,{url:t,options:n}){}get(e,t){return this.methodRequest("get",e,t)}post(e,t){return this.methodRequest("post",e,t)}patch(e,t){return this.methodRequest("patch",e,t)}put(e,t){return this.methodRequest("put",e,t)}delete(e,t){return this.methodRequest("delete",e,t)}methodRequest(e,t,n){return this.request(Promise.resolve(n).then(o=>({method:e,path:t,...o})))}request(e,t=null){return new Y(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,n){let o=await e,s=o.maxRetries??this.maxRetries;t==null&&(t=s),await this.prepareOptions(o);let{req:a,url:c,timeout:f}=await this.buildRequest(o,{retryCount:s-t});await this.prepareRequest(a,{url:c,options:o});let d="log_"+(Math.random()*(1<<24)|0).toString(16).padStart(6,"0"),m=n===void 0?"":`, retryOf: ${n}`,l=Date.now();if(P(this).debug(`[${d}] sending request`,N({retryOfRequestLogID:n,method:o.method,url:c,options:o,headers:a.headers})),o.signal?.aborted)throw new T;let g=new AbortController,h=await this.fetchWithTimeout(c,a,f,g).catch(ve),A=Date.now();if(h instanceof globalThis.Error){let U=`retrying, ${t} attempts remaining`;if(o.signal?.aborted)throw new T;let k=Ue(h)||/timed? ?out/i.test(String(h)+("cause"in h?String(h.cause):""));if(t)return P(this).info(`[${d}] connection ${k?"timed out":"failed"} - ${U}`),P(this).debug(`[${d}] connection ${k?"timed out":"failed"} (${U})`,N({retryOfRequestLogID:n,url:c,durationMs:A-l,message:h.message})),this.retryRequest(o,t,n??d);throw P(this).info(`[${d}] connection ${k?"timed out":"failed"} - error; no more retries left`),P(this).debug(`[${d}] connection ${k?"timed out":"failed"} (error; no more retries left)`,N({retryOfRequestLogID:n,url:c,durationMs:A-l,message:h.message})),k?new D:new K({cause:h})}let E=`[${d}${m}] ${a.method} ${c} ${h.ok?"succeeded":"failed"} with status ${h.status} in ${A-l}ms`;if(!h.ok){let U=await this.shouldRetry(h);if(t&&U){let q=`retrying, ${t} attempts remaining`;return await Vt(h.body),P(this).info(`${E} - ${q}`),P(this).debug(`[${d}] response error (${q})`,N({retryOfRequestLogID:n,url:h.url,status:h.status,headers:h.headers,durationMs:A-l})),this.retryRequest(o,t,n??d,h.headers)}let k=U?"error; no more retries left":"error; not retryable";P(this).info(`${E} - ${k}`);let b=await h.text().catch(q=>ve(q).message),J=Bt(b),G=J?void 0:b;throw P(this).debug(`[${d}] response error (${k})`,N({retryOfRequestLogID:n,url:h.url,status:h.status,headers:h.headers,message:G,durationMs:Date.now()-l})),this.makeStatusError(h.status,J,G,h.headers)}return P(this).info(E),P(this).debug(`[${d}] response start`,N({retryOfRequestLogID:n,url:h.url,status:h.status,headers:h.headers,durationMs:A-l})),{response:h,options:o,controller:g,requestLogID:d,retryOfRequestLogID:n,startTime:l}}getAPIList(e,t,n){return this.requestAPIList(t,n&&"then"in n?n.then(o=>({method:"get",path:e,...o})):{method:"get",path:e,...n})}requestAPIList(e,t){let n=this.makeRequest(t,null,void 0);return new Me(this,n,e)}async fetchWithTimeout(e,t,n,o){let{signal:s,method:a,...c}=t||{},f=this._makeAbort(o);s&&s.addEventListener("abort",f,{once:!0});let d=setTimeout(f,n),m=globalThis.ReadableStream&&c.body instanceof globalThis.ReadableStream||typeof c.body=="object"&&c.body!==null&&Symbol.asyncIterator in c.body,l={signal:o.signal,...m?{duplex:"half"}:{},method:"GET",...c};a&&(l.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,l)}finally{clearTimeout(d)}}async shouldRetry(e){let t=e.headers.get("x-should-retry");return t==="true"?!0:t==="false"?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,t,n,o){let s,a=o?.get("retry-after-ms");if(a){let f=parseFloat(a);Number.isNaN(f)||(s=f)}let c=o?.get("retry-after");if(c&&!s){let f=parseFloat(c);Number.isNaN(f)?s=Date.parse(c)-Date.now():s=f*1e3}if(s===void 0){let f=e.maxRetries??this.maxRetries;s=this.calculateDefaultRetryTimeoutMillis(t,f)}return await Mt(s),this.makeRequest(e,t-1,n)}calculateDefaultRetryTimeoutMillis(e,t){let s=t-e,a=Math.min(.5*Math.pow(2,s),8),c=1-Math.random()*.25;return a*c*1e3}async buildRequest(e,{retryCount:t=0}={}){let n={...e},{method:o,path:s,query:a,defaultBaseURL:c}=n,f=this.buildURL(s,a,c);"timeout"in n&&Nt("timeout",n.timeout),n.timeout=n.timeout??this.timeout;let{bodyHeaders:d,body:m}=this.buildBody({options:n}),l=await this.buildHeaders({options:e,method:o,bodyHeaders:d,retryCount:t});return{req:{method:o,headers:l,...n.signal&&{signal:n.signal},...globalThis.ReadableStream&&m instanceof globalThis.ReadableStream&&{duplex:"half"},...m&&{body:m},...this.fetchOptions??{},...n.fetchOptions??{}},url:f,timeout:n.timeout}}async buildHeaders({options:e,method:t,bodyHeaders:n,retryCount:o}){let s={};this.idempotencyHeader&&t!=="get"&&(e.idempotencyKey||(e.idempotencyKey=this.defaultIdempotencyKey()),s[this.idempotencyHeader]=e.idempotencyKey);let a=u([s,{Accept:"application/json","User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(o),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...Xt(),"X-\u004b\u0065\u0072\u006e\u0065\u006c-Project-Id":this.projectID,"X-\u004b\u0065\u0072\u006e\u0065\u006c-Project":this.project},await this.authHeaders(e),this._options.defaultHeaders,n,e.headers]);return this.validateHeaders(a),a.values}_makeAbort(e){return()=>e.abort()}buildBody({options:e}){let{body:t,headers:n}=e;if(!t)return t==null&&"body"in e?_(this,We,"f").call(this,{body:t,headers:u([n])}):{bodyHeaders:void 0,body:void 0};let o=u([n]);return ArrayBuffer.isView(t)||t instanceof ArrayBuffer||t instanceof DataView||typeof t=="string"&&o.values.has("content-type")||globalThis.Blob&&t instanceof globalThis.Blob||t instanceof FormData||t instanceof URLSearchParams||globalThis.ReadableStream&&t instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:t}:typeof t=="object"&&(Symbol.asyncIterator in t||Symbol.iterator in t&&"next"in t&&typeof t.next=="function")?{bodyHeaders:void 0,body:ze(t)}:typeof t=="object"&&o.values.get("content-type")==="application/x-www-form-urlencoded"?{bodyHeaders:{"content-type":"application/x-www-form-urlencoded"},body:this.stringifyQuery(t)}:_(this,We,"f").call(this,{body:t,headers:o})}app(e){return new st(e)}};Ct=y,We=new WeakMap,jt=new WeakSet,_r=function(){return this.baseURL!==Ar[this._options.environment||"production"]};y.\u004b\u0065\u0072\u006e\u0065\u006c=Ct;y.DEFAULT_TIMEOUT=6e4;y.\u004b\u0065\u0072\u006e\u0065\u006cError=x;y.APIError=I;y.APIConnectionError=K;y.APIConnectionTimeoutError=D;y.APIUserAbortError=T;y.NotFoundError=he;y.ConflictError=me;y.RateLimitError=ge;y.BadRequestError=fe;y.AuthenticationError=de;y.InternalServerError=we;y.PermissionDeniedError=pe;y.UnprocessableEntityError=ye;y.toFile=nt;y.Deployments=se;y.Apps=ee;y.Invocations=ae;y.Browsers=O;y.Profiles=ce;y.Auth=B;y.Telemetry=V;y.Proxies=le;y.Extensions=ie;y.BrowserPools=te;y.Credentials=oe;y.Projects=z;y.Organization=M;y.AuditLogs=X;y.APIKeys=Z;y.CredentialProviders=ne;export{K as a,D as b,de as c,pe as d,we as e,y as f};
@@ -1,2 +0,0 @@
1
- import{c as _}from"./chunk-63VWBMYR.js";import{a as p,f as w,i as x}from"./chunk-3F7AFM53.js";import{a as d,e as E,k as g}from"./chunk-RDHGQ2WZ.js";import{a as T,b as R,e as c,i as u}from"./chunk-SEZETSB3.js";import{i as l,k as m}from"./chunk-SDQW7IJN.js";import{createHash as h,randomBytes as C}from"crypto";var D=1440*60*1e3,y="mcp-reports/",F="extract-url-job-results/",O=2e3;function P(){return process.env.PRIVATE_ARTIFACT_READ_WRITE_TOKEN?.trim()||process.env.CONNECTED_DATA_READ_WRITE_TOKEN?.trim()||process.env.CONNECTED_DATA_BLOB_READ_WRITE_TOKEN?.trim()||process.env.BLOB_READ_WRITE_TOKEN?.trim()||void 0}var A={prefix:y,artifactTtlMs:D,downloadTtlMs:900*1e3,token:P()},b={...A,hosted:!1,token:void 0},a="mcp-results/";function v(t){return{prefix:a,artifactTtlMs:T,downloadTtlMs:R,hosted:!t,token:t?void 0:P()}}var M=process.env.MCP_SCRAPER_ARTIFACT_OFFLOAD!=="false";async function j(t,e,r){let i=Date.now(),n=C(6).toString("hex"),o=await c({policy:A,ownerId:e,artifactKey:`${n}.md`,createdAt:i,filename:`${t}-${i}.md`,contentType:"text/markdown",content:r,scopeSegments:[t]});return{artifactId:o.artifactId,mimeType:o.contentType,sizeBytes:o.bytes,bytes:o.bytes,sha256:o.sha256,expiresAt:o.expiresAt,downloadUrl:o.downloadUrl,downloadUrlExpiresAt:o.downloadUrlExpiresAt,preview:r.slice(0,O)}}async function k(t,e,r){let i=JSON.stringify(r),n=await c({policy:b,ownerId:t,artifactKey:`${e}.json`,createdAt:Date.now(),filename:`${e}.json`,contentType:"application/json",content:i,scopeSegments:["extract_url"]});return{artifactId:n.artifactId,mimeType:n.contentType,sizeBytes:n.bytes,bytes:n.bytes,sha256:n.sha256,expiresAt:n.expiresAt,downloadUrl:n.downloadUrl,downloadUrlExpiresAt:n.downloadUrlExpiresAt,preview:i.slice(0,O)}}function J(t){if(t.startsWith(a))return l(t,a);let e=f(t)?.ownerId;return e||(t.startsWith(p)?w(t):t.startsWith(d)?E(t):l(t,y))}function f(t){let e=t.match(/^extract-url-job-results\/([a-f0-9]{24})\/([1-9][0-9]*)\/(exurl-[a-f0-9]{24})\.json$/);if(!e)return null;let r=Number(e[2]);return Number.isSafeInteger(r)?{ownerId:e[1],userId:r,jobId:e[3]}:null}async function I(t,e){let r=await _(t,e);if(!r||r.status!=="done"||r.options.jobKind!=="extract_url"||!r.result)return null;let i=Date.parse(`${r.created_at.replace(" ","T")}Z`);if(!Number.isFinite(i))return null;let n=new Date(i+1080*60*60*1e3);return n.getTime()<=Date.now()?null:{content:Buffer.from(JSON.stringify(r.result)),expiresAt:n.toISOString()}}async function K(t,e,r){let i=`${F}${e}/${r}/${t}.json`;if(!f(i))return null;let n=await I(t,r);return n?{artifactId:i,mimeType:"application/json",sizeBytes:n.content.length,bytes:n.content.length,sha256:h("sha256").update(n.content).digest("hex"),expiresAt:n.expiresAt,downloadUrl:null,downloadUrlExpiresAt:null,preview:n.content.toString("utf8",0,Math.min(2e3,n.content.length))}:null}async function z(t,e,r,i,n=!1){let o=f(t);if(o){if(o.userId!==i||!Number.isSafeInteger(e)||e<0||!Number.isSafeInteger(r)||r<=0)return null;let s=await I(o.jobId,o.userId);return s?{...m(s.content.subarray(e,e+r+1),e,r,s.content.length),totalBytes:s.content.length}:null}return t.startsWith(a)?u({policy:v(n),artifactId:t,offset:e,maxBytes:r}):t.startsWith(p)?x(t,e,r):t.startsWith(d)?g(t,e,r):u({policy:n?b:A,artifactId:t,offset:e,maxBytes:r})}function X(t){return t.downloadUrl?{type:"resource_link",name:"Full MCP Scraper report",title:"Download full report",uri:t.downloadUrl,mimeType:t.mimeType,size:t.sizeBytes}:null}function Y(t,e){return[t.trim(),"","--- Full report stored as artifact ---",`artifactId: ${e.artifactId} \xB7 ${e.bytes} bytes \xB7 expires ${e.expiresAt}`,"Read it with report_artifact_read (supports offset/maxBytes windowing)."].join(`
2
- `)}export{D as a,y as b,F as c,O as d,A as e,a as f,v as g,M as h,j as i,k as j,J as k,K as l,z as m,X as n,Y as o};
@@ -1 +0,0 @@
1
- import{createHmac as s,timingSafeEqual as u}from"crypto";var a=()=>process.env.NODE_ENV==="production"||process.env.VERCEL==="1";function f(){let e=process.env.SESSION_SECRET?.trim();if(e)return e;if(a())throw new Error("SESSION_SECRET is not set \u2014 add it to your Vercel env vars (see src/api/env.ts)");return"dev-secret-change-me"}var i=()=>f();function l(e,t){if(e.length!==t.length)return!1;try{return u(Buffer.from(e,"hex"),Buffer.from(t,"hex"))}catch{return!1}}function p(e){let t=String(e),n=s("sha256",i()).update(t).digest("hex");return`${t}.${n}`}function S(e){let t=e.lastIndexOf(".");if(t===-1)return null;let n=e.slice(0,t),o=e.slice(t+1),c=s("sha256",i()).update(n).digest("hex");if(!l(o,c))return null;let r=parseInt(n);return isNaN(r)?null:r}export{f as a,p as b,S as c};
@@ -1,16 +0,0 @@
1
- import{a as s}from"./chunk-EYGA6LOU.js";var _={message:"User scheduling and automatic cleanup have been removed. Memory, video and connected services run through the native runtime; manual workflows, full-file delivery, reusable templates and existing credits remain available. SDK templates now live in the artifacts namespace. PAA progress checks remain at least 20 seconds apart."};var i={reset:"\x1B[0m",cyan:"\x1B[36m",lime:"\x1B[32m",amber:"\x1B[33m",red:"\x1B[31m",muted:"\x1B[90m",bold:"\x1B[1m"};function r(t,e,n){return n?`${i[e]}${t}${i.reset}`:t}function o(t,e,n){let a=t.padEnd(9," ");return` ${r(a,"muted",n)} ${e.join(r(" . ","muted",n))}`}function b(t){let e=t.color??!0,n=t.apiKeyConfigured?"$MCP_SCRAPER_API_KEY":"sk_live_your_key",a=String.raw`
2
- __ __ ____ ____
3
- | \/ |/ ___| _ \
4
- | |\/| | | | |_) |
5
- | | | | |___| __/
6
- |_| |_|\____|_|
7
-
8
- ____ ____ ____ _ ____ _____ ____
9
- / ___| / ___| _ \ / \ | _ \| ____| _ \
10
- \___ \| | | |_) | / _ \ | |_) | _| | |_) |
11
- ___) | |___| _ < / ___ \| __/| |___| _ <
12
- |____/ \____|_| \_\/_/ \_\_| |_____|_| \_\
13
- `,c=[`MCP_SCRAPER_API_KEY=${n} npx -y -p mcp-scraper@latest \\`," mcp-scraper-cli agent install claude --apply"].join(`
14
- `),l=["[mcp_servers.mcp-scraper]",'command = "npx"','args = ["-y", "-p", "mcp-scraper@latest", "mcp-scraper"]',`env = { MCP_SCRAPER_API_KEY = "${n}" }`].join(`
15
- `);return[r(`mcp-scraper v${t.version}`,"bold",e),r("> mcp-scraper-install","muted",e),r(a,"amber",e),`${r("MCP Scraper Agent","cyan",e)} . v${t.version} . mcpscraper.dev`,"1/1 install surfaces ready",r(`Newest in v${t.version}: ${_.message}`,"lime",e),"",`${r("Tools","cyan",e)} ${r(`(${s.inventory.totalTools} MCP tools)`,"muted",e)}`,o("search",["harvest_paa","search_serp","maps_search","maps_place_intel"],e),o("extract",["extract_url","map_site_urls","extract_site","audit_site","directory_workflow"],e),o("build",["create_editorial_reading_room","rank_tracker_workflow","portable HTML"],e),o("media",["youtube_harvest","youtube_transcribe","facebook_reels_inventory","facebook_ad_search","facebook_page_intel","facebook_ad_transcribe","facebook_video_transcribe","tiktok_video_transcribe","instagram_profile_content","instagram_media_download","reddit_thread"],e),o("browser",["serp_identity_create","serp_identity_list","browser_open","browser_profile_connect","browser_profile_list","browser_close","browser_screenshot","browser_read","browser_locate","browser_replay_mark","browser_replay_annotate"],e),o("connect",["list_service_connections","describe_service_connection_tool","import_service_connection_to_memory","export_connected_service_data","renew_connected_data_download","read_service_connection","call_service_connection_action"],e),o("commons",["commons_search_entities","commons_get_entity_linkset","commons_prepare_entity","commons_submit_entity","commons_prepare_publication","commons_claim_publication","commons_publish_editorial","commons_get_publication"],e),o("account",["credits_info","reports","MCP resources"],e),o("memory",["memory-put","memory-get","memory-search","list-vaults","record-fact","list_artifact_templates"],e),`${r("Workflows","cyan",e)} ${r("(MCP + CLI + API)","muted",e)}`,o("route",["workflow_list","workflow_suggest","workflow_run","workflow_step","workflow_status","workflow_artifact_read"],e),o("seo",["directory","agent-packet","competitive audit","map/serp comparison","PAA/AIO briefs"],e),"",r("Usage tips:","amber",e),"Run mcp-scraper-install for this visible card. Run mcp-scraper-cli for setup utilities and subcommands.","Run mcp-scraper in a human terminal to print this card; MCP clients get the same command as a silent stdio server.","Explicit card command: npx -y -p mcp-scraper@latest mcp-scraper-install","Hosted browser sessions use direct/no-proxy egress by default.","Customer auth setup: run browser_profile_connect, send the watch_url, let the user sign in, then call browser_profile_list until AUTHENTICATED.","Connected account ranges: call export_connected_service_data once. It handles Gmail, Calendar, Zoom, and Resend pagination; do not loop read_service_connection over individual records.","Connected account RAG: call import_service_connection_to_memory for one bounded approved read. It writes a redacted, untrusted snapshot to a stable Memory path and embeds it for search.","Stack logins / reconnect: run browser_profile_connect again with the same profile name and another domain to add accounts or refresh a login.","Start with workflow_suggest for broad jobs like market analysis, ICP research, CRO audits, brand briefs, content gaps, and AI visibility.","For MCP clients, use mcp-scraper so one install can mix SERP, Maps, browser, reports, and saved MCP resources.","If you hit the concurrency limit, add 2 browsers for $5/month with mcp-scraper-cli billing concurrency checkout.","",`${r("Ready.","lime",e)} Install the combined MCP server with one command:`,"",r("Setup doctor","amber",e),"npx -y -p mcp-scraper@latest mcp-scraper-cli doctor","",r("Hosted profile setup","amber",e),'In your MCP client, call browser_profile_connect with email="seo@example.com" and domain="chatgpt.com".',"Give the returned watch_url to the user. After they sign in, call browser_profile_list, then browser_open with the returned profile. Add more logins by calling browser_profile_connect again with the same profile and a new domain.","",r("Claude Code one-command setup","amber",e),c,"Then fully exit Claude Code and open a new Claude terminal. Check with: claude mcp list","",r("Codex config","amber",e),l,"",r("Claude Desktop Extension","amber",e),"Download: https://mcpscraper.dev/downloads/mcp-scraper.mcpb","",r("Safety note:","muted",e),"mcp-scraper prints this card only when stdin/stdout are an interactive TTY. In MCP clients it writes only JSON-RPC to stdout.","Use --stdio or MCP_SCRAPER_FORCE_STDIO=1 to force server mode from a terminal.",""].join(`
16
- `)}export{b as a};
@@ -1,198 +0,0 @@
1
- import{a as g}from"./chunk-NALXKTUU.js";import{Pool as B}from"pg";var u=class extends Error{constructor(t,s,n=400){super(s);this.code=t;this.status=n;this.name="AnalyticsRepositoryError"}code;status};var D=null;function K(){let i=process.env.ANALYTICS_DATABASE_URL?.trim();if(!i)throw new u("analytics_database_unavailable","Site Analytics is not configured.",503);return i}function E(){return D||(D=new B({connectionString:K(),max:8})),D}import{randomBytes as _e,randomUUID as p}from"crypto";import{createHash as Z,randomUUID as v}from"crypto";import{createCipheriv as X,createDecipheriv as J,createHmac as x,randomBytes as Y,scryptSync as z,timingSafeEqual as V}from"crypto";var N="xray1";function G(){return process.env.ANALYTICS_RESTRICTED_DATA_SECRET?.trim()||g()}function T(i){return z(G(),`xray-restricted:${i}:v1`,32)}function k(i,e){let t=e.trim().slice(0,80);if(!t)throw new Error("analytics encryption purpose required");let s=Y(12),n=X("aes-256-gcm",T(t),s);n.setAAD(Buffer.from(`${N}:${t}`,"utf8"));let r=Buffer.concat([n.update(i,"utf8"),n.final()]),o=n.getAuthTag();return[N,Buffer.from(t,"utf8").toString("base64url"),s.toString("base64url"),o.toString("base64url"),r.toString("base64url")].join(".")}function U(i,e){try{let[t,s,n,r,o]=i.split(".");if(t!==N||!s||!n||!r||!o)return null;let a=Buffer.from(s,"base64url").toString("utf8");if(a!==e)return null;let d=J("aes-256-gcm",T(a),Buffer.from(n,"base64url"));return d.setAAD(Buffer.from(`${N}:${a}`,"utf8")),d.setAuthTag(Buffer.from(r,"base64url")),Buffer.concat([d.update(Buffer.from(o,"base64url")),d.final()]).toString("utf8")}catch{return null}}function Ne(i,e){return x("sha256",T(`identity:${i}`)).update(e.trim().toLowerCase()).digest("hex")}function ve(i,e,t,s){return x("sha256",s).update(`${i}.${e}.${t}`).digest("hex")}function Ae(i,e){if(!i||i.length!==e.length)return!1;try{return V(Buffer.from(i),Buffer.from(e))}catch{return!1}}var M="enhanced_matching",Q=90,ee=10,f=class extends Error{constructor(t,s,n){super(s);this.code=t;this.status=n;this.name="AnalyticsIdentityProfileError"}code;status};function A(i,e){return i?.trim().replace(/\s+/g," ").slice(0,e)||null}function ie(i){if(!i)return null;let[e,t]=i.split("@");return!e||!t?null:`${e.slice(0,1)}${"*".repeat(Math.min(6,Math.max(2,e.length-1)))}@${t}`}function te(i){if(!i)return null;let e=i.replace(/\D/g,"");return e.length<4?null:`***-***-${e.slice(-4)}`}function O(i){return Z("sha256").update(i).digest("hex")}async function h(i,e){if(!e.signals.length)return;let t=e.signals.map(r=>r.kind),s=e.signals.map(r=>r.valueHmac);if((await i.query(`SELECT 1 FROM analytics_identity_tombstones
2
- WHERE site_id=$1 AND (kind,value_hmac) IN (
3
- SELECT * FROM unnest($2::text[],$3::text[])
4
- ) LIMIT 1`,[e.siteId,t,s])).rowCount)throw new f("analytics_identity_deleted","This identity cannot be automatically recreated.",410)}async function $(i,e){let t=A(e.displayName,160),s=A(e.email,320)?.toLowerCase()??null,n=A(e.phone,40);if(!t&&!s&&!n)return!1;let o=(await i.query(`SELECT p.public_ref FROM analytics_people p
5
- JOIN analytics_identity_namespaces n ON n.id=p.namespace_id AND n.site_id=p.site_id AND n.status='approved'
6
- WHERE p.id=$1 AND p.site_id=$2`,[e.personId,e.siteId])).rows[0]?.public_ref;if(!o)return!1;let a=[...new Set([o,...e.consentSubjectRefs].filter(Boolean))],l=(await i.query(`SELECT s.latest_receipt_id::text FROM analytics_consent_current_state s
7
- JOIN analytics_consent_receipts r ON r.id=s.latest_receipt_id AND r.site_id=s.site_id
8
- WHERE s.site_id=$1 AND s.subject_ref=ANY($2::text[])
9
- AND s.site_analytics=true AND s.enhanced_matching=true AND s.gpc=false
10
- AND r.action NOT IN ('withdraw','gpc')
11
- AND (s.expires_at IS NULL OR s.expires_at > now())
12
- ORDER BY s.effective_at DESC LIMIT 1`,[e.siteId,a])).rows[0]?.latest_receipt_id;if(!l)return!1;let m=e.verifiedAt&&Number.isFinite(Date.parse(e.verifiedAt))?new Date(e.verifiedAt).toISOString():new Date().toISOString(),_=k(JSON.stringify({schemaVersion:1,displayName:t,email:s,phone:n,evidenceType:e.evidenceType,verifiedAt:m}),"identity-profile");return await i.query(`INSERT INTO analytics_restricted_data(id,site_id,person_id,purpose,subject_ref,payload_ciphertext,expires_at,consent_receipt_id)
13
- VALUES($1,$2,$3,$4,$5,$6,now()+($7::int * interval '1 day'),$8)
14
- ON CONFLICT(site_id,purpose,subject_ref) DO UPDATE SET
15
- person_id=EXCLUDED.person_id,payload_ciphertext=EXCLUDED.payload_ciphertext,
16
- expires_at=EXCLUDED.expires_at,consent_receipt_id=EXCLUDED.consent_receipt_id,created_at=now()`,[v(),e.siteId,e.personId,M,o,_,Q,l]),!0}async function Re(i,e){let t=e.now??new Date,s=await i.query("SELECT role FROM analytics_site_grants WHERE site_id=$1 AND user_id=$2",[e.siteId,e.actorUserId]);if(!s.rowCount)throw new f("analytics_site_not_found","Site not found.",404);if(!["owner","editor"].includes(s.rows[0].role))throw new f("analytics_forbidden","Editor access is required.",403);let n=await i.query(`SELECT count(*)::text AS count FROM analytics_identity_profile_access_audits
17
- WHERE site_id=$1 AND actor_user_id=$2 AND created_at > $3::timestamptz - interval '1 minute'`,[e.siteId,e.actorUserId,t.toISOString()]);if(Number(n.rows[0]?.count??0)>=ee)throw await i.query(`INSERT INTO analytics_identity_profile_access_audits(id,site_id,actor_user_id,subject_ref_hmac,purpose,result,created_at)
18
- VALUES($1,$2,$3,$4,'journey_identity_display','rate_limited',$5)`,[v(),e.siteId,e.actorUserId,O(e.requestedPersonRef),t.toISOString()]),new f("analytics_identity_profile_rate_limited","Identity profile rate limit exceeded.",429);let r=async _=>{throw await i.query(`INSERT INTO analytics_identity_profile_access_audits(id,site_id,actor_user_id,subject_ref_hmac,purpose,result,created_at)
19
- VALUES($1,$2,$3,$4,'journey_identity_display',$5,$6)`,[v(),e.siteId,e.actorUserId,O(e.requestedPersonRef),_,t.toISOString()]),new f("analytics_identity_profile_not_found","Identity profile not found.",404)};if(!e.personId)return r("not_found");let o=await i.query(`SELECT p.public_ref,r.payload_ciphertext,r.expires_at
20
- FROM analytics_people p
21
- JOIN analytics_restricted_data r ON r.person_id=p.id AND r.site_id=p.site_id
22
- AND r.purpose=$3 AND r.subject_ref=p.public_ref AND r.expires_at>$4
23
- JOIN analytics_consent_current_state s ON s.site_id=p.site_id AND s.latest_receipt_id=r.consent_receipt_id
24
- AND s.site_analytics=true AND s.enhanced_matching=true AND s.gpc=false
25
- AND (s.expires_at IS NULL OR s.expires_at>$4)
26
- JOIN analytics_consent_receipts c ON c.id=s.latest_receipt_id AND c.site_id=s.site_id
27
- AND c.action NOT IN ('withdraw','gpc')
28
- WHERE p.id=$1 AND p.site_id=$2
29
- AND NOT EXISTS (SELECT 1 FROM analytics_identity_tombstones t WHERE t.site_id=p.site_id AND t.person_id=p.id)
30
- LIMIT 1`,[e.personId,e.siteId,M,t.toISOString()]);if(!o.rowCount)return r("not_found");let a=U(o.rows[0].payload_ciphertext,"identity-profile");if(!a)return r("unavailable");let d;try{d=JSON.parse(a)}catch{return r("unavailable")}let l=d.evidenceType;if(!["first_party_form","authenticated_user","crm_contact"].includes(String(l)))return r("unavailable");let m={personRef:e.requestedPersonRef,displayName:A(typeof d.displayName=="string"?d.displayName:void 0,160),maskedEmail:ie(typeof d.email=="string"?d.email:null),maskedPhone:te(typeof d.phone=="string"?d.phone:null),evidenceType:l,verifiedAt:typeof d.verifiedAt=="string"&&Number.isFinite(Date.parse(d.verifiedAt))?new Date(d.verifiedAt).toISOString():t.toISOString()};return await i.query(`INSERT INTO analytics_identity_profile_access_audits(id,site_id,person_id,actor_user_id,subject_ref_hmac,purpose,result,created_at)
31
- VALUES($1,$2,$3,$4,$5,'journey_identity_display','returned_masked',$6)`,[v(),e.siteId,e.personId,e.actorUserId,O(e.requestedPersonRef),t.toISOString()]),m}import{randomUUID as re}from"crypto";import{createHmac as se}from"crypto";var ne=new Set(["fbclid","gclid","gbraid","wbraid","ttclid","rdt_cid","msclkid","fbp","fbc","li_fat_id","snapclid"]);function w(i){let e={};for(let[t,s]of Object.entries(i??{})){if(!ne.has(t)||typeof s!="string")continue;let n=s.trim();n&&(e[t]=n.slice(0,500))}return e}function c(i,e){return se("sha256",g()).update(`${i}:${e.trim().toLowerCase()}`).digest("hex")}function oe(i){return i.consent?.analytics==="granted"&&(i.consent.purposes?.enhanced_matching==="granted"||i.consent.adUserData==="granted")&&i.consent.globalPrivacyControl!==!0}function be(i){return!!(i.identity&&oe(i))}async function Pe(i,e){let t=e.event.visitorId?.trim().slice(0,240),s=e.event.consent;if(!t||!s)return null;let n=Date.parse(e.event.occurredAt),r=Date.now();if(!Number.isFinite(n)||n>r+5*6e4||n<r-1440*6e4)return null;let o=s.purposes,a={siteAnalytics:o?o.site_analytics==="granted":s.analytics==="granted",enhancedMatching:o?o.enhanced_matching==="granted":s.adUserData==="granted",advertisingMeasurement:o?o.advertising_measurement==="granted":s.adPersonalization==="granted"},d=s.globalPrivacyControl===!0;d&&(a.siteAnalytics=!1,a.enhancedMatching=!1,a.advertisingMeasurement=!1);let l=d?"gpc":Object.values(a).every(Boolean)?"accept_all":Object.values(a).every(R=>!R)?"reject_all":"save_choices",m=new Date(n).toISOString(),y=(await i.query(`SELECT s.latest_receipt_id::text,s.site_analytics,s.enhanced_matching,s.advertising_measurement,s.gpc,r.action
32
- FROM analytics_consent_current_state s JOIN analytics_consent_receipts r ON r.id=s.latest_receipt_id
33
- WHERE s.site_id=$1 AND s.subject_ref=$2 FOR UPDATE`,[e.siteId,t])).rows[0];if(y&&y.site_analytics===a.siteAnalytics&&y.enhanced_matching===a.enhancedMatching&&y.advertising_measurement===a.advertisingMeasurement&&y.gpc===d&&y.action===l)return y.latest_receipt_id;let I=re();return await i.query(`INSERT INTO analytics_consent_receipts(id,site_id,pixel_id,subject_ref,policy_version,jurisdiction_profile,
34
- necessary,site_analytics,enhanced_matching,advertising_measurement,gpc,action,source,presented_at,occurred_at,supersedes_id)
35
- VALUES($1,$2,$3,$4,1,'pixel',true,$5,$6,$7,$8,$9,'gateway',$10,$10,$11)`,[I,e.siteId,e.pixelId,t,a.siteAnalytics,a.enhancedMatching,a.advertisingMeasurement,d,l,m,y?.latest_receipt_id??null]),await i.query(`INSERT INTO analytics_consent_current_state(site_id,subject_ref,latest_receipt_id,policy_version,jurisdiction_profile,
36
- necessary,site_analytics,enhanced_matching,advertising_measurement,gpc,effective_at)
37
- VALUES($1,$2,$3,1,'pixel',true,$4,$5,$6,$7,$8)
38
- ON CONFLICT(site_id,subject_ref) DO UPDATE SET latest_receipt_id=EXCLUDED.latest_receipt_id,
39
- policy_version=EXCLUDED.policy_version,jurisdiction_profile=EXCLUDED.jurisdiction_profile,
40
- site_analytics=EXCLUDED.site_analytics,enhanced_matching=EXCLUDED.enhanced_matching,
41
- advertising_measurement=EXCLUDED.advertising_measurement,gpc=EXCLUDED.gpc,
42
- effective_at=EXCLUDED.effective_at,updated_at=now()
43
- WHERE EXCLUDED.effective_at>=analytics_consent_current_state.effective_at`,[e.siteId,t,I,a.siteAnalytics,a.enhancedMatching,a.advertisingMeasurement,d,m]),I}async function xe(i,e){if(!e.subjectRef)return{personId:null,activationEligible:!1};let s=(await i.query(`SELECT p.id::text AS person_id,s.advertising_measurement
44
- FROM analytics_people p
45
- JOIN analytics_consent_current_state s ON s.site_id=p.site_id AND s.subject_ref=$2
46
- JOIN analytics_consent_receipts r ON r.id=s.latest_receipt_id AND r.site_id=s.site_id
47
- WHERE p.site_id=$1
48
- AND (($3::uuid IS NOT NULL AND p.id=$3) OR ($4::text IS NOT NULL AND EXISTS (
49
- SELECT 1 FROM analytics_events e WHERE e.site_id=p.site_id AND e.event_id=$4
50
- AND e.person_id=p.id AND e.visitor_id=$2
51
- )))
52
- AND s.site_analytics=true AND s.gpc=false AND r.action NOT IN ('withdraw','gpc')
53
- AND (s.expires_at IS NULL OR s.expires_at>now()) LIMIT 1`,[e.siteId,e.subjectRef,e.personId??null,e.eventId??null])).rows[0];return s?{personId:s.person_id,activationEligible:s.advertising_measurement===!0}:{personId:null,activationEligible:!1}}async function C(i,e,t,s){return!t?.trim()||!s?.trim()?!1:!!(await i.query(`SELECT 1 FROM analytics_consent_current_state s
54
- JOIN analytics_consent_receipts r ON r.id=s.latest_receipt_id AND r.site_id=s.site_id
55
- WHERE s.site_id=$1 AND s.subject_ref=$2
56
- AND s.site_analytics=true AND s.enhanced_matching=true AND s.gpc=false
57
- AND r.action NOT IN ('withdraw','gpc')
58
- AND (s.expires_at IS NULL OR s.expires_at>now())
59
- AND EXISTS (SELECT 1 FROM analytics_sessions x
60
- WHERE x.site_id=s.site_id AND x.visitor_hmac=$3 AND x.session_hmac=$4)
61
- ORDER BY s.effective_at DESC LIMIT 1`,[e,t,c("visitor_id",t),c("session_id",s)])).rowCount}async function H(i,e,t){return!!(await i.query(`SELECT 1 FROM analytics_consent_current_state s
62
- JOIN analytics_consent_receipts r ON r.id=s.latest_receipt_id AND r.site_id=s.site_id
63
- WHERE s.site_id=$1 AND s.subject_ref=$2
64
- AND s.site_analytics=true AND s.enhanced_matching=true AND s.gpc=false
65
- AND r.action NOT IN ('withdraw','gpc')
66
- AND (s.expires_at IS NULL OR s.expires_at>now()) LIMIT 1`,[e,t])).rowCount}import{createHash as ae}from"crypto";function He(i,e){let t=i?.trim().toUpperCase();return t&&/^[A-Z0-9-]+$/.test(t)?t.slice(0,e):null}function q(i,e,t){return ae("sha256").update(JSON.stringify({scope:i,siteId:e,filters:t})).digest("base64url").slice(0,18)}function de(i,e){if(!i)return 0;try{let t=JSON.parse(Buffer.from(i,"base64url").toString("utf8"));if(t.v!==1||t.f!==e||!Number.isInteger(t.o)||Number(t.o)<0)throw new Error("invalid");return Number(t.o)}catch{throw new u("invalid_cursor","The pagination cursor is invalid for these filters.")}}function F(i,e,t){if(!e)return{items:i,pageInfo:{hasNextPage:!1,nextCursor:null}};let s=Math.min(100,Math.max(1,Math.trunc(e?.limit??25))),n=de(e?.cursor,t),r=i.slice(n,n+s),o=n+r.length<i.length;return{items:r,pageInfo:{hasNextPage:o,nextCursor:o?Buffer.from(JSON.stringify({v:1,f:t,o:n+r.length})).toString("base64url"):null}}}async function S(i,e,t){let n=(await i.query("SELECT role FROM analytics_site_grants WHERE site_id = $1 AND user_id = $2",[e,t])).rows[0]?.role;if(!n)throw new u("analytics_site_not_found","Site not found.",404);return n}async function ce(i,e,t){let s=await S(i,e,t);if(s==="viewer")throw new u("analytics_forbidden","Editor access is required.",403);return s}async function We(i,e,t){return S(i,e,t)}async function je(i,e,t){return ce(i,e,t)}async function Qe(i){for(;;){let t=await i.query(`SELECT id, visitor_id, session_id
67
- FROM analytics_events
68
- WHERE (visitor_id IS NOT NULL AND visitor_hmac IS NULL)
69
- OR (session_id IS NOT NULL AND session_hmac IS NULL)
70
- ORDER BY id
71
- LIMIT $1`,[500]);if(!t.rowCount)break;await i.query(`UPDATE analytics_events e
72
- SET visitor_hmac = COALESCE(e.visitor_hmac, patch.visitor_hmac),
73
- session_hmac = COALESCE(e.session_hmac, patch.session_hmac)
74
- FROM unnest($1::uuid[], $2::text[], $3::text[]) AS patch(id, visitor_hmac, session_hmac)
75
- WHERE e.id = patch.id`,[t.rows.map(s=>s.id),t.rows.map(s=>s.visitor_id?c("visitor_id",s.visitor_id):null),t.rows.map(s=>s.session_id?c("session_id",s.session_id):null)])}for(;;){let t=await i.query(`SELECT id, session_id
76
- FROM analytics_conversions
77
- WHERE session_id IS NOT NULL AND session_hmac IS NULL
78
- ORDER BY id
79
- LIMIT $1`,[500]);if(!t.rowCount)break;await i.query(`UPDATE analytics_conversions c
80
- SET session_hmac = patch.session_hmac
81
- FROM unnest($1::uuid[], $2::text[]) AS patch(id, session_hmac)
82
- WHERE c.id = patch.id AND c.session_hmac IS NULL`,[t.rows.map(s=>s.id),t.rows.map(s=>c("session_id",s.session_id))])}}function W(){return`xrp_${_e(18).toString("base64url")}`}function ei(i,e){let t=c("crm_entity_id",`${i}:${e}`).slice(0,32).split("");return t[12]="5",t[16]=["8","9","a","b"][Number.parseInt(t[16],16)%4],`${t.slice(0,8).join("")}-${t.slice(8,12).join("")}-${t.slice(12,16).join("")}-${t.slice(16,20).join("")}-${t.slice(20).join("")}`}async function j(i,e,t){let s=await i.query("SELECT id FROM analytics_identity_namespaces WHERE site_id=$1 AND status='approved' ORDER BY version DESC LIMIT 1",[e]);s.rows[0]||(await i.query(`INSERT INTO analytics_identity_namespaces(
83
- id,site_id,name,status,approved_hosts,approved_sources,version,approved_by_user_id,approved_at
84
- )
85
- SELECT $1,s.id,'X-Ray primary','approved',
86
- COALESCE((SELECT jsonb_agg(d.hostname ORDER BY d.hostname)
87
- FROM analytics_pixels p
88
- JOIN analytics_pixel_domains d ON d.pixel_id=p.id AND d.state='approved'
89
- WHERE p.site_id=s.id),'[]'::jsonb),
90
- $3::jsonb,1,s.owner_user_id,now()
91
- FROM analytics_sites s WHERE s.id=$2
92
- ON CONFLICT(site_id,name,version) DO NOTHING`,[p(),e,JSON.stringify([t])]),s=await i.query("SELECT id FROM analytics_identity_namespaces WHERE site_id=$1 AND status='approved' ORDER BY version DESC LIMIT 1",[e]));let n=s.rows[0]?.id;if(!n)throw new u("identity_namespace_unavailable","The Site identity graph could not be initialized.",409);return await i.query(`UPDATE analytics_identity_namespaces
93
- SET approved_sources=(SELECT jsonb_agg(value ORDER BY value)
94
- FROM (SELECT DISTINCT value
95
- FROM jsonb_array_elements_text(approved_sources || $3::jsonb)) merged_sources),
96
- approved_hosts=(SELECT COALESCE(jsonb_agg(hostname ORDER BY hostname),'[]'::jsonb)
97
- FROM (SELECT DISTINCT hostname
98
- FROM (SELECT jsonb_array_elements_text(approved_hosts) AS hostname
99
- UNION ALL
100
- SELECT d.hostname
101
- FROM analytics_pixels p
102
- JOIN analytics_pixel_domains d ON d.pixel_id=p.id AND d.state='approved'
103
- WHERE p.site_id=$2) hosts) distinct_hosts),
104
- updated_at=now()
105
- WHERE id=$1 AND site_id=$2`,[n,e,JSON.stringify([t])]),n}async function le(i,e){if(!e.visitorId&&!e.sessionId)return{events:0,sessions:0,touches:0,conversions:0};let t=e.visitorId?c("visitor_id",e.visitorId):null,s=e.sessionId?c("session_id",e.sessionId):null,n=await i.query(`UPDATE analytics_events SET person_id = $1 WHERE site_id = $2 AND person_id IS NULL
106
- AND (($3::text IS NOT NULL AND visitor_id = $3) OR ($4::text IS NOT NULL AND session_id = $4))`,[e.personId,e.siteId,e.visitorId??null,e.sessionId??null]),r=await i.query(`UPDATE analytics_conversions SET person_id = $1 WHERE site_id = $2 AND person_id IS NULL
107
- AND $3::text IS NOT NULL AND session_id = $3`,[e.personId,e.siteId,e.sessionId??null]),o=await i.query(`UPDATE analytics_sessions SET person_id = $1
108
- WHERE site_id = $2 AND person_id IS NULL
109
- AND (($3::text IS NOT NULL AND visitor_hmac = $3)
110
- OR ($4::text IS NOT NULL AND session_hmac = $4))`,[e.personId,e.siteId,t,s]),a=await i.query(`UPDATE analytics_attribution_touches SET person_id = $1
111
- WHERE site_id = $2 AND person_id IS NULL
112
- AND (($3::text IS NOT NULL AND visitor_hmac = $3)
113
- OR ($4::text IS NOT NULL AND session_id IN (
114
- SELECT id FROM analytics_sessions
115
- WHERE site_id = $2 AND session_hmac = $4
116
- )))`,[e.personId,e.siteId,t,s]);return{events:n.rowCount??0,sessions:o.rowCount??0,touches:a.rowCount??0,conversions:r.rowCount??0}}async function L(i,e){let s=(await i.query(`SELECT id FROM analytics_people
117
- WHERE site_id=$1 AND (namespace_id=$2 OR namespace_id IS NULL)
118
- AND (($3::uuid IS NOT NULL AND crm_entity_id=$3::uuid)
119
- OR ($3::uuid IS NULL AND $4::text IS NOT NULL AND crm_person_ref=$4))
120
- ORDER BY first_seen_at,id LIMIT 1 FOR UPDATE`,[e.siteId,e.namespaceId,e.crmEntityId??null,e.crmPersonRef??null])).rows[0]?.id;if(!s&&!e.crmEntityId&&!e.crmPersonRef&&e.signals.length&&(s=(await i.query(`SELECT assignment.person_id
121
- FROM analytics_identity_nodes node
122
- JOIN analytics_identity_assignments assignment
123
- ON assignment.identity_node_id=node.id AND assignment.site_id=node.site_id
124
- WHERE node.site_id=$1 AND EXISTS (
125
- SELECT 1 FROM jsonb_to_recordset($2::jsonb) signal(kind text,value_hmac text)
126
- WHERE signal.kind=node.kind AND signal.value_hmac=node.value_hmac
127
- )
128
- ORDER BY assignment.assigned_at,assignment.person_id LIMIT 1`,[e.siteId,JSON.stringify(e.signals.map(r=>({kind:r.kind,value_hmac:r.valueHmac})))])).rows[0]?.person_id),s)await i.query(`UPDATE analytics_people SET last_seen_at=now(),
129
- namespace_id=COALESCE(namespace_id,$2),
130
- crm_entity_id=COALESCE(crm_entity_id,$3::uuid),
131
- public_ref=COALESCE(public_ref,$4)
132
- WHERE id=$1 AND site_id=$5`,[s,e.namespaceId,e.crmEntityId??null,W(),e.siteId]);else{let n=e.crmEntityId??null,r=e.crmPersonRef??(n?`XRay::entity::${n}`:`XRay::anonymous::${p()}`);s=(await i.query(`INSERT INTO analytics_people(id,site_id,namespace_id,crm_person_ref,crm_entity_id,public_ref)
133
- VALUES($1,$2,$3,$4,$5::uuid,$6)
134
- ON CONFLICT(site_id,crm_person_ref) DO UPDATE SET last_seen_at=now(),
135
- namespace_id=COALESCE(analytics_people.namespace_id,EXCLUDED.namespace_id),
136
- crm_entity_id=COALESCE(analytics_people.crm_entity_id,EXCLUDED.crm_entity_id),
137
- public_ref=COALESCE(analytics_people.public_ref,EXCLUDED.public_ref)
138
- RETURNING id`,[p(),e.siteId,e.namespaceId,r,n,W()])).rows[0].id}return{personId:s,mergedPersonIds:[]}}async function b(i,e){let s=(await i.query(`SELECT person_id,crm_entity_id::text FROM analytics_identity_assignments
139
- WHERE identity_node_id=$1 AND site_id=$2 FOR UPDATE`,[e.identityNodeId,e.siteId])).rows[0];if(!s){await i.query(`INSERT INTO analytics_identity_assignments(
140
- identity_node_id,site_id,person_id,crm_entity_id,evidence_kind
141
- ) VALUES($1,$2,$3,$4::uuid,$5)
142
- ON CONFLICT(identity_node_id) DO NOTHING`,[e.identityNodeId,e.siteId,e.personId,e.crmEntityId??null,e.evidenceKind]);let n=await i.query("SELECT person_id FROM analytics_identity_assignments WHERE identity_node_id=$1 AND site_id=$2",[e.identityNodeId,e.siteId]);if(n.rows[0]?.person_id===e.personId)return"assigned";if(!n.rows[0])throw new u("identity_assignment_unavailable","Identity assignment could not be recorded.",409);s={person_id:n.rows[0].person_id,crm_entity_id:null}}return s.person_id===e.personId?(await i.query(`UPDATE analytics_identity_assignments SET updated_at=now(),
143
- crm_entity_id=COALESCE(crm_entity_id,$3::uuid),evidence_kind=$4
144
- WHERE identity_node_id=$1 AND site_id=$2`,[e.identityNodeId,e.siteId,e.crmEntityId??null,e.evidenceKind]),"existing"):(await i.query(`INSERT INTO analytics_identity_assignment_conflicts(
145
- id,site_id,identity_node_id,active_person_id,attempted_person_id,
146
- active_crm_entity_id,attempted_crm_entity_id,evidence_kind
147
- ) VALUES($1,$2,$3,$4,$5,$6::uuid,$7::uuid,$8)
148
- ON CONFLICT(identity_node_id,active_person_id,attempted_person_id)
149
- WHERE status='pending' DO UPDATE SET observed_at=now(),evidence_kind=EXCLUDED.evidence_kind`,[p(),e.siteId,e.identityNodeId,s.person_id,e.personId,s.crm_entity_id,e.crmEntityId??null,e.evidenceKind]),"conflict")}async function me(i,e){let s=(await i.query(`WITH person_nodes AS (
150
- SELECT DISTINCT identity_node_id
151
- FROM analytics_identity_edges
152
- WHERE site_id=$1 AND namespace_id=$2 AND person_id=$3
153
- )
154
- UPDATE analytics_candidate_associations a
155
- SET status='promoted',promoted_person_id=$3,promoted_at=$4::timestamptz,updated_at=now()
156
- WHERE a.site_id=$1 AND a.namespace_id=$2
157
- AND (a.left_identity_node_id IN (SELECT identity_node_id FROM person_nodes)
158
- OR a.right_identity_node_id IN (SELECT identity_node_id FROM person_nodes))
159
- AND (a.status IN ('active','expired') OR (a.status='promoted' AND a.promoted_person_id=$3))
160
- RETURNING a.id`,[e.siteId,e.namespaceId,e.personId,e.occurredAt])).rows.map(r=>r.id);if(!s.length)return{associationIds:[],touches:0};for(let r of s)await i.query(`INSERT INTO analytics_candidate_promotions(
161
- id,site_id,namespace_id,association_id,person_id,evidence_kind,
162
- evidence_ref_hmac,promoted_by,promoted_at
163
- ) VALUES($1,$2,$3,$4,$5,$6,$7,'system',$8::timestamptz)
164
- ON CONFLICT(association_id,person_id) DO NOTHING`,[p(),e.siteId,e.namespaceId,r,e.personId,e.candidateEvidenceKind,e.evidenceRefHmac,e.occurredAt]);let n=await i.query(`UPDATE analytics_attribution_touches touch SET person_id=$3
165
- FROM analytics_candidate_attribution_touches candidate_touch
166
- WHERE candidate_touch.site_id=$1 AND candidate_touch.namespace_id=$2
167
- AND candidate_touch.association_id=ANY($4::uuid[])
168
- AND candidate_touch.touch_id=touch.id AND touch.site_id=$1 AND touch.person_id IS NULL`,[e.siteId,e.namespaceId,e.personId,s]);return{associationIds:s,touches:n.rowCount??0}}async function ye(i,e){let t=c("promotion_evidence",`${e.evidenceKind}:${e.evidenceRef}`),s=c("promotion_person",e.personId),n=c("promotion_receipt",`${e.siteId}:${e.personId}:${e.evidenceKind}:${e.evidenceRef}`);await i.query(`INSERT INTO analytics_identity_promotion_receipts(
169
- id,site_id,namespace_id,canonical_person_id,canonical_person_ref_hmac,
170
- evidence_kind,evidence_ref_hmac,prior_person_ids,prior_identity_node_ids,
171
- candidate_association_ids,affected_history_counts,schema_version,idempotency_key,promoted_at
172
- ) VALUES($1,$2,$3,$4,$5,$6,$7,$8::uuid[],$9::uuid[],$10::uuid[],$11::jsonb,
173
- 'xray.identity-promotion.v1',$12,$13::timestamptz)
174
- ON CONFLICT(site_id,idempotency_key) DO NOTHING`,[p(),e.siteId,e.namespaceId,e.personId,s,e.evidenceKind,t,e.priorPersonIds,e.priorIdentityNodeIds,e.candidateAssociationIds,JSON.stringify({...e.history,candidateTouches:e.candidateTouches}),n,e.occurredAt])}async function P(i,e){let t=e.occurredAt??new Date().toISOString(),s=await le(i,e),n=c("promotion_evidence",`${e.evidenceKind}:${e.evidenceRef}`),r=await me(i,{siteId:e.siteId,namespaceId:e.namespaceId,personId:e.personId,candidateEvidenceKind:e.candidateEvidenceKind,evidenceRefHmac:n,occurredAt:t});await ye(i,{...e,history:s,candidateAssociationIds:r.associationIds,candidateTouches:r.touches,occurredAt:t})}async function ii(i,e){let t=e.customerId||e.orderId||e.email||e.phone;if(!t||!await C(i,e.siteId,e.visitorId,e.sessionId))return null;let s=await j(i,e.siteId,"pixel"),n=[...e.email?[{kind:"email",valueHmac:c("email",e.email)}]:[],...e.phone?[{kind:"phone",valueHmac:c("phone",e.phone)}]:[],...e.customerId?[{kind:"customer_id",valueHmac:c("customer_id",e.customerId)}]:[],...e.orderId?[{kind:"customer_id",valueHmac:c("customer_id",`order:${e.orderId}`)}]:[]];await h(i,{siteId:e.siteId,signals:n});let r=`XRay::${c("person_ref",t).slice(0,24)}`,o=[...n,...e.visitorId?[{kind:"visitor_id",valueHmac:c("visitor_id",e.visitorId)}]:[],...e.sessionId?[{kind:"session_id",valueHmac:c("session_id",e.sessionId)}]:[]],a=await L(i,{siteId:e.siteId,namespaceId:s,crmPersonRef:r,signals:o}),d=a.personId,l=[];e.visitorId&&l.push({kind:"visitor_id",value:e.visitorId,evidence:"pixel_identify",confidence:.98}),e.sessionId&&l.push({kind:"session_id",value:e.sessionId,evidence:"pixel_identify",confidence:.98}),e.email&&l.push({kind:"email",value:e.email,evidence:"pixel_identify",confidence:1}),e.phone&&l.push({kind:"phone",value:e.phone,evidence:"pixel_identify",confidence:.99}),e.customerId&&l.push({kind:"customer_id",value:e.customerId,evidence:"customer_id",confidence:1}),e.orderId&&l.push({kind:"customer_id",value:`order:${e.orderId}`,evidence:"order_id",confidence:1});for(let[y,I]of Object.entries(w(e.clickIds)))l.push({kind:"click_id",value:`${y}:${I}`,evidence:y,confidence:.9});let m=[],_=!1;for(let y of l){let I=await i.query(`INSERT INTO analytics_identity_nodes(id, site_id, namespace_id, kind, value_hmac) VALUES ($1,$2,$3,$4,$5)
175
- ON CONFLICT(site_id, kind, value_hmac) DO UPDATE SET last_seen_at = now(),
176
- namespace_id=COALESCE(analytics_identity_nodes.namespace_id,EXCLUDED.namespace_id) RETURNING id`,[p(),e.siteId,s,y.kind,c(y.kind,y.value)]);m.push(I.rows[0].id),await i.query(`INSERT INTO analytics_identity_edges(id, site_id, namespace_id, person_id, identity_node_id, evidence_kind, confidence)
177
- VALUES ($1,$2,$3,$4,$5,$6,$7)
178
- ON CONFLICT(person_id, identity_node_id, evidence_kind) DO UPDATE
179
- SET last_seen_at = now(), confidence = greatest(analytics_identity_edges.confidence, EXCLUDED.confidence),
180
- namespace_id=COALESCE(analytics_identity_edges.namespace_id,EXCLUDED.namespace_id)`,[p(),e.siteId,s,d,I.rows[0].id,y.evidence,y.confidence]);let R=await b(i,{siteId:e.siteId,personId:d,identityNodeId:I.rows[0].id,evidenceKind:y.evidence});_||=R==="conflict"}return _||await P(i,{siteId:e.siteId,namespaceId:s,personId:d,evidenceKind:e.customerId?"authenticated_login":"browser_identify",candidateEvidenceKind:e.email?"verified_email":e.phone?"verified_phone":"authenticated_user",evidenceRef:t,priorPersonIds:a.mergedPersonIds,priorIdentityNodeIds:m,visitorId:e.visitorId,sessionId:e.sessionId,occurredAt:e.occurredAt}),e.customerId&&!_&&await $(i,{siteId:e.siteId,personId:d,consentSubjectRefs:[e.visitorId??"",e.sessionId??""],evidenceType:"authenticated_user",email:e.email,phone:e.phone}),d}async function ti(i){let e=await E().connect();try{if(await e.query("BEGIN"),!await C(e,i.siteId,i.visitorId,i.sessionId))return await e.query("COMMIT"),{personId:null,linkedSignals:0,conflicts:0};let t=await j(e,i.siteId,"form"),s=[...i.email?[{kind:"email",valueHmac:c("email",i.email)}]:[],...i.phone?[{kind:"phone",valueHmac:c("phone",i.phone)}]:[]];await h(e,{siteId:i.siteId,signals:s});let n=[...s,...i.visitorId?[{kind:"visitor_id",valueHmac:c("visitor_id",i.visitorId)}]:[],...i.sessionId?[{kind:"session_id",valueHmac:c("session_id",i.sessionId)}]:[]],r=await L(e,{siteId:i.siteId,namespaceId:t,crmPersonRef:i.crmPersonRef,crmEntityId:i.crmEntityId,signals:n}),o=r.personId,a=[];i.visitorId&&a.push({kind:"visitor_id",value:i.visitorId,evidence:"first_party_form",confidence:.98}),i.sessionId&&a.push({kind:"session_id",value:i.sessionId,evidence:"first_party_form",confidence:.95}),i.email&&a.push({kind:"email",value:i.email,evidence:"submitted_email",confidence:1}),i.phone&&a.push({kind:"phone",value:i.phone,evidence:"submitted_phone",confidence:.99});for(let[m,_]of Object.entries(w(i.clickIds)))a.push({kind:"click_id",value:`${m}:${_}`,evidence:m,confidence:.9});let d=[],l=0;for(let m of a){let _=await e.query(`INSERT INTO analytics_identity_nodes(id, site_id, namespace_id, kind, value_hmac) VALUES ($1,$2,$3,$4,$5)
181
- ON CONFLICT(site_id, kind, value_hmac) DO UPDATE SET last_seen_at = now(),
182
- namespace_id=COALESCE(analytics_identity_nodes.namespace_id,EXCLUDED.namespace_id) RETURNING id`,[p(),i.siteId,t,m.kind,c(m.kind,m.value)]);d.push(_.rows[0].id),await e.query(`INSERT INTO analytics_identity_edges(id, site_id, namespace_id, person_id, identity_node_id, evidence_kind, confidence)
183
- VALUES ($1,$2,$3,$4,$5,$6,$7)
184
- ON CONFLICT(person_id, identity_node_id, evidence_kind) DO UPDATE SET last_seen_at = now(),
185
- confidence = greatest(analytics_identity_edges.confidence, EXCLUDED.confidence),
186
- namespace_id=COALESCE(analytics_identity_edges.namespace_id,EXCLUDED.namespace_id)`,[p(),i.siteId,t,o,_.rows[0].id,m.evidence,m.confidence]),await b(e,{siteId:i.siteId,personId:o,crmEntityId:i.crmEntityId,identityNodeId:_.rows[0].id,evidenceKind:m.evidence})==="conflict"&&(l+=1)}return i.submissionId&&await e.query("UPDATE analytics_form_submissions SET person_id = $1 WHERE id = $2 AND site_id = $3",[o,i.submissionId,i.siteId]),l===0&&await P(e,{siteId:i.siteId,namespaceId:t,personId:o,evidenceKind:"form_fill",candidateEvidenceKind:i.email?"verified_email":i.phone?"verified_phone":"authenticated_user",evidenceRef:i.submissionId??i.crmEntityId??i.crmPersonRef??o,priorPersonIds:r.mergedPersonIds,priorIdentityNodeIds:d,visitorId:i.visitorId,sessionId:i.sessionId}),l===0&&await $(e,{siteId:i.siteId,personId:o,consentSubjectRefs:[i.visitorId??""],evidenceType:i.evidenceType??"first_party_form",displayName:i.displayName,email:i.email,phone:i.phone}),await e.query("COMMIT"),{personId:o,linkedSignals:a.length,conflicts:l}}catch(t){throw await e.query("ROLLBACK"),t}finally{e.release()}}async function si(i){let e=await E().connect();try{await e.query("BEGIN");let s=(await e.query(`SELECT p.id,p.public_ref,p.namespace_id FROM analytics_people p
187
- JOIN analytics_identity_namespaces n ON n.id=p.namespace_id AND n.site_id=p.site_id AND n.status='approved'
188
- WHERE p.site_id=$1 AND p.crm_person_ref=$2 LIMIT 1 FOR UPDATE OF p`,[i.siteId,i.crmPersonRef])).rows[0];if(!s||!await H(e,i.siteId,s.public_ref))return await e.query("COMMIT"),{personId:null,linkedSignals:0,conflicts:0};let n=[...i.email?[{kind:"email",value:i.email,confidence:1}]:[],...i.phone?[{kind:"phone",value:i.phone,confidence:.99}]:[]];await h(e,{siteId:i.siteId,signals:n.map(_=>({kind:_.kind,valueHmac:c(_.kind,_.value)}))});let r=await L(e,{siteId:i.siteId,namespaceId:s.namespace_id,crmPersonRef:i.crmPersonRef,crmEntityId:i.crmEntityId,signals:n.map(_=>({kind:_.kind,valueHmac:c(_.kind,_.value)}))}),o=r.personId,d=(await e.query("SELECT public_ref FROM analytics_people WHERE id=$1 AND site_id=$2",[o,i.siteId])).rows[0]?.public_ref??s.public_ref,l=[],m=0;for(let _ of n){let y=await e.query(`INSERT INTO analytics_identity_nodes(id,site_id,namespace_id,kind,value_hmac) VALUES($1,$2,$3,$4,$5)
189
- ON CONFLICT(site_id,kind,value_hmac) DO UPDATE SET last_seen_at=now(),
190
- namespace_id=COALESCE(analytics_identity_nodes.namespace_id,EXCLUDED.namespace_id) RETURNING id`,[p(),i.siteId,s.namespace_id,_.kind,c(_.kind,_.value)]);l.push(y.rows[0].id),await e.query(`INSERT INTO analytics_identity_edges(id,site_id,namespace_id,person_id,identity_node_id,evidence_kind,confidence)
191
- VALUES($1,$2,$3,$4,$5,'crm_contact',$6)
192
- ON CONFLICT(person_id,identity_node_id,evidence_kind) DO UPDATE SET last_seen_at=now(),
193
- confidence=greatest(analytics_identity_edges.confidence,EXCLUDED.confidence)`,[p(),i.siteId,s.namespace_id,o,y.rows[0].id,_.confidence]),await b(e,{siteId:i.siteId,personId:o,crmEntityId:i.crmEntityId,identityNodeId:y.rows[0].id,evidenceKind:"crm_contact"})==="conflict"&&(m+=1)}return m===0&&await P(e,{siteId:i.siteId,namespaceId:s.namespace_id,personId:o,evidenceKind:"crm_identity",candidateEvidenceKind:"crm_contact",evidenceRef:i.crmPersonRef,priorPersonIds:r.mergedPersonIds,priorIdentityNodeIds:l}),m===0&&await $(e,{siteId:i.siteId,personId:o,consentSubjectRefs:[d],evidenceType:"crm_contact",displayName:i.displayName,email:i.email,phone:i.phone}),await e.query("COMMIT"),{personId:o,linkedSignals:n.length,conflicts:m}}catch(t){throw await e.query("ROLLBACK"),t}finally{e.release()}}async function ni(i,e,t){let s=E();await S(s,i,e);let n=await s.query(`SELECT p.id, p.first_seen_at, p.last_seen_at, true AS crm_linked,
194
- (SELECT count(*)::int FROM analytics_identity_edges e WHERE e.person_id = p.id) AS signal_count,
195
- (SELECT count(*)::int FROM analytics_form_submissions f WHERE f.person_id = p.id) AS form_submission_count,
196
- (SELECT count(*)::int FROM analytics_conversions c WHERE c.person_id = p.id) AS conversion_count,
197
- (SELECT COALESCE(sum(c.value_minor), 0)::bigint FROM analytics_conversions c WHERE c.person_id = p.id) AS revenue_minor
198
- FROM analytics_people p WHERE p.site_id = $1 ORDER BY p.last_seen_at DESC, p.id DESC LIMIT 1000`,[i]),r=F(n.rows,t,q("people",i,{start:"all",end:"all"}));return{people:r.items,pageInfo:r.pageInfo}}export{u as a,E as b,k as c,U as d,Ne as e,ve as f,Ae as g,w as h,c as i,f as j,Re as k,oe as l,be as m,Pe as n,xe as o,He as p,q,F as r,S as s,ce as t,We as u,je as v,Qe as w,W as x,ei as y,le as z,b as A,ii as B,ti as C,si as D,ni as E};
@@ -1,41 +0,0 @@
1
- import{a as ot}from"./chunk-U4WIJZCX.js";import{G as fe,a as Qe,c as Ve}from"./chunk-JNPM3U3L.js";import{g as Ke,h as Ze}from"./chunk-KXJCGV3H.js";import{c as st}from"./chunk-JMZIDHYQ.js";import{c as tt,e as nt,f as rt,g as it}from"./chunk-CNSVZTTT.js";import{c as et}from"./chunk-K3VDGJNK.js";import{h as Ge}from"./chunk-C7MGJUTU.js";import{a as se}from"./chunk-WNUXMPVX.js";import{createWriteStream as ae,mkdtempSync as Yt,mkdirSync as le,readFileSync as Wt,readdirSync as Gt,rmSync as Kt,statSync as Zt,writeFileSync as y}from"fs";import{createHash as W}from"crypto";import{join as l}from"path";import{tmpdir as Qt}from"os";import{createGzip as Vt}from"zlib";import{once as G}from"events";import{finished as ue}from"stream/promises";import{ZipFile as en}from"yazl";import tn from"p-limit";var vt=new Set(["browser_navigation_blocked","browser_navigation_failed","browser_timeout","browser_session_failed","browser_result_missing"]);function Mt(e){return e instanceof Error?e.code:void 0}function At(e){return e instanceof Error?e.message:String(e)}function at(e){let r=e?.match(/^browser_http_(\d+)$/);return r?Number(r[1]):null}function It(e){return e===404?"page_not_found":e===403?"page_forbidden":e===429?"page_rate_limited":e>=500&&e<=599?"page_server_error":"page_http_error"}function Rt(e){let r=At(e),i=Mt(e);if(ot(e,r))return{errorCode:"vendor_unavailable",httpStatus:null,retryable:!0};let a=at(i)??at(r.match(/^(browser_http_\d+)/)?.[1]);return a!=null?{errorCode:It(a),httpStatus:a,retryable:a===429||a>=500}:i==="browser_challenge_unresolved"||/^browser_challenge_unresolved/.test(r)?{errorCode:"bot_check_unresolved",httpStatus:null,retryable:!0}:i==="browser_response_too_large"||/exceeds \d+ byte limit/i.test(r)?{errorCode:"page_too_large",httpStatus:null,retryable:!1}:/browser (?:has been )?closed|context closed|target page, context or browser has been closed|session closed/i.test(r)?{errorCode:"browser_session_interrupted",httpStatus:null,retryable:!0}:vt.has(i??"")||/timeout|navigation_failed|ERR_/i.test(r)?{errorCode:"page_unreachable",httpStatus:null,retryable:!0}:{errorCode:"extraction_failed",httpStatus:null,retryable:!1}}function lt(e,r){switch(e){case"page_not_found":return`The page could not be found (HTTP ${r??404}). It may have been moved or deleted.`;case"page_forbidden":return`The site refused the request (HTTP ${r??403}).`;case"page_rate_limited":return"The site is rate-limiting requests right now (HTTP 429). Retrying after a short wait usually works.";case"page_server_error":return`The page's own server returned an error (HTTP ${r}). This is on the target site's side, not something a retry here can fix.`;case"page_http_error":return`The page returned an unexpected HTTP ${r} response.`;case"bot_check_unresolved":return"This site has automated-traffic protection (a bot/CAPTCHA check) that could not be resolved in time. Some sites are simply not extractable this way.";case"page_too_large":return"The page is larger than we can safely process.";case"page_unreachable":return"The page did not respond in time, or the connection could not be completed.";case"browser_session_interrupted":return"The browser session closed before extraction completed. A retry uses a fresh browser session.";case"vendor_unavailable":return"MCP Scraper's internal browser services require MCP Scraper team attention. Servers or IPs are down until this is fixed \u2014 this is not caused by your request. Please retry in a few minutes.";case"extraction_failed":return"The page could not be extracted. Check retryable before attempting it again; contact support if this persists for the same URL."}}function on(e,r={}){let i=lt(e.errorCode,e.httpStatus);return{...Ge({errorCode:e.errorCode,retryable:e.retryable,chargeStatus:r.chargeStatus,details:{...r.details??{},...e.httpStatus!=null?{http_status:e.httpStatus}:{}}}),message:i,error:i}}function an(e){return e.httpStatus===404?404:e.httpStatus===403?403:e.httpStatus===429?429:e.httpStatus!=null&&e.httpStatus>=500&&e.httpStatus<=599?500:e.httpStatus!=null?502:e.errorCode==="vendor_unavailable"?503:502}var Dt="wayback_capture_missing";function Me(e,r){if(e==null)return{failureCode:null,failureReason:null};if(e===Dt)return{failureCode:e,failureReason:r??null};let i=new Error(r??e);i.code=e;let a=Rt(i);return{failureCode:a.errorCode,failureReason:lt(a.errorCode,a.httpStatus)}}import{createHash as Ie}from"crypto";import{neon as $t}from"@neondatabase/serverless";import{waitUntil as Ut}from"@vercel/functions";var jt="jina",ye=null,ut=!1;function be(){return(process.env.JINA_EMBED_MODEL??"jina-embeddings-v5-omni-small").trim()}function _e(){return Number((process.env.JINA_EMBED_DIM??"1024").trim())}function Ae(){return!!(process.env.JINA_API_KEY?.trim()&&process.env.MEMORY_DATABASE_URL?.trim())}function oe(){if(ye)return ye;let e=process.env.MEMORY_DATABASE_URL?.trim();if(!e)throw new Error("MEMORY_DATABASE_URL is not set; Commons semantic search needs the shared Postgres.");return ye=$t(e),ye}async function mt(){if(ut)return;let e=_e();await oe().query("CREATE EXTENSION IF NOT EXISTS vector"),await oe().query(`
2
- CREATE TABLE IF NOT EXISTS commons_index_vectors (
3
- document_id TEXT PRIMARY KEY,
4
- entity_id TEXT NOT NULL,
5
- document_type TEXT NOT NULL,
6
- title TEXT NOT NULL,
7
- embedding vector(${e}) NOT NULL,
8
- model TEXT NOT NULL,
9
- updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
10
- )
11
- `),await oe().query("CREATE INDEX IF NOT EXISTS commons_index_vectors_entity ON commons_index_vectors(entity_id)"),ut=!0}async function we(e){let r=process.env.JINA_API_KEY?.trim();if(!r)throw new Error("JINA_API_KEY is not set; Commons semantic search cannot embed.");if(!e.length)return[];let i=await fetch("https://api.jina.ai/v1/embeddings",{method:"POST",headers:{authorization:`Bearer ${r}`,"content-type":"application/json"},body:JSON.stringify({model:be(),dimensions:_e(),input:e.map(p=>({text:p.slice(0,8e3)}))}),signal:AbortSignal.timeout(6e4)});if(!i.ok)throw new Error(`Jina embedding request failed with HTTP ${i.status}: ${(await i.text()).slice(0,200)}`);let s=((await i.json()).data??[]).map(p=>p.embedding);if(s.length!==e.length)throw new Error(`Jina returned ${s.length} embeddings for ${e.length} inputs.`);return s}var Nt=60*6e4;async function Lt(e=50){if(!Ae())return{claimed:0,embedded:0,failed:0,remaining:0};await mt();let r=Math.max(1,Math.min(200,Math.floor(e))),a=(await se().execute({sql:`SELECT id, entity_id, document_type, title, text FROM commons_index_documents
12
- WHERE embedding_status = 'queued' OR (embedding_status = 'failed' AND updated_at < ?)
13
- ORDER BY updated_at ASC LIMIT ?`,args:[new Date(Date.now()-Nt).toISOString(),r]})).rows;if(!a.length)return{claimed:0,embedded:0,failed:0,remaining:await ct()};let s=0,p=0,M=be();try{let h=await we(a.map(S=>`${S.title}
14
-
15
- ${S.text}`));for(let[S,_]of a.entries()){let C=`[${h[S].join(",")}]`;await oe().query(`INSERT INTO commons_index_vectors (document_id, entity_id, document_type, title, embedding, model, updated_at)
16
- VALUES ($1, $2, $3, $4, $5::vector, $6, now())
17
- ON CONFLICT (document_id) DO UPDATE SET entity_id = EXCLUDED.entity_id, document_type = EXCLUDED.document_type,
18
- title = EXCLUDED.title, embedding = EXCLUDED.embedding, model = EXCLUDED.model, updated_at = now()`,[_.id,_.entity_id,_.document_type,_.title,C,M]),await se().execute({sql:`UPDATE commons_index_documents SET embedding_status = 'indexed', embedding_provider = ?, embedding_model = ?,
19
- vector_ref = ?, indexed_at = ?, error = NULL WHERE id = ?`,args:[jt,M,_.id,new Date().toISOString(),_.id]}),s+=1}}catch(h){p=a.length-s;let S=(h instanceof Error?h.message:String(h)).slice(0,500);for(let _ of a.slice(s))await se().execute({sql:"UPDATE commons_index_documents SET embedding_status = 'failed', error = ?, updated_at = ? WHERE id = ?",args:[S,new Date().toISOString(),_.id]}).catch(()=>{})}return{claimed:a.length,embedded:s,failed:p,remaining:await ct()}}function dn(){Ae()&&Ut(Lt(10).catch(e=>{console.error("[commons/embeddings] immediate embed failed; the scheduled drain will retry",e instanceof Error?e.message:String(e))}))}async function ct(){let e=await se().execute("SELECT COUNT(*) AS n FROM commons_index_documents WHERE embedding_status IN ('queued', 'failed')");return Number(e.rows[0]?.n??0)}async function pn(e,r=40){let i=new Map;if(!Ae()||!e.trim())return i;await mt();let[a]=await we([e]);if(!a)return i;let s=await oe().query(`SELECT entity_id, MAX(1 - (embedding <=> $1::vector)) AS score
20
- FROM commons_index_vectors GROUP BY entity_id ORDER BY score DESC LIMIT $2`,[`[${a.join(",")}]`,Math.max(1,Math.min(100,r))]);for(let p of s)i.set(String(p.entity_id),Number(p.score));return i}var Ot=500,Bt=.9,qt=1e4,Ft=5e4;function Se(e,r){let i=10**r;return Math.round(e*i)/i}function Jt(e,r){if(e.length===0||e.length!==r.length)throw new Error("Similarity vectors must have the same non-zero dimension.");let i=0,a=0,s=0;for(let p=0;p<e.length;p++)i+=e[p]*r[p],a+=e[p]*e[p],s+=r[p]*r[p];return a===0||s===0?0:Math.max(-1,Math.min(1,i/(Math.sqrt(a)*Math.sqrt(s))))}function Ht(e){let r=Ie("sha256");for(let i of[...e].sort((a,s)=>a.url.localeCompare(s.url)))r.update(i.url),r.update("\0"),r.update(i.contentHash),r.update("\0");return r.digest("hex")}function dt(e){let r=e.replace(/!\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/https?:\/\/\S+/gi," ").replace(/&(?:amp|nbsp|quot|#39);/gi," ").replace(/[#>*_`~|\\-]+/g," ").replace(/[^\p{L}\p{N}]+/gu," ").replace(/\s+/g," ").trim().toLowerCase();return r.length>=12?r:null}function zt(e){let r=e.map(h=>h.bodyMarkdown.split(/\n{2,}/).map(S=>S.trim()).filter(Boolean)),i=e.length>=4?Math.max(3,Math.ceil(e.length*.5)):null,a=new Map;for(let h of r){let S=new Set(h.map(dt).filter(_=>!!_));for(let _ of S)a.set(_,(a.get(_)??0)+1)}let s=new Set;if(i!=null)for(let[h,S]of a)S>=i&&s.add(h);let p=0;return{texts:e.map((h,S)=>{let _=[];for(let P of r[S]){let I=dt(P);if(I&&s.has(I)){p+=P.length;continue}_.push(P)}let C=_.join(`
21
-
22
- `).trim(),v=C.length>=60?C:h.bodyMarkdown;return`${h.title?.trim()||"Untitled page"}
23
-
24
- ${v}`}),minimumPageCount:i,removedBlockSignatures:s.size,removedCharacters:p}}var Re=class{parent;constructor(r){this.parent=Array.from({length:r},(i,a)=>a)}find(r){let i=this.parent[r];return i!==r&&(this.parent[r]=this.find(i)),this.parent[r]}union(r,i){let a=this.find(r),s=this.find(i);a!==s&&(this.parent[s]=a)}};async function pt(e,r={}){let i=e.filter(o=>o.bodyMarkdown.trim().length>0).slice(0,Ot),a=Number.isFinite(r.threshold)?r.threshold:Bt,s=Number.isFinite(r.maxPairs)?r.maxPairs:qt,p=Math.max(0,Math.min(1,a)),M=Math.max(1,Math.min(Ft,Math.floor(s))),h=r.model??be(),S=r.dimensions??_e(),_=r.embedTexts??we,C=zt(i),v=[],P=new Map,I=[];for(let[o,f]of i.entries()){let w=f.contentHash||Ie("sha256").update(f.bodyMarkdown).digest("hex"),k=P.get(w);k==null&&(k=v.length,P.set(w,k),v.push(C.texts[o])),I.push(k)}let D=[];for(let o=0;o<v.length;o+=64)D.push(...await _(v.slice(o,o+64)));if(D.length!==v.length)throw new Error(`Embedding provider returned ${D.length} vectors for ${v.length} unique page bodies.`);let K=I.map(o=>D[o]),ce=new Re(i.length),L=[],O=[];for(let o=0;o<i.length;o++)for(let f=o+1;f<i.length;f++){let w=Jt(K[o],K[f]);L.push(w),!(w<p)&&(O.push({source:o,target:f,score:w}),ce.union(o,f))}O.sort((o,f)=>f.score-o.score||i[o.source].url.localeCompare(i[f.source].url)||i[o.target].url.localeCompare(i[f.target].url));let R=[...L].sort((o,f)=>o-f),U=o=>R.length?Se(R[Math.floor((R.length-1)*o)],6):null,j=new Map;for(let o=0;o<i.length;o++){let f=ce.find(o),w=j.get(f)??[];w.push(o),j.set(f,w)}let B=new Map,J=[...j.values()].filter(o=>o.length>1).sort((o,f)=>f.length-o.length||i[o[0]].url.localeCompare(i[f[0]].url)).map((o,f)=>{let w=`cluster-${String(f+1).padStart(3,"0")}`;for(let k of o)B.set(k,w);return{clusterId:w,pageCount:o.length,urls:o.map(k=>i[k].url).sort()}}),H=O.slice(0,M).map((o,f)=>{let w=i[o.source],k=i[o.target],q=Se(o.score,6);return{sourceUrl:w.url,sourceTitle:w.title,targetUrl:k.url,targetTitle:k.title,similarity:q,similarityPercent:Se(q*100,2),corpusPercentile:R.length<=1?100:Se((1-f/(R.length-1))*100,2),exactContentDuplicate:!!(w.contentHash&&w.contentHash===k.contentHash),sourceWordCount:w.wordCount,targetWordCount:k.wordCount,clusterId:B.get(o.source)??null}}),z=Ht(i),me=Ie("sha256").update(JSON.stringify({corpusSha256:z,model:h,dimensions:S,threshold:p,maxPairs:M,boilerplateRemoval:{method:"corpus_repeated_markdown_blocks",minimumPageCount:C.minimumPageCount,removedBlockSignatures:C.removedBlockSignatures}})).digest("hex");return{generatedAt:new Date().toISOString(),provider:"jina",model:h,dimensions:S,threshold:p,requestedMaxPairs:M,comparedPages:i.length,possiblePairs:i.length*Math.max(0,i.length-1)/2,qualifyingPairs:O.length,returnedPairs:H.length,pairsTruncated:O.length>H.length,corpusSha256:z,analysisSha256:me,scoreDistribution:{min:U(0),p25:U(.25),median:U(.5),p75:U(.75),p90:U(.9),max:U(1)},boilerplateRemoval:{method:"corpus_repeated_markdown_blocks",minimumPageCount:C.minimumPageCount,removedBlockSignatures:C.removedBlockSignatures,removedCharacters:C.removedCharacters},rows:H,clusters:J}}import{basename as Xt}from"path";function Y(e){return e.split("#")[0].replace(/\/$/,"")}function De(e){let r=e.replace(/^www\./,"").toLowerCase(),i=r.split(".");return i.length<=2?r:i.slice(-2).join(".")}function gt(e,r){try{let i=new URL(e);return Xt(i.pathname).replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,80)||`image-${r}`}catch{return`image-${r}`}}function ht(){let e=new Map;return r=>{let i=r.replace(/^https?:\/\//,"").replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"page",a=e.get(i)??0;return e.set(i,a+1),a?`${i}-${a}`:i}}function ft(e){let r=e==null?"":String(e);return/[",\r\n]/.test(r)?`"${r.replace(/"/g,'""')}"`:r}function yt(e){return{source_url:e.sourceUrl,source_title:e.sourceTitle,target_url:e.targetUrl,target_title:e.targetTitle,similarity:e.similarity,similarity_percent:e.similarityPercent,corpus_percentile:e.corpusPercentile,exact_content_duplicate:e.exactContentDuplicate,source_word_count:e.sourceWordCount,target_word_count:e.targetWordCount,cluster_id:e.clusterId}}var $e=20,Ue=500,nn=8,bt=10*1024*1024,_t=100*1024*1024,je=25e4;async function Fn(e,r={}){let i=e.options.downloadImages===!0;if(e.userId==null)throw new Error("site extract artifact owner is missing");let a=Qe(String(e.userId)),s=Yt(l(Qt(),"extract-bundle-"));le(s,{recursive:!0}),i&&le(l(s,"images"),{recursive:!0});let p=e.options.captureRenderedDom===!0,M=e.options.semanticSimilarity===!0;p&&le(l(s,"rendered-dom"),{recursive:!0});try{let h=[],S=[],_=[],C=ht(),v=[],P=e.options.waybackTimeline,I=new Map;for await(let n of fe(e.id))for(let t of n){I.set(Y(t.url),t.status),h.push({url:t.url,status:t.status,title:t.title,titleLength:t.titleLength,titlePixels:t.titlePixels,metaDescription:t.metaDescription,metaDescLength:t.metaDescLength,h1:t.h1,h1_2:t.h1_2,h2Count:t.h2Count,extractionStatus:t.extractionStatus,indexable:t.indexable,indexabilityReason:t.indexabilityReason,canonicalUrl:t.canonicalUrl?t.url:null,wordCount:t.wordCount,contentHash:t.contentHash,imagesMissingAlt:t.imagesMissingAlt,schemaTypes:t.schemaTypes.length>0?["present"]:[],outlinks:[]});let u=t.pageId??W("sha256").update(t.archivedUrl??t.url).digest("hex"),E=l(s,"pages",u);le(E,{recursive:!0});let d=t.contentRef?await a(t.contentRef):null,g=d?.html??null,c=d?.markdown??t.bodyMarkdown??null;if(M&&t.extractionStatus==="successful"&&c?.trim()&&S.push({url:t.url,title:t.title,bodyMarkdown:c,contentHash:t.contentHash,wordCount:t.wordCount}),p&&g!=null){let We=`rendered-dom/${C(t.url)}.html.txt`;y(l(s,We),g),_.push({url:t.url,path:We,bytes:Buffer.byteLength(g),truncated:t.renderedDomTruncated===!0,sanitized:t.renderedDomSanitized===!0})}let m=g==null?null:`pages/${u}/page.html`,b=c==null?null:`pages/${u}/page.md`,x=c==null||!t.archiveRequestedMonth?null:`pages/${t.archiveRequestedMonth}/${u}.md`;g!=null&&m&&y(l(s,m),g),c!=null&&b&&y(l(s,b),c),c!=null&&x&&(le(l(s,"pages",t.archiveRequestedMonth),{recursive:!0}),y(l(s,x),c));let{bodyMarkdown:A,contentRef:ne,discoveryLinks:re,...Ct}=t,ie={version:"site-export-page.v1",...Ct,pageId:u,content:{htmlPath:m,markdownPath:b,htmlBytes:g==null?0:Buffer.byteLength(g),markdownBytes:c==null?0:Buffer.byteLength(c),htmlSha256:g==null?null:W("sha256").update(g).digest("hex"),markdownSha256:c==null?null:W("sha256").update(c).digest("hex")}},Xe=JSON.stringify(ie,null,2),Ye=`pages/${u}/page.json`;y(l(s,Ye),Xe),v.push({pageId:u,url:t.archivedUrl??t.url,jsonPath:Ye,htmlPath:m,markdownPath:b,legacyMarkdownPath:x,jsonSha256:W("sha256").update(Xe).digest("hex"),htmlSha256:ie.content.htmlSha256,markdownSha256:ie.content.markdownSha256,htmlBytes:ie.content.htmlBytes,markdownBytes:ie.content.markdownBytes})}let D=Vt(),K=ae(l(s,"links.jsonl.gz"));D.pipe(K);let ce=async n=>{D.write(n)||await G(D,"drain")},L=ae(l(s,"schema.jsonl")),O=async n=>{L.write(n)||await G(L,"drain")},R=ae(l(s,"failures.jsonl")),U=async n=>{R.write(n)||await G(R,"drain")},j=new Map,B=new Map,J=new Map,H=new Map,z=new Map,me=new Set,o=0,f=0,w=0,k=0,q=0,xe=!1,Ee="";try{Ee=De(new URL(e.startUrl).hostname)}catch{Ee=""}let wt=tn(nn),Ne=[],Le=[],Oe=[],Z=0,de=0,ke=0,St=n=>ke+n>_t?!1:(ke+=n,!0);for await(let n of fe(e.id))for(let t of n){if(t.schema?.length&&await O(JSON.stringify({url:t.url,schema:t.schema})+`
25
- `),t.extractionStatus==="failed"){let{failureCode:d,failureReason:g}=Me(t.failureCode,t.failureReason);await U(JSON.stringify({url:t.url,status:t.status,via:t.via,failureCode:d,failureReason:g,fetchAttempts:t.fetchAttempts??[]})+`
26
- `)}if(t.imageLinks?.length)for(let[d,g]of t.imageLinks.entries()){let c=W("sha256").update(`${t.url}\0${g}`).digest("hex"),m={imageId:c,sourcePage:t.url,sourceUrl:g,path:null,status:"not_requested",mimeType:null,bytes:null,sha256:null,failureCode:null,failureReason:null,artifactId:null};if(Le.push(m),!i)continue;if(d>=$e){m.status="skipped_page_limit",m.failureCode="page_image_limit",m.failureReason=`Only the first ${$e} image candidates are downloaded per page.`;continue}if(Z>=Ue){m.status="skipped_site_limit",m.failureCode="site_image_limit",m.failureReason=`Only the first ${Ue} image candidates are downloaded per site.`;continue}Z++;let b=`${c}-${gt(g,d)}`,x=l(s,"images");Ne.push(wt(()=>st(g,x,b,{expectedType:"image",maxBytes:bt,consumeBytes:St})).then(async A=>{let ne=Wt(A.savedPath),re=await Ze({ownerId:String(e.userId),jobId:e.id,imageId:c,filename:b,contentType:A.mimeType??"application/octet-stream",content:ne,sourceUrl:g,sourcePage:t.url});Oe.push(re),m.status="downloaded",m.path=`images/${b}`,m.artifactId=re.key,m.mimeType=A.mimeType,m.bytes=A.sizeBytes,m.sha256=W("sha256").update(ne).digest("hex")},A=>{de++,m.status="failed",m.failureCode="image_download_failed",m.failureReason=(A instanceof Error?A.message:String(A)).replace(/\s+/g," ").slice(0,500)}))}let u=Y(t.url),E={int:0,ext:0};for(let d of t.outlinks??[]){let g=(d.rel??"").split(/\s+/).includes("nofollow"),c=Y(d.href),m=I.get(c)??null;if(await ce(JSON.stringify({from:t.url,to:d.href,anchor:d.anchor,rel:d.rel,internal:d.internal,nofollow:g,targetStatus:m})+`
27
- `),k++,q>=je){xe=!0;continue}if(q++,d.internal){if(E.int++,o++,j.has(c)||j.set(c,new Set),j.get(c).add(u),d.anchor){B.has(c)||B.set(c,new Map);let b=B.get(c);b.set(d.anchor,(b.get(d.anchor)??0)+1)}!g&&(I.get(c)===200||!I.has(c))&&(J.has(u)||J.set(u,new Set),J.get(u).add(c)),m!=null&&m>=400&&(w++,me.add(t.url))}else{E.ext++;let b="";try{b=De(new URL(d.href).hostname)}catch{continue}if(!b||b===Ee)continue;f++;let x=z.get(b)??{links:0,nofollow:0,pages:new Set};x.links++,g&&x.nofollow++,x.pages.add(t.url),z.set(b,x)}}H.set(t.url,E)}let xt=Promise.all([ue(K),ue(L),ue(R)]);D.end(),L.end(),R.end(),await xt,await Promise.all(Ne);let X=new Map,Pe=Y(e.startUrl);X.set(Pe,0);let Te=[Pe];for(;Te.length>0;){let n=Te.shift(),t=X.get(n);for(let u of J.get(n)??[])X.has(u)||(X.set(u,t+1),Te.push(u))}let Q=new Map;for(let n of h){let t=Y(n.url),u=j.get(t)??new Set,E=B.get(t),d=E?[...E.entries()].sort((c,m)=>m[1]-c[1]).slice(0,3).map(c=>c[0]):[],g=H.get(n.url)??{int:0,ext:0};Q.set(n.url,{url:n.url,inlinks:u.size,uniqueInlinks:u.size,outlinksInternal:g.int,outlinksExternal:g.ext,crawlDepth:X.has(t)?X.get(t):null,orphan:u.size===0&&t!==Pe,topAnchors:d})}let Be=rt(h,Q,me),V=it(e.startUrl,h,Be,Q),ee=Ve(e),F={jobId:e.id,startUrl:e.startUrl,status:e.successfulUrls===0?"failed":e.failedUrls>0||e.remainingUrls>0||ee.creditTruncated?"partial":"complete",...ee,discovered:e.totalUrls,attempted:e.attemptedUrls,successful:e.successfulUrls,failed:e.failedUrls,remaining:e.remainingUrls,linkAnalysis:{truncated:xe,analyzedEdges:q,streamedEdges:k,edgeCap:je},generatedAt:new Date().toISOString()};V=["## Crawl delivery",`- Discovered: ${F.discovered}`,`- Attempted: ${F.attempted}`,`- Successful: ${F.successful}`,`- Failed: ${F.failed}`,`- Remaining: ${F.remaining}`,`- Requested page cap: ${ee.requestedMaxPages}`,`- Funded page cap: ${ee.effectiveMaxPages}`,`- Credit-truncated: ${ee.creditTruncated?"yes":"no"}`,`- Link analysis: ${q}/${k} edges${xe?` (capped at ${je})`:""}`,"",V].join(`
28
- `),r.imageAudit&&(V+=`
29
-
30
- ${tt(r.imageAudit)}`);let pe=[...Q.values()],qe=n=>Math.round(n*10)/10,te={zero:0,oneToTwo:0,threeToTen:0,elevenPlus:0},Fe=0,Je=0;for(let n of pe)Fe+=n.inlinks,Je+=n.outlinksInternal+n.outlinksExternal,n.inlinks===0?te.zero++:n.inlinks<=2?te.oneToTwo++:n.inlinks<=10?te.threeToTen++:te.elevenPlus++;let Ce=[...z.entries()].map(([n,t])=>({domain:n,links:t.links,nofollow:t.nofollow,pages:t.pages.size})).sort((n,t)=>t.links-n.links),ve={summary:{internal:{totalLinks:o,pages:h.length,orphans:pe.filter(n=>n.orphan).length,brokenInternal:w,avgInlinks:h.length?qe(Fe/h.length):0,avgOutlinks:h.length?qe(Je/h.length):0,distribution:te,topByInlinks:[...pe].sort((n,t)=>t.inlinks-n.inlinks).slice(0,20).map(n=>({url:n.url,inlinks:n.inlinks,outlinksInternal:n.outlinksInternal,outlinksExternal:n.outlinksExternal}))},external:{totalLinks:f,uniqueDomains:Ce.length,topDomains:Ce.slice(0,20)}},externalDomains:Ce},ge=ae(l(s,"pages.jsonl")),Et=new Map(v.map(n=>[n.pageId,n])),$=P?ae(l(s,"capture-matrix.jsonl")):null,He=new Set,ze=(n,t)=>{let u=t;try{u=new URL(t).href}catch{}return`${n??""}\0${u}`};for await(let n of fe(e.id))for(let t of n){let u=t.extractionStatus==="failed"?Me(t.failureCode,t.failureReason):{failureCode:null,failureReason:null},{bodyMarkdown:E,schema:d,outlinks:g,contentRef:c,...m}=t,b=Q.get(t.url),x=t.pageId?Et.get(t.pageId):void 0,A={...m,...t.extractionStatus==="failed"?u:{},representations:x?{jsonPath:x.jsonPath,htmlPath:x.htmlPath,markdownPath:x.markdownPath,jsonSha256:x.jsonSha256,htmlSha256:x.htmlSha256,markdownSha256:x.markdownSha256,htmlBytes:x.htmlBytes,markdownBytes:x.markdownBytes}:null,inlinks:b?.inlinks??0,crawlDepth:b?.crawlDepth??null,orphan:b?.orphan??!1};if(ge.write(JSON.stringify(A)+`
31
- `)||await G(ge,"drain"),$){let ne=ze(t.archiveRequestedMonth,t.originalUrl??t.url);He.add(ne);let re={requestedMonth:t.archiveRequestedMonth??null,captureTimestamp:t.archiveTimestamp??null,originalUrl:t.originalUrl??t.url,archivedUrl:t.archivedUrl??null,status:t.extractionStatus==="successful"?"captured":"failed",httpStatus:t.status,contentHash:t.contentHash||null,wordCount:t.wordCount,failureCode:u.failureCode,failureReason:u.failureReason};$.write(JSON.stringify(re)+`
32
- `)||await G($,"drain")}}if($&&P?.timeline?.urls){let n=P.timeline,t=n.urls,u=(()=>{if(n.months?.length)return[...new Set(n.months)].sort();if(!n.from||!n.to)return[];let E=[],d=new Date(`${n.from}-01T00:00:00Z`),g=new Date(`${n.to}-01T00:00:00Z`);for(;d<=g&&E.length<60;)E.push(`${d.getUTCFullYear()}-${String(d.getUTCMonth()+1).padStart(2,"0")}`),d.setUTCMonth(d.getUTCMonth()+(n.intervalMonths??1));return E})();for(let E of u)for(let d of t)He.has(ze(E,d))||$.write(JSON.stringify({requestedMonth:E,captureTimestamp:null,originalUrl:d,archivedUrl:null,status:"missing",httpStatus:null,contentHash:null,wordCount:0,failureCode:"wayback_capture_missing",failureReason:"No successful HTML capture was available in the requested month."})+`
33
- `)||await G($,"drain")}let kt=ue(ge),Pt=$?ue($):Promise.resolve();if(ge.end(),$?.end(),await Promise.all([kt,Pt]),p&&y(l(s,"rendered-dom","manifest.jsonl"),_.map(n=>JSON.stringify(n)).join(`
34
- `)),M){let n=await pt(S,{threshold:Number(e.options.similarityThreshold??void 0),maxPairs:Number(e.options.similarityMaxPairs??void 0),embedTexts:r.embedSimilarityTexts}),t=n.rows.map(yt),u=t.length>0?Object.keys(t[0]):["source_url","source_title","target_url","target_title","similarity","similarity_percent","corpus_percentile","exact_content_duplicate","source_word_count","target_word_count","cluster_id"],E=[u.join(","),...t.map(m=>u.map(b=>ft(m[b]??null)).join(","))].join(`
35
- `)+`
36
- `,{rows:d,clusters:g,...c}=n;y(l(s,"similarity-table.csv"),E),y(l(s,"similarity.jsonl"),t.map(m=>JSON.stringify(m)).join(`
37
- `)),y(l(s,"similarity-table-schema.json"),JSON.stringify({tableNameSuggestion:`site_similarity_${new URL(e.startUrl).hostname.replace(/[^a-z0-9]+/gi,"_").replace(/^_+|_+$/g,"").toLowerCase()}`,defaultSort:[{column:"similarity",direction:"desc"}],columns:{source_url:"text",source_title:"text",target_url:"text",target_title:"text",similarity:"number",similarity_percent:"number",corpus_percentile:"number",exact_content_duplicate:"boolean",source_word_count:"integer",target_word_count:"integer",cluster_id:"text"}},null,2)),y(l(s,"similarity-summary.json"),JSON.stringify(c,null,2)),y(l(s,"content-clusters.json"),JSON.stringify(n.clusters,null,2)),V+=["","## Rendered content similarity",`- Compared pages: ${n.comparedPages}`,`- Raw cosine threshold: ${n.threshold}`,`- Corpus score distribution: min ${n.scoreDistribution.min??"n/a"} / median ${n.scoreDistribution.median??"n/a"} / p90 ${n.scoreDistribution.p90??"n/a"} / max ${n.scoreDistribution.max??"n/a"}`,`- Qualifying pairs: ${n.qualifyingPairs}`,`- Returned table rows: ${n.returnedPairs}${n.pairsTruncated?" (capped)":""}`,`- Multi-page clusters: ${n.clusters.length}`,`- Embedding model: ${n.model} (${n.dimensions} dimensions)`,`- Corpus boilerplate removed: ${n.boilerplateRemoval.removedBlockSignatures} repeated block signatures / ${n.boilerplateRemoval.removedCharacters} characters`,`- Corpus SHA-256: ${n.corpusSha256}`].join(`
38
- `)}y(l(s,"report.md"),V),y(l(s,"crawl-summary.json"),JSON.stringify(F,null,2)),y(l(s,"images-manifest.jsonl"),Le.map(n=>JSON.stringify(n)).join(`
39
- `)),y(l(s,"manifest.json"),JSON.stringify({version:"site-export.v1",jobId:e.id,startUrl:e.startUrl,generatedAt:F.generatedAt,outputProfile:{json:!0,html:!0,markdown:!0,imageManifest:!0,imageBytes:i},pages:[...v].sort((n,t)=>n.pageId.localeCompare(t.pageId)),imagesManifestPath:"images-manifest.jsonl",download:"This ZIP is the complete human export. AI clients should use site_export_read and site_export_image."},null,2)),P&&y(l(s,"wayback-manifest.json"),JSON.stringify({rootUrl:P.rootUrl??e.startUrl,requested:P.timeline??null,maxPagesPerSnapshot:P.maxPagesPerSnapshot??null,captureMatrix:"capture-matrix.jsonl"},null,2)),y(l(s,"issues.json"),JSON.stringify(Be,null,2)),y(l(s,"link-metrics.jsonl"),pe.map(n=>JSON.stringify(n)).join(`
40
- `)),y(l(s,"link-report.md"),nt(ve)),y(l(s,"links-summary.json"),JSON.stringify(ve.summary,null,2)),y(l(s,"external-domains.json"),JSON.stringify(ve.externalDomains,null,2)),r.imageAudit&&(y(l(s,"images.jsonl"),r.imageAudit.rows.map(n=>JSON.stringify(n)).join(`
41
- `)),y(l(s,"images-summary.json"),JSON.stringify(r.imageAudit.summary,null,2))),r.seoAudit&&y(l(s,"seo-audit.json"),JSON.stringify(r.seoAudit,null,2)),r.branding&&y(l(s,"branding.json"),JSON.stringify(r.branding,null,2)),i&&y(l(s,"images-download-summary.json"),JSON.stringify({queued:Z,downloaded:Z-de,failed:de,downloadedBytes:ke,perPageCap:$e,perSiteCap:Ue,perFileByteCap:bt,totalByteCap:_t},null,2));let T=[{name:"manifest.json",type:"application/json"},{name:"images-manifest.jsonl",type:"application/x-ndjson"},{name:"report.md",type:"text/markdown"},{name:"crawl-summary.json",type:"application/json"},{name:"failures.jsonl",type:"application/x-ndjson"},{name:"schema.jsonl",type:"application/x-ndjson"},{name:"issues.json",type:"application/json"},{name:"pages.jsonl",type:"application/x-ndjson"},{name:"links.jsonl.gz",type:"application/gzip"},{name:"link-metrics.jsonl",type:"application/x-ndjson"},{name:"link-report.md",type:"text/markdown"},{name:"links-summary.json",type:"application/json"},{name:"external-domains.json",type:"application/json"}];if(p){T.push({name:"rendered-dom/manifest.jsonl",type:"application/x-ndjson"});for(let n of _)T.push({name:n.path,type:"text/plain"})}M&&(T.push({name:"similarity-table.csv",type:"text/csv"}),T.push({name:"similarity.jsonl",type:"application/x-ndjson"}),T.push({name:"similarity-table-schema.json",type:"application/json"}),T.push({name:"similarity-summary.json",type:"application/json"}),T.push({name:"content-clusters.json",type:"application/json"})),P&&(T.push({name:"wayback-manifest.json",type:"application/json"}),T.push({name:"capture-matrix.jsonl",type:"application/x-ndjson"})),r.imageAudit&&(T.push({name:"images.jsonl",type:"application/x-ndjson"}),T.push({name:"images-summary.json",type:"application/json"})),r.seoAudit&&T.push({name:"seo-audit.json",type:"application/json"}),r.branding&&T.push({name:"branding.json",type:"application/json"}),i&&T.push({name:"images-download-summary.json",type:"application/json"});let N=new en,Tt=Ke({ownerId:String(e.userId),jobId:e.id,createdAt:new Date,content:N.outputStream});for(let n of T)N.addFile(l(s,n.name),n.name);let he=[...v].sort((n,t)=>n.pageId.localeCompare(t.pageId));for(let n of he)n.markdownPath&&N.addFile(l(s,n.markdownPath),n.markdownPath);for(let n of he)n.legacyMarkdownPath&&N.addFile(l(s,n.legacyMarkdownPath),n.legacyMarkdownPath);for(let n of he)n.htmlPath&&N.addFile(l(s,n.htmlPath),n.htmlPath);for(let n of he)N.addFile(l(s,n.jsonPath),n.jsonPath);if(i&&Z>de){let n=l(s,"images");for(let t of Gt(n,{recursive:!0})){let u=l(n,t);Zt(u).isFile()&&N.addFile(u,`images/${t.split("\\").join("/")}`)}}return N.end(),[await et("export_packaging",()=>Tt),...Oe]}finally{Kt(s,{recursive:!0,force:!0})}}export{Rt as a,on as b,an as c,Me as d,Ae as e,Lt as f,dn as g,ct as h,pn as i,je as j,Fn as k};
@@ -1,2 +0,0 @@
1
- import{mkdirSync as p,openSync as f,writeFileSync as m,closeSync as c,unlinkSync as g}from"fs";import{homedir as S}from"os";import{join as s}from"path";var u=!0;function w(r){u=r}function d(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"mcp-scraper-report"}function R(r){return r.split(`
2
- `).find(t=>t.startsWith("# "))?.replace(/^#\s+/,"").trim()||"MCP Scraper Report"}function v(r){return r?.trim()||process.env.MCP_SCRAPER_OUTPUT_DIR?.trim()||s(S(),"Downloads","mcp-scraper")}function C(r){if(!y())return null;let o=v(),t=null,e=null;try{p(o,{recursive:!0});let a=`${new Date().toISOString().replace(/[:.]/g,"-")}-${d(R(r))}`;for(let n=0;n<1e3;n++){let i=s(o,`${a}${n?"-"+n:""}.md`);try{t=f(i,"wx"),e=i;break}catch(l){if(l.code!=="EEXIST")throw l}}return t===null?null:(m(t,r,"utf8"),c(t),t=null,e)}catch{if(t!==null)try{c(t)}catch{}if(e!==null)try{g(e)}catch{}return null}}function y(){return u&&process.env.MCP_SCRAPER_SAVE_REPORTS!=="false"}export{w as a,d as b,v as c,C as d,y as e};