mcp-scraper 0.96.1 → 0.96.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -1
- package/README.md +1 -1
- package/dist/actions-FKAX2PYT.js +1 -0
- package/dist/bin/api-server.js +1 -1
- package/dist/bin/mcp-scraper-cli.js +1 -1
- package/dist/bin/mcp-scraper-core.js +1 -1
- package/dist/bin/mcp-scraper-install.js +1 -1
- package/dist/bin/mcp-stdio-server.js +1 -1
- package/dist/bin/paa-harvest.js +1 -1
- package/dist/bundle-7JMACIIR.js +1 -0
- package/dist/chunk-3HXMW2UJ.js +1 -0
- package/dist/{chunk-RN4VG3VH.js → chunk-42SLBGDI.js} +1 -1
- package/dist/{chunk-JHT6A4U6.js → chunk-4KHDV5E7.js} +1 -1
- package/dist/{chunk-FB4KBB5W.js → chunk-7ZR5IO3B.js} +2 -2
- package/dist/{chunk-HUNSEGUN.js → chunk-ANQ4JJVI.js} +43 -29
- package/dist/{chunk-SE4VKLEC.js → chunk-CFZXZKFT.js} +1 -1
- package/dist/{chunk-6BD75VKS.js → chunk-DJT2547J.js} +1 -1
- package/dist/chunk-E7I3OQHQ.js +203 -0
- package/dist/{chunk-HVQZRQRJ.js → chunk-GLCR4KJI.js} +16 -37
- package/dist/chunk-JGGQ3UX5.js +1 -0
- package/dist/chunk-JREMJRSS.js +1 -0
- package/dist/chunk-K3VDGJNK.js +1 -0
- package/dist/{chunk-H6MODA7W.js → chunk-MJOXIDKF.js} +5 -5
- package/dist/chunk-OY24ERPV.js +8 -0
- package/dist/{chunk-7WPCGRD7.js → chunk-P55O4IDC.js} +41 -34
- package/dist/{chunk-ZTMQEDIB.js → chunk-PANT6VEM.js} +1 -1
- package/dist/chunk-PKQHHCO4.js +20 -0
- package/dist/{chunk-RIHI3KH7.js → chunk-QYPSFZK3.js} +1 -1
- package/dist/{chunk-BPKTUCV7.js → chunk-U7BZ5KTE.js} +1 -1
- package/dist/{chunk-SFUOSJ3A.js → chunk-WBJ6Y7WP.js} +2 -2
- package/dist/dispatch-E6VTNHHS.js +1 -0
- package/dist/index.cjs +10 -10
- package/dist/index.js +1 -1
- package/dist/metering-YHZ46GV4.js +1 -0
- package/dist/queue-4XHYUV7J.js +1 -0
- package/dist/reconciliation-43CSC3XD.js +1 -0
- package/dist/repository-UKDA4IWP.js +1 -0
- package/dist/{server-DXZ27KQO.js → server-74VGVXA4.js} +840 -802
- package/dist/settlement-I5IBIK6U.js +1 -0
- package/dist/worker-L5NISZQV.js +1 -0
- package/package.json +1 -2
- package/dist/actions-R4EJDLRO.js +0 -1
- package/dist/bundle-FCXZMIRB.js +0 -1
- package/dist/chunk-5BKSKLHX.js +0 -1
- package/dist/chunk-5LYINW7Z.js +0 -8
- package/dist/chunk-CORWWDHL.js +0 -1
- package/dist/chunk-CVQUHVHX.js +0 -1
- package/dist/chunk-IY6ZUUY7.js +0 -173
- package/dist/chunk-RYX4FJVH.js +0 -1
- package/dist/chunk-UXNR3K6I.js +0 -1
- package/dist/dispatch-P7IY75LH.js +0 -1
- package/dist/metering-ZH2P62IC.js +0 -1
- package/dist/queue-AC4XKD6Z.js +0 -1
- package/dist/reconciliation-UZUZ6B74.js +0 -1
- package/dist/repository-4EC5EXVN.js +0 -1
- package/dist/settlement-6CS4JZTY.js +0 -1
- package/dist/worker-ATRD6VKM.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as ot}from"./chunk-U4WIJZCX.js";import{
|
|
1
|
+
import{a as ot}from"./chunk-U4WIJZCX.js";import{G as fe,a as Qe,c as Ve}from"./chunk-P55O4IDC.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
2
|
CREATE TABLE IF NOT EXISTS commons_index_vectors (
|
|
3
3
|
document_id TEXT PRIMARY KEY,
|
|
4
4
|
entity_id TEXT NOT NULL,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
var a="2026-10-10-operation-physical-attempts.1",s="operation_physical_attempts";async function r(t){let[i,_,p,E,c]=await Promise.all([t.execute(`PRAGMA table_info(${s})`),t.execute("PRAGMA index_info(operation_physical_identity)"),t.execute(`PRAGMA foreign_key_list(${s})`),t.execute("SELECT name,sql FROM sqlite_master WHERE name IN ('operation_physical_attempts','operation_physical_unresolved','operation_physical_identity')"),t.execute({sql:"SELECT 1 FROM schema_migrations WHERE version=?",args:[a]})]),n=e=>String(E.rows.find(o=>o.name===e)?.sql??"").replace(/\s+/g," ");return["id","parent_run_id","user_id","controller_token","claim_token","scope","attempt_number","provider","profile","intent_json","state","effects_json","resources_json","created_at","updated_at"].every(e=>i.rows.some(o=>o.name===e&&Number(o.notnull)===1))&&i.rows.some(e=>e.name==="id"&&Number(e.pk)===1)&&i.rows.some(e=>e.name==="receipt_json")&&_.rows.map(e=>e.name).join(",")==="parent_run_id,scope,attempt_number"&&p.rows.some(e=>e.table==="operation_runs"&&e.from==="parent_run_id"&&e.to==="id"&&e.on_delete==="CASCADE")&&n(s).includes("state IN ('prepared','effects_started','terminated','not_started','unknown')")&&n(s).includes("CHECK (json_valid(intent_json))")&&n(s).includes("CHECK (json_valid(effects_json))")&&n(s).includes("CHECK (json_valid(resources_json))")&&n(s).includes("CHECK (receipt_json IS NULL OR json_valid(receipt_json))")&&n(s).includes("CHECK ((state IN ('terminated','not_started','unknown') AND receipt_json IS NOT NULL)")&&n("operation_physical_identity").includes("CREATE UNIQUE INDEX")&&n("operation_physical_unresolved").includes("CREATE UNIQUE INDEX")&&n("operation_physical_unresolved").includes("WHERE state IN ('prepared','effects_started','unknown')")&&c.rows.length===1}async function l(t){if(!await r(t)){try{await t.batch([`CREATE TABLE IF NOT EXISTS operation_physical_attempts (
|
|
2
|
+
id TEXT NOT NULL PRIMARY KEY,
|
|
3
|
+
parent_run_id TEXT NOT NULL REFERENCES operation_runs(id) ON DELETE CASCADE,
|
|
4
|
+
user_id INTEGER NOT NULL CHECK (user_id > 0),
|
|
5
|
+
controller_token TEXT NOT NULL,
|
|
6
|
+
claim_token TEXT NOT NULL,
|
|
7
|
+
scope TEXT NOT NULL,
|
|
8
|
+
attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
|
|
9
|
+
provider TEXT NOT NULL CHECK (length(provider) BETWEEN 1 AND 100),
|
|
10
|
+
profile TEXT NOT NULL CHECK (profile IN ('customer-funded','funded-parent')),
|
|
11
|
+
intent_json TEXT NOT NULL CHECK (json_valid(intent_json)),
|
|
12
|
+
state TEXT NOT NULL CHECK (state IN ('prepared','effects_started','terminated','not_started','unknown')),
|
|
13
|
+
effects_json TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(effects_json)),
|
|
14
|
+
resources_json TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(resources_json)),
|
|
15
|
+
receipt_json TEXT CHECK (receipt_json IS NULL OR json_valid(receipt_json)),
|
|
16
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
17
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
18
|
+
CHECK ((state IN ('terminated','not_started','unknown') AND receipt_json IS NOT NULL)
|
|
19
|
+
OR (state IN ('prepared','effects_started') AND receipt_json IS NULL))
|
|
20
|
+
)`,"CREATE UNIQUE INDEX IF NOT EXISTS operation_physical_identity ON operation_physical_attempts(parent_run_id,scope,attempt_number)","CREATE UNIQUE INDEX IF NOT EXISTS operation_physical_unresolved ON operation_physical_attempts(parent_run_id) WHERE state IN ('prepared','effects_started','unknown')",{sql:"INSERT OR IGNORE INTO schema_migrations(version) VALUES (?)",args:[a]}],"write")}catch(i){if(!await r(t).catch(()=>!1))throw i}if(!await r(t))throw Error("Physical attempt schema is incomplete")}}export{l as a};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as An,e as Je,s as il}from"./chunk-JHT6A4U6.js";import{b as ol}from"./chunk-7POHNTVW.js";import{j as Gs,k as Ws,l as Bs,m as Ks}from"./chunk-MVMWPKRC.js";import{c as Vs,e as _o,f as Js,h as Io,j as ko,k as Ro,l as To,m as Ys,n as Zr,p as Co,q as Xs,r as Ao,s as Po,u as Zs}from"./chunk-2IATUJO6.js";import{$ as As,aa as Ps,c as ho,d as Kr,e as fo,f as bo,g as Cs}from"./chunk-CORWWDHL.js";import{e as Br,h as Dt,j as er}from"./chunk-5LYINW7Z.js";import{a as Ls,c as rr,d as Us,e as ir,f as $s,g as qs}from"./chunk-CNSVZTTT.js";import{a as Ms,b as wo}from"./chunk-5BKSKLHX.js";import{f as js}from"./chunk-7SR7MEU5.js";import{e as nr,g as Xr,i as Es}from"./chunk-SEZETSB3.js";import{b as Os,c as Yr,i as tr}from"./chunk-SDQW7IJN.js";import{a as xs,c as go,e as Cn,f as Gr,i as Ts}from"./chunk-B4ZKPLSP.js";import{d as ks,g as Rs}from"./chunk-VVSHZV5S.js";import{c as _s,f as Wr,g as qt,h as Xe,i as Qn}from"./chunk-C7MGJUTU.js";import{c as Is}from"./chunk-4ZVO6GX4.js";import{a as Ds,b as Hs,c as Ns,d as So,e as zs,f as Fs,h as Qs,i as el,k as tl,m as nl,n as rl}from"./chunk-24YDQ3EO.js";import{b as Vr,c as Ve,d as vo,e as Jr}from"./chunk-OILOHQNL.js";import{a as xo}from"./chunk-CVQUHVHX.js";import{z as Ae}from"zod";var Qr=class extends Error{constructor(e){super("lead_provider_admission_denied",{cause:e}),this.name="LeadProviderAdmissionError"}};var sl=["president\\s*[/&-]\\s*owner","owner\\s*[/&-]\\s*president","chief executive officer","operations manager","general manager","managing member","managing partner","business owner","co[- ]founder","team member","president","principal","director","manager","partner","founder","owner","ceo"].join("|"),Oo=String.raw`(?:Mr\.?|Ms\.?|Mrs\.?|Dr\.?)?\s*([\p{Lu}][\p{L}'’.-]+(?:\s+[\p{Lu}][\p{L}'’.-]+){1,3})`,Wv=`${Oo}\\s*(?:,|[-\u2013\u2014]|\\bis\\b|\\bas\\b|\\bserves as\\b)?\\s*(${sl})\\b`,Bv=`\\b(${sl})\\b\\s*(?:[,:\u2013\u2014-]|\\bis\\b|\\bof\\b)?\\s*${Oo}`,Kv=`\\b((?:co[- ]?)?owned|founded)\\s+by\\s+${Oo}`,Vv=new Set(["about","additional","business","company","contact","customer","details","information","management","member","owner","president","profile","roofing","team","website"]),Jv=new Set(["co","company","corp","corporation","inc","incorporated","llc","ltd","limited","pllc"]);function or(t,e=400){return t.replace(/\s+/g," ").trim().slice(0,e)}function Ht(t){return t.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean)}function ll(t){let e=Ht(t);for(;e.length&&Jv.has(e[e.length-1]);)e.pop();return e}function Yv(t){return t.replace(/^(?:Mr\.?|Ms\.?|Mrs\.?|Dr\.?)\s+/i,"").replace(/[.!?]\s+.*$/,"").replace(/[.,;:!?]+$/,"").replace(/\s+/g," ").trim()}function Xv(t,e){let n=Ht(t);if(n.length<2||n.length>4||n.some(o=>Vv.has(o)))return!1;let r=new Set(ll(e));return n.some(o=>!r.has(o))}function Zv(t){let e=t.toLowerCase().replace(/\s+/g," ");return/founder/.test(e)?"founder":/owner|managing member|partner/.test(e)?"owner":/manager/.test(e)?"manager":/president|chief executive officer|\bceo\b|principal|director/.test(e)?"executive":"team_member"}function Qv(t){return/founded/i.test(t)?"Founder":/owned/i.test(t)?"Owner":or(t,80).replace(/\bceo\b/i,"CEO").replace(/\b\w/g,e=>e.toUpperCase())}function cl(t){return or(`${t.title} | ${t.snippet??""}`)}function dl(t){return t.map((e,n)=>({result:e,index:n})).sort((e,n)=>{let r=Number.isFinite(e.result.position)?e.result.position:Number.MAX_SAFE_INTEGER,o=Number.isFinite(n.result.position)?n.result.position:Number.MAX_SAFE_INTEGER;return r-o||e.index-n.index}).map(e=>e.result)}function ew(t){if(!t)return null;try{let e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"?e.href:null}catch{return null}}function al(t){return`"${t.replace(/["\\]/g," ").replace(/\s+/g," ").trim()}"`}function ei(t){return or(t??"",120).replace(/["\\]/g," ")}function tw(t){return t==="owners"?'"{business}" owner of company {location}':'"{business}" leadership team {location}'}function ul(t){let e={business:ei(t.businessName),city:ei(t.city),region:ei(t.region),location:ei(t.location)},n=(t.queryTemplates?.length?t.queryTemplates:[tw(t.mode)]).map(r=>or(r.replace(/\{(business|city|region|location)\}/g,(o,s)=>e[s]),240)).filter(Boolean);return[...new Set(n)].slice(0,3)}function pl(t){return`site:linkedin.com/in ${al(t.personName)} ${al(t.businessName)}`}function ml(t){let e=new Map,n=[],r=t.aiOverview?.detected?or(t.aiOverview.text??""):"";if(r){let o=ew(t.aiOverview?.shareUrl)??(t.query?`https://www.google.com/search?q=${encodeURIComponent(t.query)}`:"https://www.google.com/"),s=(t.aiOverview?.citations??[]).flatMap(l=>{try{let m=new URL(l.href);return["http:","https:"].includes(m.protocol)?[m.href]:[]}catch{return[]}}).slice(0,5);n.push({sourceType:"ai_overview",sourceUrl:o,sourceTitle:"Google AI Overview",sourcePosition:0,context:r,...s.length?{citationUrls:s}:{}})}for(let o of dl(t.results))n.push({sourceType:"serp_snippet",sourceUrl:o.url,sourceTitle:o.title,sourcePosition:o.position,context:cl(o)});for(let o of n){let s=o.context;if(!yl(s,t.businessName))continue;let l=t.city||(t.location??"").split(",")[0]||"",m=Ht(l).filter(v=>v.length>2),c=m.some(v=>Ht(s).includes(v));if(o.sourceType==="ai_overview"&&m.length&&!c)continue;let f=[];for(let v of s.matchAll(new RegExp(Wv,"giu")))f.push({name:v[1]??"",role:v[2]??""});for(let v of s.matchAll(new RegExp(Bv,"giu")))f.push({name:v[2]??"",role:v[1]??""});for(let v of s.matchAll(new RegExp(Kv,"giu")))f.push({name:v[2]??"",role:v[1]??""});for(let v of f){let d=Yv(v.name),p=Qv(v.role);if(!Xv(d,t.businessName))continue;let h=Zv(p);if(t.mode==="owners"&&h!=="owner"&&h!=="founder")continue;let w=Ht(d).join(" ");if(!w)continue;let R={sourceType:o.sourceType,purpose:"role",sourceUrl:o.sourceUrl,sourceTitle:o.sourceTitle,sourcePosition:o.sourcePosition,context:s,...o.citationUrls?{citationUrls:o.citationUrls}:{}},A=e.get(w);if(A){A.sources.length<2&&!A.sources.some(P=>P.sourceUrl===R.sourceUrl)&&A.sources.push(R),A.reasons=[...new Set([...A.reasons,"multiple_search_sources"])],A.confidence=Math.max(A.confidence,o.sourceType==="ai_overview"?c?.93:.9:.88);continue}let C=o.sourceType==="ai_overview";if(e.set(w,{name:d,role:p,relationship:h,linkedinUrl:null,confidence:C?c?.93:.9:.88,reasons:[C?"name_role_in_ai_overview":"name_role_in_search_result","exact_business_query_context",...C&&c?["ai_overview_location_match"]:[]],sources:[R]}),e.size>=5)return[...e.values()]}}return[...e.values()]}function nw(t){try{let e=new URL(t),n=e.hostname.toLowerCase().replace(/^www\./,"");return e.protocol!=="https:"||n!=="linkedin.com"||!/^\/in\/[^/]+\/?$/i.test(e.pathname)?null:(e.search="",e.hash="",e.href)}catch{return null}}function rw(t,e){let n=new Set(Ht(t)),r=Ht(e);return r.length>=2&&r.every(o=>n.has(o))}function yl(t,e){let n=new Set(Ht(t)),r=ll(e);if(r.length<2)return!1;let o=r.filter(s=>n.has(s)).length;return o>=2&&o/r.length>=.6}function gl(t){for(let e of dl(t.results)){let n=nw(e.url);if(!n)continue;let r=cl(e);if(!rw(r,t.person.name)||!yl(r,t.businessName))continue;let s=Ht((t.location??"").split(",")[0]??"").filter(l=>l.length>2).some(l=>Ht(r).includes(l));return{...t.person,linkedinUrl:n,confidence:s?.97:.94,reasons:[...new Set([...t.person.reasons,"linkedin_name_match","linkedin_company_match",...s?["linkedin_location_match"]:[]])],sources:[...t.person.sources,{sourceType:"serp_snippet",purpose:"linkedin",sourceUrl:e.url,sourceTitle:e.title,sourcePosition:e.position,context:r}]}}return t.person}var iw=Ae.union([Ae.string(),Ae.number().finite(),Ae.boolean(),Ae.null()]),Il="enriched_",ow=250,hl=100,aw=32*1024,fl=500*1024,sw=5*1024*1024,lw=Ae.array(Ae.record(Ae.string(),iw)).min(1).max(ow).superRefine((t,e)=>{t.forEach((n,r)=>{Object.keys(n).forEach(o=>{o.toLowerCase().startsWith(Il)&&e.addIssue({code:"custom",message:`Input header ${o} uses the reserved enriched_ prefix`,path:[r,o]})})})}),cw=Ae.object({name:Ae.string().min(1),location:Ae.string().min(1).optional(),city:Ae.string().min(1).optional(),region:Ae.string().min(1).optional(),organization:Ae.string().min(1).optional(),websiteUrl:Ae.string().min(1).optional(),profileUrl:Ae.string().min(1).optional(),phone:Ae.string().min(1).optional(),email:Ae.string().min(1).optional(),entityType:Ae.string().min(1).optional()}).strict(),dw=/\{(?:business|city|region|location)\}/g,uw=Ae.string().trim().min(1).max(240).refine(t=>!/[\r\n]/.test(t),"People query templates must be one line").refine(t=>t.includes("{business}"),"People query templates must include {business}").refine(t=>!/[{}]/.test(t.replace(dw,"")),"People query templates may use only {business}, {city}, {region}, and {location}"),jo=Ae.array(uw).min(1).max(3),kl=Ae.object({resolveMissingUrls:Ae.boolean().default(!0),defaultEntityType:Ae.enum(["business","person"]).default("business"),gl:Ae.string().regex(/^[a-z]{2}$/i).transform(t=>t.toLowerCase()).default("us"),hl:Ae.string().regex(/^[a-z]{2}(?:-[a-z]{2})?$/i).transform(t=>t.toLowerCase()).default("en"),maxPagesPerLead:Ae.number().int().min(1).max(4).default(3),concurrency:Ae.number().int().min(1).max(5).default(3),emailSearchFallback:Ae.enum(["off","serp_snippets"]).default("off"),peopleDiscovery:Ae.enum(["off","owners","leadership"]).default("off"),peopleQueryTemplates:jo.optional(),maxPeoplePerLead:Ae.number().int().min(1).max(3).default(2),outputFormats:Ae.array(Ae.enum(["csv","xlsx"])).min(1).max(2).transform(t=>[...new Set(t)]).default(["csv","xlsx"])}).strict(),pw={name:["name","business_name","business name","company","company_name","full_name","full name"],location:["location","market","address"],city:["city","town"],region:["region","state","province"],organization:["organization","organisation","brokerage","agency","company"],websiteUrl:["websiteUrl","website_url","website url","website","url"],profileUrl:["profileUrl","profile_url","profile url","profile"],phone:["phone","phone_number","phone number","telephone"],email:["email","email_address","email address"],entityType:["entityType","entity_type","entity type","type"]};function mw(t){return Buffer.byteLength(String(t??""),"utf8")}function yw(t){return t==null?null:String(t).trim()||null}function gw(t){let e=t.split(".").map(Number);return e.length!==4||e.some(n=>!Number.isInteger(n)||n<0||n>255)?!1:e[0]===10||e[0]===127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&e[1]===168||e[0]===0}function bl(t){if(!t)return null;try{let e=new URL(t),n=e.hostname.toLowerCase();return!["http:","https:"].includes(e.protocol)||e.username||e.password||n==="localhost"||n.endsWith(".localhost")||n==="::1"||n.endsWith(".local")||gw(n)?null:e.href}catch{return null}}function hw(t,e){let n=new Map(t.map(o=>[o.toLowerCase(),o])),r={...e};for(let[o,s]of Object.entries(pw)){if(r[o])continue;let l=s.map(m=>n.get(m.toLowerCase())).find(Boolean);l&&(r[o]=l)}if(!r.name)throw new Error(`invalid_column_map: name must identify one exact source header; available headers: ${t.join(", ")}`);return cw.parse(r)}function fw(t,e){for(let[n,r]of Object.entries(e))if(!(n==="entityType"&&(r==="person"||r==="business")&&!t.includes(r))&&!t.includes(r))throw new Error(`invalid_column_map: ${n} references missing header ${r}; available headers: ${t.join(", ")}`)}function Nt(t,e){return e?yw(t[e]):null}function ri(t,e,n){return t||[e,n].filter(Boolean).join(", ")||null}function bw(t){let e=lw.parse(t.rows),n=kl.parse(t.options??{}),r=Object.keys(e[0]);if(!r.length||r.length>hl)throw new Error(`lead_list_bounds_exceeded: input must contain 1-${hl} columns`);if(r.some(c=>!c.trim()))throw new Error("Input headers must not be blank");if(new Set(r).size!==r.length)throw new Error("Input headers must be unique");for(let[c,f]of e.entries()){let v=Object.keys(f);if(v.length!==r.length||v.some((d,p)=>d!==r[p]))throw new Error(`All rows must have the same columns in the same order; row ${c+1} differs`);for(let[d,p]of Object.entries(f))if(mw(p)>aw)throw new Error(`lead_list_bounds_exceeded: cell in column ${d} exceeds 32 KiB`)}let o=Buffer.byteLength(JSON.stringify(e),"utf8"),s=t.maxSerializedBytes??fl;if(!Number.isInteger(s)||s<1||s>sw)throw new Error("maxSerializedBytes must be an integer no greater than 5 MiB");if(o>s){let c=s===fl?"inline rows exceed 500 KiB":"normalized rows exceed the configured byte limit";throw new Error(`lead_list_bounds_exceeded: ${c}`)}let l=hw(r,t.columnMap);fw(r,l);let m=e.map((c,f)=>{let v=Nt(c,l.name);if(!v)throw new Error(`Row ${f+1} requires a non-empty name`);let d=Nt(c,l.websiteUrl),p=Nt(c,l.profileUrl),h=d?bl(d):null,w=p?bl(p):null;if(d&&!h||p&&!w)throw new Error(`Row ${f+1} URL must be a public HTTP(S) URL`);let R=Nt(c,l.location),A=Nt(c,l.city),C=Nt(c,l.region);if(!h&&!w&&(!n.resolveMissingUrls||!ri(R,A,C)))throw new Error(`Row ${f+1} requires a public website/profile URL or a location with resolveMissingUrls enabled`);let P=l.entityType==="person"||l.entityType==="business"?l.entityType:Nt(c,l.entityType);if(P&&P!=="person"&&P!=="business")throw new Error(`Row ${f+1} entityType must be business or person`);let M=P==="person"||P==="business"?P:n.defaultEntityType;return{ordinal:f,source:Object.fromEntries(r.map(H=>[H,c[H]])),mapped:{name:v,location:R,city:A,region:C,organization:Nt(c,l.organization),websiteUrl:h,profileUrl:w,phone:Nt(c,l.phone),email:Nt(c,l.email)?.toLowerCase()??null,entityType:M}}});return{headers:r,rows:m,serializedBytes:o,columnMap:l,options:n}}function vw(t){return{query:[t.name,t.organization].filter(Boolean).join(" "),location:ri(t.location,t.city,t.region)}}var ww=new Set(["co","company","corp","corporation","inc","incorporated","llc","llp","lp","ltd","limited","pllc","pc"]);function ni(t){let e=t.toLowerCase().replace(/&/g," and ").replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean);for(;e.length&&ww.has(e[e.length-1]);)e.pop();return e}function Sw(t,e){let n=ni(t),r=ni(e);if(!n.length||!r.length)return 0;if(n.join(" ")===r.join(" "))return 1;let o=new Set(n),s=r.filter(c=>o.has(c)).length,l=2*s/(n.length+r.length),m=s/Math.min(n.length,r.length);return Math.max(l,m>=1?.9:m*.85)}function vl(t){let e=(t??"").replace(/\D/g,"");return e.length>10?e.slice(-10):e}function wl(t){try{return new URL(t??"").hostname.toLowerCase().replace(/^www\./,"")||null}catch{return null}}function ti(t,e){let n=ni(e??"").filter(o=>o.length>2),r=ni(t??"");return!!(n.length&&n.every(o=>r.includes(o)))}function xw(t,e){let n=Sw(t.name,e.name);if(n<.72)return null;let r=[n===1?"exact_name_match":"near_name_match"],o=[],s=vl(t.phone),l=vl(e.phone);s.length>=7&&l.endsWith(s.slice(-7))&&o.push("phone_match");let m=ri(t.location,t.city,t.region);m&&ti(e.address,m)&&o.push("location_match"),t.city&&ti(e.address,t.city)&&o.push("location_match"),t.organization&&(ti(e.organization,t.organization)||ti(e.name,t.organization))&&o.push("organization_match");let c=wl(t.websiteUrl??t.profileUrl);c&&c===wl(e.websiteUrl)&&o.push("domain_match");let f=[...new Set(o)];if(!f.length)return null;r.push(...f);let v=Math.min(1,Number((n*.7+.2+Math.min(.1,(f.length-1)*.05)).toFixed(3)));return{candidate:e,confidence:v,reasons:r,corroborators:f}}function Sl(t,e){if(t.profileUrl??t.websiteUrl)return{status:"provided_url",confidence:1,reasons:["caller_provided_url"],selected:null,candidates:[]};if(!t.name)return{status:"invalid",confidence:0,reasons:["missing_name"],selected:null,candidates:[]};let r=e.map(s=>xw(t,s)).filter(s=>!!s).sort((s,l)=>l.confidence-s.confidence||s.candidate.name.localeCompare(l.candidate.name));if(!r.length)return{status:"not_found",confidence:0,reasons:["no_corroborated_candidate"],selected:null,candidates:[]};let o=r.filter(s=>s.confidence>=r[0].confidence-.08);return o.length>1?{status:"ambiguous",confidence:r[0].confidence,reasons:["multiple_plausible_candidates"],selected:null,candidates:o.slice(0,3)}:{status:"matched",confidence:r[0].confidence,reasons:r[0].reasons,selected:r[0].candidate,candidates:r.slice(0,3)}}function _w(t){return Array.isArray(t)?t:t.organicResults}function Iw(t){return Array.isArray(t)?{organicResults:t}:t}async function xl(t){if(t.options.peopleDiscovery==="off")return[];if(t.mapped.entityType!=="business")return t.warnings.push("people_discovery_skipped_for_person"),[];if(!t.adapters.searchPeopleSerp)return t.warnings.push("people_search_failed"),[];let e=t.adapters.searchPeopleSerp,n=t.options.peopleDiscovery,r=ri(t.mapped.location,t.mapped.city,t.mapped.region),o=ul({businessName:t.mapped.name,location:r,city:t.mapped.city,region:t.mapped.region,mode:n,queryTemplates:t.options.peopleQueryTemplates}),s=new Map,l=0;for(let f of o)try{let v=await e({query:f,gl:t.options.gl,hl:t.options.hl,includeAiOverview:!0});t.usage.serpSearches+=1,l+=1;let d=Iw(v);for(let p of ml({businessName:t.mapped.name,location:r,city:t.mapped.city,query:f,mode:n,results:d.organicResults,aiOverview:d.aiOverview})){let h=p.name.toLocaleLowerCase("en-US");if(s.has(h)||s.set(h,p),s.size>=t.options.maxPeoplePerLead)break}if(s.size>=t.options.maxPeoplePerLead)break}catch{t.warnings.push("people_search_failed")}let m=[...s.values()].slice(0,t.options.maxPeoplePerLead);if(!l)return[];if(!m.length)return t.warnings.push("people_not_found"),[];let c=[];for(let f of m)try{let v=await e({query:pl({personName:f.name,businessName:t.mapped.name}),gl:t.options.gl,hl:t.options.hl,includeAiOverview:!1});t.usage.serpSearches+=1,c.push(gl({person:f,businessName:t.mapped.name,location:r,results:_w(v)}))}catch{t.warnings.push("people_linkedin_search_failed"),c.push(f)}return c}function ar(){return{website:null,phone:null,primaryEmail:null,emails:[],socialProfiles:[],contactFormUrl:null,sourceUrls:[]}}function Eo(t,e){let n=new Set(t.emails.map(l=>l.value));for(let l of e.emails){if(t.emails.length>=20)break;n.has(l.value)||(t.emails.push(l),n.add(l.value))}let r=new Set(t.socialProfiles.map(l=>l.url));for(let l of e.socialProfiles){if(t.socialProfiles.length>=20)break;r.has(l.url)||(t.socialProfiles.push(l),r.add(l.url))}let o=new Set(t.contactForms.map(l=>l.url));for(let l of e.contactForms){if(t.contactForms.length>=10)break;o.has(l.url)||(t.contactForms.push(l),o.add(l.url))}let s=new Set(t.candidatePageUrls.map(l=>l.url));for(let l of e.candidatePageUrls){if(t.candidatePageUrls.length>=20)break;s.has(l.url)||(t.candidatePageUrls.push(l),s.add(l.url))}}function kw(t,e){let n={emails:[],socialProfiles:[],contactForms:[],candidatePageUrls:[]},r=t.kpo?.email?.trim().toLowerCase();r&&n.emails.push({value:r,sourceUrl:e,context:`Structured entity data for ${t.kpo?.entityName??"the page entity"}`,sourceType:"structured_data"});for(let o of[...t.kpo?.sameAs??[],...t.kpo?.socialLinks??[]])try{let s=new URL(o);if(!["http:","https:"].includes(s.protocol))continue;let l=s.hostname.replace(/^www\./,"").split(".")[0];n.socialProfiles.some(m=>m.url===s.href)||n.socialProfiles.push({url:s.href,network:l,sourceUrl:e,context:"Structured entity social profile"})}catch{}return n}function Rw(t){return{name:t.name,websiteUrl:t.websiteUrl??null,address:t.address??null,phone:t.phone??null,placeUrl:t.placeUrl??null,cid:t.cid==null?null:String(t.cid),organization:t.organization??null,category:t.category??null}}function _l(t){return typeof t=="object"&&t!==null&&"source"in t&&typeof t.source=="object"&&t.source!==null&&"mapped"in t&&typeof t.mapped=="object"&&t.mapped!==null}async function qT(t){let e,n;try{if(_l(t.row))e=t.row,n=kl.parse(t.options??{});else{let B=bw({rows:[t.row],columnMap:t.columnMap,options:t.options});e={...B.rows[0],ordinal:t.ordinal},n=B.options}}catch{return{ordinal:t.ordinal,source:_l(t.row)?t.row.source:t.row,rowStatus:"failed",identity:{status:"invalid",confidence:0,reasons:["invalid_input"],selected:null,candidates:[]},contacts:ar(),people:[],usage:{mapsAttempts:0,pageAttempts:0,pageSuccesses:0,serpSearches:0},warnings:[],error:{code:"invalid_row",message:"The row could not be normalized with the supplied column mapping."}}}let r={mapsAttempts:0,pageAttempts:0,pageSuccesses:0,serpSearches:0},o;if(e.mapped.profileUrl||e.mapped.websiteUrl)o=Sl(e.mapped,[]);else{let B=vw(e.mapped);try{r.mapsAttempts=1;let de=await t.adapters.mapsSearch({query:B.query,location:B.location,maxResults:5,gl:n.gl,hl:n.hl}),Ie=(Array.isArray(de)?de:de.results).map(Rw);o=Sl(e.mapped,Ie)}catch(de){return de instanceof Qr&&(r.mapsAttempts=0),{ordinal:e.ordinal,source:e.source,rowStatus:"failed",identity:{status:"not_found",confidence:0,reasons:["maps_provider_failure"],selected:null,candidates:[]},contacts:ar(),people:[],usage:r,warnings:[],error:{code:"resolution_failed",message:"The business lookup could not be completed for this row."}}}}if(o.status==="ambiguous"||o.status==="not_found"||o.status==="invalid")return{ordinal:e.ordinal,source:e.source,rowStatus:o.status==="invalid"?"failed":"complete",identity:o,contacts:ar(),people:[],usage:r,warnings:[],error:o.status==="invalid"?{code:"invalid_row",message:"The row could not be resolved."}:null};let s=e.mapped.profileUrl??e.mapped.websiteUrl??o.selected?.websiteUrl??null,l=s?{value:s,sourceUrl:o.status==="provided_url"?"provided":o.selected?.placeUrl??"maps_search"}:null,m=e.mapped.phone?{value:e.mapped.phone,sourceUrl:"provided"}:o.selected?.phone?{value:o.selected.phone,sourceUrl:o.selected.placeUrl??"maps_search"}:null,c=[];if(!s){let B=await xl({mapped:e.mapped,options:n,adapters:t.adapters,usage:r,warnings:c}),de=[...c.includes("people_search_failed")?["The optional associated-people search could not be completed."]:[],...c.includes("people_linkedin_search_failed")?["One or more optional LinkedIn candidate searches could not be completed."]:[],...c.includes("people_not_found")?["No role-bearing associated people were found in the bounded search."]:[],...c.includes("people_discovery_skipped_for_person")?["Associated-people discovery applies to business rows and was skipped for this person row."]:[]];return{ordinal:e.ordinal,source:e.source,rowStatus:"complete",identity:o,contacts:{...ar(),website:l,phone:m,sourceUrls:[l?.sourceUrl,m?.sourceUrl].filter(Ie=>!!Ie)},people:B,usage:r,warnings:["The matched listing did not expose a public website.",...de],error:null}}let f={emails:[],socialProfiles:[],contactForms:[],candidatePageUrls:[]};e.mapped.email&&f.emails.push({value:e.mapped.email,sourceUrl:"provided",context:`Provided for ${e.mapped.name}`,sourceType:"provided"});let v=new Set,d=[s],p=null;for(;d.length&&v.size<n.maxPagesPerLead;){let B=d.find(de=>!v.has(de));if(!B)break;v.add(B),r.pageAttempts+=1;try{let de=await t.adapters.extractPage({url:B});r.pageSuccesses+=1;let Ie=de.url??B,ze=de.contactEvidence??Ds(de.bodyHtml??de.bodyMarkdown??"",Ie);Eo(ze,kw(de,Ie)),Eo(f,ze),!p&&de.kpo?.phone&&(p={value:de.kpo.phone,sourceUrl:Ie}),d=So(s,f.candidatePageUrls,n.maxPagesPerLead)}catch{c.push("page_failed"),d=So(s,f.candidatePageUrls,n.maxPagesPerLead)}}if(!f.emails.length&&n.emailSearchFallback==="serp_snippets"){let B=zs(s);if(B)try{let de=await t.adapters.searchEmailSerp({query:B,gl:n.gl,hl:n.hl});r.serpSearches+=1;let Ie=Array.isArray(de)?de:de.organicResults;Eo(f,{emails:Fs({websiteUrl:s,results:Ie}),socialProfiles:[],contactForms:[],candidatePageUrls:[]})}catch{c.push("serp_failed")}}let h=await xl({mapped:e.mapped,options:n,adapters:t.adapters,usage:r,warnings:c}),w=[...c.includes("page_failed")?["One or more selected website pages could not be read."]:[],...c.includes("serp_failed")?["The optional email search could not be completed."]:[],...c.includes("people_search_failed")?["The optional associated-people search could not be completed."]:[],...c.includes("people_linkedin_search_failed")?["One or more optional LinkedIn candidate searches could not be completed."]:[],...c.includes("people_not_found")?["No role-bearing associated people were found in the bounded search."]:[],...c.includes("people_discovery_skipped_for_person")?["Associated-people discovery applies to business rows and was skipped for this person row."]:[]];if(!r.pageSuccesses&&!f.emails.length&&!h.length)return{ordinal:e.ordinal,source:e.source,rowStatus:"failed",identity:o,contacts:{...ar(),website:l,phone:m},people:h,usage:r,warnings:w,error:{code:"page_extraction_failed",message:"No selected website page could be read for this row."}};let R={entityType:e.mapped.entityType,name:e.mapped.name,organization:e.mapped.organization},A=["provided","first_party_page","structured_data","serp_snippet"],C=["person","team","office","unknown"],P=f.emails.map(B=>({...B,...Hs(B,R)})).sort((B,de)=>A.indexOf(B.sourceType)-A.indexOf(de.sourceType)||C.indexOf(B.scope)-C.indexOf(de.scope)),M=Ns(f.emails,R),H=f.contactForms[0]?{value:f.contactForms[0].url,sourceUrl:f.contactForms[0].sourceUrl}:null,K=m??p,Z=[...new Set([l?.sourceUrl,K?.sourceUrl,...P.map(B=>B.sourceUrl),...f.socialProfiles.map(B=>B.sourceUrl),H?.sourceUrl].filter(B=>!!B))];return{ordinal:e.ordinal,source:e.source,rowStatus:"complete",identity:o,contacts:{website:l,phone:K,primaryEmail:M,emails:P,socialProfiles:f.socialProfiles.slice(0,20),contactFormUrl:H,sourceUrls:Z},people:h,usage:r,warnings:w,error:null}}var Tw=["enriched_row_status","enriched_identity_status","enriched_match_confidence","enriched_matched_name","enriched_organization","enriched_website","enriched_phone","enriched_primary_email","enriched_primary_email_scope","enriched_secondary_email","enriched_all_emails","enriched_social_profiles","enriched_contact_form_url","enriched_primary_person_name","enriched_primary_person_role","enriched_primary_person_linkedin","enriched_all_people","enriched_maps_url","enriched_cid","enriched_source_urls","enriched_warnings"];function sr(t){return JSON.stringify(t)}function DT(t,e){let n=e??Object.keys(t[0]?.source??{});for(let o of n)if(o.toLowerCase().startsWith(Il))throw new Error(`Source header ${o} collides with reserved enriched_ output columns`);let r=[...t].sort((o,s)=>o.ordinal-s.ordinal);return{headers:[...n,...Tw],rows:r.map(o=>{let s=o.contacts.primaryEmail?o.contacts.emails.find(l=>l.value!==o.contacts.primaryEmail?.value)??null:null;return[...n.map(l=>o.source[l]??null),o.rowStatus,o.identity.status,o.identity.confidence,o.identity.selected?.name??"",o.identity.selected?.organization??"",o.contacts.website?.value??"",o.contacts.phone?.value??"",o.contacts.primaryEmail?.value??"",o.contacts.primaryEmail?.scope??"",s?.value??"",sr(o.contacts.emails.map(l=>({value:l.value,scope:l.scope,sourceType:l.sourceType,sourceUrl:l.sourceUrl,...l.sourceTitle?{sourceTitle:l.sourceTitle}:{},...l.sourcePosition!=null?{sourcePosition:l.sourcePosition}:{},context:l.context,reasons:l.reasons}))),sr(o.contacts.socialProfiles.map(l=>({url:l.url,network:l.network,sourceUrl:l.sourceUrl}))),o.contacts.contactFormUrl?.value??"",o.people[0]?.name??"",o.people[0]?.role??"",o.people[0]?.linkedinUrl??"",sr(o.people),o.identity.selected?.placeUrl??"",o.identity.selected?.cid??"",sr(o.contacts.sourceUrls),sr([...o.warnings,...o.error?[o.error.message]:[]])]})}}import{z as Cw}from"zod";var lr=["LocalBusiness","AnimalShelter","AutomotiveBusiness","AutoBodyShop","AutoDealer","AutoPartsStore","AutoRental","AutoRepair","AutoWash","GasStation","MotorcycleDealer","MotorcycleRepair","ChildCare","Dentist","DryCleaningOrLaundry","EmergencyService","EmploymentAgency","EntertainmentBusiness","FinancialService","AccountingService","AutomatedTeller","BankOrCreditUnion","InsuranceAgency","FoodEstablishment","Bakery","BarOrPub","Brewery","CafeOrCoffeeShop","Distillery","FastFoodRestaurant","IceCreamShop","Restaurant","Winery","HealthAndBeautyBusiness","BeautySalon","DaySpa","HairSalon","HealthClub","NailSalon","TattooParlor","HomeAndConstructionBusiness","Electrician","GeneralContractor","HVACBusiness","HousePainter","Locksmith","MovingCompany","Plumber","RoofingContractor","LegalService","Library","LodgingBusiness","MedicalBusiness","Pharmacy","Physician","RealEstateAgent","RecyclingCenter","SelfStorage","ShoppingCenter","SportsActivityLocation","Store","TouristInformationCenter","TravelAgency"],Aw=Cw.enum(lr),Pw={home:"HomeAndConstructionBusiness",professional:"LocalBusiness",restaurants:"FoodEstablishment",financial:"FinancialService",realestate:"RealEstateAgent",auto:"AutomotiveBusiness",wellness:"HealthAndBeautyBusiness"};function Rl(t){return Pw[t]}function zT(t,e){let n=Aw.safeParse(e);return n.success?n.data:Rl(t)}function FT(t){return{rootType:"LocalBusiness",selectedDefault:t?Rl(t):"LocalBusiness",acceptedSubtypes:lr,callerSuppliedJsonLdAccepted:!1,compilation:"MCP Scraper generates JSON-LD from source-backed listing evidence after acquisition."}}var Ow=new Intl.Segmenter(void 0,{granularity:"word"});function ft(t){let e=0;for(let n of Ow.segment(t))n.isWordLike&&(e+=1);return e}function Rt(t,e,n){let r=ft(t),o=e.reduce((v,d)=>{let p=Number(d.timestamp?.[1]);return Number.isFinite(p)&&p>v?p:v},0),s=typeof n=="number"&&Number.isFinite(n)&&n>0?n:o>0?o:null,l=s&&s>0?Math.round(r/s*600)/10:null,m=r===0?"empty":r<5?"low_speech_signal":"speech_detected",c=r<=2,f=[];return m==="empty"?f.push("No speech was transcribed. This does not distinguish silent media from an inaccessible or expired playback URL."):m==="low_speech_signal"&&f.push("Very little speech was transcribed. Review the media before treating this as a complete transcript."),c&&f.push("If speech was expected, refresh the media source and retry using the tool for its original platform."),{status:m,speechDetected:m==="speech_detected",confidence:m==="speech_detected"?"medium":"low",basis:"transcript_word_count_and_timing",mediaDurationSec:s,wordsPerMinute:l,retryRecommended:c,warnings:f}}import{fal as Ew}from"@fal-ai/client";var Mo=9e4,Pn=Mo+15e3,ii=["af","am","ar","as","az","ba","be","bg","bn","bo","br","bs","ca","cs","cy","da","de","el","en","es","et","eu","fa","fi","fo","fr","gl","gu","ha","haw","he","hi","hr","ht","hu","hy","id","is","it","ja","jw","ka","kk","km","kn","ko","la","lb","ln","lo","lt","lv","mg","mi","mk","ml","mn","mr","ms","mt","my","ne","nl","nn","no","oc","pa","pl","ps","pt","ro","ru","sa","sd","si","sk","sl","sn","so","sq","sr","su","sv","sw","ta","te","tg","th","tk","tl","tr","tt","uk","ur","uz","vi","yi","yo","zh"];function jw(t,e,n,r){let o=l=>`${Math.floor(l/60)}:${String(Math.floor(l%60)).padStart(2,"0")}`,s=[t,"",`*Transcribed in ${(r/1e3).toFixed(1)}s*`,"","## Full Text","",e,""];if(n.length){s.push("## Timestamped Segments","");for(let l of n)s.push(`**[${o(l.timestamp[0])} -> ${o(l.timestamp[1])}]** ${l.text.trim()}`,"")}return s.join(`
|
|
1
|
+
import{a as An,e as Je,s as il}from"./chunk-4KHDV5E7.js";import{b as ol}from"./chunk-7POHNTVW.js";import{j as Gs,k as Ws,l as Bs,m as Ks}from"./chunk-MVMWPKRC.js";import{c as Vs,e as _o,f as Js,h as Io,j as ko,k as Ro,l as To,m as Ys,n as Zr,p as Co,q as Xs,r as Ao,s as Po,u as Zs}from"./chunk-2IATUJO6.js";import{e as Br,h as Dt,i as er,ja as As,ka as Ps,m as ho,n as Kr,o as fo,p as bo,q as Cs}from"./chunk-OY24ERPV.js";import{a as Ls,c as rr,d as Us,e as ir,f as $s,g as qs}from"./chunk-CNSVZTTT.js";import{a as Ms,b as wo}from"./chunk-K3VDGJNK.js";import{f as js}from"./chunk-7SR7MEU5.js";import{e as nr,g as Xr,i as Es}from"./chunk-SEZETSB3.js";import{b as Os,c as Yr,i as tr}from"./chunk-SDQW7IJN.js";import{a as xs,c as go,e as Cn,f as Gr,i as Ts}from"./chunk-B4ZKPLSP.js";import{d as ks,g as Rs}from"./chunk-VVSHZV5S.js";import{c as _s,f as Wr,g as qt,h as Xe,i as Qn}from"./chunk-C7MGJUTU.js";import{c as Is}from"./chunk-4ZVO6GX4.js";import{a as Ds,b as Hs,c as Ns,d as So,e as zs,f as Fs,h as Qs,i as el,k as tl,m as nl,n as rl}from"./chunk-24YDQ3EO.js";import{b as Vr,c as Ve,d as vo,e as Jr}from"./chunk-OILOHQNL.js";import{a as xo}from"./chunk-JGGQ3UX5.js";import{z as Ae}from"zod";var Qr=class extends Error{constructor(e){super("lead_provider_admission_denied",{cause:e}),this.name="LeadProviderAdmissionError"}};var sl=["president\\s*[/&-]\\s*owner","owner\\s*[/&-]\\s*president","chief executive officer","operations manager","general manager","managing member","managing partner","business owner","co[- ]founder","team member","president","principal","director","manager","partner","founder","owner","ceo"].join("|"),Oo=String.raw`(?:Mr\.?|Ms\.?|Mrs\.?|Dr\.?)?\s*([\p{Lu}][\p{L}'’.-]+(?:\s+[\p{Lu}][\p{L}'’.-]+){1,3})`,Wv=`${Oo}\\s*(?:,|[-\u2013\u2014]|\\bis\\b|\\bas\\b|\\bserves as\\b)?\\s*(${sl})\\b`,Bv=`\\b(${sl})\\b\\s*(?:[,:\u2013\u2014-]|\\bis\\b|\\bof\\b)?\\s*${Oo}`,Kv=`\\b((?:co[- ]?)?owned|founded)\\s+by\\s+${Oo}`,Vv=new Set(["about","additional","business","company","contact","customer","details","information","management","member","owner","president","profile","roofing","team","website"]),Jv=new Set(["co","company","corp","corporation","inc","incorporated","llc","ltd","limited","pllc"]);function or(t,e=400){return t.replace(/\s+/g," ").trim().slice(0,e)}function Ht(t){return t.toLowerCase().replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean)}function ll(t){let e=Ht(t);for(;e.length&&Jv.has(e[e.length-1]);)e.pop();return e}function Yv(t){return t.replace(/^(?:Mr\.?|Ms\.?|Mrs\.?|Dr\.?)\s+/i,"").replace(/[.!?]\s+.*$/,"").replace(/[.,;:!?]+$/,"").replace(/\s+/g," ").trim()}function Xv(t,e){let n=Ht(t);if(n.length<2||n.length>4||n.some(o=>Vv.has(o)))return!1;let r=new Set(ll(e));return n.some(o=>!r.has(o))}function Zv(t){let e=t.toLowerCase().replace(/\s+/g," ");return/founder/.test(e)?"founder":/owner|managing member|partner/.test(e)?"owner":/manager/.test(e)?"manager":/president|chief executive officer|\bceo\b|principal|director/.test(e)?"executive":"team_member"}function Qv(t){return/founded/i.test(t)?"Founder":/owned/i.test(t)?"Owner":or(t,80).replace(/\bceo\b/i,"CEO").replace(/\b\w/g,e=>e.toUpperCase())}function cl(t){return or(`${t.title} | ${t.snippet??""}`)}function dl(t){return t.map((e,n)=>({result:e,index:n})).sort((e,n)=>{let r=Number.isFinite(e.result.position)?e.result.position:Number.MAX_SAFE_INTEGER,o=Number.isFinite(n.result.position)?n.result.position:Number.MAX_SAFE_INTEGER;return r-o||e.index-n.index}).map(e=>e.result)}function ew(t){if(!t)return null;try{let e=new URL(t);return e.protocol==="http:"||e.protocol==="https:"?e.href:null}catch{return null}}function al(t){return`"${t.replace(/["\\]/g," ").replace(/\s+/g," ").trim()}"`}function ei(t){return or(t??"",120).replace(/["\\]/g," ")}function tw(t){return t==="owners"?'"{business}" owner of company {location}':'"{business}" leadership team {location}'}function ul(t){let e={business:ei(t.businessName),city:ei(t.city),region:ei(t.region),location:ei(t.location)},n=(t.queryTemplates?.length?t.queryTemplates:[tw(t.mode)]).map(r=>or(r.replace(/\{(business|city|region|location)\}/g,(o,s)=>e[s]),240)).filter(Boolean);return[...new Set(n)].slice(0,3)}function pl(t){return`site:linkedin.com/in ${al(t.personName)} ${al(t.businessName)}`}function ml(t){let e=new Map,n=[],r=t.aiOverview?.detected?or(t.aiOverview.text??""):"";if(r){let o=ew(t.aiOverview?.shareUrl)??(t.query?`https://www.google.com/search?q=${encodeURIComponent(t.query)}`:"https://www.google.com/"),s=(t.aiOverview?.citations??[]).flatMap(l=>{try{let m=new URL(l.href);return["http:","https:"].includes(m.protocol)?[m.href]:[]}catch{return[]}}).slice(0,5);n.push({sourceType:"ai_overview",sourceUrl:o,sourceTitle:"Google AI Overview",sourcePosition:0,context:r,...s.length?{citationUrls:s}:{}})}for(let o of dl(t.results))n.push({sourceType:"serp_snippet",sourceUrl:o.url,sourceTitle:o.title,sourcePosition:o.position,context:cl(o)});for(let o of n){let s=o.context;if(!yl(s,t.businessName))continue;let l=t.city||(t.location??"").split(",")[0]||"",m=Ht(l).filter(v=>v.length>2),c=m.some(v=>Ht(s).includes(v));if(o.sourceType==="ai_overview"&&m.length&&!c)continue;let f=[];for(let v of s.matchAll(new RegExp(Wv,"giu")))f.push({name:v[1]??"",role:v[2]??""});for(let v of s.matchAll(new RegExp(Bv,"giu")))f.push({name:v[2]??"",role:v[1]??""});for(let v of s.matchAll(new RegExp(Kv,"giu")))f.push({name:v[2]??"",role:v[1]??""});for(let v of f){let d=Yv(v.name),p=Qv(v.role);if(!Xv(d,t.businessName))continue;let h=Zv(p);if(t.mode==="owners"&&h!=="owner"&&h!=="founder")continue;let w=Ht(d).join(" ");if(!w)continue;let R={sourceType:o.sourceType,purpose:"role",sourceUrl:o.sourceUrl,sourceTitle:o.sourceTitle,sourcePosition:o.sourcePosition,context:s,...o.citationUrls?{citationUrls:o.citationUrls}:{}},A=e.get(w);if(A){A.sources.length<2&&!A.sources.some(P=>P.sourceUrl===R.sourceUrl)&&A.sources.push(R),A.reasons=[...new Set([...A.reasons,"multiple_search_sources"])],A.confidence=Math.max(A.confidence,o.sourceType==="ai_overview"?c?.93:.9:.88);continue}let C=o.sourceType==="ai_overview";if(e.set(w,{name:d,role:p,relationship:h,linkedinUrl:null,confidence:C?c?.93:.9:.88,reasons:[C?"name_role_in_ai_overview":"name_role_in_search_result","exact_business_query_context",...C&&c?["ai_overview_location_match"]:[]],sources:[R]}),e.size>=5)return[...e.values()]}}return[...e.values()]}function nw(t){try{let e=new URL(t),n=e.hostname.toLowerCase().replace(/^www\./,"");return e.protocol!=="https:"||n!=="linkedin.com"||!/^\/in\/[^/]+\/?$/i.test(e.pathname)?null:(e.search="",e.hash="",e.href)}catch{return null}}function rw(t,e){let n=new Set(Ht(t)),r=Ht(e);return r.length>=2&&r.every(o=>n.has(o))}function yl(t,e){let n=new Set(Ht(t)),r=ll(e);if(r.length<2)return!1;let o=r.filter(s=>n.has(s)).length;return o>=2&&o/r.length>=.6}function gl(t){for(let e of dl(t.results)){let n=nw(e.url);if(!n)continue;let r=cl(e);if(!rw(r,t.person.name)||!yl(r,t.businessName))continue;let s=Ht((t.location??"").split(",")[0]??"").filter(l=>l.length>2).some(l=>Ht(r).includes(l));return{...t.person,linkedinUrl:n,confidence:s?.97:.94,reasons:[...new Set([...t.person.reasons,"linkedin_name_match","linkedin_company_match",...s?["linkedin_location_match"]:[]])],sources:[...t.person.sources,{sourceType:"serp_snippet",purpose:"linkedin",sourceUrl:e.url,sourceTitle:e.title,sourcePosition:e.position,context:r}]}}return t.person}var iw=Ae.union([Ae.string(),Ae.number().finite(),Ae.boolean(),Ae.null()]),Il="enriched_",ow=250,hl=100,aw=32*1024,fl=500*1024,sw=5*1024*1024,lw=Ae.array(Ae.record(Ae.string(),iw)).min(1).max(ow).superRefine((t,e)=>{t.forEach((n,r)=>{Object.keys(n).forEach(o=>{o.toLowerCase().startsWith(Il)&&e.addIssue({code:"custom",message:`Input header ${o} uses the reserved enriched_ prefix`,path:[r,o]})})})}),cw=Ae.object({name:Ae.string().min(1),location:Ae.string().min(1).optional(),city:Ae.string().min(1).optional(),region:Ae.string().min(1).optional(),organization:Ae.string().min(1).optional(),websiteUrl:Ae.string().min(1).optional(),profileUrl:Ae.string().min(1).optional(),phone:Ae.string().min(1).optional(),email:Ae.string().min(1).optional(),entityType:Ae.string().min(1).optional()}).strict(),dw=/\{(?:business|city|region|location)\}/g,uw=Ae.string().trim().min(1).max(240).refine(t=>!/[\r\n]/.test(t),"People query templates must be one line").refine(t=>t.includes("{business}"),"People query templates must include {business}").refine(t=>!/[{}]/.test(t.replace(dw,"")),"People query templates may use only {business}, {city}, {region}, and {location}"),jo=Ae.array(uw).min(1).max(3),kl=Ae.object({resolveMissingUrls:Ae.boolean().default(!0),defaultEntityType:Ae.enum(["business","person"]).default("business"),gl:Ae.string().regex(/^[a-z]{2}$/i).transform(t=>t.toLowerCase()).default("us"),hl:Ae.string().regex(/^[a-z]{2}(?:-[a-z]{2})?$/i).transform(t=>t.toLowerCase()).default("en"),maxPagesPerLead:Ae.number().int().min(1).max(4).default(3),concurrency:Ae.number().int().min(1).max(5).default(3),emailSearchFallback:Ae.enum(["off","serp_snippets"]).default("off"),peopleDiscovery:Ae.enum(["off","owners","leadership"]).default("off"),peopleQueryTemplates:jo.optional(),maxPeoplePerLead:Ae.number().int().min(1).max(3).default(2),outputFormats:Ae.array(Ae.enum(["csv","xlsx"])).min(1).max(2).transform(t=>[...new Set(t)]).default(["csv","xlsx"])}).strict(),pw={name:["name","business_name","business name","company","company_name","full_name","full name"],location:["location","market","address"],city:["city","town"],region:["region","state","province"],organization:["organization","organisation","brokerage","agency","company"],websiteUrl:["websiteUrl","website_url","website url","website","url"],profileUrl:["profileUrl","profile_url","profile url","profile"],phone:["phone","phone_number","phone number","telephone"],email:["email","email_address","email address"],entityType:["entityType","entity_type","entity type","type"]};function mw(t){return Buffer.byteLength(String(t??""),"utf8")}function yw(t){return t==null?null:String(t).trim()||null}function gw(t){let e=t.split(".").map(Number);return e.length!==4||e.some(n=>!Number.isInteger(n)||n<0||n>255)?!1:e[0]===10||e[0]===127||e[0]===169&&e[1]===254||e[0]===172&&e[1]>=16&&e[1]<=31||e[0]===192&&e[1]===168||e[0]===0}function bl(t){if(!t)return null;try{let e=new URL(t),n=e.hostname.toLowerCase();return!["http:","https:"].includes(e.protocol)||e.username||e.password||n==="localhost"||n.endsWith(".localhost")||n==="::1"||n.endsWith(".local")||gw(n)?null:e.href}catch{return null}}function hw(t,e){let n=new Map(t.map(o=>[o.toLowerCase(),o])),r={...e};for(let[o,s]of Object.entries(pw)){if(r[o])continue;let l=s.map(m=>n.get(m.toLowerCase())).find(Boolean);l&&(r[o]=l)}if(!r.name)throw new Error(`invalid_column_map: name must identify one exact source header; available headers: ${t.join(", ")}`);return cw.parse(r)}function fw(t,e){for(let[n,r]of Object.entries(e))if(!(n==="entityType"&&(r==="person"||r==="business")&&!t.includes(r))&&!t.includes(r))throw new Error(`invalid_column_map: ${n} references missing header ${r}; available headers: ${t.join(", ")}`)}function Nt(t,e){return e?yw(t[e]):null}function ri(t,e,n){return t||[e,n].filter(Boolean).join(", ")||null}function bw(t){let e=lw.parse(t.rows),n=kl.parse(t.options??{}),r=Object.keys(e[0]);if(!r.length||r.length>hl)throw new Error(`lead_list_bounds_exceeded: input must contain 1-${hl} columns`);if(r.some(c=>!c.trim()))throw new Error("Input headers must not be blank");if(new Set(r).size!==r.length)throw new Error("Input headers must be unique");for(let[c,f]of e.entries()){let v=Object.keys(f);if(v.length!==r.length||v.some((d,p)=>d!==r[p]))throw new Error(`All rows must have the same columns in the same order; row ${c+1} differs`);for(let[d,p]of Object.entries(f))if(mw(p)>aw)throw new Error(`lead_list_bounds_exceeded: cell in column ${d} exceeds 32 KiB`)}let o=Buffer.byteLength(JSON.stringify(e),"utf8"),s=t.maxSerializedBytes??fl;if(!Number.isInteger(s)||s<1||s>sw)throw new Error("maxSerializedBytes must be an integer no greater than 5 MiB");if(o>s){let c=s===fl?"inline rows exceed 500 KiB":"normalized rows exceed the configured byte limit";throw new Error(`lead_list_bounds_exceeded: ${c}`)}let l=hw(r,t.columnMap);fw(r,l);let m=e.map((c,f)=>{let v=Nt(c,l.name);if(!v)throw new Error(`Row ${f+1} requires a non-empty name`);let d=Nt(c,l.websiteUrl),p=Nt(c,l.profileUrl),h=d?bl(d):null,w=p?bl(p):null;if(d&&!h||p&&!w)throw new Error(`Row ${f+1} URL must be a public HTTP(S) URL`);let R=Nt(c,l.location),A=Nt(c,l.city),C=Nt(c,l.region);if(!h&&!w&&(!n.resolveMissingUrls||!ri(R,A,C)))throw new Error(`Row ${f+1} requires a public website/profile URL or a location with resolveMissingUrls enabled`);let P=l.entityType==="person"||l.entityType==="business"?l.entityType:Nt(c,l.entityType);if(P&&P!=="person"&&P!=="business")throw new Error(`Row ${f+1} entityType must be business or person`);let M=P==="person"||P==="business"?P:n.defaultEntityType;return{ordinal:f,source:Object.fromEntries(r.map(H=>[H,c[H]])),mapped:{name:v,location:R,city:A,region:C,organization:Nt(c,l.organization),websiteUrl:h,profileUrl:w,phone:Nt(c,l.phone),email:Nt(c,l.email)?.toLowerCase()??null,entityType:M}}});return{headers:r,rows:m,serializedBytes:o,columnMap:l,options:n}}function vw(t){return{query:[t.name,t.organization].filter(Boolean).join(" "),location:ri(t.location,t.city,t.region)}}var ww=new Set(["co","company","corp","corporation","inc","incorporated","llc","llp","lp","ltd","limited","pllc","pc"]);function ni(t){let e=t.toLowerCase().replace(/&/g," and ").replace(/[^a-z0-9]+/g," ").trim().split(/\s+/).filter(Boolean);for(;e.length&&ww.has(e[e.length-1]);)e.pop();return e}function Sw(t,e){let n=ni(t),r=ni(e);if(!n.length||!r.length)return 0;if(n.join(" ")===r.join(" "))return 1;let o=new Set(n),s=r.filter(c=>o.has(c)).length,l=2*s/(n.length+r.length),m=s/Math.min(n.length,r.length);return Math.max(l,m>=1?.9:m*.85)}function vl(t){let e=(t??"").replace(/\D/g,"");return e.length>10?e.slice(-10):e}function wl(t){try{return new URL(t??"").hostname.toLowerCase().replace(/^www\./,"")||null}catch{return null}}function ti(t,e){let n=ni(e??"").filter(o=>o.length>2),r=ni(t??"");return!!(n.length&&n.every(o=>r.includes(o)))}function xw(t,e){let n=Sw(t.name,e.name);if(n<.72)return null;let r=[n===1?"exact_name_match":"near_name_match"],o=[],s=vl(t.phone),l=vl(e.phone);s.length>=7&&l.endsWith(s.slice(-7))&&o.push("phone_match");let m=ri(t.location,t.city,t.region);m&&ti(e.address,m)&&o.push("location_match"),t.city&&ti(e.address,t.city)&&o.push("location_match"),t.organization&&(ti(e.organization,t.organization)||ti(e.name,t.organization))&&o.push("organization_match");let c=wl(t.websiteUrl??t.profileUrl);c&&c===wl(e.websiteUrl)&&o.push("domain_match");let f=[...new Set(o)];if(!f.length)return null;r.push(...f);let v=Math.min(1,Number((n*.7+.2+Math.min(.1,(f.length-1)*.05)).toFixed(3)));return{candidate:e,confidence:v,reasons:r,corroborators:f}}function Sl(t,e){if(t.profileUrl??t.websiteUrl)return{status:"provided_url",confidence:1,reasons:["caller_provided_url"],selected:null,candidates:[]};if(!t.name)return{status:"invalid",confidence:0,reasons:["missing_name"],selected:null,candidates:[]};let r=e.map(s=>xw(t,s)).filter(s=>!!s).sort((s,l)=>l.confidence-s.confidence||s.candidate.name.localeCompare(l.candidate.name));if(!r.length)return{status:"not_found",confidence:0,reasons:["no_corroborated_candidate"],selected:null,candidates:[]};let o=r.filter(s=>s.confidence>=r[0].confidence-.08);return o.length>1?{status:"ambiguous",confidence:r[0].confidence,reasons:["multiple_plausible_candidates"],selected:null,candidates:o.slice(0,3)}:{status:"matched",confidence:r[0].confidence,reasons:r[0].reasons,selected:r[0].candidate,candidates:r.slice(0,3)}}function _w(t){return Array.isArray(t)?t:t.organicResults}function Iw(t){return Array.isArray(t)?{organicResults:t}:t}async function xl(t){if(t.options.peopleDiscovery==="off")return[];if(t.mapped.entityType!=="business")return t.warnings.push("people_discovery_skipped_for_person"),[];if(!t.adapters.searchPeopleSerp)return t.warnings.push("people_search_failed"),[];let e=t.adapters.searchPeopleSerp,n=t.options.peopleDiscovery,r=ri(t.mapped.location,t.mapped.city,t.mapped.region),o=ul({businessName:t.mapped.name,location:r,city:t.mapped.city,region:t.mapped.region,mode:n,queryTemplates:t.options.peopleQueryTemplates}),s=new Map,l=0;for(let f of o)try{let v=await e({query:f,gl:t.options.gl,hl:t.options.hl,includeAiOverview:!0});t.usage.serpSearches+=1,l+=1;let d=Iw(v);for(let p of ml({businessName:t.mapped.name,location:r,city:t.mapped.city,query:f,mode:n,results:d.organicResults,aiOverview:d.aiOverview})){let h=p.name.toLocaleLowerCase("en-US");if(s.has(h)||s.set(h,p),s.size>=t.options.maxPeoplePerLead)break}if(s.size>=t.options.maxPeoplePerLead)break}catch{t.warnings.push("people_search_failed")}let m=[...s.values()].slice(0,t.options.maxPeoplePerLead);if(!l)return[];if(!m.length)return t.warnings.push("people_not_found"),[];let c=[];for(let f of m)try{let v=await e({query:pl({personName:f.name,businessName:t.mapped.name}),gl:t.options.gl,hl:t.options.hl,includeAiOverview:!1});t.usage.serpSearches+=1,c.push(gl({person:f,businessName:t.mapped.name,location:r,results:_w(v)}))}catch{t.warnings.push("people_linkedin_search_failed"),c.push(f)}return c}function ar(){return{website:null,phone:null,primaryEmail:null,emails:[],socialProfiles:[],contactFormUrl:null,sourceUrls:[]}}function Eo(t,e){let n=new Set(t.emails.map(l=>l.value));for(let l of e.emails){if(t.emails.length>=20)break;n.has(l.value)||(t.emails.push(l),n.add(l.value))}let r=new Set(t.socialProfiles.map(l=>l.url));for(let l of e.socialProfiles){if(t.socialProfiles.length>=20)break;r.has(l.url)||(t.socialProfiles.push(l),r.add(l.url))}let o=new Set(t.contactForms.map(l=>l.url));for(let l of e.contactForms){if(t.contactForms.length>=10)break;o.has(l.url)||(t.contactForms.push(l),o.add(l.url))}let s=new Set(t.candidatePageUrls.map(l=>l.url));for(let l of e.candidatePageUrls){if(t.candidatePageUrls.length>=20)break;s.has(l.url)||(t.candidatePageUrls.push(l),s.add(l.url))}}function kw(t,e){let n={emails:[],socialProfiles:[],contactForms:[],candidatePageUrls:[]},r=t.kpo?.email?.trim().toLowerCase();r&&n.emails.push({value:r,sourceUrl:e,context:`Structured entity data for ${t.kpo?.entityName??"the page entity"}`,sourceType:"structured_data"});for(let o of[...t.kpo?.sameAs??[],...t.kpo?.socialLinks??[]])try{let s=new URL(o);if(!["http:","https:"].includes(s.protocol))continue;let l=s.hostname.replace(/^www\./,"").split(".")[0];n.socialProfiles.some(m=>m.url===s.href)||n.socialProfiles.push({url:s.href,network:l,sourceUrl:e,context:"Structured entity social profile"})}catch{}return n}function Rw(t){return{name:t.name,websiteUrl:t.websiteUrl??null,address:t.address??null,phone:t.phone??null,placeUrl:t.placeUrl??null,cid:t.cid==null?null:String(t.cid),organization:t.organization??null,category:t.category??null}}function _l(t){return typeof t=="object"&&t!==null&&"source"in t&&typeof t.source=="object"&&t.source!==null&&"mapped"in t&&typeof t.mapped=="object"&&t.mapped!==null}async function qT(t){let e,n;try{if(_l(t.row))e=t.row,n=kl.parse(t.options??{});else{let B=bw({rows:[t.row],columnMap:t.columnMap,options:t.options});e={...B.rows[0],ordinal:t.ordinal},n=B.options}}catch{return{ordinal:t.ordinal,source:_l(t.row)?t.row.source:t.row,rowStatus:"failed",identity:{status:"invalid",confidence:0,reasons:["invalid_input"],selected:null,candidates:[]},contacts:ar(),people:[],usage:{mapsAttempts:0,pageAttempts:0,pageSuccesses:0,serpSearches:0},warnings:[],error:{code:"invalid_row",message:"The row could not be normalized with the supplied column mapping."}}}let r={mapsAttempts:0,pageAttempts:0,pageSuccesses:0,serpSearches:0},o;if(e.mapped.profileUrl||e.mapped.websiteUrl)o=Sl(e.mapped,[]);else{let B=vw(e.mapped);try{r.mapsAttempts=1;let de=await t.adapters.mapsSearch({query:B.query,location:B.location,maxResults:5,gl:n.gl,hl:n.hl}),Ie=(Array.isArray(de)?de:de.results).map(Rw);o=Sl(e.mapped,Ie)}catch(de){return de instanceof Qr&&(r.mapsAttempts=0),{ordinal:e.ordinal,source:e.source,rowStatus:"failed",identity:{status:"not_found",confidence:0,reasons:["maps_provider_failure"],selected:null,candidates:[]},contacts:ar(),people:[],usage:r,warnings:[],error:{code:"resolution_failed",message:"The business lookup could not be completed for this row."}}}}if(o.status==="ambiguous"||o.status==="not_found"||o.status==="invalid")return{ordinal:e.ordinal,source:e.source,rowStatus:o.status==="invalid"?"failed":"complete",identity:o,contacts:ar(),people:[],usage:r,warnings:[],error:o.status==="invalid"?{code:"invalid_row",message:"The row could not be resolved."}:null};let s=e.mapped.profileUrl??e.mapped.websiteUrl??o.selected?.websiteUrl??null,l=s?{value:s,sourceUrl:o.status==="provided_url"?"provided":o.selected?.placeUrl??"maps_search"}:null,m=e.mapped.phone?{value:e.mapped.phone,sourceUrl:"provided"}:o.selected?.phone?{value:o.selected.phone,sourceUrl:o.selected.placeUrl??"maps_search"}:null,c=[];if(!s){let B=await xl({mapped:e.mapped,options:n,adapters:t.adapters,usage:r,warnings:c}),de=[...c.includes("people_search_failed")?["The optional associated-people search could not be completed."]:[],...c.includes("people_linkedin_search_failed")?["One or more optional LinkedIn candidate searches could not be completed."]:[],...c.includes("people_not_found")?["No role-bearing associated people were found in the bounded search."]:[],...c.includes("people_discovery_skipped_for_person")?["Associated-people discovery applies to business rows and was skipped for this person row."]:[]];return{ordinal:e.ordinal,source:e.source,rowStatus:"complete",identity:o,contacts:{...ar(),website:l,phone:m,sourceUrls:[l?.sourceUrl,m?.sourceUrl].filter(Ie=>!!Ie)},people:B,usage:r,warnings:["The matched listing did not expose a public website.",...de],error:null}}let f={emails:[],socialProfiles:[],contactForms:[],candidatePageUrls:[]};e.mapped.email&&f.emails.push({value:e.mapped.email,sourceUrl:"provided",context:`Provided for ${e.mapped.name}`,sourceType:"provided"});let v=new Set,d=[s],p=null;for(;d.length&&v.size<n.maxPagesPerLead;){let B=d.find(de=>!v.has(de));if(!B)break;v.add(B),r.pageAttempts+=1;try{let de=await t.adapters.extractPage({url:B});r.pageSuccesses+=1;let Ie=de.url??B,ze=de.contactEvidence??Ds(de.bodyHtml??de.bodyMarkdown??"",Ie);Eo(ze,kw(de,Ie)),Eo(f,ze),!p&&de.kpo?.phone&&(p={value:de.kpo.phone,sourceUrl:Ie}),d=So(s,f.candidatePageUrls,n.maxPagesPerLead)}catch{c.push("page_failed"),d=So(s,f.candidatePageUrls,n.maxPagesPerLead)}}if(!f.emails.length&&n.emailSearchFallback==="serp_snippets"){let B=zs(s);if(B)try{let de=await t.adapters.searchEmailSerp({query:B,gl:n.gl,hl:n.hl});r.serpSearches+=1;let Ie=Array.isArray(de)?de:de.organicResults;Eo(f,{emails:Fs({websiteUrl:s,results:Ie}),socialProfiles:[],contactForms:[],candidatePageUrls:[]})}catch{c.push("serp_failed")}}let h=await xl({mapped:e.mapped,options:n,adapters:t.adapters,usage:r,warnings:c}),w=[...c.includes("page_failed")?["One or more selected website pages could not be read."]:[],...c.includes("serp_failed")?["The optional email search could not be completed."]:[],...c.includes("people_search_failed")?["The optional associated-people search could not be completed."]:[],...c.includes("people_linkedin_search_failed")?["One or more optional LinkedIn candidate searches could not be completed."]:[],...c.includes("people_not_found")?["No role-bearing associated people were found in the bounded search."]:[],...c.includes("people_discovery_skipped_for_person")?["Associated-people discovery applies to business rows and was skipped for this person row."]:[]];if(!r.pageSuccesses&&!f.emails.length&&!h.length)return{ordinal:e.ordinal,source:e.source,rowStatus:"failed",identity:o,contacts:{...ar(),website:l,phone:m},people:h,usage:r,warnings:w,error:{code:"page_extraction_failed",message:"No selected website page could be read for this row."}};let R={entityType:e.mapped.entityType,name:e.mapped.name,organization:e.mapped.organization},A=["provided","first_party_page","structured_data","serp_snippet"],C=["person","team","office","unknown"],P=f.emails.map(B=>({...B,...Hs(B,R)})).sort((B,de)=>A.indexOf(B.sourceType)-A.indexOf(de.sourceType)||C.indexOf(B.scope)-C.indexOf(de.scope)),M=Ns(f.emails,R),H=f.contactForms[0]?{value:f.contactForms[0].url,sourceUrl:f.contactForms[0].sourceUrl}:null,K=m??p,Z=[...new Set([l?.sourceUrl,K?.sourceUrl,...P.map(B=>B.sourceUrl),...f.socialProfiles.map(B=>B.sourceUrl),H?.sourceUrl].filter(B=>!!B))];return{ordinal:e.ordinal,source:e.source,rowStatus:"complete",identity:o,contacts:{website:l,phone:K,primaryEmail:M,emails:P,socialProfiles:f.socialProfiles.slice(0,20),contactFormUrl:H,sourceUrls:Z},people:h,usage:r,warnings:w,error:null}}var Tw=["enriched_row_status","enriched_identity_status","enriched_match_confidence","enriched_matched_name","enriched_organization","enriched_website","enriched_phone","enriched_primary_email","enriched_primary_email_scope","enriched_secondary_email","enriched_all_emails","enriched_social_profiles","enriched_contact_form_url","enriched_primary_person_name","enriched_primary_person_role","enriched_primary_person_linkedin","enriched_all_people","enriched_maps_url","enriched_cid","enriched_source_urls","enriched_warnings"];function sr(t){return JSON.stringify(t)}function DT(t,e){let n=e??Object.keys(t[0]?.source??{});for(let o of n)if(o.toLowerCase().startsWith(Il))throw new Error(`Source header ${o} collides with reserved enriched_ output columns`);let r=[...t].sort((o,s)=>o.ordinal-s.ordinal);return{headers:[...n,...Tw],rows:r.map(o=>{let s=o.contacts.primaryEmail?o.contacts.emails.find(l=>l.value!==o.contacts.primaryEmail?.value)??null:null;return[...n.map(l=>o.source[l]??null),o.rowStatus,o.identity.status,o.identity.confidence,o.identity.selected?.name??"",o.identity.selected?.organization??"",o.contacts.website?.value??"",o.contacts.phone?.value??"",o.contacts.primaryEmail?.value??"",o.contacts.primaryEmail?.scope??"",s?.value??"",sr(o.contacts.emails.map(l=>({value:l.value,scope:l.scope,sourceType:l.sourceType,sourceUrl:l.sourceUrl,...l.sourceTitle?{sourceTitle:l.sourceTitle}:{},...l.sourcePosition!=null?{sourcePosition:l.sourcePosition}:{},context:l.context,reasons:l.reasons}))),sr(o.contacts.socialProfiles.map(l=>({url:l.url,network:l.network,sourceUrl:l.sourceUrl}))),o.contacts.contactFormUrl?.value??"",o.people[0]?.name??"",o.people[0]?.role??"",o.people[0]?.linkedinUrl??"",sr(o.people),o.identity.selected?.placeUrl??"",o.identity.selected?.cid??"",sr(o.contacts.sourceUrls),sr([...o.warnings,...o.error?[o.error.message]:[]])]})}}import{z as Cw}from"zod";var lr=["LocalBusiness","AnimalShelter","AutomotiveBusiness","AutoBodyShop","AutoDealer","AutoPartsStore","AutoRental","AutoRepair","AutoWash","GasStation","MotorcycleDealer","MotorcycleRepair","ChildCare","Dentist","DryCleaningOrLaundry","EmergencyService","EmploymentAgency","EntertainmentBusiness","FinancialService","AccountingService","AutomatedTeller","BankOrCreditUnion","InsuranceAgency","FoodEstablishment","Bakery","BarOrPub","Brewery","CafeOrCoffeeShop","Distillery","FastFoodRestaurant","IceCreamShop","Restaurant","Winery","HealthAndBeautyBusiness","BeautySalon","DaySpa","HairSalon","HealthClub","NailSalon","TattooParlor","HomeAndConstructionBusiness","Electrician","GeneralContractor","HVACBusiness","HousePainter","Locksmith","MovingCompany","Plumber","RoofingContractor","LegalService","Library","LodgingBusiness","MedicalBusiness","Pharmacy","Physician","RealEstateAgent","RecyclingCenter","SelfStorage","ShoppingCenter","SportsActivityLocation","Store","TouristInformationCenter","TravelAgency"],Aw=Cw.enum(lr),Pw={home:"HomeAndConstructionBusiness",professional:"LocalBusiness",restaurants:"FoodEstablishment",financial:"FinancialService",realestate:"RealEstateAgent",auto:"AutomotiveBusiness",wellness:"HealthAndBeautyBusiness"};function Rl(t){return Pw[t]}function zT(t,e){let n=Aw.safeParse(e);return n.success?n.data:Rl(t)}function FT(t){return{rootType:"LocalBusiness",selectedDefault:t?Rl(t):"LocalBusiness",acceptedSubtypes:lr,callerSuppliedJsonLdAccepted:!1,compilation:"MCP Scraper generates JSON-LD from source-backed listing evidence after acquisition."}}var Ow=new Intl.Segmenter(void 0,{granularity:"word"});function ft(t){let e=0;for(let n of Ow.segment(t))n.isWordLike&&(e+=1);return e}function Rt(t,e,n){let r=ft(t),o=e.reduce((v,d)=>{let p=Number(d.timestamp?.[1]);return Number.isFinite(p)&&p>v?p:v},0),s=typeof n=="number"&&Number.isFinite(n)&&n>0?n:o>0?o:null,l=s&&s>0?Math.round(r/s*600)/10:null,m=r===0?"empty":r<5?"low_speech_signal":"speech_detected",c=r<=2,f=[];return m==="empty"?f.push("No speech was transcribed. This does not distinguish silent media from an inaccessible or expired playback URL."):m==="low_speech_signal"&&f.push("Very little speech was transcribed. Review the media before treating this as a complete transcript."),c&&f.push("If speech was expected, refresh the media source and retry using the tool for its original platform."),{status:m,speechDetected:m==="speech_detected",confidence:m==="speech_detected"?"medium":"low",basis:"transcript_word_count_and_timing",mediaDurationSec:s,wordsPerMinute:l,retryRecommended:c,warnings:f}}import{fal as Ew}from"@fal-ai/client";var Mo=9e4,Pn=Mo+15e3,ii=["af","am","ar","as","az","ba","be","bg","bn","bo","br","bs","ca","cs","cy","da","de","el","en","es","et","eu","fa","fi","fo","fr","gl","gu","ha","haw","he","hi","hr","ht","hu","hy","id","is","it","ja","jw","ka","kk","km","kn","ko","la","lb","ln","lo","lt","lv","mg","mi","mk","ml","mn","mr","ms","mt","my","ne","nl","nn","no","oc","pa","pl","ps","pt","ro","ru","sa","sd","si","sk","sl","sn","so","sq","sr","su","sv","sw","ta","te","tg","th","tk","tl","tr","tt","uk","ur","uz","vi","yi","yo","zh"];function jw(t,e,n,r){let o=l=>`${Math.floor(l/60)}:${String(Math.floor(l%60)).padStart(2,"0")}`,s=[t,"",`*Transcribed in ${(r/1e3).toFixed(1)}s*`,"","## Full Text","",e,""];if(n.length){s.push("## Timestamped Segments","");for(let l of n)s.push(`**[${o(l.timestamp[0])} -> ${o(l.timestamp[1])}]** ${l.text.trim()}`,"")}return s.join(`
|
|
2
2
|
`)}async function eC(t,e="# Media Transcript",n="en",r){let o=Date.now(),s=Ts(Mo,r),l=Is(),m=null;try{m=await Ms({tool:l?.op==="yt_transcription"?"youtube_transcribe":l?.op==="google_ads_transcribe"?"google_ads_transcribe":l?.op==="tiktok_video_transcribe"||l?.op==="tiktok_transcribe"?"tiktok_video_transcribe":l?.op==="instagram_transcribe"?"instagram_media_download":l?.op==="facebook_video_transcribe"?"facebook_video_transcribe":"facebook_ad_transcribe",method:l?.op==="instagram_transcribe"?"fal_wizper_optional":l?.op==="google_ads_transcribe"||l?.op==="facebook_ad_transcribe"?"fal_wizper_direct_media":"fal_wizper",provider:"fal",providerProduct:"fal_wizper"})}catch(P){console.warn(JSON.stringify({event:"fal_cost_telemetry_start_failed",message:P instanceof Error?P.message:String(P)}))}let c=Promise.resolve(),f=null,v=P=>{let M=m;!M||!P||(c=c.then(async()=>{f!==P&&(await js(M.receiptId,P),f=P)}).catch(()=>console.warn(JSON.stringify({event:"fal_cost_source_attach_failed",errorCode:"provider_source_attach_failed"}))))},d;try{d=await Ew.subscribe("fal-ai/wizper",{input:{audio_url:t,task:"transcribe",language:n},logs:!1,pollInterval:3e3,abortSignal:s,startTimeout:Mo/1e3,onEnqueue:v})}catch(P){throw await c,m&&await wo(m,s.aborted?"timed_out":"failed","fal_submit_or_result_failed").catch(()=>{}),P}d.requestId&&v(d.requestId),await c;let p=d.data&&typeof d.data=="object"?d.data:{},h=typeof p.text=="string"?p.text:"",w=Array.isArray(p.chunks)?p.chunks:[],R=Rt(h,w);m&&await wo(m,"succeeded").catch(P=>console.warn(JSON.stringify({event:"fal_cost_telemetry_finish_failed",message:P instanceof Error?P.message:String(P)})));let A=Date.now()-o;Rs({vendor:"fal_wizper",model:"fal-ai/wizper",units:A/1e3,unitType:"wall_sec"});let C=ks("fal_wizper",A/1e3);return{text:h,chunks:w,durationMs:A,costUsd:C,markdown:jw(e,h,w,A),transcriptSignal:R}}import{z as k}from"zod";var Mw=["desktop","mobile"],Lw=["location","configured","none"],Cl=["paa_found","paa_partial","no_paa","serp_only","degraded_result","captcha","request_aborted","timeout","location_mismatch","proxy_tunnel_failed","proxy_unavailable","browser_session_interrupted","mcp_unavailable","error"],Uw=["not_requested","matched","mismatch","unknown"],Al=["organic","ai_citation","local_pack_website","configured_target","site_subject"],$w=["captured","skipped","failed"],qw=["fetch","headless","browser","mcp"],Dw=/(^|\.)localhost$/i,Hw=/^\d{1,3}(?:\.\d{1,3}){3}$/;function Nw(t){if(!Hw.test(t))return!1;let e=t.split(".").map(o=>Number(o));if(e.some(o=>!Number.isInteger(o)||o<0||o>255))return!0;let[n,r]=e;return n===10||n===127||n===0||n===169&&r===254||n===172&&r>=16&&r<=31||n===192&&r===168||n===100&&r>=64&&r<=127}function zw(t){let e=t.replace(/^\[/,"").replace(/\]$/,"").toLowerCase();return e==="::1"||e==="0:0:0:0:0:0:0:1"||e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe80:")}function Fw(t){try{let e=new URL(t);if(e.protocol!=="http:"&&e.protocol!=="https:")return!1;let n=e.hostname.toLowerCase();return!(!n||Dw.test(n)||Nw(n)||zw(n))}catch{return!1}}var On=k.string().url().refine(Fw,"url must be a public HTTP or HTTPS URL"),oC=k.object({query:k.string().trim().min(1,"query is required"),location:k.string().trim().min(1).optional(),gl:k.string().trim().length(2).default("us"),hl:k.string().trim().length(2).default("en"),device:k.enum(Mw).default("desktop"),proxyMode:k.enum(Lw).default(xs),proxyZip:k.string().regex(/^\d{5}$/).optional(),pages:k.number().int().min(1).max(2).default(1),debug:k.boolean().default(!1),includePageSnapshots:k.boolean().default(!1),pageSnapshotLimit:k.number().int().min(0).max(10).default(0)}).strict(),Gw=k.object({url:On,sourceKind:k.enum(Al).default("configured_target"),sourcePosition:k.number().int().min(1).optional()}).strict(),aC=k.object({urls:k.array(On).min(1).max(25).optional(),targets:k.array(Gw).min(1).max(25).optional(),maxConcurrency:k.number().int().min(1).max(5).default(2),timeoutMs:k.number().int().min(1e3).max(6e4).default(15e3),debug:k.boolean().default(!1)}).strict().superRefine((t,e)=>{let n=!!t.urls?.length,r=!!t.targets?.length;n===r&&e.addIssue({code:k.ZodIssueCode.custom,message:"provide exactly one of urls or targets",path:n?["targets"]:["urls"]})}),ve=k.string().nullable(),oi={url:k.string(),rawUrl:k.string().optional(),resolvedUrl:ve.optional(),linkType:k.enum(["plain","google_url_redirect","google_goto_redirect"]).optional(),resolutionStatus:k.enum(["not_needed","resolved","unresolved","rejected"]).optional()},Tl=k.object({text:k.string(),href:k.string(),rawUrl:k.string().optional(),resolvedUrl:ve.optional(),linkType:oi.linkType,resolutionStatus:oi.resolutionStatus}),Ww=k.object({position:k.number().int().min(1),title:k.string(),...oi,sourcePage:k.union([k.literal(1),k.literal(2)]).optional(),domain:k.string(),cite:ve,snippet:ve,isRedditStyle:k.boolean(),inlineRating:k.object({value:k.string(),count:k.string()}).nullable()}),Pl=k.object({...oi,title:ve,site:ve,description:ve.optional()}),Bw=k.object({questionId:k.string(),googleLinkId:ve,googleEvidenceId:ve,question:k.string(),answer:ve,answerExpansionIncomplete:k.boolean().optional(),sourceTitle:ve,sourceSite:ve,sourceCite:ve,sources:k.array(Pl),depth:k.number().int().min(0),parentQuestion:ve}),Ol=k.lazy(()=>Bw.extend({children:k.array(Ol)})),Kw=k.object({seed_query:k.string(),question_id:k.string(),google_link_id:k.string(),google_evidence_id:k.string(),question:k.string(),answer:k.string(),answerExpansionIncomplete:k.boolean().optional(),source_title:k.string(),source_site:k.string(),source_cite:k.string(),sources:k.array(Pl),depth:k.number().int().min(0),parent_question:k.string(),extracted_at:k.string()}),Vw=k.object({position:k.number().int().min(1),name:k.string(),cid:ve.optional(),rating:ve.optional(),reviewCount:ve.optional(),metadata:k.array(k.string()).optional(),websiteUrl:ve.optional(),directionsUrl:ve.optional()}),Jw=k.object({type:k.enum(["reddit","facebook","instagram","tiktok","youtube","news","unknown"]),title:k.string(),url:k.string(),source:k.string(),platform:k.string(),popularComment:ve,engagement:k.string(),date:k.string(),duration:ve,authorNote:ve}),cr=k.object({status:k.enum(Uw),expected:k.object({city:k.string(),regionCode:ve,canonicalLocation:k.string()}).nullable(),candidates:k.array(k.object({city:k.string(),regionCode:k.string(),count:k.number().int().min(0),examples:k.array(k.string())}))}),Tt=k.number().min(0),se=k.number().int().min(0),Lo=k.object({completionStatus:k.enum(["paa_found","no_paa","serp_only"]),problem:k.null().optional(),resultQuality:k.enum(["complete","partial","degraded"]).optional(),degradedResult:k.boolean().optional(),degradationReasons:k.array(k.enum(["empty_primary_serp","page_two_missing"])).optional(),retryRecommended:k.boolean().optional(),noPaaObserved:k.boolean().optional(),phaseTimings:k.object({providerConnectMs:Tt.optional(),navigationMs:Tt.optional(),serpParseMs:Tt.optional(),paaExpansionMs:Tt.optional(),linkResolutionMs:Tt.optional(),totalServerMs:Tt}).optional(),pagination:k.object({requestedPages:k.union([k.literal(1),k.literal(2)]),capturedPages:k.union([k.literal(1),k.literal(2)]),page2Status:k.enum(["not_requested","not_attempted","captured","unavailable","failed"]),page1OrganicCount:se,page2OrganicCount:se,failureCode:k.enum(["missing_next","invalid_next","empty_page","captcha","timeout","navigation_error","unsupported_driver"]).optional()}).optional(),completeness:k.object({paaWithoutAnswer:se,paaWithoutSource:se,paaIncompleteAnswers:se.optional(),paaAnswersRecovered:se,aioShareCaptured:k.boolean().nullable(),paaRequested:se.optional(),paaReturned:se.optional(),paaUnique:se.optional()}).optional(),interruption:k.object({code:k.enum(["browser_session_interrupted","request_aborted","timeout"])}).optional(),warnings:k.array(k.object({code:k.enum(["short_videos_captcha_skipped","paa_partial"]),surface:k.enum(["short_videos","paa"]),retryable:k.boolean()})).optional(),links:k.object({linkCandidatesObserved:se,plainLinksObserved:se,googleUrlRedirectsObserved:se,googleGotoRedirectsObserved:se,redirectsResolved:se,redirectsUnresolved:se,redirectsRejected:se,resolverNonGoogleRequestsObserved:se,paaSourcesPreserved:se,aiOverviewLabelValidated:k.boolean()}).optional(),paaLifecycle:k.object({requestedQuestions:se,questionsFound:se,targetStatus:k.enum(["met","not_met"]),discoveryStatus:k.enum(["in_progress","target_reached","frontier_exhausted","no_paa_observed","interrupted","recovery_exhausted"]),materialStatus:k.enum(["complete","partial"]),automaticRetries:se,retryBreakdown:k.object({controlRetries:se,browserRetries:se,providerFallbacks:se,runtimeRecoveries:se,idempotentReplays:se}),knownQuestions:se,processedQuestions:se,failedInteractions:se,noGrowthConfirmations:se,visibleControls:se.optional(),eligibleControls:se.optional(),dispatchedInteractions:se.optional(),confirmedInteractions:se.optional(),unconfirmedInteractions:se.optional()}).optional()}),dr=k.object({seed:k.string(),location:ve,extractedAt:k.string(),totalQuestions:se,surface:k.enum(["web","aim","unknown"]),aiOverview:k.object({detected:k.boolean(),text:ve,citations:k.array(Tl),expanded:k.boolean().optional(),fullyExpanded:k.boolean().optional(),sections:k.array(k.string()).optional(),shareUrl:ve.optional()}),aiMode:k.object({detected:k.boolean(),text:ve,citations:k.array(Tl)}),tree:k.array(Ol),flat:k.array(Kw),videos:k.array(k.object({type:k.enum(["video","short_video"]),title:k.string(),channel:k.string(),platform:k.string(),duration:k.string(),url:k.string()})),forums:k.array(k.object({title:k.string(),source:k.string(),url:k.string()})),organicResults:k.array(Ww),localPack:k.array(Vw),entityIds:k.object({entities:k.array(k.object({name:k.string(),kgId:ve,cid:ve,gcid:ve})),kgIds:k.array(k.string()),cids:k.array(k.string()),gcids:k.array(k.string())}),stats:k.object({seed:k.string(),totalQuestions:se,maxDepthReached:se,durationMs:Tt,errorCount:se}),diagnostics:Lo,whatPeopleSaying:k.array(Jw)}),Uo=[...Cl,"request_aborted","captcha_exhausted","harvest_timeout","service_unavailable","vendor_unavailable","extraction_failed","invalid_url","capture_failed"],yn=k.object({attemptNumber:k.number().int().min(1),outcome:k.enum([...Cl,"page_captured","page_failed"]),startedAt:k.string().optional(),completedAt:k.string().optional(),durationMs:Tt.optional(),problemCode:k.enum(Uo).optional(),cleanupSucceeded:k.boolean().nullable().optional()}),ai=k.object({url:On,requestedUrl:On,finalUrl:On.nullable(),sourceKind:k.enum(Al),sourcePosition:k.number().int().min(1).nullable(),status:k.enum($w),fetchedVia:k.enum(qw).nullable(),httpStatus:k.number().int().min(100).max(599).nullable(),contentType:ve,title:ve,canonicalUrl:On.nullable(),metaDescription:ve,headings:k.array(k.object({level:k.number().int().min(1).max(6),text:k.string()})).default([]),artifact:k.object({htmlBlobUrl:k.string().url().nullable(),textBlobUrl:k.string().url().nullable(),markdownBlobUrl:k.string().url().nullable(),screenshotBlobUrl:k.string().url().nullable(),contentSha256:ve,capturedAt:ve}),error:k.object({code:k.enum(["invalid_url","timeout","capture_failed"]),message:k.string()}).nullable(),schemaTypes:k.array(k.string()).optional(),wordCount:se.optional(),linkCounts:k.object({wordCount:se,internalLinkCount:se,externalLinkCount:se,totalLinkCount:se}).optional(),hashes:k.object({htmlSha256:ve,markdownSha256:ve,textSha256:ve}).optional(),content:k.object({html:ve,markdown:ve,text:ve}).optional(),diagnostics:k.object({requestedAt:k.string(),completedAt:k.string(),durationMs:Tt,urlValidation:k.object({passed:k.boolean()}),browserFallback:k.object({configured:k.boolean(),used:k.boolean(),boundedByTimeoutMs:Tt}),content:k.object({htmlIncluded:k.boolean(),markdownIncluded:k.boolean(),textIncluded:k.boolean(),maxContentChars:se,truncated:k.boolean()})}).optional()}),ur=ai.partial().extend({artifact:ai.shape.artifact.partial().optional()}),pr=k.object({requestedCount:se.optional(),capturedCount:se.optional(),failedCount:se.optional(),maxConcurrency:k.number().int().min(1).max(5).optional(),timeoutMs:Tt.optional()}),El=k.object({harvestResult:dr,attempts:k.array(yn),locationEvidence:cr.nullable(),pageSnapshotArtifacts:k.array(ai),billing:k.object({creditsUsed:Tt.optional(),requestId:k.string().optional(),jobId:k.string().optional()}).optional()}),jl=k.object({pageSnapshotArtifacts:k.array(ai),attempts:k.array(yn).default([]),diagnostics:pr.optional()});function mr(t){let e=new Set(Uo);return(Array.isArray(t)?t:[]).map(n=>{let r=n;return yn.parse({...r,...r.problemCode!==void 0&&!e.has(String(r.problemCode))?{problemCode:"extraction_failed"}:{}})})}function $o(t){return dr.partial().parse(t)}function yr(t){return(Array.isArray(t)?t:[]).map(e=>{let n=e,r=n.error&&typeof n.error=="object"?n.error:null,o=r?.code==="timeout"||r?.code==="invalid_url"?r.code:"capture_failed";return ur.parse({...n,error:r?{code:o,message:o==="timeout"?"Page capture timed out. Retry this URL when ready.":o==="invalid_url"?"Provide a public HTTP or HTTPS page URL.":"Page capture failed. Retry this URL when ready."}:null})})}function cC(t){let e=t;return El.parse({...e,harvestResult:$o(e.harvestResult),attempts:mr(e.attempts),pageSnapshotArtifacts:yr(e.pageSnapshotArtifacts)})}function dC(t){let e=t;return jl.parse({pageSnapshotArtifacts:yr(e.pageSnapshotArtifacts),attempts:mr(e.attempts),...e.diagnostics?{diagnostics:qo(e.diagnostics)}:{}})}function qo(t){return pr.parse(t)}function ee(t){return{title:t,readOnlyHint:!0,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}}function Ge(t){return{title:t,readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}}function Bt(t,e){return e.length===0?t:Object.fromEntries(Object.entries(t).filter(([n])=>!e.includes(n)))}function Yw(t=process.env){let e=t.MCP_SCRAPER_OUTPUT_SCHEMA_MODE?.trim().toLowerCase();if(e){if(e==="contract"||e==="all")return"contract";if(e==="runtime"||e==="none"||e==="essential")return"runtime";throw new Error(`Unsupported MCP_SCRAPER_OUTPUT_SCHEMA_MODE: ${e}`)}let n=t.MCP_SCRAPER_ADVERTISE_OUTPUT_SCHEMAS?.trim().toLowerCase();if(n==="true")return"contract";if(n===void 0||n===""||n==="false")return"runtime";throw new Error(`Unsupported MCP_SCRAPER_ADVERTISE_OUTPUT_SCHEMAS value: ${n}`)}var Xw=Yw(),Zw=Xw==="contract",si={};function T(t,e){return si[t]=e,Zw?e:void 0}import{z as O}from"zod";import{z as zt}from"zod";var li="Expected a public http(s) URL or bare domain (for example example.com)",gn=zt.string().trim().min(1).transform((t,e)=>{if(/^[/?#]/.test(t)||/[\\\u0000-\u001f\u007f]/.test(t))return e.addIssue({code:zt.ZodIssueCode.custom,message:li}),zt.NEVER;let n=/^[a-z][a-z0-9+.-]*:\/\//i.test(t),r=n?t:`https://${t}`;try{let o=new URL(r);if(!["http:","https:"].includes(o.protocol)||o.username||o.password)return e.addIssue({code:zt.ZodIssueCode.custom,message:li}),zt.NEVER;if(!n){let s=o.hostname.replace(/^\[|\]$/g,""),l=/^\d{1,3}(?:\.\d{1,3}){3}$/.test(s),m=s.includes(":"),c=s.includes(".");if(!l&&!m&&!c&&!(s==="localhost"))return e.addIssue({code:zt.ZodIssueCode.custom,message:li}),zt.NEVER}return o.href}catch{return e.addIssue({code:zt.ZodIssueCode.custom,message:li}),zt.NEVER}}),b=zt.string().nullable();import{z as N}from"zod";var ci=N.object({requestedQuestions:N.number().int().min(0),questionsFound:N.number().int().min(0),targetStatus:N.enum(["met","not_met"]),discoveryStatus:N.enum(["in_progress","target_reached","frontier_exhausted","no_paa_observed","interrupted","recovery_exhausted"]),materialStatus:N.enum(["complete","partial"]),completionReason:N.string(),automaticRetries:N.number().int().min(0),retryBreakdown:N.object({controlRetries:N.number().int().min(0),browserRetries:N.number().int().min(0),providerFallbacks:N.number().int().min(0),runtimeRecoveries:N.number().int().min(0),idempotentReplays:N.number().int().min(0)}),knownQuestions:N.number().int().min(0),processedQuestions:N.number().int().min(0),failedInteractions:N.number().int().min(0),noGrowthConfirmations:N.number().int().min(0),visibleControls:N.number().int().min(0),eligibleControls:N.number().int().min(0),dispatchedInteractions:N.number().int().min(0),confirmedInteractions:N.number().int().min(0),unconfirmedInteractions:N.number().int().min(0)}).nullable(),gr=N.object({providerConnectMs:N.number().int().min(0).optional(),navigationMs:N.number().int().min(0).optional(),serpParseMs:N.number().int().min(0).optional(),paaExpansionMs:N.number().int().min(0).optional(),linkResolutionMs:N.number().int().min(0).optional(),totalServerMs:N.number().int().min(0)}).nullable(),Ml=N.object({observations:N.number().int().min(0),dispatched:N.number().int().min(0),confirmed:N.number().int().min(0),unconfirmed:N.number().int().min(0),dispatchFailures:N.number().int().min(0),confirmedWithoutDispatchAck:N.number().int().min(0),expandedSignals:N.number().int().min(0),answerSignals:N.number().int().min(0),sourceSignals:N.number().int().min(0),questionGrowthBatches:N.number().int().min(0),checkpoint700ms:N.number().int().min(0),checkpoint1000ms:N.number().int().min(0),checkpoint1400ms:N.number().int().min(0)}),Ll=N.object({id:N.string(),questionId:N.string(),question:N.string(),batchNumber:N.number().int().min(0),controlAttempt:N.number().int().min(0),observedAt:b,dispatched:N.boolean(),outcome:N.enum(["confirmed","unconfirmed","dispatch_failed"]),confirmationSignals:N.array(N.enum(["expanded","answer","source","question_growth"])),confirmationCheckpointMs:N.union([N.literal(700),N.literal(1e3),N.literal(1400)]).nullable(),confirmedAtMs:N.number().int().min(0).nullable(),dispatchDurationMs:N.number().int().min(0),totalDurationMs:N.number().int().min(0),beforeQuestionCount:N.number().int().min(0),afterQuestionCount:N.number().int().min(0),newQuestionCount:N.number().int().min(0),expandedBefore:N.boolean(),expandedAfter:N.boolean(),answerObserved:N.boolean(),sourceCount:N.number().int().min(0),errorCode:N.enum(["click_failed","click_ack_timeout","control_missing","confirmation_timeout"]).nullable()}),En=N.object({requestedPages:N.union([N.literal(1),N.literal(2)]),capturedPages:N.union([N.literal(1),N.literal(2)]),page2Status:N.enum(["not_requested","not_attempted","captured","unavailable","failed"]),page1OrganicCount:N.number().int().min(0),page2OrganicCount:N.number().int().min(0),failureCode:N.enum(["missing_next","invalid_next","empty_page","captcha","timeout","navigation_error","unsupported_driver"]).optional()}).nullable();import{z as we}from"zod";var Ul=we.enum(["plain","google_url_redirect","google_goto_redirect"]),$l=we.enum(["not_needed","resolved","unresolved","rejected"]),ql={url:we.string(),rawUrl:we.string(),resolvedUrl:b,linkType:Ul,resolutionStatus:$l},Qw=we.object({...ql,title:b,site:b,description:b.optional().describe("Captured source-card description from Google, when present.")}),Do=we.object({questionId:we.string(),googleLinkId:b,googleEvidenceId:b,question:we.string(),answer:b,answerExpansionIncomplete:we.boolean().optional().describe("True when a captured answer still has unexpanded content."),sources:we.array(Qw),sourceTitle:b,sourceSite:b,sourceUrl:b}),hr=we.object({position:we.number().int(),sourcePage:we.union([we.literal(1),we.literal(2)]).optional(),title:we.string(),...ql,domain:we.string(),snippet:b}),fr=we.object({detected:we.boolean(),text:b,citations:we.array(we.object({text:we.string(),href:we.string(),rawUrl:we.string(),resolvedUrl:b,linkType:Ul,resolutionStatus:$l})),expanded:we.boolean(),fullyExpanded:we.boolean(),sections:we.array(we.string()),shareUrl:b.optional()}).nullable(),br=we.object({entities:we.array(we.object({name:we.string(),kgId:we.string().nullable(),cid:we.string().nullable(),gcid:we.string().nullable()})).describe("Entities named on the page with their kgId/cid/gcid. Flat lists below are the same IDs deduplicated, kept for backward compatibility."),kgIds:we.array(we.string()),cids:we.array(we.string()),gcids:we.array(we.string())}).nullable();var Dl={jobId:O.string().trim().min(1).max(200).describe("The jobId returned by search_serp.")},jn=O.enum(["observed_present","observed_absent","incomplete","not_requested","unknown","unsupported"]),Ho={mode:O.enum(["light","full"]),jobId:b,status:O.enum(["pending","running","done"]),statusTool:b,replayed:O.boolean(),query:O.string(),location:b,resultQuality:b,degradedResult:O.boolean().nullable(),degradationReasons:O.array(O.string()),retryRecommended:O.boolean().nullable(),pagination:En,serpCompleteness:O.object({pagination:O.object({status:O.enum(["complete","incomplete"]),requestedPages:O.array(O.union([O.literal(1),O.literal(2)])).min(1).max(2),attemptedPages:O.array(O.union([O.literal(1),O.literal(2)])).max(2),capturedPages:O.array(O.union([O.literal(1),O.literal(2)])).max(2),pageResultCounts:O.array(O.object({page:O.union([O.literal(1),O.literal(2)]),resultCount:O.number().int().min(0)})).max(2),providerRequestCount:O.number().int().min(0),failureCode:b}),features:O.object({localPack:jn,forums:jn,videos:jn,aiOverview:jn,whatPeopleSaying:jn}),queryIntegrity:O.object({status:O.enum(["matched","unresolved_location","query_mismatch"]),queryHash:O.string(),normalizedQueryTokens:O.array(O.string()),canonicalLocation:b,locationResolutionSource:O.string(),locationAmbiguousCandidates:O.number().int().min(0),uulePresent:O.boolean(),uuleHash:b,outboundProviderMethod:O.string(),finalQueryHash:b}),failureStage:O.enum(["provider_transport","invalid_payload","serp_readiness","query_integrity","pagination","optional_feature_parsing","unknown"]).nullable()}).nullable(),organicResults:O.array(hr),localPack:O.array(O.object({position:O.number().int(),name:O.string(),rating:b,reviewCount:b,websiteUrl:b})),aiOverview:fr,aiMode:O.object({detected:O.boolean(),text:b,citations:O.array(O.object({text:O.string(),href:O.string()}))}).nullable(),forums:O.array(O.object({title:O.string(),source:O.string(),url:O.string()})),videos:O.array(O.object({type:O.string(),title:O.string(),channel:O.string(),platform:O.string(),duration:O.string(),url:O.string()})),whatPeopleSaying:O.array(O.record(O.string(),O.unknown())),paaPreview:O.array(O.object({question:O.string(),answer:b,url:b,sourceTitle:b.optional(),sourceName:b.optional(),displayLink:b.optional()})),additionalSerpFeatures:O.array(O.object({name:O.string(),attributes:O.record(O.string(),O.union([O.string(),O.number(),O.boolean(),O.null()])),items:O.array(O.object({title:b,url:b,description:b,position:O.number().nullable()}))})),featureStatus:O.record(O.string(),jn),featurePages:O.array(O.record(O.string(),O.unknown())).max(2),entityIds:br,phaseTimings:gr,durationMs:O.number().int().min(0).nullable(),attemptCount:O.number().int().min(1)},Hl={schemaVersion:O.literal("serp-intelligence.capture.v1"),status:O.string(),query:b,location:b,capturedAt:b,resultCount:O.number().int().min(0).nullable(),organicResultCount:O.number().int().min(0),localPackResultCount:O.number().int().min(0),pageSnapshotCount:O.number().int().min(0),pageSnapshotFailedCount:O.number().int().min(0),snapshotId:b,resolvedInputs:O.record(O.string(),O.unknown()),artifacts:O.array(ur),attempts:O.array(yn),billing:O.object({creditsUsed:O.number().min(0).nullable(),requestId:b,jobId:b}).nullable(),diagnostics:Lo.nullable(),harvestResult:dr.partial(),locationEvidence:cr.nullable()},Nl={schemaVersion:O.literal("serp-intelligence.page-snapshots.v1"),status:O.string(),count:O.number().int().min(0),capturedCount:O.number().int().min(0),failedCount:O.number().int().min(0),skippedCount:O.number().int().min(0),captures:O.array(ur),attempts:O.array(yn),resolvedInputs:O.record(O.string(),O.unknown()),diagnostics:pr.nullable()},zl={mode:O.enum(["light","full"]).default("light").describe("Light returns organic results. Full adds available same-page features for an unfiltered one-page search. Date-filtered, two-page, and browser-backup results contain organic listings only and mark rich features unsupported."),query:O.string().min(1).describe("The search topic, exactly as it should be searched. Include the place here when you want it in the search terms \u2014 the server sends your query to Google unchanged and never adds or removes a location."),location:O.string().optional().describe("Compatibility field. Ordinary search ignores this. Include a place in query when needed."),gl:O.string().length(2).default("us").describe("Compatibility field. Ordinary search uses its fixed default market."),hl:O.string().default("en").describe("Compatibility field. Ordinary search uses its fixed default language."),device:O.enum(["desktop","mobile"]).default("desktop").describe("Compatibility field. Ordinary search uses desktop results."),idempotencyKey:O.string().trim().min(8).max(200).optional().describe("Retry key: reuse after a timeout to avoid re-billing. New key per search."),serpIdentity:O.string().regex(/^[a-z0-9][a-z0-9_-]{0,63}$/).optional().describe("Optional persistent SERP identity created with serp_identity_create. Reuses the same saved browser state and fixed network address across calls."),includeAllSerpFeatures:O.boolean().default(!1).describe("Compatibility field. Ordinary search returns organic results only."),includeLocalPack:O.boolean().default(!1).describe("Compatibility field. Ordinary search does not include the local pack."),includeForums:O.boolean().default(!1).describe("Compatibility field. Ordinary search does not include forum modules."),includeVideos:O.boolean().default(!1).describe("Compatibility field. Ordinary search does not include video modules."),includeAiOverview:O.boolean().default(!1).describe("Compatibility field. Ordinary search does not include AI modules."),includeWhatPeopleSaying:O.boolean().default(!1).describe("Compatibility field. Ordinary search does not include social modules."),debug:O.boolean().default(!1).describe("Include sanitized diagnostics for debugging."),pages:O.number().int().min(1).max(2).default(1).describe("One page by default. Set 2 only when the user explicitly requests two pages; two-page results include organic listings only; if page 2 is unavailable, page 1 is returned and billed when available."),recency:O.enum(["week","month"]).optional().describe("Limit Google results to the past week or past month. A date-filtered search uses the managed browser and returns organic listings only. It costs 35 Credits for one page or 70 Credits when two requested pages are delivered. Omit for unfiltered results.")},Fl={query:O.string().min(1).describe("Search topic to capture, exactly as it should be searched. Include the place here when you want it in the search terms \u2014 the server sends your query to Google unchanged and never adds or removes a location."),location:O.string().optional().describe("Where Google should think the searcher is. Sets the Google UULE parameter only \u2014 it never changes your query text and never selects a proxy. To put the place in the search terms too, write it into query."),gl:O.string().length(2).default("us").describe("Google country code inferred from the requested market."),hl:O.string().default("en").describe("Google interface/content language inferred from the user request."),device:O.enum(["desktop","mobile"]).default("desktop").describe("SERP device context. Use mobile only for mobile rankings/evidence."),debug:O.boolean().default(!1).describe("Collect additional location evidence; private browser diagnostics stay server-side."),pages:O.number().int().min(1).max(2).default(1).describe("Google result pages to capture. Use 2 only for deeper ranking evidence."),includePageSnapshots:O.boolean().default(!1).describe("Also capture ranking-page snapshots for selected SERP URLs. Each attempted snapshot adds 1 Credit."),pageSnapshotLimit:O.number().int().min(0).max(10).default(0).describe("Maximum ranking-page snapshots when includePageSnapshots is true. This capacity is held up front and unused capacity is refunded.")},Gl={urls:O.array(O.string().url()).min(1).max(25).optional().describe("Public HTTP/HTTPS URLs to capture. Provide exactly one of urls or targets. Do not pass localhost, private IPs, file URLs, or internal admin URLs."),targets:O.array(O.object({url:O.string().url().describe("Public HTTP/HTTPS URL to capture."),sourceKind:O.enum(["organic","ai_citation","local_pack_website","configured_target","site_subject"]).default("configured_target").describe("Why this page is being captured."),sourcePosition:O.number().int().min(1).optional().describe("Ranking or citation position when the page came from SERP evidence.")}).strict()).min(1).max(25).optional().describe("Structured targets. Provide exactly one of targets or urls; use targets when source kind or position should be preserved."),maxConcurrency:O.number().int().min(1).max(5).default(2).describe("Parallel page captures."),timeoutMs:O.number().int().min(1e3).max(6e4).default(15e3).describe("Per-page capture timeout in milliseconds; timeouts return as structured capture failures."),debug:O.boolean().default(!1).describe("Compatibility field. Results include public page-capture diagnostics only.")};function hn(t){return Qn(t.replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c_session_id", "gi")),"browser_session_id").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c_delete_succeeded", "gi")),"session_cleanup_succeeded").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c_delete_started", "gi")),"session_cleanup_started").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006c_delete_error", "gi")),"session_cleanup_error").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006cSessionId", "g")),"browserSessionId").replace((new RegExp("\u006b\u0065\u0072\u006e\u0065\u006cProxyId", "g")),"proxyId").replace((new RegExp("\u004b\u0045\u0052\u004e\u0045\u004c_API_KEY", "g")),"BROWSER_SERVICE_API_KEY").replace((new RegExp("\"\u006b\u0065\u0072\u006e\u0065\u006c\"\\s*:", "gi")),'"browserRuntime":'))}function X(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function Wl(t){let e=X(t.details),n=X(t.upgrade);return{...e,active:t.active,limit:t.limit,operation:t.operation,upgrade_url:t.upgrade_url,topup_url:t.topup_url,upgrade_command:t.upgrade_command,slots_per_pack:t.slots_per_pack??n.slots_per_pack,pack_price_usd:t.pack_price_usd??n.pack_price_usd,balance_credits:t.balance_credits,required_credits:t.required_credits}}function Mn(t){let e=t.details??{},n=[`${t.error_code}: ${t.message}`];return typeof e.active=="number"&&typeof e.limit=="number"&&n.push(`Active operations: ${e.active}. Account limit: ${e.limit}.`),typeof e.operation=="string"&&n.push(`Operation: ${e.operation}.`),typeof e.balance_credits=="number"&&typeof e.required_credits=="number"&&n.push(`Balance: ${e.balance_credits} Credits. Required: ${e.required_credits} Credits.`),t.retry_after_seconds&&n.push(`Retry after: ${t.retry_after_seconds} seconds.`),t.charge_status&&n.push(`Charge status: ${t.charge_status.replaceAll("_"," ")}.`),typeof e.upgrade_url=="string"&&n.push(`Add capacity: ${e.upgrade_url}`),typeof e.topup_url=="string"&&n.push(`Billing: ${e.topup_url}`),typeof e.upgrade_command=="string"&&n.push(`Terminal: ${e.upgrade_command}`),t.retryable&&n.push("Retryable: yes."),n.join(" ")}function eS(t,e){if(t.error==="idempotency_in_progress"||t.error_code==="idempotency_in_progress"){let r=typeof t.job_id=="string"&&t.job_id.length<=200?t.job_id:null,o=typeof t.path=="string"?t.path:"",s=o==="/harvest"||o==="/harvest/sync",l=typeof t.retry_after_seconds=="number"&&Number.isFinite(t.retry_after_seconds)?Math.max(1,Math.floor(t.retry_after_seconds)):10,m=e?Math.max(Je,l):l,c={error_code:"idempotency_in_progress",error_type:"connection",message:s?"This PAA harvest is already running. Poll the existing job instead of starting a second run.":"This request is already running. Retry with the same idempotencyKey after the indicated delay; a completed result will replay instead of starting or billing another run.",retryable:!0,retry_after_seconds:m,details:{...r?{job_id:r}:{},retry_guidance:s?`Keep the same idempotencyKey and wait at least ${m} seconds before each harvest_paa_status check of the returned job_id until terminal.`:"Keep the same idempotencyKey and retry after the indicated delay. This operation does not expose a resumable status tool."}};return{text:Mn(c),envelope:c}}if(t.error==="insufficient_balance"){let r=Xe({errorCode:"insufficient_balance",errorType:"billing",retryable:!1,details:Wl(t)});return{text:Mn(r),envelope:r}}if(t.error==="mcp_request_timeout"){let r=typeof t.idempotency_fingerprint=="string"&&/^[a-f0-9]{16}$/.test(t.idempotency_fingerprint)?t.idempotency_fingerprint:null,o=typeof t.retry_guidance=="string"?t.retry_guidance.slice(0,500):"Retry with the same idempotencyKey so a completed operation replays instead of running and billing again.",s={...Xe({errorCode:"mcp_request_timeout",retryable:!0,details:{retry_guidance:o}}),...r?{idempotencyFingerprint:r}:{}};return{text:Mn(s),envelope:s}}if(typeof t.error_code=="string"){let r=Wr(t.error_code),o=Xe({errorCode:r,errorType:t.error_type,retryable:t.retryable,retryAfterSeconds:t.retry_after_seconds??t.retryAfterSeconds,chargeStatus:t.charge_status??t.chargeStatus,details:Wl(t)});return{text:`${Mn(o)}${Bl(t)}`,envelope:o}}let n=Xe({errorCode:"service_unavailable",retryable:!0});return{text:Mn(n),envelope:n}}function Y(t,e={}){let n=t.content.find(o=>o.type==="text"),r=n?.type==="text"?n.text:"";try{let o=JSON.parse(r||"{}");if(t.isError||o.error||o.error_code){let l=fn(o,e);return{error:{...l,text:hn(l.text)}}}return{data:o.result??o}}catch{let o=Xe({errorCode:"service_unavailable",retryable:!0});return t.isError?{error:{text:qt("service_unavailable"),envelope:o}}:{error:{text:"Failed to parse tool response",envelope:o}}}}function z(t){return{content:[{type:"text",text:t.text}],structuredContent:t.envelope,isError:!0}}function Bl(t){let e=Array.isArray(t.attempts)?t.attempts:[];return e.length===0?"":`
|
|
3
3
|
|
|
4
4
|
Attempts:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as D,c as A,d as T,e as C,f as w,g as p}from"./chunk-
|
|
1
|
+
import{a as D,c as A,d as T,e as C,f as w,g as p}from"./chunk-DJT2547J.js";import{C as k,D as x,E as v,b as E,g,y as I}from"./chunk-P55O4IDC.js";import{e as P,f as S}from"./chunk-OY24ERPV.js";import{a as _}from"./chunk-WNUXMPVX.js";import{randomUUID as O}from"crypto";var L=class{constructor(t,r,i){this.userId=t;this.sourceSurface=r;this.fence=i;if(i&&i.userId!==t)throw Error("Billing scope principal differs from execution claim")}userId;sourceSurface;fence;identity=`debit:${O()}`;charges=new Map;pending=new Map;compensating=new Set;closing=!1;async debit(t,r,i,c,a){if(this.closing||this.compensating.has(t))throw Error("Billing scope is compensating; new charges are forbidden");let s=this.charges.get(t);if(s?.outcome==="pending")throw Error("Named debit outcome is pending; reconcile before retrying");if(s?.outcome==="funded"&&s.amountMc!==r)throw Error("An applied debit amount cannot change");let o={key:s?.key??`${this.identity}:${t}`,amountMc:r,operation:i,description:c,refundOperation:a,outcome:"pending"};if(s&&(s.operation!==i||s.description!==c||s.refundOperation!==a))throw Error("Named charge identity cannot change");this.charges.set(t,o);let u=(async()=>{if(this.fence){let f=await A(this.fence,{label:t,amountMc:r,operation:i,description:c,refundOperation:a,sourceSurface:this.sourceSurface});if(o.key=f.key,this.closing||this.compensating.has(t))throw Error("Billing scope began compensating while planning")}return this.fence?w(this.userId,r,i,c,o.key,this.fence):w(this.userId,r,i,c,o.key)})();this.pending.set(t,u);try{let f=await u;return o.outcome=f.ok?"funded":"unfunded",{...f,billingKey:o.key}}finally{this.pending.delete(t)}}async compensate(t){this.compensating.add(t),await this.pending.get(t)?.catch(()=>{});try{this.fence&&await this.loadDurablePlans();let r=this.charges.get(t);if(!r)return"not_charged";let i=await C(this.userId,r.key);return i?i.amountMc!==r.amountMc||i.operation!==r.operation||i.description!==r.description?"refund_pending":i.status==="claimed"?this.fence?.mode==="compensate"||r.outcome==="unfunded"?"not_charged":"refund_pending":i.status!=="applied"?"refund_pending":(this.fence?await p(this.userId,r.key,0,r.refundOperation,`${this.sourceSurface} failed`,this.sourceSurface,this.fence):await p(this.userId,r.key,0,r.refundOperation,`${this.sourceSurface} failed`,this.sourceSurface)).final_amount_mc===0?"refunded":"refund_pending":this.fence?.mode==="compensate"||r.outcome==="unfunded"?"not_charged":"refund_pending"}catch{return"refund_pending"}}async compensateAll(){if(this.closing=!0,await Promise.allSettled([...this.pending.values()]),this.fence)try{await this.loadDurablePlans()}catch{return"refund_pending"}let t=await Promise.all([...this.charges.keys()].map(r=>this.compensate(r)));return t.includes("refund_pending")?"refund_pending":t.includes("refunded")?"refunded":"not_charged"}async loadDurablePlans(){if(this.fence)for(let t of await T(this.fence)){let r=this.charges.get(t.label);if(t.sourceSurface!==this.sourceSurface)throw Error("Persisted billing source differs from scope");this.charges.set(t.label,{key:t.key,amountMc:t.amountMc,operation:t.operation,description:t.description,refundOperation:t.refundOperation,outcome:r?.key===t.key?r.outcome:"pending"})}}};async function H(e){if(!Number.isSafeInteger(e.userId)||e.userId<=0||!Number.isSafeInteger(e.refundMc)||e.refundMc<0)throw Error("invalid_legacy_refund");await _().batch([e.admission,{sql:`INSERT INTO credit_lots (user_id, amount_mc, remaining_mc, source, expires_at)
|
|
2
2
|
SELECT ?, ?, ?, ?, ? WHERE changes() = 1 AND ? > 0 AND datetime(?) > datetime('now')`,args:[e.userId,e.refundMc,e.refundMc,e.operation,e.expiresAt,e.refundMc,e.expiresAt]},{sql:"UPDATE users SET balance_mc = balance_mc + ? WHERE id = ? AND ? > 0 AND changes() = 1",args:[e.refundMc,e.userId,e.refundMc]},{sql:`INSERT INTO ledger (user_id, amount_mc, operation, description)
|
|
3
3
|
SELECT ?, ?, ?, ? WHERE ? > 0 AND changes() = 1`,args:[e.userId,e.refundMc,e.operation,e.description,e.refundMc]},e.acknowledgment],"write")}function J(e){return e.status==="complete"||e.status==="partial"||e.status==="failed"}function y(e,t,r){return e.userId===t&&(e.executionGeneration??0)===r&&J(e)}function W(e){let t=e.options.xraySetupReceipt;return e.options.heldMc===0&&e.options.debitKey==null&&t?.billingClass===E&&t.consumesMcpScraperCredits===!1&&t.heldMc===0&&t.billedMc===0}function b(e,t){if(!e||!y(e,t.userId,t.generation)||JSON.stringify(e.settlementPlan)!==JSON.stringify(t))return null;let r=e.settlementReceipt;return!r||r.jobId!==t.jobId||r.userId!==t.userId||r.generation!==t.generation||e.billedMc!==r.netChargeMc?null:r}async function Q(e,t,r,i,c,a=0){let s=await g(e);if(!s||!y(s,t,a))throw Error("extract_settlement_identity_or_terminal_conflict");if(s.billedMc!=null)return s.settlementReceipt??null;let o=Number(s.options.heldMc??0);if(![o,r,i].every(d=>Number.isSafeInteger(d)&&d>=0)||r+i!==o)throw Error("extract_settlement_amount_conflict");let u=String(s.options.billingClass??"credits");if(u===E&&!W(s))throw Error("xray_extract_zero_charge_finalization_rejected");let f={version:1,jobId:e,userId:t,generation:a,status:s.status,heldMc:o,debitKey:typeof s.options.debitKey=="string"?s.options.debitKey:null,billingClass:u,netChargeMc:i,refundMc:r,reference:c},l;try{l=await k(f)}catch(d){if(l=await g(e).catch(()=>null),!l?.settlementPlan||!y(l,t,a))throw d}if(!l||!y(l,t,a)||!l.settlementPlan)throw Error("extract_settlement_admission_conflict");let n=l.settlementPlan;if(n.jobId!==e||n.userId!==t||n.generation!==a||n.status!==l.status||n.heldMc!==o||n.debitKey!==f.debitKey||n.billingClass!==u)throw Error("extract_settlement_plan_conflict");let N=b(l,n);if(N)return N;let m={version:1,jobId:e,userId:t,generation:a,netChargeMc:n.netChargeMc,refundMc:0,expiredRefundMc:0};try{if(u===E)await x(n,m);else if(n.debitKey){let d=await p(t,n.debitKey,n.netChargeMc,S.EXTRACT_SITE_REFUND,n.reference,"extract_site");m.netChargeMc=d.final_amount_mc,m.refundMc=d.refund_mc,m.expiredRefundMc=d.expired_refund_mc??0,await x(n,m)}else{let h=await _().execute({sql:"SELECT datetime(created_at, ?) AS expires_at FROM site_extract_jobs WHERE id = ?",args:[D,e]}),R=[e,t,a,n.status,JSON.stringify(n)];await H({userId:t,refundMc:n.refundMc,expiresAt:String(h.rows[0]?.expires_at),operation:S.EXTRACT_SITE_REFUND,description:n.reference,admission:{sql:`UPDATE site_extract_jobs SET billed_mc = -1
|
|
4
4
|
WHERE id = ? AND user_id = ? AND execution_generation = ? AND status = ?
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as M,b as q,f as L}from"./chunk-
|
|
1
|
+
import{a as M,b as q,f as L}from"./chunk-DJT2547J.js";import{B as J,C as pe,D as _e,E as H,G as ge,f as I,h as F,y as b}from"./chunk-OY24ERPV.js";import{g as j}from"./chunk-VVSHZV5S.js";import{b as $}from"./chunk-4ZVO6GX4.js";import{a as l}from"./chunk-WNUXMPVX.js";import{createHash as O,randomUUID as Oe}from"crypto";import{Client as tt,StreamableHTTPClientTransport as nt}from"@modelcontextprotocol/client";import{randomUUID as Q}from"crypto";import{createHash as Y,randomBytes as W,scryptSync as fe,timingSafeEqual as We}from"crypto";function Ee(){return"sk_"+W(24).toString("hex")}function ye(e){let t=W(16).toString("hex"),n=fe(e,t,64);return`${t}:${n.toString("hex")}`}function Ct(e,t){let[n,i]=t.split(":"),r=Buffer.from(i,"hex"),o=fe(e,n,64);return We(r,o)}function K(e){return{id:Number(e.id),email:String(e.email),name:e.name!=null?String(e.name):null,api_key:String(e.api_key),key_active:Number(e.key_active??1),password_hash:e.password_hash!=null?String(e.password_hash):null,created_at:String(e.created_at),active:Number(e.active),stripe_customer_id:e.stripe_customer_id!=null?String(e.stripe_customer_id):null,balance_mc:Number(e.balance_mc??0),extra_concurrency_slots:Number(e.extra_concurrency_slots??0),concurrency_stripe_sub_id:e.concurrency_stripe_sub_id!=null?String(e.concurrency_stripe_sub_id):null,concurrency_pack_quantity:Number(e.concurrency_pack_quantity??0),subscription_concurrency:Number(e.subscription_concurrency??0),subscription_tier:e.subscription_tier!=null?String(e.subscription_tier):null,subscription_id:e.subscription_id!=null?String(e.subscription_id):null,memory_plan:e.memory_plan!=null?String(e.memory_plan):"free",memory_subscription_id:e.memory_subscription_id!=null?String(e.memory_subscription_id):null,memory_provisioned:Number(e.memory_provisioned??0)}}async function X(e){let t=await l().execute({sql:"SELECT * FROM users WHERE email = ? AND active = 1",args:[e]});return t.rows[0]?K(t.rows[0]):void 0}async function St(e){let t=await l().execute({sql:"SELECT * FROM users WHERE api_key = ? AND active = 1 AND key_active = 1",args:[e]});return t.rows[0]?K(t.rows[0]):void 0}async function Nt(e){let t=await l().execute({sql:"SELECT * FROM users WHERE id = ? AND active = 1",args:[e]});return t.rows[0]?K(t.rows[0]):void 0}async function ht(e,t){await l().execute({sql:"UPDATE users SET password_hash = ? WHERE id = ?",args:[ye(t),e]})}async function Rt(e){let t=l(),[n,i,r,o,s]=await Promise.all([t.execute({sql:"SELECT COUNT(*) as n FROM jobs WHERE user_id = ?",args:[e]}),t.execute({sql:"SELECT COUNT(*) as n FROM jobs WHERE user_id = ? AND status = 'done'",args:[e]}),t.execute({sql:"SELECT COUNT(*) as n FROM jobs WHERE user_id = ? AND status = 'failed'",args:[e]}),t.execute({sql:"SELECT COALESCE(SUM(json_extract(result, '$.totalQuestions')), 0) as n FROM jobs WHERE user_id = ? AND status = 'done'",args:[e]}),t.execute({sql:"SELECT MAX(created_at) as t FROM jobs WHERE user_id = ?",args:[e]})]);return{total:Number(n.rows[0]?.n??0),done:Number(i.rows[0]?.n??0),failed:Number(r.rows[0]?.n??0),totalQuestions:Number(o.rows[0]?.n??0),lastUsed:s.rows[0]?.t!=null?String(s.rows[0].t):null}}async function At(e,t,n,i){let r=l(),o=Ee(),s=n??W(6).toString("hex"),a=ye(s);return{id:(await r.execute({sql:"INSERT INTO users (email, name, api_key, password_hash, stripe_customer_id) VALUES (?, ?, ?, ?, ?)",args:[e,t??null,o,a,i??null]})).lastInsertRowid,email:e,name:t,api_key:o,password:s}}async function xt(e,t,n,i){let r=Math.floor(Date.now()/1e3),o=Math.floor(r/i)*i,s=Y("sha256").update(t).digest("hex"),d=await l().execute({sql:`
|
|
2
2
|
INSERT INTO rate_limits (scope, key_hash, window_start, count)
|
|
3
3
|
VALUES (?, ?, ?, 1)
|
|
4
4
|
ON CONFLICT(scope, key_hash, window_start)
|
|
@@ -156,4 +156,4 @@ import{a as M,b as q,f as L}from"./chunk-6BD75VKS.js";import{o as b,r as J,s as
|
|
|
156
156
|
FROM billing_events
|
|
157
157
|
WHERE user_id = ? AND billing_class = ? AND status IN ('settled', 'cost_pending')
|
|
158
158
|
ORDER BY created_at DESC
|
|
159
|
-
LIMIT ?`,args:[e,N,Math.max(1,Math.min(250,Math.round(t)))]}),i=[];for(let r of n.rows){let o=r;try{let s=se(o);i.push({id:o.id,createdAt:String(o.created_at??""),status:o.status==="settled"?"settled":"cost_pending",connectionId:s.connectionId,providerConfigKey:s.providerConfigKey,amountMc:s.charge.amountMc,credits:s.charge.credits,usage:s.usage,costBreakdown:Ae(s.usage,s.charge),metadata:s.safeMetadata})}catch{}}return i}function ue(e){return e.annotations?.readOnlyHint===!0?"read":e.annotations?.readOnlyHint===!1?"action":/^(get|list|search|query|read|download|fetch|find|lookup|inspect|describe|check)-/i.test(e.name)?"read":"action"}function xe(e){return new Map(Object.entries(e??{}).map(([t,n])=>[t,[...new Set(n.map(i=>i.trim()).filter(Boolean))].sort()]))}function B(e){let t=xe(e.requiredPermissionsByTool),n=xe(e.requiredFeaturesByTool),i=new Set(e.grantedPermissions??[]),r=new Set(e.enabledFeatures??[]),o=new Set(e.adminBlockedTools??[]),s=new Map;for(let a of e.tools){let d=ue(a),c=t.get(a.name)??[],u=n.get(a.name)??[],p=c.filter(w=>!i.has(w)),f=u.filter(w=>!r.has(w)),y=e.connectionActive?o.has(a.name)?"admin_blocked":d==="action"&&!e.actionsEnabled?"actions_disabled":c.length>0&&e.permissionVerification==="unavailable"?"permission_verification_unavailable":p.length>0?"missing_permission":f.length>0?"missing_app_feature":null:"inactive_connection";s.set(a.name,{name:a.name,classification:d,requiredPermissions:c,requiredFeatures:u,available:y===null,blockedReason:y,missingPermissions:p,missingFeatures:f})}return s}function de(e,t){let n=e.get(t);if(!n)throw new Error("connected_tool_policy_missing");return n}var it="https://api.nango.dev/mcp",rt=2e4,ot=24e4,Ie=100,st=20,at=360*60*1e3,ct=new Set(["stripe_revenue","salesforce","pipedrive"]),ut="2026-07-16.1",dt="f037859ec80c2ea2fac6e4a67c1a59f3200dd22d3642c97789b9bb3236723d3e",g=class extends Error{status;code;retryable;retryAfterMs;constructor(t,n,i,r=n===429||n>=500,o=null){super(t),this.name="MainNangoTransportError",this.status=n,this.code=i,this.retryable=r,this.retryAfterMs=o}};function G(e){return typeof e=="string"&&ct.has(e.normalize("NFKC").trim().toLowerCase())}function Le(e){if(G(e))throw new g("This provider integration is not currently available.",409,"provider_unavailable",!1)}function lt(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return""}}function Ue(e){let t=e.match(/retry[_ -]?after[_ -]?ms[^0-9]{0,20}(\d{1,7})/i);if(t)return Math.min(Math.max(Number(t[1]),1e3),6e4);let n=e.match(/retry[_ -]?after[^0-9]{0,20}(\d{1,4})/i);return n?Math.min(Math.max(Number(n[1]),1)*1e3,6e4):null}function De(e){if(e instanceof g)return e;let t=lt(e),n=e&&typeof e=="object"?e:null;return n?.code===-32001||n?.name==="RequestTimeout"||/Request timed out|RequestTimeout|Maximum total timeout exceeded/i.test(t)?new g("The connected service operation timed out before returning a result. Retry failed items or use a smaller batch.",503,"mcp_request_timeout",!0):/SERVICE_DISABLED|accessNotConfigured/i.test(t)?new g("The provider API required by this connection is disabled. Enable it in the provider project, wait for propagation, then retry.",409,"provider_api_disabled",!1):/PERMISSION_DENIED|insufficientPermissions|insufficient permission/i.test(t)?new g("The connected account does not have permission to run this provider operation.",403,"missing_provider_permission",!1):/RESOURCE_EXHAUSTED|rate.?limit|status["']?\s*:\s*429/i.test(t)?new g("The connected provider is temporarily rate limited.",429,"upstream_rate_limited",!0,Ue(t)):/UNAUTHENTICATED|invalid_grant|status["']?\s*:\s*401/i.test(t)?new g("The service connection requires reconnection.",409,"connection_inactive",!1):new g("The service connection is temporarily unavailable.",503,"connection_transport_unavailable")}async function mt(e,t,n){return e.callTool({name:t,arguments:n},{timeout:ot})}function _(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function m(e){return typeof e=="string"&&e.trim()?e.trim():null}function le(e,t){if(Array.isArray(e))return e;let n=_(e);if(Array.isArray(n?.[t]))return n[t];if(Array.isArray(n?.data))return n.data;let i=_(n?.data);return Array.isArray(i?.[t])?i[t]:[]}function Pe(){let e=process.env.NANGO_SECRET_KEY?.trim();if(!e)throw new g("Nango is not configured.",503,"nango_not_configured");return e}function ke(){try{return new URL(process.env.NANGO_MCP_URL?.trim()||it)}catch{throw new g("Nango MCP URL is invalid.",503,"nango_invalid_url")}}async function A(e,t={}){let n=new URL(e,`${ke().origin}/`);for(let[s,a]of Object.entries(t.query??{}))a!==void 0&&n.searchParams.set(s,String(a));let i;try{i=await fetch(n,{method:t.method??"GET",headers:{authorization:`Bearer ${Pe()}`,accept:"application/json",...t.body?{"content-type":"application/json"}:{},...t.headers},body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(rt)})}catch{throw new g("Nango is temporarily unavailable.",503,"connection_transport_unavailable")}let r=await i.text(),o={};try{o=r?JSON.parse(r):{}}catch{throw new g("Nango returned an invalid response.",502,"nango_invalid_response")}if(!i.ok){let s=i.status===400||i.status===403||i.status===404||i.status===409||i.status===429||i.status===503?i.status:502;throw new g(s===429?"The connected provider is temporarily rate limited.":"Nango request failed.",s,s===429?"upstream_rate_limited":s===404?"connection_not_found":"connection_transport_unavailable",s===429||s>=500,s===429?Ue(`retry-after: ${i.headers.get("retry-after")??""}`):null)}return o}function k(e){let t=m(e);return t?t.normalize("NFKC").toLowerCase():null}function pt(e,t){let n=_(e),i=_(n?.tags),r=_(n?.end_user),o=k(t);if(!o)return!1;let s=[k(i?.end_user_email),k(r?.email)].filter(d=>!!d);if(s.some(d=>d!==o))return!1;let a=[k(i?.end_user_id),k(r?.id)].filter(d=>!!d&&d.includes("@"));return a.some(d=>d!==o)?!1:s.length>0?s.includes(o):a.includes(o)}function _t(e){let t=_(e),n=m(t?.connection_id),i=m(t?.provider_config_key);if(!n||!i)return null;let o=(Array.isArray(t?.errors)?t.errors:[]).some(s=>m(_(s)?.type)==="auth");return{upstreamConnectionId:n,providerConfigKey:i,provider:m(t?.provider)??i,label:null,lifecycleStatus:o?"needs_reauth":"connected",reconnectRequired:o,createdAt:m(t?.created_at)??m(t?.created),updatedAt:m(t?.updated_at)}}var gt=new Set(["facebook","github-getting-started","google-analytics","google-calendar","google-drive","google-mail","google-search-console","linkedin","meta-marketing-api","slack","twitter-v2","xero","youtube","zoom"]);function ft(e){let t=m(e);return t||(typeof e=="number"&&Number.isFinite(e)?String(e):null)}function R(e){let t=m(e)?.toLowerCase()??null;return t&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?t:null}function v(e){return e.id||e.email||e.name?e:null}async function h(e){return A(`/proxy${e.path}`,{query:e.query,headers:{"connection-id":e.upstreamConnectionId,"provider-config-key":e.providerConfigKey,...e.baseUrlOverride?{"base-url-override":e.baseUrlOverride}:{}}})}var Et=[{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/messages$/},{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/messages\/[A-Za-z0-9_-]+$/},{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/messages\/[A-Za-z0-9_-]+\/attachments\/[A-Za-z0-9_-]+$/},{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/labels$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/batchModify$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/batchDelete$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/send$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/[A-Za-z0-9_-]+\/(?:trash|untrash)$/}],yt=new Set(["q","maxResults","pageToken","format","metadataHeaders","fields"]);async function Ln(e){let t=await V(e.identity,e.connectionId);if(t.providerConfigKey!=="google-mail")throw new g("Service connection not found.",404,"connection_not_found",!1);if(!Et.some(d=>d.method===e.method&&d.pattern.test(e.path)))throw new g("The Gmail provider operation is not allowed.",403,"tool_not_allowed",!1);if(Object.keys(e.query??{}).some(d=>!yt.has(d)))throw new g("The Gmail provider query is not allowed.",400,"invalid_request",!1);let n=e.method==="POST";if(n&&!t.actionsEnabled)throw new g("Actions are disabled for this service connection.",403,"actions_disabled",!1);await ae({identity:e.identity,ratePolicyVersion:b});let i=e.requestId?.trim()||Oe(),r=`main-gmail-proxy:${O("sha256").update(e.identity.toLowerCase()).update("\0").update(t.id).update("\0").update(e.method).update("\0").update(e.path).update("\0").update(i).digest("hex")}`,o=performance.now(),s,a;try{s=await A(`/proxy${e.path}`,{method:e.method,query:e.query,body:e.body,headers:{"connection-id":t.upstreamConnectionId,"provider-config-key":"google-mail","base-url-override":"https://gmail.googleapis.com"}})}catch(d){a=d}if(await ce({identity:e.identity,idempotencyKey:r,ratePolicyVersion:b,connectionId:t.id,providerConfigKey:t.providerConfigKey,functionRuns:0,proxyRequests:1,computeMilliseconds:Math.max(0,Math.round(performance.now()-o)),sourceSurface:"main_mcp",metadata:{operationKind:n?"action":"read",outcome:a?"error":"success",requestId:i.length<=200?i:O("sha256").update(i).digest("hex")}}),a)throw De(a);return s}async function bt(e){let t=(n,i,r)=>h({...e,path:n,query:i,baseUrlOverride:r});try{if(e.providerConfigKey==="google-mail"){let n=_(await t("/gmail/v1/users/me/profile",void 0,"https://gmail.googleapis.com")),i=R(n?.emailAddress);return v({id:i,email:i,name:null})}if(e.providerConfigKey==="google-drive"){let n=_(await t("/drive/v3/about",{fields:"user(permissionId,displayName,emailAddress)"},"https://www.googleapis.com")),i=_(n?.user);return v({id:m(i?.permissionId),email:R(i?.emailAddress),name:m(i?.displayName)})}if(e.providerConfigKey==="google-calendar"){let n=_(await t("/calendar/v3/calendars/primary",void 0,"https://www.googleapis.com")),i=m(n?.id);return v({id:i,email:R(i),name:m(n?.summary)})}if(e.providerConfigKey==="youtube"){let n=_(await t("/youtube/v3/channels",{part:"snippet",mine:"true",maxResults:1},"https://www.googleapis.com")),i=Array.isArray(n?.items)?_(n.items[0]):null;return v({id:m(i?.id),email:null,name:m(_(i?.snippet)?.title)})}}catch{}try{let n=_(await t("/v1/userinfo",void 0,"https://openidconnect.googleapis.com"));return v({id:m(n?.sub),email:n?.email_verified===!1?null:R(n?.email),name:m(n?.name)})}catch{return null}}async function Tt(e){if(!gt.has(e.providerConfigKey))return null;if(e.providerConfigKey.startsWith("google-")||e.providerConfigKey==="youtube")return bt(e);try{if(e.providerConfigKey==="github-getting-started"){let t=_(await h({...e,path:"/user"}));return v({id:ft(t?.id),email:R(t?.email),name:m(t?.name)??m(t?.login)})}if(e.providerConfigKey==="slack"){let t=_(await h({...e,path:"/api/auth.test"}));return v({id:m(t?.user_id),email:null,name:[m(t?.user),m(t?.team)].filter(Boolean).join(" \xB7 ")||null})}if(e.providerConfigKey==="zoom"){let t=_(await h({...e,path:"/v2/users/me"})),n=[m(t?.first_name),m(t?.last_name)].filter(Boolean).join(" ");return v({id:m(t?.id),email:R(t?.email),name:m(t?.display_name)??(n||null)})}if(e.providerConfigKey==="linkedin"){let t=_(await h({...e,path:"/v2/userinfo"}));return v({id:m(t?.sub),email:t?.email_verified===!1?null:R(t?.email),name:m(t?.name)})}if(e.providerConfigKey==="meta-marketing-api"||e.providerConfigKey==="facebook"){let t=_(await h({...e,path:"/me",query:{fields:"id,name,email"}}));return v({id:m(t?.id),email:R(t?.email),name:m(t?.name)})}if(e.providerConfigKey==="twitter-v2"){let t=_(await h({...e,path:"/2/users/me",query:{"user.fields":"id,name,username"}})),n=_(t?.data);return v({id:m(n?.id),email:null,name:m(n?.username)??m(n?.name)})}if(e.providerConfigKey==="xero"){let t=await h({...e,path:"/connections"}),n=Array.isArray(t)?_(t[0]):null;return v({id:m(n?.tenantId),email:null,name:m(n?.tenantName)})}}catch{return null}return null}async function Un(e,t={}){let n=[];for(let a=0;a<st;a+=1){let d=await A("/connections",{query:{limit:Ie,page:a}}),c=le(d,"connections");if(n.push(...c),c.length<Ie)break}let i=n.filter(a=>pt(a,e)).map(_t).filter(a=>a!==null),o=(await ee(e,i)).filter(a=>!G(a.providerConfigKey));if(t.resolveProviderIdentity===!1)return o;let s=new Map(i.map(a=>[`${a.providerConfigKey}\0${a.upstreamConnectionId}`,a]));return await Promise.all(o.map(async a=>{if(a.lifecycleStatus!=="connected"||!a.upstreamConnectionId)return;let d=s.get(`${a.providerConfigKey}\0${a.upstreamConnectionId}`);if(!d)return;let c=d.updatedAt??d.createdAt??a.lifecycleStatus,u=!!(a.providerAccountId||a.providerAccountEmail||a.providerAccountName),p=a.providerIdentityCheckedAt?Date.parse(`${a.providerIdentityCheckedAt.replace(" ","T")}Z`):Number.NaN,f=!u&&Number.isFinite(p)&&Date.now()-p<at;if(a.providerIdentitySourceUpdatedAt===c&&(u||f))return;let y=await Tt({upstreamConnectionId:a.upstreamConnectionId,providerConfigKey:a.providerConfigKey});await we({connectionId:a.id,providerAccountId:y?.id,providerAccountEmail:y?.email,providerAccountName:y?.name,sourceUpdatedAt:c})})),(await ee(e,i)).filter(a=>!G(a.providerConfigKey))}async function Dn(){let[e,t]=await Promise.all([A("/integrations"),A("/providers")]),n=new Map;for(let i of le(t,"providers")){let r=_(i),o=m(r?.name);r&&o&&n.set(o,r)}return le(e,"integrations").flatMap(i=>{let r=_(i),o=m(r?.unique_key)??m(r?.id),s=m(r?.provider);if(!o||!s||G(o))return[];let a=n.get(s);return[{id:o,provider:s,displayName:m(r?.display_name)??m(a?.display_name)??o,authMode:m(a?.auth_mode),categories:Array.isArray(a?.categories)?a.categories:[],docsUrl:m(a?.docs),logoUrl:m(r?.logo),safeDefaultAllowedTools:[],actionTools:[],setupStatus:"ready"}]})}function Me(e){let n={linkedin:"openid profile email w_member_social","github-getting-started":"repo workflow read:org read:user user:email","google-drive":"openid profile email https://www.googleapis.com/auth/drive","google-search-console":"openid profile email https://www.googleapis.com/auth/webmasters.readonly https://www.googleapis.com/auth/webmasters"}[e];return n?{[e]:{connection_config:{oauth_scopes_override:n}}}:void 0}function qe(e){let t=_(e),n=_(t?.data)??t,i=m(n?.connect_link);if(!i)throw new g("Nango did not return a connect link.",502,"nango_missing_connect_link");return{connectLink:i,expiresAt:m(n?.expires_at)}}async function Pn(e,t){Le(t);let n=Me(t);return qe(await A("/connect/sessions",{method:"POST",body:{tags:{end_user_id:e,end_user_email:e},allowed_integrations:[t],...n?{integrations_config_defaults:n}:{}}}))}async function kn(e,t){let n=await V(e,t,!0),i=Me(n.providerConfigKey);return qe(await A("/connect/sessions/reconnect",{method:"POST",body:{connection_id:n.upstreamConnectionId,integration_id:n.providerConfigKey,tags:{end_user_id:e,end_user_email:e},...i?{integrations_config_defaults:i}:{}}}))}async function Mn(e,t){let n=await Fe(e,t);try{await A(`/connections/${encodeURIComponent(n.upstreamConnectionId)}`,{method:"DELETE",query:{provider_config_key:n.providerConfigKey}})}catch(i){if(!(i instanceof g)||i.status!==404)throw i}}async function Fe(e,t){let n=await S(e,t);if(!n||n.transport!=="nango"||!n.upstreamConnectionId)throw new g("Service connection not found.",404,"connection_not_found",!1);return n}async function V(e,t,n=!1){let i=await Fe(e,t);if(Le(i.providerConfigKey),i.lifecycleStatus!=="connected"&&!(n&&i.lifecycleStatus==="needs_reauth"))throw new g("Service connection requires reconnection.",409,"connection_inactive",!1);return i}async function me(e,t){let n=new nt(ke(),{requestInit:{headers:{Authorization:`Bearer ${Pe()}`,"connection-id":e.upstreamConnectionId,"provider-config-key":e.providerConfigKey}}}),i=new tt({name:"mcp-scraper-integrations",version:"1.0.0"},{capabilities:{}});try{await i.connect(n);let r=await t(i);return await te({connectionId:e.id,operationalStatus:"available",evidenceSource:"nango_mcp"}),r}catch(r){let o=De(r);throw await te({connectionId:e.id,operationalStatus:o.code==="connection_transport_unavailable"?"unavailable":"degraded",failureCode:o.code,retryable:o.retryable,evidenceSource:"nango_mcp"}).catch(()=>{}),o}finally{await i.close().catch(()=>{})}}async function qn(e,t){let n=await V(e,t);(n.provider??n.providerConfigKey)==="google-search-console"&&await me(n,async r=>{if(!(await r.listTools()).tools.some(s=>s.name==="list-sites"))throw new g("The Search Console health-check tool is unavailable.",404,"live_tool_missing",!1);await r.callTool({name:"list-sites",arguments:{}})})}async function He(e,t){let n=await V(e,t),r=(await me(n,u=>u.listTools())).tools.flatMap(u=>{let p=_(u.inputSchema);return!u.name||!p?[]:[{name:u.name,...u.title?{title:u.title}:{},...u.description?{description:u.description}:{},inputSchema:p,..._(u.outputSchema)?{outputSchema:_(u.outputSchema)}:{},..._(u.annotations)?{annotations:_(u.annotations)}:{}}]}),o=B({tools:r,connectionActive:n.lifecycleStatus==="connected",actionsEnabled:n.actionsEnabled}),s=[...o.values()].filter(u=>u.classification==="read").map(u=>u.name),a=[...o.values()].filter(u=>u.classification==="action").map(u=>u.name),d=O("sha256").update(JSON.stringify(r.map(u=>({name:u.name,inputSchema:u.inputSchema})))).digest("hex");return await ve(n.id,s,a,d),{connection:await S(e,n.id)??{...n,readTools:s,actionTools:a,toolRevision:d},tools:r}}async function Fn(e){let{connection:t,tools:n}=await He(e.identity,e.connectionId),i=n.find(f=>f.name===e.tool);if(!i)throw new g("The requested provider tool is unavailable.",404,"live_tool_missing",!1);let r=de(B({tools:n,connectionActive:t.lifecycleStatus==="connected",actionsEnabled:t.actionsEnabled}),i.name);if(r.classification!==e.classification)throw new g("The provider tool classification does not match this operation.",403,"tool_not_allowed",!1);if(!r.available&&r.blockedReason==="actions_disabled")throw new g("Actions are disabled for this service connection.",403,"actions_disabled",!1);if(!r.available)throw new g("The provider tool is not authorized for this connection.",403,"tool_not_allowed",!1);await ae({identity:e.identity,ratePolicyVersion:b});let o=e.requestId?.trim()||Oe(),s=`main-nango:${O("sha256").update(e.identity.toLowerCase()).update("\0").update(t.id).update("\0").update(e.tool).update("\0").update(o).digest("hex")}`,a=new Date,d=performance.now(),c,u;try{c=await me(t,f=>mt(f,e.tool,e.input))}catch(f){u=f}let p=new Date;if(await ce({identity:e.identity,idempotencyKey:s,ratePolicyVersion:b,connectionId:t.id,providerConfigKey:t.providerConfigKey,functionRuns:1,proxyRequests:0,computeMilliseconds:Math.max(0,Math.round(performance.now()-d)),sourceSurface:"main_mcp",metadata:{toolName:e.tool,operationKind:e.operationKind??e.classification,outcome:u?"error":"partial",requestId:o.length<=200?o:O("sha256").update(o).digest("hex"),startedAt:a.toISOString(),completedAt:p.toISOString()}}),u)throw u;return c}async function Hn(e,t,n){let{connection:i,tools:r}=await He(e,t),o=r.find(u=>u.name===n);if(!o)throw new g("The requested provider tool is unavailable.",404,"live_tool_missing",!1);let s=de(B({tools:r,connectionActive:i.lifecycleStatus==="connected",actionsEnabled:i.actionsEnabled}),o.name),a=ue(o),d=s.available,c={name:o.name,...o.title?{title:o.title}:{},...o.description?{description:o.description}:{},inputSchema:o.inputSchema,...o.outputSchema?{outputSchema:o.outputSchema}:{},...o.annotations?{annotations:o.annotations}:{}};return{...c,classification:a,callable:d,blockedReason:s.blockedReason,requiredPermissions:s.requiredPermissions,missingPermissions:s.missingPermissions,requiredFeatures:s.requiredFeatures,missingFeatures:s.missingFeatures,transport:"nango",providerConfigKey:i.providerConfigKey,providerContractVersion:ut,providerContractHash:dt,protocolVersion:null,schemaSource:"live_tools_list",schemaHash:O("sha256").update(JSON.stringify(c)).digest("hex"),fetchedAt:new Date().toISOString()}}export{an as a,cn as b,un as c,dn as d,ln as e,mn as f,pn as g,D as h,Ct as i,K as j,X as k,St as l,Nt as m,ht as n,Rt as o,At as p,xt as q,It as r,Ot as s,Lt as t,Ut as u,Dt as v,Pt as w,kt as x,Mt as y,Qt as z,$e as A,je as B,T as C,ae as D,ce as E,Cn as F,Kt as G,C as H,Ke as I,S as J,Xt as K,Bt as L,Gt as M,Vt as N,$t as O,g as P,G as Q,Le as R,Ln as S,Un as T,Dn as U,Pn as V,kn as W,Mn as X,qn as Y,He as Z,Fn as _,Hn as $};
|
|
159
|
+
LIMIT ?`,args:[e,N,Math.max(1,Math.min(250,Math.round(t)))]}),i=[];for(let r of n.rows){let o=r;try{let s=se(o);i.push({id:o.id,createdAt:String(o.created_at??""),status:o.status==="settled"?"settled":"cost_pending",connectionId:s.connectionId,providerConfigKey:s.providerConfigKey,amountMc:s.charge.amountMc,credits:s.charge.credits,usage:s.usage,costBreakdown:Ae(s.usage,s.charge),metadata:s.safeMetadata})}catch{}}return i}function ue(e){return e.annotations?.readOnlyHint===!0?"read":e.annotations?.readOnlyHint===!1?"action":/^(get|list|search|query|read|download|fetch|find|lookup|inspect|describe|check)-/i.test(e.name)?"read":"action"}function xe(e){return new Map(Object.entries(e??{}).map(([t,n])=>[t,[...new Set(n.map(i=>i.trim()).filter(Boolean))].sort()]))}function B(e){let t=xe(e.requiredPermissionsByTool),n=xe(e.requiredFeaturesByTool),i=new Set(e.grantedPermissions??[]),r=new Set(e.enabledFeatures??[]),o=new Set(e.adminBlockedTools??[]),s=new Map;for(let a of e.tools){let d=ue(a),c=t.get(a.name)??[],u=n.get(a.name)??[],p=c.filter(w=>!i.has(w)),f=u.filter(w=>!r.has(w)),y=e.connectionActive?o.has(a.name)?"admin_blocked":d==="action"&&!e.actionsEnabled?"actions_disabled":c.length>0&&e.permissionVerification==="unavailable"?"permission_verification_unavailable":p.length>0?"missing_permission":f.length>0?"missing_app_feature":null:"inactive_connection";s.set(a.name,{name:a.name,classification:d,requiredPermissions:c,requiredFeatures:u,available:y===null,blockedReason:y,missingPermissions:p,missingFeatures:f})}return s}function de(e,t){let n=e.get(t);if(!n)throw new Error("connected_tool_policy_missing");return n}var it="https://api.nango.dev/mcp",rt=2e4,ot=24e4,Ie=100,st=20,at=360*60*1e3,ct=new Set(["stripe_revenue","salesforce","pipedrive"]),ut="2026-07-16.1",dt="f037859ec80c2ea2fac6e4a67c1a59f3200dd22d3642c97789b9bb3236723d3e",g=class extends Error{status;code;retryable;retryAfterMs;constructor(t,n,i,r=n===429||n>=500,o=null){super(t),this.name="MainNangoTransportError",this.status=n,this.code=i,this.retryable=r,this.retryAfterMs=o}};function G(e){return typeof e=="string"&&ct.has(e.normalize("NFKC").trim().toLowerCase())}function Le(e){if(G(e))throw new g("This provider integration is not currently available.",409,"provider_unavailable",!1)}function lt(e){if(e instanceof Error)return e.message;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return""}}function Ue(e){let t=e.match(/retry[_ -]?after[_ -]?ms[^0-9]{0,20}(\d{1,7})/i);if(t)return Math.min(Math.max(Number(t[1]),1e3),6e4);let n=e.match(/retry[_ -]?after[^0-9]{0,20}(\d{1,4})/i);return n?Math.min(Math.max(Number(n[1]),1)*1e3,6e4):null}function De(e){if(e instanceof g)return e;let t=lt(e),n=e&&typeof e=="object"?e:null;return n?.code===-32001||n?.name==="RequestTimeout"||/Request timed out|RequestTimeout|Maximum total timeout exceeded/i.test(t)?new g("The connected service operation timed out before returning a result. Retry failed items or use a smaller batch.",503,"mcp_request_timeout",!0):/SERVICE_DISABLED|accessNotConfigured/i.test(t)?new g("The provider API required by this connection is disabled. Enable it in the provider project, wait for propagation, then retry.",409,"provider_api_disabled",!1):/PERMISSION_DENIED|insufficientPermissions|insufficient permission/i.test(t)?new g("The connected account does not have permission to run this provider operation.",403,"missing_provider_permission",!1):/RESOURCE_EXHAUSTED|rate.?limit|status["']?\s*:\s*429/i.test(t)?new g("The connected provider is temporarily rate limited.",429,"upstream_rate_limited",!0,Ue(t)):/UNAUTHENTICATED|invalid_grant|status["']?\s*:\s*401/i.test(t)?new g("The service connection requires reconnection.",409,"connection_inactive",!1):new g("The service connection is temporarily unavailable.",503,"connection_transport_unavailable")}async function mt(e,t,n){return e.callTool({name:t,arguments:n},{timeout:ot})}function _(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function m(e){return typeof e=="string"&&e.trim()?e.trim():null}function le(e,t){if(Array.isArray(e))return e;let n=_(e);if(Array.isArray(n?.[t]))return n[t];if(Array.isArray(n?.data))return n.data;let i=_(n?.data);return Array.isArray(i?.[t])?i[t]:[]}function Pe(){let e=process.env.NANGO_SECRET_KEY?.trim();if(!e)throw new g("Nango is not configured.",503,"nango_not_configured");return e}function ke(){try{return new URL(process.env.NANGO_MCP_URL?.trim()||it)}catch{throw new g("Nango MCP URL is invalid.",503,"nango_invalid_url")}}async function A(e,t={}){let n=new URL(e,`${ke().origin}/`);for(let[s,a]of Object.entries(t.query??{}))a!==void 0&&n.searchParams.set(s,String(a));let i;try{i=await fetch(n,{method:t.method??"GET",headers:{authorization:`Bearer ${Pe()}`,accept:"application/json",...t.body?{"content-type":"application/json"}:{},...t.headers},body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(rt)})}catch{throw new g("Nango is temporarily unavailable.",503,"connection_transport_unavailable")}let r=await i.text(),o={};try{o=r?JSON.parse(r):{}}catch{throw new g("Nango returned an invalid response.",502,"nango_invalid_response")}if(!i.ok){let s=i.status===400||i.status===403||i.status===404||i.status===409||i.status===429||i.status===503?i.status:502;throw new g(s===429?"The connected provider is temporarily rate limited.":"Nango request failed.",s,s===429?"upstream_rate_limited":s===404?"connection_not_found":"connection_transport_unavailable",s===429||s>=500,s===429?Ue(`retry-after: ${i.headers.get("retry-after")??""}`):null)}return o}function k(e){let t=m(e);return t?t.normalize("NFKC").toLowerCase():null}function pt(e,t){let n=_(e),i=_(n?.tags),r=_(n?.end_user),o=k(t);if(!o)return!1;let s=[k(i?.end_user_email),k(r?.email)].filter(d=>!!d);if(s.some(d=>d!==o))return!1;let a=[k(i?.end_user_id),k(r?.id)].filter(d=>!!d&&d.includes("@"));return a.some(d=>d!==o)?!1:s.length>0?s.includes(o):a.includes(o)}function _t(e){let t=_(e),n=m(t?.connection_id),i=m(t?.provider_config_key);if(!n||!i)return null;let o=(Array.isArray(t?.errors)?t.errors:[]).some(s=>m(_(s)?.type)==="auth");return{upstreamConnectionId:n,providerConfigKey:i,provider:m(t?.provider)??i,label:null,lifecycleStatus:o?"needs_reauth":"connected",reconnectRequired:o,createdAt:m(t?.created_at)??m(t?.created),updatedAt:m(t?.updated_at)}}var gt=new Set(["facebook","github-getting-started","google-analytics","google-calendar","google-drive","google-mail","google-search-console","linkedin","meta-marketing-api","slack","twitter-v2","xero","youtube","zoom"]);function ft(e){let t=m(e);return t||(typeof e=="number"&&Number.isFinite(e)?String(e):null)}function R(e){let t=m(e)?.toLowerCase()??null;return t&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)?t:null}function v(e){return e.id||e.email||e.name?e:null}async function h(e){return A(`/proxy${e.path}`,{query:e.query,headers:{"connection-id":e.upstreamConnectionId,"provider-config-key":e.providerConfigKey,...e.baseUrlOverride?{"base-url-override":e.baseUrlOverride}:{}}})}var Et=[{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/messages$/},{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/messages\/[A-Za-z0-9_-]+$/},{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/messages\/[A-Za-z0-9_-]+\/attachments\/[A-Za-z0-9_-]+$/},{method:"GET",pattern:/^\/gmail\/v1\/users\/me\/labels$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/batchModify$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/batchDelete$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/send$/},{method:"POST",pattern:/^\/gmail\/v1\/users\/me\/messages\/[A-Za-z0-9_-]+\/(?:trash|untrash)$/}],yt=new Set(["q","maxResults","pageToken","format","metadataHeaders","fields"]);async function Ln(e){let t=await V(e.identity,e.connectionId);if(t.providerConfigKey!=="google-mail")throw new g("Service connection not found.",404,"connection_not_found",!1);if(!Et.some(d=>d.method===e.method&&d.pattern.test(e.path)))throw new g("The Gmail provider operation is not allowed.",403,"tool_not_allowed",!1);if(Object.keys(e.query??{}).some(d=>!yt.has(d)))throw new g("The Gmail provider query is not allowed.",400,"invalid_request",!1);let n=e.method==="POST";if(n&&!t.actionsEnabled)throw new g("Actions are disabled for this service connection.",403,"actions_disabled",!1);await ae({identity:e.identity,ratePolicyVersion:b});let i=e.requestId?.trim()||Oe(),r=`main-gmail-proxy:${O("sha256").update(e.identity.toLowerCase()).update("\0").update(t.id).update("\0").update(e.method).update("\0").update(e.path).update("\0").update(i).digest("hex")}`,o=performance.now(),s,a;try{s=await A(`/proxy${e.path}`,{method:e.method,query:e.query,body:e.body,headers:{"connection-id":t.upstreamConnectionId,"provider-config-key":"google-mail","base-url-override":"https://gmail.googleapis.com"}})}catch(d){a=d}if(await ce({identity:e.identity,idempotencyKey:r,ratePolicyVersion:b,connectionId:t.id,providerConfigKey:t.providerConfigKey,functionRuns:0,proxyRequests:1,computeMilliseconds:Math.max(0,Math.round(performance.now()-o)),sourceSurface:"main_mcp",metadata:{operationKind:n?"action":"read",outcome:a?"error":"success",requestId:i.length<=200?i:O("sha256").update(i).digest("hex")}}),a)throw De(a);return s}async function bt(e){let t=(n,i,r)=>h({...e,path:n,query:i,baseUrlOverride:r});try{if(e.providerConfigKey==="google-mail"){let n=_(await t("/gmail/v1/users/me/profile",void 0,"https://gmail.googleapis.com")),i=R(n?.emailAddress);return v({id:i,email:i,name:null})}if(e.providerConfigKey==="google-drive"){let n=_(await t("/drive/v3/about",{fields:"user(permissionId,displayName,emailAddress)"},"https://www.googleapis.com")),i=_(n?.user);return v({id:m(i?.permissionId),email:R(i?.emailAddress),name:m(i?.displayName)})}if(e.providerConfigKey==="google-calendar"){let n=_(await t("/calendar/v3/calendars/primary",void 0,"https://www.googleapis.com")),i=m(n?.id);return v({id:i,email:R(i),name:m(n?.summary)})}if(e.providerConfigKey==="youtube"){let n=_(await t("/youtube/v3/channels",{part:"snippet",mine:"true",maxResults:1},"https://www.googleapis.com")),i=Array.isArray(n?.items)?_(n.items[0]):null;return v({id:m(i?.id),email:null,name:m(_(i?.snippet)?.title)})}}catch{}try{let n=_(await t("/v1/userinfo",void 0,"https://openidconnect.googleapis.com"));return v({id:m(n?.sub),email:n?.email_verified===!1?null:R(n?.email),name:m(n?.name)})}catch{return null}}async function Tt(e){if(!gt.has(e.providerConfigKey))return null;if(e.providerConfigKey.startsWith("google-")||e.providerConfigKey==="youtube")return bt(e);try{if(e.providerConfigKey==="github-getting-started"){let t=_(await h({...e,path:"/user"}));return v({id:ft(t?.id),email:R(t?.email),name:m(t?.name)??m(t?.login)})}if(e.providerConfigKey==="slack"){let t=_(await h({...e,path:"/api/auth.test"}));return v({id:m(t?.user_id),email:null,name:[m(t?.user),m(t?.team)].filter(Boolean).join(" \xB7 ")||null})}if(e.providerConfigKey==="zoom"){let t=_(await h({...e,path:"/v2/users/me"})),n=[m(t?.first_name),m(t?.last_name)].filter(Boolean).join(" ");return v({id:m(t?.id),email:R(t?.email),name:m(t?.display_name)??(n||null)})}if(e.providerConfigKey==="linkedin"){let t=_(await h({...e,path:"/v2/userinfo"}));return v({id:m(t?.sub),email:t?.email_verified===!1?null:R(t?.email),name:m(t?.name)})}if(e.providerConfigKey==="meta-marketing-api"||e.providerConfigKey==="facebook"){let t=_(await h({...e,path:"/me",query:{fields:"id,name,email"}}));return v({id:m(t?.id),email:R(t?.email),name:m(t?.name)})}if(e.providerConfigKey==="twitter-v2"){let t=_(await h({...e,path:"/2/users/me",query:{"user.fields":"id,name,username"}})),n=_(t?.data);return v({id:m(n?.id),email:null,name:m(n?.username)??m(n?.name)})}if(e.providerConfigKey==="xero"){let t=await h({...e,path:"/connections"}),n=Array.isArray(t)?_(t[0]):null;return v({id:m(n?.tenantId),email:null,name:m(n?.tenantName)})}}catch{return null}return null}async function Un(e,t={}){let n=[];for(let a=0;a<st;a+=1){let d=await A("/connections",{query:{limit:Ie,page:a}}),c=le(d,"connections");if(n.push(...c),c.length<Ie)break}let i=n.filter(a=>pt(a,e)).map(_t).filter(a=>a!==null),o=(await ee(e,i)).filter(a=>!G(a.providerConfigKey));if(t.resolveProviderIdentity===!1)return o;let s=new Map(i.map(a=>[`${a.providerConfigKey}\0${a.upstreamConnectionId}`,a]));return await Promise.all(o.map(async a=>{if(a.lifecycleStatus!=="connected"||!a.upstreamConnectionId)return;let d=s.get(`${a.providerConfigKey}\0${a.upstreamConnectionId}`);if(!d)return;let c=d.updatedAt??d.createdAt??a.lifecycleStatus,u=!!(a.providerAccountId||a.providerAccountEmail||a.providerAccountName),p=a.providerIdentityCheckedAt?Date.parse(`${a.providerIdentityCheckedAt.replace(" ","T")}Z`):Number.NaN,f=!u&&Number.isFinite(p)&&Date.now()-p<at;if(a.providerIdentitySourceUpdatedAt===c&&(u||f))return;let y=await Tt({upstreamConnectionId:a.upstreamConnectionId,providerConfigKey:a.providerConfigKey});await we({connectionId:a.id,providerAccountId:y?.id,providerAccountEmail:y?.email,providerAccountName:y?.name,sourceUpdatedAt:c})})),(await ee(e,i)).filter(a=>!G(a.providerConfigKey))}async function Dn(){let[e,t]=await Promise.all([A("/integrations"),A("/providers")]),n=new Map;for(let i of le(t,"providers")){let r=_(i),o=m(r?.name);r&&o&&n.set(o,r)}return le(e,"integrations").flatMap(i=>{let r=_(i),o=m(r?.unique_key)??m(r?.id),s=m(r?.provider);if(!o||!s||G(o))return[];let a=n.get(s);return[{id:o,provider:s,displayName:m(r?.display_name)??m(a?.display_name)??o,authMode:m(a?.auth_mode),categories:Array.isArray(a?.categories)?a.categories:[],docsUrl:m(a?.docs),logoUrl:m(r?.logo),safeDefaultAllowedTools:[],actionTools:[],setupStatus:"ready"}]})}function Me(e){let n={linkedin:"openid profile email w_member_social","github-getting-started":"repo workflow read:org read:user user:email","google-drive":"openid profile email https://www.googleapis.com/auth/drive","google-search-console":"openid profile email https://www.googleapis.com/auth/webmasters.readonly https://www.googleapis.com/auth/webmasters"}[e];return n?{[e]:{connection_config:{oauth_scopes_override:n}}}:void 0}function qe(e){let t=_(e),n=_(t?.data)??t,i=m(n?.connect_link);if(!i)throw new g("Nango did not return a connect link.",502,"nango_missing_connect_link");return{connectLink:i,expiresAt:m(n?.expires_at)}}async function Pn(e,t){Le(t);let n=Me(t);return qe(await A("/connect/sessions",{method:"POST",body:{tags:{end_user_id:e,end_user_email:e},allowed_integrations:[t],...n?{integrations_config_defaults:n}:{}}}))}async function kn(e,t){let n=await V(e,t,!0),i=Me(n.providerConfigKey);return qe(await A("/connect/sessions/reconnect",{method:"POST",body:{connection_id:n.upstreamConnectionId,integration_id:n.providerConfigKey,tags:{end_user_id:e,end_user_email:e},...i?{integrations_config_defaults:i}:{}}}))}async function Mn(e,t){let n=await Fe(e,t);try{await A(`/connections/${encodeURIComponent(n.upstreamConnectionId)}`,{method:"DELETE",query:{provider_config_key:n.providerConfigKey}})}catch(i){if(!(i instanceof g)||i.status!==404)throw i}}async function Fe(e,t){let n=await S(e,t);if(!n||n.transport!=="nango"||!n.upstreamConnectionId)throw new g("Service connection not found.",404,"connection_not_found",!1);return n}async function V(e,t,n=!1){let i=await Fe(e,t);if(Le(i.providerConfigKey),i.lifecycleStatus!=="connected"&&!(n&&i.lifecycleStatus==="needs_reauth"))throw new g("Service connection requires reconnection.",409,"connection_inactive",!1);return i}async function me(e,t){let n=new nt(ke(),{requestInit:{headers:{Authorization:`Bearer ${Pe()}`,"connection-id":e.upstreamConnectionId,"provider-config-key":e.providerConfigKey}}}),i=new tt({name:"mcp-scraper-integrations",version:"1.0.0"},{capabilities:{}});try{await i.connect(n);let r=await t(i);return await te({connectionId:e.id,operationalStatus:"available",evidenceSource:"nango_mcp"}),r}catch(r){let o=De(r);throw await te({connectionId:e.id,operationalStatus:o.code==="connection_transport_unavailable"?"unavailable":"degraded",failureCode:o.code,retryable:o.retryable,evidenceSource:"nango_mcp"}).catch(()=>{}),o}finally{await i.close().catch(()=>{})}}async function qn(e,t){let n=await V(e,t);(n.provider??n.providerConfigKey)==="google-search-console"&&await me(n,async r=>{if(!(await r.listTools()).tools.some(s=>s.name==="list-sites"))throw new g("The Search Console health-check tool is unavailable.",404,"live_tool_missing",!1);await r.callTool({name:"list-sites",arguments:{}})})}async function He(e,t){let n=await V(e,t),r=(await me(n,u=>u.listTools())).tools.flatMap(u=>{let p=_(u.inputSchema);return!u.name||!p?[]:[{name:u.name,...u.title?{title:u.title}:{},...u.description?{description:u.description}:{},inputSchema:p,..._(u.outputSchema)?{outputSchema:_(u.outputSchema)}:{},..._(u.annotations)?{annotations:_(u.annotations)}:{}}]}),o=B({tools:r,connectionActive:n.lifecycleStatus==="connected",actionsEnabled:n.actionsEnabled}),s=[...o.values()].filter(u=>u.classification==="read").map(u=>u.name),a=[...o.values()].filter(u=>u.classification==="action").map(u=>u.name),d=O("sha256").update(JSON.stringify(r.map(u=>({name:u.name,inputSchema:u.inputSchema})))).digest("hex");return await ve(n.id,s,a,d),{connection:await S(e,n.id)??{...n,readTools:s,actionTools:a,toolRevision:d},tools:r}}async function Fn(e){let{connection:t,tools:n}=await He(e.identity,e.connectionId),i=n.find(f=>f.name===e.tool);if(!i)throw new g("The requested provider tool is unavailable.",404,"live_tool_missing",!1);let r=de(B({tools:n,connectionActive:t.lifecycleStatus==="connected",actionsEnabled:t.actionsEnabled}),i.name);if(r.classification!==e.classification)throw new g("The provider tool classification does not match this operation.",403,"tool_not_allowed",!1);if(!r.available&&r.blockedReason==="actions_disabled")throw new g("Actions are disabled for this service connection.",403,"actions_disabled",!1);if(!r.available)throw new g("The provider tool is not authorized for this connection.",403,"tool_not_allowed",!1);await ae({identity:e.identity,ratePolicyVersion:b});let o=e.requestId?.trim()||Oe(),s=`main-nango:${O("sha256").update(e.identity.toLowerCase()).update("\0").update(t.id).update("\0").update(e.tool).update("\0").update(o).digest("hex")}`,a=new Date,d=performance.now(),c,u;try{c=await me(t,f=>mt(f,e.tool,e.input))}catch(f){u=f}let p=new Date;if(await ce({identity:e.identity,idempotencyKey:s,ratePolicyVersion:b,connectionId:t.id,providerConfigKey:t.providerConfigKey,functionRuns:1,proxyRequests:0,computeMilliseconds:Math.max(0,Math.round(performance.now()-d)),sourceSurface:"main_mcp",metadata:{toolName:e.tool,operationKind:e.operationKind??e.classification,outcome:u?"error":"partial",requestId:o.length<=200?o:O("sha256").update(o).digest("hex"),startedAt:a.toISOString(),completedAt:p.toISOString()}}),u)throw u;return c}async function Hn(e,t,n){let{connection:i,tools:r}=await He(e,t),o=r.find(u=>u.name===n);if(!o)throw new g("The requested provider tool is unavailable.",404,"live_tool_missing",!1);let s=de(B({tools:r,connectionActive:i.lifecycleStatus==="connected",actionsEnabled:i.actionsEnabled}),o.name),a=ue(o),d=s.available,c={name:o.name,...o.title?{title:o.title}:{},...o.description?{description:o.description}:{},inputSchema:o.inputSchema,...o.outputSchema?{outputSchema:o.outputSchema}:{},...o.annotations?{annotations:o.annotations}:{}};return{...c,classification:a,callable:d,blockedReason:s.blockedReason,requiredPermissions:s.requiredPermissions,missingPermissions:s.missingPermissions,requiredFeatures:s.requiredFeatures,missingFeatures:s.missingFeatures,transport:"nango",providerConfigKey:i.providerConfigKey,providerContractVersion:ut,providerContractHash:dt,protocolVersion:null,schemaSource:"live_tools_list",schemaHash:O("sha256").update(JSON.stringify(c)).digest("hex"),fetchedAt:new Date().toISOString()}}export{Ct as a,K as b,X as c,St as d,Nt as e,ht as f,Rt as g,At as h,xt as i,It as j,Ot as k,Lt as l,Ut as m,Dt as n,Pt as o,kt as p,Mt as q,an as r,cn as s,un as t,dn as u,ln as v,mn as w,pn as x,D as y,Qt as z,$e as A,je as B,T as C,ae as D,ce as E,Cn as F,Kt as G,C as H,Ke as I,S as J,Xt as K,Bt as L,Gt as M,Vt as N,$t as O,g as P,G as Q,Le as R,Ln as S,Un as T,Dn as U,Pn as V,kn as W,Mn as X,qn as Y,He as Z,Fn as _,Hn as $};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{f as a,g as b}from"./chunk-JREMJRSS.js";import"./chunk-P55O4IDC.js";import"./chunk-KXJCGV3H.js";import"./chunk-ANQ4JJVI.js";import"./chunk-SEZETSB3.js";import"./chunk-SDQW7IJN.js";import"./chunk-C7MGJUTU.js";import"./chunk-PKQHHCO4.js";import"./chunk-4ZVO6GX4.js";import"./chunk-WNUXMPVX.js";import"./chunk-OILOHQNL.js";import"./chunk-HNNYXMSI.js";export{a as dispatchSiteExtractJob,b as redispatchFundedSiteExtractJobs};
|