@smithery/cli 1.1.83 → 1.1.84
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/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -96,7 +96,7 @@ Input Schema:`)),console.dir(a.value.inputSchema,{depth:null,colors:!0}),console
|
|
|
96
96
|
Fix with: chmod 700 "${e}"
|
|
97
97
|
Or use: export SMITHERY_CONFIG_PATH="/custom/path"
|
|
98
98
|
Running in memory-only mode (settings won't persist).`,av=async(e,t)=>{k(`Saving settings to ${t}`),k(`Settings data: ${JSON.stringify(e,null,2)}`);try{try{k(`Ensuring directory exists: ${t}`),await Cf.promises.mkdir(t,{recursive:!0}),k("Directory check completed")}catch(n){if(k(`Directory creation error: ${JSON.stringify(n)}`),n instanceof Error&&"code"in n&&n.code==="EACCES")return{success:!1,error:iv(t,"write")};throw n}let r=(0,m1.join)(t,"settings.json");return k(`Writing settings to file: ${r}`),await Cf.promises.writeFile(r,JSON.stringify(e,null,2)),k("Settings successfully written"),{success:!0,data:e}}catch(r){return k(`Settings save error: ${JSON.stringify(r)}`),{success:!1,error:r instanceof Error&&"code"in r&&r.code==="EACCES"?iv(t,"write"):`Failed to save settings: ${r instanceof Error?r.message:String(r)}`}}},dye=async e=>{k(`Loading settings from ${e}`);try{let t=(0,m1.join)(e,"settings.json");k(`Reading settings file: ${t}`);try{let r=await Cf.promises.readFile(t,"utf-8");k("Settings file content loaded");let n=JSON.parse(r);if(k(`Settings parsed: ${JSON.stringify(n,null,2)}`),!pye(n)){k("Settings validation failed, fixing settings");let i={...nv(),...n};return i.analyticsConsent&&(i.askedConsent=!0),k(`Fixed settings: ${JSON.stringify(i,null,2)}`),await av(i,e),{success:!0,data:i}}return{success:!0,data:n}}catch(r){if(k(`Settings read error: ${JSON.stringify(r)}`),r instanceof Error&&"code"in r){if(r.code==="ENOENT"){k("Settings file not found, creating default settings");let n=nv();return k(`Default settings: ${JSON.stringify(n,null,2)}`),await av(n,e)}if(r.code==="EACCES")return{success:!1,error:iv(e,"read")}}throw r}}catch(t){return k(`Settings load error: ${JSON.stringify(t)}`),{success:!1,error:`Failed to load settings: ${t instanceof Error?t.message:String(t)}`}}},h1=async()=>{if(rv&&na)return{success:!0,data:na};try{let e=RI(),t=await dye(e);return t.success&&t.data&&(na=t.data),rv=!0,t}catch(e){return na=nv(),rv=!0,{success:!0,data:na,error:`Warning: Running in memory-only mode - ${e instanceof Error?e.message:String(e)}`}}};var Sf=async()=>{let e=await h1();return!e.success||!e.data?(console.warn("[Config] Failed to load analytics settings:",e.error),!1):e.data.analyticsConsent},NI=async e=>{let t=await h1();return!t.success||!t.data?t:(na={...t.data,analyticsConsent:e,askedConsent:!0},await av(na,RI()))},II=async()=>(await h1(),na?.askedConsent||!1);async function kI(){let e=await h1();if(!e.success){console.warn("[Analytics] Failed to initialize settings:",e.error);return}if(await Sf())return;if(!await II())try{let{EnableAnalytics:n}=await jI.default.prompt([{type:"confirm",name:"EnableAnalytics",message:`Would you like to help improve Smithery by sending anonymized usage data?
|
|
99
|
-
For information on Smithery's data policy, please visit: ${MI.default.blue("https://smithery.ai/docs/data-policy")}`,default:!0}]),i=await NI(n);i.success||console.warn("[Smithery] Failed to save preference:",i.error)}catch(n){console.warn("[Smithery] Failed to prompt for consent:",n instanceof Error?n.message:String(n))}}var LI=ce(bo()),VI=require("node:child_process"),UI=require("node:util"),ei=(0,UI.promisify)(VI.exec);async function lye(e){if(!e)return!1;try{let t=process.platform,r={claude:"Claude"}[e]||e;if(t==="win32"){let{stdout:n}=await ei(`tasklist /FI "IMAGENAME eq ${r}.exe" /NH`);return n.includes(`${r}.exe`)}else if(t==="darwin"){let{stdout:n}=await ei(`pgrep -x "${r}"`);return!!n.trim()}else if(t==="linux"){let{stdout:n}=await ei(`pgrep -f "${r.toLowerCase()}"`);return!!n.trim()}return!1}catch{return!1}}async function cye(e){let t={claude:"Claude"}[e]||e;try{let r=process.platform;r==="win32"?await ei(`taskkill /F /IM "${t}.exe" && start "" "${t}.exe"`):r==="darwin"?await ei(`killall "${t}" && open -a "${t}"`):r==="linux"&&await ei(`pkill -f "${t.toLowerCase()}" && ${t.toLowerCase()}`),await new Promise(n=>setTimeout(n,2e3)),r==="win32"?await ei(`start "" "${t}.exe"`):r==="darwin"?await ei(`open -a "${t}"`):r==="linux"&&await ei(t.toLowerCase()),console.log(`${t} has been restarted.`)}catch(r){console.error(`Failed to restart ${t}:`,r)}}async function Af(e){if(!e||!await lye(e))return!1;let{shouldRestart:r}=await LI.default.prompt([{type:"confirm",name:"shouldRestart",message:`Would you like to restart the ${e} app to apply changes?`,default:!0}]);return r&&(console.log(`Restarting ${e} app...`),await cye(e)),r}process.removeAllListeners("warning");process.on("warning",e=>{e.name==="DeprecationWarning"&&e.message.includes("punycode")||console.warn(e)});async function $I(e,t,r,n,i){k(`Starting installation of ${e} for client ${t}`),k(`Resolving package: ${e}`);try{k("Checking analytics consent..."),await kI(),k("Analytics consent check completed")}catch(u){console.warn(Lu.default.yellow("[Analytics] Failed to check consent:"),u instanceof Error?u.message:String(u)),k(`Analytics consent check error details: ${JSON.stringify(u)}`)}let a=vn(`Resolving ${e}...`).start();try{k("Awaiting package resolution...");let u=await Po(e);k(`Package resolved successfully: ${u.qualifiedName}`),a.succeed(`Successfully resolved ${e}`),k("Choosing connection type...");let p=Bo(u);k(`Selected connection: ${JSON.stringify(p,null,2)}`),await yI(p),await EI(p);let l=n;Jh(u)&&!n&&(a.stop(),l=await FI()),wI(u);let c=n?r||{}:await Df(p,r||{});k(`Config values: ${JSON.stringify(c,null,2)}`),k("Formatting server configuration...");let h=DI(e,c,l,i);k(`Formatted server config: ${JSON.stringify(h,null,2)}`),k(`Reading configuration for client: ${t}`);let _=No(t);k("Normalizing server ID...");let w=gI(e);k(`Normalized server ID: ${w}`),k("Updating client configuration..."),_.mcpServers[w]=h,k("Writing updated configuration..."),Ef(_,t),k("Configuration successfully written"),console.log(Lu.default.green(`${e} successfully installed for ${t}`)),k("Prompting for client restart..."),await Af(t),k("Installation process completed")}catch(u){a.fail(`Failed to install ${e}`),k(`Installation error: ${u instanceof Error?u.stack:JSON.stringify(u)}`),u instanceof Error?console.error(Lu.default.red(`Error: ${u.message}`)):console.error(Lu.default.red("An unexpected error occurred during installation")),process.exit(1)}}var ia=ce($e());async function WI(e,t){switch(e){case"clients":console.log(ia.default.bold("Available clients:")),N1.forEach(r=>console.log(` ${ia.default.green(r)}`));break;case"servers":{if(Ro(t).type==="command"){console.log(ia.default.yellow(`Listing servers is currently not supported for ${t}`));return}let n=No(t),i=Object.keys(n.mcpServers);if(i?.length>0)console.log(ia.default.bold(`Installed servers for ${t}:`)),i.sort().forEach(a=>{console.log(`${ia.default.green(a)}`)});else{let a=`No installed servers found for ${t}`;console.log(`${ia.default.red(a)}`)}break}default:console.log(ia.default.yellow("Please specify what to list. Available options:")),console.log(" clients List available clients"),console.log(" servers List installed servers"),process.exit(1)}}var KI=ce(Wh()),YI=ce(V8());var fye=10*30*1e3,Of=3,zI=1e3,mye=3e4,z=e=>{let t=new Date().toISOString();console.error(`${t} ${e}`)},HI=(e,t)=>{let r=null;return{start:()=>{r&&clearInterval(r),r=setInterval(async()=>{try{t()&&(z("[Runner] Sending heartbeat ping..."),await e({jsonrpc:"2.0",method:"ping",params:{}}))}catch(a){z(`[Runner] Failed to send heartbeat: ${a.message}`)}},mye)},stop:()=>{r&&(clearInterval(r),r=null)}}},GI=e=>{let t=Date.now(),r=null,n=()=>{t=Date.now()};return{updateActivity:n,start:()=>{r&&clearInterval(r),n(),r=setInterval(()=>{let u=Date.now()-t;u>=fye&&(z(`[Runner] Connection idle for ${Math.round(u/6e4)} minutes, initiating shutdown`),e().catch(p=>{z(`[Runner] Error during idle timeout cleanup: ${p}`),process.exit(1)}))},6e4)},stop:()=>{r&&(clearInterval(r),r=null)}}},Tf=e=>{switch(e.error.code){case dt.ConnectionClosed:z(`[Runner] Connection closed by server (code: ${dt.ConnectionClosed}). Details: ${JSON.stringify(e.error)}`),z("[Runner] Attempting to reconnect after server-initiated close...");return;case dt.ParseError:case dt.InvalidRequest:case dt.MethodNotFound:case dt.InvalidParams:case dt.InternalError:return;default:z(`[Runner] Unexpected protocol error: ${JSON.stringify(e.error)}`);return}};var ZI=async(e,t,r,n)=>{let i="",a=!1,u=!1,p=null,l=(T,C)=>(z(`[Runner] ${C}: ${T.message}`),T),c=async T=>{if(i+=T.toString("utf8"),!a)return;let C=i.split(/\r?\n/);i=C.pop()??"";for(let S of C.filter(Boolean))try{let P=JSON.parse(S);if(n&&r&&h8){let{data:q,error:L}=A8.safeParse(P);L||(0,KI.default)(h8,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({eventName:"tool_call",payload:{connectionType:"stdio",serverQualifiedName:e.qualifiedName,toolParams:q?(0,YI.pick)(q.params,"name"):{}}})}).catch(G=>{console.error("[Runner] Analytics error:",G)})}await p?.send(P)}catch(P){l(P,"Failed to send message to child process")}},h=async()=>{if(z("[Runner] Starting child process setup..."),!e.connections.find(X=>X.type==="stdio"))throw new Error("No STDIO connection found");let C=await hI(e.qualifiedName,t,r);if(!C||"type"in C)throw new Error("Failed to get valid stdio server configuration");let{command:S,args:P=[],env:q={}}=C,L=_f(q);k(`[Runner] Using environment: ${JSON.stringify(L,null,2)}`);let G=S,ee=P;G==="npx"&&process.platform==="win32"&&(z("[Runner] Windows platform detected, using cmd /c for npx"),ee=["/c","npx",...ee],G="cmd"),z(`[Runner] Executing: ${JSON.stringify({command:G,args:ee})}`);try{p=new G1({command:G,args:ee,env:L})}catch(X){throw z("For more help, see: https://smithery.ai/docs/faq/users"),X}p.onmessage=X=>{try{if("error"in X&&X.error){let Re=X;Tf(Re),Re.error.code===dt.ConnectionClosed&&w().catch(Vt=>{z(`[Runner] Error during exit cleanup: ${Vt}`),process.exit(1)})}console.log(JSON.stringify(X))}catch(Re){l(Re,"Error handling message"),w().catch(Vt=>{z(`[Runner] Error during exit cleanup: ${Vt}`),process.exit(1)})}},p.onclose=()=>{z("[Runner] Child process terminated"),a&&!u?(z("[Runner] Process terminated unexpectedly while running"),w().catch(X=>{z(`[Runner] Error during exit cleanup: ${X}`),process.exit(1)})):process.exit(0)},p.onerror=X=>{z(`[Runner] Child process error: ${X.message}`),X.message.includes("spawn")?z("[Runner] Failed to spawn child process - check if the command exists and is executable"):X.message.includes("permission")?z("[Runner] Permission error when running child process"):z("[Runner] Non-critical error, continuing")},await p.start(),a=!0,await c(Buffer.from(""))},_=async()=>{if(u){z("[Runner] Cleanup already in progress, skipping...");return}if(z("[Runner] Starting cleanup..."),u=!0,p){try{z("[Runner] Attempting to close transport..."),await Promise.race([p.close(),new Promise((T,C)=>setTimeout(()=>C(new Error("Transport close timeout")),3e3))]),z("[Runner] Transport closed successfully")}catch(T){z(`[Runner] Error during transport cleanup: ${T}`)}p=null}z("[Runner] Cleanup completed")},w=async()=>{z("[Runner] Exit handler triggered, starting shutdown..."),await _(),u||process.exit(0)};return process.on("SIGINT",w),process.on("SIGTERM",w),process.on("beforeExit",w),process.on("exit",()=>{z("[Runner] Final cleanup on exit")}),process.stdin.on("end",()=>{z("[Runner] STDIN closed (client disconnected)"),w().catch(T=>{z(`[Runner] Error during stdin close cleanup: ${T}`),process.exit(1)})}),process.stdin.on("error",T=>{z(`[Runner] STDIN error: ${T}`),w().catch(C=>{z(`[Runner] Error during stdin error cleanup: ${C}`),process.exit(1)})}),process.stdin.on("data",T=>c(T).catch(C=>l(C,"Error processing message"))),await h(),_};var ov;ov=globalThis.crypto?.webcrypto??globalThis.crypto??import("node:crypto").then(e=>e.webcrypto);async function hye(e){return(await ov).getRandomValues(new Uint8Array(e))}async function vye(e){let t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~",r="",n=await hye(e);for(let i=0;i<e;i++){let a=n[i]%t.length;r+=t[a]}return r}async function xye(e){return await vye(e)}async function gye(e){let t=await(await ov).subtle.digest("SHA-256",new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}async function sv(e){if(e||(e=43),e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await xye(e),r=await gye(t);return{code_verifier:t,code_challenge:r}}var JI=x.object({issuer:x.string(),authorization_endpoint:x.string(),token_endpoint:x.string(),registration_endpoint:x.string().optional(),scopes_supported:x.array(x.string()).optional(),response_types_supported:x.array(x.string()),response_modes_supported:x.array(x.string()).optional(),grant_types_supported:x.array(x.string()).optional(),token_endpoint_auth_methods_supported:x.array(x.string()).optional(),token_endpoint_auth_signing_alg_values_supported:x.array(x.string()).optional(),service_documentation:x.string().optional(),revocation_endpoint:x.string().optional(),revocation_endpoint_auth_methods_supported:x.array(x.string()).optional(),revocation_endpoint_auth_signing_alg_values_supported:x.array(x.string()).optional(),introspection_endpoint:x.string().optional(),introspection_endpoint_auth_methods_supported:x.array(x.string()).optional(),introspection_endpoint_auth_signing_alg_values_supported:x.array(x.string()).optional(),code_challenge_methods_supported:x.array(x.string()).optional()}).passthrough(),uv=x.object({access_token:x.string(),token_type:x.string(),expires_in:x.number().optional(),scope:x.string().optional(),refresh_token:x.string().optional()}).strip(),pNe=x.object({error:x.string(),error_description:x.string().optional(),error_uri:x.string().optional()}),Dye=x.object({redirect_uris:x.array(x.string()).refine(e=>e.every(t=>URL.canParse(t)),{message:"redirect_uris must contain valid URLs"}),token_endpoint_auth_method:x.string().optional(),grant_types:x.array(x.string()).optional(),response_types:x.array(x.string()).optional(),client_name:x.string().optional(),client_uri:x.string().optional(),logo_uri:x.string().optional(),scope:x.string().optional(),contacts:x.array(x.string()).optional(),tos_uri:x.string().optional(),policy_uri:x.string().optional(),jwks_uri:x.string().optional(),jwks:x.any().optional(),software_id:x.string().optional(),software_version:x.string().optional()}).strip(),bye=x.object({client_id:x.string(),client_secret:x.string().optional(),client_id_issued_at:x.number().optional(),client_secret_expires_at:x.number().optional()}).strip(),XI=Dye.merge(bye),dNe=x.object({error:x.string(),error_description:x.string().optional()}).strip(),lNe=x.object({token:x.string(),token_type_hint:x.string().optional()}).strip();var aa=class extends Error{constructor(t){super(t??"Unauthorized")}};async function qf(e,{serverUrl:t,authorizationCode:r}){let n=await _ye(t),i=await Promise.resolve(e.clientInformation());if(!i){if(r!==void 0)throw new Error("Existing OAuth client information is required when exchanging an authorization code");if(!e.saveClientInformation)throw new Error("OAuth client information must be saveable for dynamic registration");let l=await Fye(t,{metadata:n,clientMetadata:e.clientMetadata});await e.saveClientInformation(l),i=l}if(r!==void 0){let l=await e.codeVerifier(),c=await Eye(t,{metadata:n,clientInformation:i,authorizationCode:r,codeVerifier:l,redirectUri:e.redirectUrl});return await e.saveTokens(c),"AUTHORIZED"}let a=await e.tokens();if(a?.refresh_token)try{let l=await wye(t,{metadata:n,clientInformation:i,refreshToken:a.refresh_token});return await e.saveTokens(l),"AUTHORIZED"}catch(l){console.error("Could not refresh OAuth tokens:",l)}let{authorizationUrl:u,codeVerifier:p}=await yye(t,{metadata:n,clientInformation:i,redirectUrl:e.redirectUrl});return await e.saveCodeVerifier(p),await e.redirectToAuthorization(u),"REDIRECT"}async function _ye(e,t){var r;let n=new URL("/.well-known/oauth-authorization-server",e),i;try{i=await fetch(n,{headers:{"MCP-Protocol-Version":(r=t?.protocolVersion)!==null&&r!==void 0?r:fs}})}catch(a){if(a instanceof TypeError)i=await fetch(n);else throw a}if(i.status!==404){if(!i.ok)throw new Error(`HTTP ${i.status} trying to load well-known OAuth metadata`);return JI.parse(await i.json())}}async function yye(e,{metadata:t,clientInformation:r,redirectUrl:n}){let i="code",a="S256",u;if(t){if(u=new URL(t.authorization_endpoint),!t.response_types_supported.includes(i))throw new Error(`Incompatible auth server: does not support response type ${i}`);if(!t.code_challenge_methods_supported||!t.code_challenge_methods_supported.includes(a))throw new Error(`Incompatible auth server: does not support code challenge method ${a}`)}else u=new URL("/authorize",e);let p=await sv(),l=p.code_verifier,c=p.code_challenge;return u.searchParams.set("response_type",i),u.searchParams.set("client_id",r.client_id),u.searchParams.set("code_challenge",c),u.searchParams.set("code_challenge_method",a),u.searchParams.set("redirect_uri",String(n)),{authorizationUrl:u,codeVerifier:l}}async function Eye(e,{metadata:t,clientInformation:r,authorizationCode:n,codeVerifier:i,redirectUri:a}){let u="authorization_code",p;if(t){if(p=new URL(t.token_endpoint),t.grant_types_supported&&!t.grant_types_supported.includes(u))throw new Error(`Incompatible auth server: does not support grant type ${u}`)}else p=new URL("/token",e);let l=new URLSearchParams({grant_type:u,client_id:r.client_id,code:n,code_verifier:i,redirect_uri:String(a)});r.client_secret&&l.set("client_secret",r.client_secret);let c=await fetch(p,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:l});if(!c.ok)throw new Error(`Token exchange failed: HTTP ${c.status}`);return uv.parse(await c.json())}async function wye(e,{metadata:t,clientInformation:r,refreshToken:n}){let i="refresh_token",a;if(t){if(a=new URL(t.token_endpoint),t.grant_types_supported&&!t.grant_types_supported.includes(i))throw new Error(`Incompatible auth server: does not support grant type ${i}`)}else a=new URL("/token",e);let u=new URLSearchParams({grant_type:i,client_id:r.client_id,refresh_token:n});r.client_secret&&u.set("client_secret",r.client_secret);let p=await fetch(a,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:u});if(!p.ok)throw new Error(`Token refresh failed: HTTP ${p.status}`);return uv.parse(await p.json())}async function Fye(e,{metadata:t,clientMetadata:r}){let n;if(t){if(!t.registration_endpoint)throw new Error("Incompatible auth server: does not support dynamic client registration");n=new URL(t.registration_endpoint)}else n=new URL("/register",e);let i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!i.ok)throw new Error(`Dynamic client registration failed: HTTP ${i.status}`);return XI.parse(await i.json())}var Cye=Object.defineProperty,Sye=(e,t,r)=>t in e?Cye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Pf=(e,t,r)=>Sye(e,typeof t!="symbol"?t+"":t,r),Bf=class extends Error{constructor(t,r){super(t),Pf(this,"type"),Pf(this,"field"),Pf(this,"value"),Pf(this,"line"),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function pv(e){}function QI(e){let{onEvent:t=pv,onError:r=pv,onRetry:n=pv,onComment:i}=e,a="",u=!0,p,l="",c="";function h(S){let P=u?S.replace(/^\xEF\xBB\xBF/,""):S,[q,L]=Aye(`${a}${P}`);for(let G of q)_(G);a=L,u=!1}function _(S){if(S===""){T();return}if(S.startsWith(":")){i&&i(S.slice(S.startsWith(": ")?2:1));return}let P=S.indexOf(":");if(P!==-1){let q=S.slice(0,P),L=S[P+1]===" "?2:1,G=S.slice(P+L);w(q,G,S);return}w(S,"",S)}function w(S,P,q){switch(S){case"event":c=P;break;case"data":l=`${l}${P}
|
|
99
|
+
For information on Smithery's data policy, please visit: ${MI.default.blue("https://smithery.ai/docs/data-policy")}`,default:!0}]),i=await NI(n);i.success||console.warn("[Smithery] Failed to save preference:",i.error)}catch(n){console.warn("[Smithery] Failed to prompt for consent:",n instanceof Error?n.message:String(n))}}var LI=ce(bo()),VI=require("node:child_process"),UI=require("node:util"),ei=(0,UI.promisify)(VI.exec);async function lye(e){if(!e)return!1;try{let t=process.platform,r={claude:"Claude"}[e]||e;if(t==="win32"){let{stdout:n}=await ei(`tasklist /FI "IMAGENAME eq ${r}.exe" /NH`);return n.includes(`${r}.exe`)}else if(t==="darwin"){let{stdout:n}=await ei(`pgrep -x "${r}"`);return!!n.trim()}else if(t==="linux"){let{stdout:n}=await ei(`pgrep -f "${r.toLowerCase()}"`);return!!n.trim()}return!1}catch{return!1}}async function cye(e){let t={claude:"Claude"}[e]||e;try{let r=process.platform;r==="win32"?await ei(`taskkill /F /IM "${t}.exe" && start "" "${t}.exe"`):r==="darwin"?await ei(`killall "${t}" && open -a "${t}"`):r==="linux"&&await ei(`pkill -f "${t.toLowerCase()}" && ${t.toLowerCase()}`),await new Promise(n=>setTimeout(n,2e3)),r==="win32"?await ei(`start "" "${t}.exe"`):r==="darwin"?await ei(`open -a "${t}"`):r==="linux"&&await ei(t.toLowerCase()),console.log(`${t} has been restarted.`)}catch(r){console.error(`Failed to restart ${t}:`,r)}}async function Af(e){if(!e||!await lye(e))return!1;let{shouldRestart:r}=await LI.default.prompt([{type:"confirm",name:"shouldRestart",message:`Would you like to restart the ${e} app to apply changes?`,default:!0}]);return r&&(console.log(`Restarting ${e} app...`),await cye(e)),r}process.removeAllListeners("warning");process.on("warning",e=>{e.name==="DeprecationWarning"&&e.message.includes("punycode")||console.warn(e)});async function $I(e,t,r,n,i){k(`Starting installation of ${e} for client ${t}`),k(`Resolving package: ${e}`);try{k("Checking analytics consent..."),await kI(),k("Analytics consent check completed")}catch(u){console.warn(Lu.default.yellow("[Analytics] Failed to check consent:"),u instanceof Error?u.message:String(u)),k(`Analytics consent check error details: ${JSON.stringify(u)}`)}let a=vn(`Resolving ${e}...`).start();try{k("Awaiting package resolution...");let u=await Po(e);k(`Package resolved successfully: ${u.qualifiedName}`),a.succeed(`Successfully resolved ${e}`),k("Choosing connection type...");let p=Bo(u);k(`Selected connection: ${JSON.stringify(p,null,2)}`),await yI(p),await EI(p);let l=n;Jh(u)&&!n&&(a.stop(),l=await FI()),wI(u);let c=n?r||{}:await Df(p,r||{});k(`Config values: ${JSON.stringify(c,null,2)}`),k("Formatting server configuration...");let h=DI(e,c,l,i);k(`Formatted server config: ${JSON.stringify(h,null,2)}`),k(`Reading configuration for client: ${t}`);let _=No(t);k("Normalizing server ID...");let w=gI(e);k(`Normalized server ID: ${w}`),k("Updating client configuration..."),_.mcpServers[w]=h,k("Writing updated configuration..."),Ef(_,t),k("Configuration successfully written"),console.log(Lu.default.green(`${e} successfully installed for ${t}`)),k("Prompting for client restart..."),await Af(t),k("Installation process completed")}catch(u){a.fail(`Failed to install ${e}`),k(`Installation error: ${u instanceof Error?u.stack:JSON.stringify(u)}`),u instanceof Error?console.error(Lu.default.red(`Error: ${u.message}`)):console.error(Lu.default.red("An unexpected error occurred during installation")),process.exit(1)}}var ia=ce($e());async function WI(e,t){switch(e){case"clients":console.log(ia.default.bold("Available clients:")),N1.forEach(r=>console.log(` ${ia.default.green(r)}`));break;case"servers":{if(Ro(t).type==="command"){console.log(ia.default.yellow(`Listing servers is currently not supported for ${t}`));return}let n=No(t),i=Object.keys(n.mcpServers);if(i?.length>0)console.log(ia.default.bold(`Installed servers for ${t}:`)),i.sort().forEach(a=>{console.log(`${ia.default.green(a)}`)});else{let a=`No installed servers found for ${t}`;console.log(`${ia.default.red(a)}`)}break}default:console.log(ia.default.yellow("Please specify what to list. Available options:")),console.log(" clients List available clients"),console.log(" servers List installed servers"),process.exit(1)}}var KI=ce(Wh()),YI=ce(V8());var fye=10*60*1e3,Of=3,zI=1e3,mye=3e4,z=e=>{let t=new Date().toISOString();console.error(`${t} ${e}`)},HI=(e,t)=>{let r=null;return{start:()=>{r&&clearInterval(r),r=setInterval(async()=>{try{t()&&(z("[Runner] Sending heartbeat ping..."),await e({jsonrpc:"2.0",method:"ping",params:{}}))}catch(a){z(`[Runner] Failed to send heartbeat: ${a.message}`)}},mye)},stop:()=>{r&&(clearInterval(r),r=null)}}},GI=e=>{let t=Date.now(),r=null,n=()=>{t=Date.now()};return{updateActivity:n,start:()=>{r&&clearInterval(r),n(),r=setInterval(()=>{let u=Date.now()-t;u>=fye&&(z(`[Runner] Connection idle for ${Math.round(u/6e4)} minutes, initiating shutdown`),e().catch(p=>{z(`[Runner] Error during idle timeout cleanup: ${p}`),process.exit(1)}))},6e4)},stop:()=>{r&&(clearInterval(r),r=null)}}},Tf=e=>{switch(e.error.code){case dt.ConnectionClosed:z(`[Runner] Connection closed by server (code: ${dt.ConnectionClosed}). Details: ${JSON.stringify(e.error)}`),z("[Runner] Attempting to reconnect after server-initiated close...");return;case dt.ParseError:case dt.InvalidRequest:case dt.MethodNotFound:case dt.InvalidParams:case dt.InternalError:return;default:z(`[Runner] Unexpected protocol error: ${JSON.stringify(e.error)}`);return}};var ZI=async(e,t,r,n)=>{let i="",a=!1,u=!1,p=null,l=(T,C)=>(z(`[Runner] ${C}: ${T.message}`),T),c=async T=>{if(i+=T.toString("utf8"),!a)return;let C=i.split(/\r?\n/);i=C.pop()??"";for(let S of C.filter(Boolean))try{let P=JSON.parse(S);if(n&&r&&h8){let{data:q,error:L}=A8.safeParse(P);L||(0,KI.default)(h8,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({eventName:"tool_call",payload:{connectionType:"stdio",serverQualifiedName:e.qualifiedName,toolParams:q?(0,YI.pick)(q.params,"name"):{}}})}).catch(G=>{console.error("[Runner] Analytics error:",G)})}await p?.send(P)}catch(P){l(P,"Failed to send message to child process")}},h=async()=>{if(z("[Runner] Starting child process setup..."),!e.connections.find(X=>X.type==="stdio"))throw new Error("No STDIO connection found");let C=await hI(e.qualifiedName,t,r);if(!C||"type"in C)throw new Error("Failed to get valid stdio server configuration");let{command:S,args:P=[],env:q={}}=C,L=_f(q);k(`[Runner] Using environment: ${JSON.stringify(L,null,2)}`);let G=S,ee=P;G==="npx"&&process.platform==="win32"&&(z("[Runner] Windows platform detected, using cmd /c for npx"),ee=["/c","npx",...ee],G="cmd"),z(`[Runner] Executing: ${JSON.stringify({command:G,args:ee})}`);try{p=new G1({command:G,args:ee,env:L})}catch(X){throw z("For more help, see: https://smithery.ai/docs/faq/users"),X}p.onmessage=X=>{try{if("error"in X&&X.error){let Re=X;Tf(Re),Re.error.code===dt.ConnectionClosed&&w().catch(Vt=>{z(`[Runner] Error during exit cleanup: ${Vt}`),process.exit(1)})}console.log(JSON.stringify(X))}catch(Re){l(Re,"Error handling message"),w().catch(Vt=>{z(`[Runner] Error during exit cleanup: ${Vt}`),process.exit(1)})}},p.onclose=()=>{z("[Runner] Child process terminated"),a&&!u?(z("[Runner] Process terminated unexpectedly while running"),w().catch(X=>{z(`[Runner] Error during exit cleanup: ${X}`),process.exit(1)})):process.exit(0)},p.onerror=X=>{z(`[Runner] Child process error: ${X.message}`),X.message.includes("spawn")?z("[Runner] Failed to spawn child process - check if the command exists and is executable"):X.message.includes("permission")?z("[Runner] Permission error when running child process"):z("[Runner] Non-critical error, continuing")},await p.start(),a=!0,await c(Buffer.from(""))},_=async()=>{if(u){z("[Runner] Cleanup already in progress, skipping...");return}if(z("[Runner] Starting cleanup..."),u=!0,p){try{z("[Runner] Attempting to close transport..."),await Promise.race([p.close(),new Promise((T,C)=>setTimeout(()=>C(new Error("Transport close timeout")),3e3))]),z("[Runner] Transport closed successfully")}catch(T){z(`[Runner] Error during transport cleanup: ${T}`)}p=null}z("[Runner] Cleanup completed")},w=async()=>{z("[Runner] Exit handler triggered, starting shutdown..."),await _(),u||process.exit(0)};return process.on("SIGINT",w),process.on("SIGTERM",w),process.on("beforeExit",w),process.on("exit",()=>{z("[Runner] Final cleanup on exit")}),process.stdin.on("end",()=>{z("[Runner] STDIN closed (client disconnected)"),w().catch(T=>{z(`[Runner] Error during stdin close cleanup: ${T}`),process.exit(1)})}),process.stdin.on("error",T=>{z(`[Runner] STDIN error: ${T}`),w().catch(C=>{z(`[Runner] Error during stdin error cleanup: ${C}`),process.exit(1)})}),process.stdin.on("data",T=>c(T).catch(C=>l(C,"Error processing message"))),await h(),_};var ov;ov=globalThis.crypto?.webcrypto??globalThis.crypto??import("node:crypto").then(e=>e.webcrypto);async function hye(e){return(await ov).getRandomValues(new Uint8Array(e))}async function vye(e){let t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~",r="",n=await hye(e);for(let i=0;i<e;i++){let a=n[i]%t.length;r+=t[a]}return r}async function xye(e){return await vye(e)}async function gye(e){let t=await(await ov).subtle.digest("SHA-256",new TextEncoder().encode(e));return btoa(String.fromCharCode(...new Uint8Array(t))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}async function sv(e){if(e||(e=43),e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await xye(e),r=await gye(t);return{code_verifier:t,code_challenge:r}}var JI=x.object({issuer:x.string(),authorization_endpoint:x.string(),token_endpoint:x.string(),registration_endpoint:x.string().optional(),scopes_supported:x.array(x.string()).optional(),response_types_supported:x.array(x.string()),response_modes_supported:x.array(x.string()).optional(),grant_types_supported:x.array(x.string()).optional(),token_endpoint_auth_methods_supported:x.array(x.string()).optional(),token_endpoint_auth_signing_alg_values_supported:x.array(x.string()).optional(),service_documentation:x.string().optional(),revocation_endpoint:x.string().optional(),revocation_endpoint_auth_methods_supported:x.array(x.string()).optional(),revocation_endpoint_auth_signing_alg_values_supported:x.array(x.string()).optional(),introspection_endpoint:x.string().optional(),introspection_endpoint_auth_methods_supported:x.array(x.string()).optional(),introspection_endpoint_auth_signing_alg_values_supported:x.array(x.string()).optional(),code_challenge_methods_supported:x.array(x.string()).optional()}).passthrough(),uv=x.object({access_token:x.string(),token_type:x.string(),expires_in:x.number().optional(),scope:x.string().optional(),refresh_token:x.string().optional()}).strip(),pNe=x.object({error:x.string(),error_description:x.string().optional(),error_uri:x.string().optional()}),Dye=x.object({redirect_uris:x.array(x.string()).refine(e=>e.every(t=>URL.canParse(t)),{message:"redirect_uris must contain valid URLs"}),token_endpoint_auth_method:x.string().optional(),grant_types:x.array(x.string()).optional(),response_types:x.array(x.string()).optional(),client_name:x.string().optional(),client_uri:x.string().optional(),logo_uri:x.string().optional(),scope:x.string().optional(),contacts:x.array(x.string()).optional(),tos_uri:x.string().optional(),policy_uri:x.string().optional(),jwks_uri:x.string().optional(),jwks:x.any().optional(),software_id:x.string().optional(),software_version:x.string().optional()}).strip(),bye=x.object({client_id:x.string(),client_secret:x.string().optional(),client_id_issued_at:x.number().optional(),client_secret_expires_at:x.number().optional()}).strip(),XI=Dye.merge(bye),dNe=x.object({error:x.string(),error_description:x.string().optional()}).strip(),lNe=x.object({token:x.string(),token_type_hint:x.string().optional()}).strip();var aa=class extends Error{constructor(t){super(t??"Unauthorized")}};async function qf(e,{serverUrl:t,authorizationCode:r}){let n=await _ye(t),i=await Promise.resolve(e.clientInformation());if(!i){if(r!==void 0)throw new Error("Existing OAuth client information is required when exchanging an authorization code");if(!e.saveClientInformation)throw new Error("OAuth client information must be saveable for dynamic registration");let l=await Fye(t,{metadata:n,clientMetadata:e.clientMetadata});await e.saveClientInformation(l),i=l}if(r!==void 0){let l=await e.codeVerifier(),c=await Eye(t,{metadata:n,clientInformation:i,authorizationCode:r,codeVerifier:l,redirectUri:e.redirectUrl});return await e.saveTokens(c),"AUTHORIZED"}let a=await e.tokens();if(a?.refresh_token)try{let l=await wye(t,{metadata:n,clientInformation:i,refreshToken:a.refresh_token});return await e.saveTokens(l),"AUTHORIZED"}catch(l){console.error("Could not refresh OAuth tokens:",l)}let{authorizationUrl:u,codeVerifier:p}=await yye(t,{metadata:n,clientInformation:i,redirectUrl:e.redirectUrl});return await e.saveCodeVerifier(p),await e.redirectToAuthorization(u),"REDIRECT"}async function _ye(e,t){var r;let n=new URL("/.well-known/oauth-authorization-server",e),i;try{i=await fetch(n,{headers:{"MCP-Protocol-Version":(r=t?.protocolVersion)!==null&&r!==void 0?r:fs}})}catch(a){if(a instanceof TypeError)i=await fetch(n);else throw a}if(i.status!==404){if(!i.ok)throw new Error(`HTTP ${i.status} trying to load well-known OAuth metadata`);return JI.parse(await i.json())}}async function yye(e,{metadata:t,clientInformation:r,redirectUrl:n}){let i="code",a="S256",u;if(t){if(u=new URL(t.authorization_endpoint),!t.response_types_supported.includes(i))throw new Error(`Incompatible auth server: does not support response type ${i}`);if(!t.code_challenge_methods_supported||!t.code_challenge_methods_supported.includes(a))throw new Error(`Incompatible auth server: does not support code challenge method ${a}`)}else u=new URL("/authorize",e);let p=await sv(),l=p.code_verifier,c=p.code_challenge;return u.searchParams.set("response_type",i),u.searchParams.set("client_id",r.client_id),u.searchParams.set("code_challenge",c),u.searchParams.set("code_challenge_method",a),u.searchParams.set("redirect_uri",String(n)),{authorizationUrl:u,codeVerifier:l}}async function Eye(e,{metadata:t,clientInformation:r,authorizationCode:n,codeVerifier:i,redirectUri:a}){let u="authorization_code",p;if(t){if(p=new URL(t.token_endpoint),t.grant_types_supported&&!t.grant_types_supported.includes(u))throw new Error(`Incompatible auth server: does not support grant type ${u}`)}else p=new URL("/token",e);let l=new URLSearchParams({grant_type:u,client_id:r.client_id,code:n,code_verifier:i,redirect_uri:String(a)});r.client_secret&&l.set("client_secret",r.client_secret);let c=await fetch(p,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:l});if(!c.ok)throw new Error(`Token exchange failed: HTTP ${c.status}`);return uv.parse(await c.json())}async function wye(e,{metadata:t,clientInformation:r,refreshToken:n}){let i="refresh_token",a;if(t){if(a=new URL(t.token_endpoint),t.grant_types_supported&&!t.grant_types_supported.includes(i))throw new Error(`Incompatible auth server: does not support grant type ${i}`)}else a=new URL("/token",e);let u=new URLSearchParams({grant_type:i,client_id:r.client_id,refresh_token:n});r.client_secret&&u.set("client_secret",r.client_secret);let p=await fetch(a,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:u});if(!p.ok)throw new Error(`Token refresh failed: HTTP ${p.status}`);return uv.parse(await p.json())}async function Fye(e,{metadata:t,clientMetadata:r}){let n;if(t){if(!t.registration_endpoint)throw new Error("Incompatible auth server: does not support dynamic client registration");n=new URL(t.registration_endpoint)}else n=new URL("/register",e);let i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});if(!i.ok)throw new Error(`Dynamic client registration failed: HTTP ${i.status}`);return XI.parse(await i.json())}var Cye=Object.defineProperty,Sye=(e,t,r)=>t in e?Cye(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Pf=(e,t,r)=>Sye(e,typeof t!="symbol"?t+"":t,r),Bf=class extends Error{constructor(t,r){super(t),Pf(this,"type"),Pf(this,"field"),Pf(this,"value"),Pf(this,"line"),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function pv(e){}function QI(e){let{onEvent:t=pv,onError:r=pv,onRetry:n=pv,onComment:i}=e,a="",u=!0,p,l="",c="";function h(S){let P=u?S.replace(/^\xEF\xBB\xBF/,""):S,[q,L]=Aye(`${a}${P}`);for(let G of q)_(G);a=L,u=!1}function _(S){if(S===""){T();return}if(S.startsWith(":")){i&&i(S.slice(S.startsWith(": ")?2:1));return}let P=S.indexOf(":");if(P!==-1){let q=S.slice(0,P),L=S[P+1]===" "?2:1,G=S.slice(P+L);w(q,G,S);return}w(S,"",S)}function w(S,P,q){switch(S){case"event":c=P;break;case"data":l=`${l}${P}
|
|
100
100
|
`;break;case"id":p=P.includes("\0")?void 0:P;break;case"retry":/^\d+$/.test(P)?n(parseInt(P,10)):r(new Bf(`Invalid \`retry\` value: "${P}"`,{type:"invalid-retry",value:P,line:q}));break;default:r(new Bf(`Unknown field "${S.length>20?`${S.slice(0,20)}\u2026`:S}"`,{type:"unknown-field",field:S,value:P,line:q}));break}}function T(){l.length>0&&t({id:p,event:c||void 0,data:l.endsWith(`
|
|
101
101
|
`)?l.slice(0,-1):l}),p=void 0,l="",c=""}function C(S={}){a&&S.consume&&_(a),p=void 0,l="",c="",a=""}return{feed:h,reset:C}}function Aye(e){let t=[],r="",n=e.length;for(let i=0;i<n;i++){let a=e[i];a==="\r"&&e[i+1]===`
|
|
102
102
|
`?(t.push(r),r="",i++):a==="\r"||a===`
|