1import{p as A,a as B,f as $,b as j,v as q,c as N,g as I,d as O,e as V}from"./freeTools.DQjDoD0E.js";const S={success:"bg-success-bg-light text-success-text border border-success-border",warning:"bg-warning-bg text-warning-text border border-warning-border",error:"bg-error-bg text-error-text border border-error-border"},W='<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="9" y="9" width="13" height="13" rx="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>';function g(e){return typeof document>"u"?null:document.getElementById(e)}function r(e,t){return e.querySelector(`#${t}`)}function u(e){typeof e.scrollIntoView=="function"&&e.scrollIntoView({block:"nearest"})}function l(e,t){e?.classList.toggle("hidden",t)}function F(e,t,n,a){if(e.className=`mt-4 rounded-lg px-4 py-3 text-sm font-medium ${S[t]}`,e.replaceChildren(),!a){e.textContent=n;return}const o=document.createElement("strong");o.textContent=n;const s=document.createElement("span");s.className="font-normal opacity-80",s.textContent=a,e.append(o,document.createElement("br"),s)}function T(e,t,n,a){if(e.className=`mt-4 rounded-lg px-4 py-3 text-sm font-medium ${S[t]}`,e.replaceChildren(),!a){e.textContent=n;return}const o=document.createElement("span");o.className="font-normal opacity-75",o.textContent=a,e.append(n,document.createElement("br"),o)}function k(e,t){e&&(e.classList.toggle("hidden",!t),e.classList.toggle("animate-expand-in",t))}function E(e,t,n,a){e.querySelectorAll(t).forEach(o=>{o.classList.toggle(n,o.dataset.tab===a)}),e.querySelector(`${t}[data-tab="${a}"]`)?.click()}function d(e,t,n,a){const o=r(e,e.id==="boolean-search"?"bs-prompt":"sn-prompt"),s=r(e,e.id==="boolean-search"?"bs-submit":"sn-submit"),i=r(e,e.id==="boolean-search"?"bs-btn-text":"sn-btn-text"),c=r(e,e.id==="boolean-search"?"bs-spinner":"sn-spinner"),m=r(e,e.id==="boolean-search"?"bs-loadbar":"sn-loadbar"),G=r(e,e.id==="boolean-search"?"bs-wait":"sn-wait");s&&(s.disabled=t||!o?.value.trim()),i&&(i.textContent=t?a:n),l(c,!t),l(m,!t),l(G,!t)}function h(e){const t=g("email-finder-widget");if(!t)return;const n=r(t,"ef-name"),a=r(t,"ef-website"),o=r(t,"ef-submit"),s=r(t,"ef-result"),i=r(t,"ef-cta");if(!(!s||!o)){if(e.phase==="idle"){o.disabled=!1,o.textContent="Find Email",o.classList.remove("opacity-60","cursor-not-allowed");return}if(n&&(n.value=e.fullName),a&&(a.value=e.domain),u(t),e.phase==="loading"){o.disabled=!0,o.textContent="Searchingâ¦",o.classList.add("opacity-60","cursor-not-allowed"),s.className="hidden",s.textContent="",k(i,!1);return}o.disabled=!1,o.textContent="Find Email",o.classList.remove("opacity-60","cursor-not-allowed"),T(s,e.tone,e.primary,e.secondary),k(i,e.showCta)}}function f(e){const t=g("ev-widget");if(!t)return;const n=r(t,"ev-email"),a=r(t,"ev-submit"),o=r(t,"ev-result"),s=r(t,"ev-cta");if(!(!o||!a)){if(e.phase==="idle"){a.disabled=!1,a.textContent="Verify Email",a.classList.remove("opacity-60","cursor-not-allowed");return}if(n&&(n.value=e.email),u(t),e.phase==="loading"){a.disabled=!0,a.textContent="Verifyingâ¦",a.classList.add("opacity-60","cursor-not-allowed"),o.className="hidden",o.textContent="",k(s,!1);return}a.disabled=!1,a.textContent="Verify Email",a.classList.remove("opacity-60","cursor-not-allowed"),e.secondary?F(o,e.tone,e.primary,e.secondary):T(o,e.tone,e.primary),k(s,e.showCta)}}function R(e,t){l(r(e,`${t}-error`),!0),l(r(e,`${t}-warning`),!0),l(r(e,`${t}-result`),!0),l(r(e,`${t}-cta`),!0)}function x(e){const t=g("sn-url-generator");if(!t)return;if(e.phase==="idle"){d(t,!1,"Generate URL","Generatingâ¦");return}E(t,".sn-tab","sn-tab--active",e.searchType);const n=r(t,"sn-prompt");if(n&&(n.value=e.prompt),n?.dispatchEvent(new Event("input",{bubbles:!0})),u(t),R(t,"sn"),e.phase==="loading"){d(t,!0,"Generate URL","Generatingâ¦");return}if(d(t,!1,"Generate URL","Generatingâ¦"),e.outcome==="url"){const o=r(t,"sn-result-url"),s=r(t,"sn-open");o&&(o.value=e.text),s&&(s.href=e.text),l(r(t,"sn-result"),!1),l(r(t,"sn-cta"),!1);return}const a=r(t,e.outcome==="detail"?"sn-warning":"sn-error");a&&(a.textContent=e.text),l(a,!1)}function v(e,t){const n=document.createElement("div"),a=document.createElement("span");a.className="block text-xs font-bold text-success-text mb-2 tracking-wide",a.textContent=`${e}:`;const o=document.createElement("div");o.className="flex items-center gap-2";const s=document.createElement("input");s.readOnly=!0,s.value=t,s.className="flex-1 rounded-lg border-2 border-lavender-mid bg-white px-3 py-2.5 text-xs text-navy font-mono focus:outline-none";const i=document.createElement("button");return i.type="button",i.className="bs-copy shrink-0 flex items-center justify-center w-10 h-10 rounded-lg border border-border-subtle bg-surface-muted cursor-pointer transition-colors hover:bg-lavender",i.setAttribute("aria-label","Copy"),i.innerHTML=W,o.append(s,i),n.append(a,o),n}function C(e){const t=g("boolean-search");if(!t)return;if(e.phase==="idle"){d(t,!1,"Generate Boolean Expression","Generatingâ¦");return}E(t,".bs-tab","bs-tab--active",e.searchType);const n=r(t,"bs-prompt");n&&(n.value=e.prompt),n?.dispatchEvent(new Event("input",{bubbles:!0})),u(t),R(t,"bs");const a=r(t,"bs-result");if(a?.replaceChildren(),e.phase==="loading"){d(t,!0,"Generate Boolean Expression","Generatingâ¦");return}if(d(t,!1,"Generate Boolean Expression","Generatingâ¦"),e.outcome==="fields"&&a){e.searchType==="lead"?(e.jobTitle&&a.append(v("Job Title Boolean",e.
1jobTitle)),e.keywords&&a.append(v("Keyword Boolean",e.keywords))):e.account&&a.append(v("Account Boolean",e.account)),l(a,!1),l(r(t,"bs-cta"),!1);return}const o=r(t,e.outcome==="detail"?"bs-warning":"bs-error");o&&(o.textContent=e.text??""),l(o,!1)}function L(e,t){const n=r(e,"snc-submit"),a=r(e,"snc-btn-text");n&&(n.disabled=t,n.classList.toggle("opacity-60",t),n.classList.toggle("cursor-not-allowed",t)),a&&(a.textContent=t?"Convertingâ¦":"Convert URL")}function _(e){const t=g("sn-url-converter");if(!t)return;const n=r(t,"snc-input"),a=r(t,"snc-error"),o=r(t,"snc-result"),s=r(t,"snc-result-url"),i=r(t,"snc-open"),c=r(t,"snc-cta");if("phase"in e&&e.phase==="idle"){L(t,!1);return}if("phase"in e&&e.phase==="loading"){n&&(n.value=e.raw),u(t),l(a,!0),l(o,!0),l(c,!0),L(t,!0);return}if(L(t,!1),e.outcome==="url"&&E(t,".snc-tab","snc-tab--active",e.kind),n&&(n.value=e.raw,e.outcome==="url"&&(n.placeholder=e.kind==="lead"?"Paste a Sales Navigator profile URLâ¦":"Paste a Sales Navigator company URLâ¦")),u(t),l(a,!0),l(o,!0),l(c,!0),a&&(a.textContent=""),e.outcome==="error"){a&&(a.textContent=e.message),l(a,!1);return}s&&(s.value=e.url),i&&(i.href=e.url),l(o,!1),l(c,!1)}const b={readOnlyHint:!0,untrustedContentHint:!0,consequentialHint:!1},U={type:"string",enum:["lead","account"],description:"lead searches for people. account searches for companies."};function p(e,t){const n=e[t];return typeof n=="string"?n:""}function w(e,t,n){return h({phase:"done",fullName:e,domain:t,showCta:!1,tone:"error",primary:n}),{ok:!1,error:n}}async function M(e,t){const n=p(e,"full_name"),a=p(e,"company_domain"),o=A(n);if("error"in o)return w(n,a,o.error);const s=B(a);if("error"in s)return w(n,a,s.error);const i=`${o.firstName} ${o.lastName}`;h({phase:"loading",fullName:i,domain:s.domain});try{const c=await $(i,s.domain,t?.signal);return c.ok?h({phase:"done",fullName:i,domain:s.domain,showCta:!0,tone:"success",primary:c.email,secondary:`Validity: ${c.validity}`}):h({phase:"done",fullName:i,domain:s.domain,showCta:!0,tone:"error",primary:c.error}),c}catch(c){throw h({phase:"idle"}),c}}async function H(e,t){const n=p(e,"email"),a=j(n);if("error"in a)return f({phase:"done",email:n,showCta:!1,tone:"error",primary:a.error}),a;f({phase:"loading",email:a.email});try{const o=await q(a.email,t?.signal);return o.ok?f({phase:"done",email:o.email,showCta:!0,tone:o.status==="safe"?"success":o.status==="invalid"?"error":"warning",primary:o.email,secondary:o.label}):f({phase:"done",email:a.email,showCta:!0,tone:"error",primary:o.error}),o}catch(o){throw f({phase:"idle"}),o}}function P(e,t,n,a){if(!t)return;const o={phase:"done",searchType:t,prompt:n,outcome:"error",text:a};e==="url"?x(o):C(o)}async function D(e,t){const n=N(e.prompt,e.search_type);if("error"in n)return P("url",e.search_type==="lead"||e.search_type==="account"?e.search_type:null,p(e,"prompt"),n.error),n;x({phase:"loading",searchType:n.searchType,prompt:n.prompt});try{const a=await I(n.prompt,n.searchType,t?.signal);return x(Y(n.searchType,n.prompt,a)),a}catch(a){throw x({phase:"idle"}),a}}function Y(e,t,n){return n.ok&&"url"in n?{phase:"done",searchType:e,prompt:t,outcome:"url",text:n.url}:n.ok&&"needs_detail"in n?{phase:"done",searchType:e,prompt:t,outcome:"detail",text:n.message}:{phase:"done",searchType:e,prompt:t,outcome:"error",text:n.ok?"Something went wrong. Please try again.":n.error}}async function J(e,t){const n=N(e.prompt,e.search_type);if("error"in n)return P("boolean",e.search_type==="lead"||e.search_type==="account"?e.search_type:null,p(e,"prompt"),n.error),n;C({phase:"loading",searchType:n.searchType,prompt:n.prompt});try{const a=await O(n.prompt,n.searchType,t?.signal);return C(K(n.searchType,n.prompt,a)),a}catch(a){throw C({phase:"idle"}),a}}function K(e,t,n){return n.ok&&"needs_detail"in n?{phase:"done",searchType:e,prompt:t,outcome:"detail",text:n.message}:n.ok&&n.search_type==="account"?{phase:"done",searchType:e,prompt:t,outcome:"fields",account:n.account}:n.ok&&n.search_type==="lead"?{phase:"done",searchType:e,prompt:t,outcome:"fields",jobTitle:n.job_title,keywords:n.keywords}:{phase:"done",searchType:e,prompt:t,outcome:"error",text:n.ok?"Something went wrong. Please try again.":n.error}}function z(e){const t=p(e,"url"),n=V(t);return n.ok?_({raw:t,outcome:"url",url:n.url,kind:n.kind}):_({raw:t,outcome:"error",message:n.error}),n}const Q={name:"find_email",description:"Find one professional email from a person's full name and company domain, using Evaboot's free email finder. Pass a first and last name, and a domain such as acme.com. Returns that one email and its validity, or an error when no address is found. One person per
1call. This does not search in bulk, export a list, or use a Sales Navigator seat. When the email finder form is on the page, the result is shown there too.",inputSchema:{type:"object",additionalProperties:!1,properties:{full_name:{type:"string",maxLength:120,description:"Person's full name, first and last, such as Ada Lovelace."},company_domain:{type:"string",maxLength:253,description:"Company domain, such as acme.com or acme.co.uk. A URL is reduced to its host."}},required:["full_name","company_domain"]},annotations:b,execute:M},X={name:"verify_email",description:"Check whether one email address is safe to send to, using Evaboot's free email verifier. Returns the address with a status of safe, riskier, or invalid. One address per call, not a bulk list. When the verifier form is on the page, the result is shown there too.",inputSchema:{type:"object",additionalProperties:!1,properties:{email:{type:"string",maxLength:320,description:"The email address to verify, such as [email protected]."}},required:["email"]},annotations:b,execute:H},Z={name:"generate_sales_navigator_url",description:"Build one LinkedIn Sales Navigator search U
1RL from a plain-language audience description, using Evaboot's free URL generator. search_type lead is a people search; account is a company search. Returns a Sales Navigator URL, or needs_detail with a message when the description is too vague. When needs_detail is true, ask for the missing detail and call this tool again. Do not invent filters the user did not ask for. Can take up to two minutes. Does not export leads, save a list, or require a Sales Navigator seat. When the generator form is on the page, the URL is shown there too.",inputSchema:{type:"object",additionalProperties:!1,properties:{prompt:{type:"string",maxLength:2e3,description:"Plain-language audience, such as sales managers at SaaS companies in France."},search_type:U},required:["prompt","search_type"]},annotations:b,execute:D},ee={name:"convert_sales_navigator_url",description:"Convert one LinkedIn Sales Navigator lead or company URL into the public linkedin.com URL. Accepts linkedin.com links whose path contains /sales/lead/, /sales/people/, or /sales/company/. Runs in the browser and does not call the network. When the converter form is on the page, the converted URL is shown there too.",inputSchema:{type:"object",additionalProperties:!1,properties:{url:{type:"string",maxLength:2e3,description:"A Sales Navigator lead or company URL."}},required:["url"]},annotations:b,execute:async e=>z(e)},te={name:"generate_linkedin_boolean",description:"Turn a plain-language audience description into LinkedIn boolean search strings, using Evaboot's free boolean generator. search_type lead returns job title and keyword booleans to paste into a people search; account returns one company boolean. Returns needs_detail with a message when the description is too vague. When needs_detail is true, ask for the missing detail and call this tool again. Do not invent filters the user did not ask for. Can take about a minute. Does not run the search or export results. When the boolean form is on the page, the strings are shown there too.",inputSchema:{type:"object",additionalProperties:!1,properties:{prompt:{type:"string",maxLength:2e3,description:"Plain-language audience, such as heads of marketing at fintech companies."},search_type:U},required:["prompt","search_type"]},annotations:b,execute:J},ne=[Q,X,Z,ee,te];async function ae(e,t){await Promise.all(ne.map(n=>e.registerTool(n,{signal:t})))}const y="__evabootWebMcpCleanup";function oe(e){const t=[e.modelContext,typeof navigator>"u"?void 0:navigator.modelContext],n=[];for(const a of t)typeof a?.registerTool=="function"&&(n.includes(a)||n.push(a));return n}function re(e=document){const t=globalThis;t[y]?.();let n=null;const a=()=>{n?.abort(),n=new AbortController;const i=oe(e);if(i.length===0)return;const c=n;Promise.all(i.map(m=>ae(m,c.signal))).catch(m=>{c.signal.aborted||console.error("WebMCP registration failed",m)})},o=()=>{n?.abort(),n=null},s=()=>{n?.abort(),n=null,e.removeEventListener("astro:page-load",a),e.removeEventListener("astro:before-swap",o),t[y]===s&&delete t[y]};e.addEventListener("astro:page-load",a),e.addEventListener("astro:before-swap",o),t[y]=s,a()}re();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.