@augmentcode/auggie 1.2.0-prerelease.202610221516 → 1.2.0-prerelease.202610231216
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/auggie-v2.mjs +1526 -1526
- package/auggie-v2.mjs.d/extensions/mcp/index.js +1 -1
- package/package.json +1 -1
|
@@ -140,7 +140,7 @@ ${C}`,l++;break;case"id":u=C.includes("\0")?void 0:C;break;case"retry":/^\d+$/.t
|
|
|
140
140
|
</main>
|
|
141
141
|
${i}
|
|
142
142
|
</body>
|
|
143
|
-
</html>`}function sE(t){return iE({title:"Authentication successful",heading:"Authentication successful",message:t,autoClose:!0})}function zu(t,e){return iE({title:"Authentication failed",heading:"Authentication failed",message:t,details:e})}var IZ="127.0.0.1",uE="/callback",aE=3e3,cE=3010,OZ="Authentication successful. You can close this window.",Nu={"Content-Type":"text/html; charset=utf-8"};function dE(t=process.env){return!!(t.SSH_CONNECTION||t.SSH_TTY)}function lE(t,e){let r=t.trim();if(!r)throw new Error("No authorization code provided");let n;try{n=new URL(r).searchParams}catch{(r.includes("code=")||r.includes("error="))&&(n=new URLSearchParams(r))}if(!n)return{kind:"success",result:{code:r,state:e}};let o=n.get("state");if(n.has("error")){if(o!==e)throw new Error("OAuth state mismatch");return{kind:"error",params:n}}let i=n.get("code");if(!i)throw new Error("Could not find an authorization code in the pasted input");if(o&&o!==e)throw new Error("OAuth state mismatch");return{kind:"success",result:{code:i,state:o??e}}}function bm(t){let e=t.get("error")??"unknown_error",r=t.get("error_description");return new Error(`Authentication did not complete: ${e}${r?`: ${r}`:""}`)}function zZ(t,e,r){try{let n=new URL(t.url??"","http://localhost");if(n.pathname!==uE){e.writeHead(404,Nu),e.end(zu("Callback route not found."));return}let o=n.searchParams.get("code"),i=n.searchParams.get("state"),s=n.searchParams.get("error");if(s){let a=c=>{e.writeHead(400,Nu),e.end(zu("Authentication did not complete.",`Error: ${s}`));let u=bm(n.searchParams);c instanceof Error?u=c:c!==void 0&&(u=new Error(String(c))),r.onError(u)};r.onErrorRetry(n.searchParams).then(c=>{c?(e.writeHead(302,{Location:c}),e.end()):a()}).catch(c=>a(c));return}if(!o||!i){e.writeHead(400,Nu),e.end(zu("Missing code or state parameter.")),r.onError(new Error("OAuth callback missing code or state"));return}e.writeHead(200,Nu),e.end(sE(OZ)),r.onSuccess({code:o,state:i})}catch{e.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),e.end("Internal error")}}async function NZ(t){for(let e=aE;e<=cE;e++)if(await new Promise(n=>{let o=()=>{t.removeListener("listening",i),n(!1)},i=()=>{t.removeListener("error",o),n(!0)};t.once("error",o),t.once("listening",i),t.listen(e,IZ)}))return e;throw new Error(`No free port in ${aE}-${cE} for the OAuth callback server`)}async function fE(){let t=!1,e,r,n=new Promise((a,c)=>{e=u=>{t||(t=!0,a(u))},r=u=>{t||(t=!0,c(u))}}),o,i=$Z((a,c)=>{zZ(a,c,{onSuccess:u=>e?.(u),onError:u=>r?.(u),onErrorRetry:u=>o?.(u)??Promise.resolve(null)})}),s=await NZ(i);return{port:s,redirectUri:`http://localhost:${s}${uE}`,waitForCode:()=>n,cancelWait:()=>e?.(null),close:()=>i.close(),setErrorRetryHandler:a=>{o=a}}}var Rm=DZ.child({prefix:"pi-mcp"}),LZ=300*1e3,mE="MCP authentication was superseded";function pE(){return dE()?"You appear to be on a remote machine. Open the URL in a local browser, then paste the final redirect URL or code below.":"Complete sign-in in your browser. If it doesn't open, paste the final redirect URL or code below."}function wr(t){if(t.aborted)throw new Error("Authentication cancelled")}function gE(t,e,r){return t.authenticationGeneration===r.authenticationGeneration&&t.servers.get(e)===r.server&&(t.serverGenerations.get(e)??0)===r.serverGeneration&&(t.configRevisions.get(e)??0)===r.installedConfigRevision&&(t.configDesiredRevisions.get(e)??0)===r.desiredConfigRevision&&t.tokens===r.tokenStore&&t.tokens.get(e)===r.token&&yE(t.credentialRevisions.get(e),r.credentialRevision)}function yE(t,e){return t?.revision===e?.revision&&t?.domain===e?.domain}function hE(t,e,r){if(!gE(t,e,r))throw new Error(mE)}async function jZ(t,e,r,n,o,i,s){let a=t.servers.get(e),c=t.tokens,u=c.get(e),d=t.credentialRevisions.get(e);if(c!==r.tokenStore||!a||!u||!pt(r.server.config,a.config))return;let l=a.config,f=Gt(t,a);try{let p=await c.restoreAfterSupersededAuthentication(e,o,u,n,i,f);if(p===void 0||t.tokens!==c||t.servers.get(e)?.config!==l||c.get(e)!==u||!kr(Gt(t,a),f)||!yE(t.credentialRevisions.get(e),d)||c.reconcileCredentialIdentity?.(e,u,f)!==!0)return;un({state:t,name:e,revision:p}),N(t.currentLoad?.latestPi??s,t)}catch{Rm.error(`Failed to restore authoritative MCP OAuth token for "${e}" after superseded authentication`)}}function FZ(t){let e=t.serverMetadata;if(!e.authorization_endpoint||!e.token_endpoint)throw new Error("Authorization server metadata is missing required endpoints");let r=t.client.client_secret,n=t.client.token_endpoint_auth_method;return{accessToken:t.accessToken,refreshToken:t.refreshToken,expiresAt:t.expiresAt,tokenType:t.tokenType,scope:t.scope,resource:t.resource,serverMetadata:{issuer:e.issuer,authorization_endpoint:e.authorization_endpoint,token_endpoint:e.token_endpoint},client:{client_id:t.client.client_id,...typeof r=="string"?{client_secret:r}:{},...typeof n=="string"?{token_endpoint_auth_method:n}:{}}}}function UZ(t,e,r,n){return new Promise((o,i)=>{let s=!1,a,c=()=>{a&&clearTimeout(a),e.signal.removeEventListener("abort",d),t.cancelWait()},u=m=>{s||(s=!0,c(),m())},d=()=>u(()=>i(new Error("Authentication cancelled"))),l=()=>{a&&clearTimeout(a),a=setTimeout(()=>u(()=>i(new Error("Authentication timed out"))),LZ)},f=m=>{let g=m instanceof Error?m.message:String(m);u(()=>i(new Error(`Could not read the pasted authorization code (${g}). Restart sign-in and paste the full redirect URL.`)))},p=async(m,g)=>{let v=await n(m,l);if(!s){if(v){h(g);return}u(()=>i(bm(m)))}},h=(m=e.waitForManualCode())=>{m.then(async g=>{if(!(s||!g))try{let v=lE(g,r());if(v.kind==="success"){u(()=>o(new URLSearchParams({code:v.result.code,state:v.result.state})));return}let w=e.waitForManualCode();await p(v.params,w)}catch(v){f(v)}}).catch(g=>u(()=>i(g instanceof Error?g:new Error(String(g)))))};if(t.setErrorRetryHandler(m=>n(m,l)),l(),e.signal.aborted){u(()=>i(new Error("Authentication cancelled")));return}e.signal.addEventListener("abort",d),t.waitForCode().then(m=>{m&&u(()=>o(new URLSearchParams({code:m.code,state:m.state})))}).catch(m=>u(()=>i(m instanceof Error?m:new Error(String(m))))),h()})}async function vE(t){let{serverName:e,state:r,pi:n,controller:o}=t,i=r.servers.get(e);if(!i)throw new Error(`Unknown MCP server "${e}"`);let s=i.config;if(s.type!=="http"&&s.type!=="sse")throw new Error(`MCP server "${e}" does not use OAuth authentication`);if(r.authenticating)throw new Error("Another MCP authentication is already in progress");r.authenticating=!0,r.authenticatingServerName=e;let a=++r.authenticationGeneration,c={authenticationGeneration:a,server:i,serverGeneration:r.serverGenerations.get(e)??0,installedConfigRevision:r.configRevisions.get(e)??0,desiredConfigRevision:r.configDesiredRevisions.get(e)??0,tokenStore:r.tokens,token:r.tokens.get(e),credentialRevision:r.credentialRevisions.get(e)},u=Gt(r,i),d;try{wr(o.signal),d=await fE(),wr(o.signal);let l=new URL(s.url),f,p;try{f=await Kd(l),wr(o.signal),p=await Jd(f),wr(o.signal)}catch(be){wr(o.signal);let qt=xi(be);throw qt?ki(qt):new Error(`OAuth discovery failed for MCP server "${e}". Verify that the endpoint supports OAuth and publishes discovery metadata.`)}let h=await c.tokenStore.captureAuthenticatedIdentityVersion(u);hE(r,e,c),wr(o.signal);let m=await Yd({config:s.clientId?{clientId:s.clientId}:{},serverMetadata:p,redirectUris:[d.redirectUri],preferStaticClient:s.registrySource===void 0});wr(o.signal);let g=await Na(l,m,p,d.redirectUri,f.resourceScopes?.join(" "),f.resourceIdentifier?new URL(f.resourceIdentifier):void 0);wr(o.signal);let v=g,w=!1,b,R,_=(be,qt)=>{if(w)return R&&b&&Da(be,b)?R.then(lt=>lt.authUri.toString()):Promise.resolve(null);if(!Da(be,v))return Promise.resolve(null);w=!0;let cn=v;return b=cn,qt(),Rm.info(`MCP server "${e}" rejected offline_access (invalid_scope); retrying authorization without it`),R=Xd(cn).then(lt=>(v=lt,o.onAuthUrl({url:lt.authUri.toString(),instructions:pE()}),lt)),R.then(lt=>lt.authUri.toString())};d.setErrorRetryHandler(be=>_(be,()=>{})),o.onAuthUrl({url:g.authUri.toString(),instructions:pE()}),wr(o.signal),await oE(g.authUri.toString());let C=await UZ(d,o,()=>v.state,_),I=await Qd(C,v);hE(r,e,c);let Q=FZ(I),pe=await c.tokenStore.persistAuthenticated(e,Q,u,h);if(!gE(r,e,c))throw await jZ(r,e,c,u,Q,pe,n),new Error(mE);c.tokenStore.commit(e,Q,u),r.preservedCredentialIdentities?.delete(e),un({state:r,name:e,revision:pe}),r.tokens.clearAuthRequired(e),at(r,e),await Xs([e],r,n),N(r.currentLoad?.latestPi??n,r),Se(r),Rm.info(`MCP server "${e}" authenticated`)}finally{d?.close(),r.authenticationGeneration===a&&(r.authenticating=!1,r.authenticatingServerName=void 0)}}import{SettingsManager as n2}from"@augmentcode/auggie-v2";import{resolveTargetFiles as qZ,SETTINGS_TARGET_ORDER as HZ,SettingsManager as GZ,scopeToSettingsTarget as ZZ,settingsTargetToScope as Cm}from"@augmentcode/auggie-v2";var BZ=HZ.map(t=>Cm(t)),_E=(t,e)=>GZ.create(t,e);function SE(t,e){switch(e){case"global":return t.getGlobalSettings().mcpServers;case"project":return t.getProjectSettings().mcpServers;case"local":return t.getLocalSettings().mcpServers;case"managed":return t.getManagedSettings().mcpServers}}function wE(t,e,r){let n=_E(e,r);return BZ.filter(o=>SE(n,o)?.[t])}function bE(t){let e=t.map(n=>({target:ZZ(n),path:n,exists:!0})),r=qZ({files:e});return"directTarget"in r?{scopes:t,direct:Cm(r.directTarget)}:{scopes:r.files.map(n=>Cm(n.target)),direct:null}}function WZ(t,e,r){let{servers:n}=to(e,r);return n.find(o=>o.name===t)?.disabled===!0}function RE(t,e,r,n,o){try{let i=_E(n,o);if(!SE(i,r)?.[t])return{ok:!1,error:`Server "${t}" not found in ${r} settings`};i.update(r,{path:["mcpServers",t,"disabled"],value:e})}catch(i){return{ok:!1,error:i instanceof Error?i.message:String(i)}}return{ok:!0,overridden:WZ(t,n,o)!==e}}function Pm(t){return`Cannot toggle "${t}": server is not in any editable settings file`}function CE(t,e,r){return Pm(t)}function PE(t){return`Saved toggle for "${t}", but a higher-priority settings file overrides it`}import{logger as VZ}from"@hermes/logger";var km=VZ.child({prefix:"pi-mcp"}),xE="hermes:mcp:register-server-source";function KZ(t,e){return t.type==="stdio"?Bt(t,e):Zt(t,e)}function kE(t,e){return JSON.stringify(t)===JSON.stringify(e)}function JZ(t,e){return{...t,disabled:e}}function YZ(t){try{return t.getServers()}catch(e){return km.warn(`plugin MCP server source getServers() threw: ${e instanceof Error?e.message:String(e)}`),[]}}function XZ(t,e){if(t.getDiagnostics)try{for(let r of t.getDiagnostics())e.diagnostics.push({message:r.message,origin:"plugin"})}catch{}}function EE(t,e){t.diagnostics.push({server:e,message:`plugin MCP server "${e}" is shadowed by an existing MCP server of the same name; skipping`,origin:"plugin"})}function QZ(t,e,r,n){let o=new Map;if(!t)return o;for(let i of YZ(t)){let s=e.servers.get(i.name),a=KZ(i,r),c=e.sessionPluginDisabledOverrides.get(i.name),u=JZ(a,c??a.disabled===!0),d=e.pluginServerHosts.get(i.name);s&&d===s&&ee(e,i.name,s);let l=D(e,i.name),f=s!==void 0&&l?.owner.kind==="plugin"&&l.host===s,p=s!==void 0&&d===void 0&&n.has(i.name)&&kE(s.config,u);p&&(ee(e,i.name,s),Ym({state:e,name:i.name,host:s}));let h=l?.owner.kind==="vfs";if(s&&!(f||p||h)){e.pluginServerNames.delete(i.name),e.pluginServerHosts.delete(i.name),EE(e,i.name);continue}o.has(i.name)||o.set(i.name,u)}return o}async function e2(t,e,r){let n=[];for(let o of e){if(t.has(o))continue;r.sessionPluginDisabledOverrides.delete(o);let i=D(r,o);if(i?.owner.kind!=="plugin")continue;let s=i.host;if(!s){ke({state:r,name:o,owner:i.owner,revision:i.revision});continue}let a=ct({state:r,name:o,owner:i.owner,revision:i.revision,host:s});if(!a)continue;let c=ht(r,o,s.config.id,s.config);s.beginDisposal?.(),n.push(Promise.allSettled([c,s.dispose({strict:!0})]).then(u=>{let d=u.find(l=>l.status==="rejected");if(d)throw _e({state:r,name:o,retirement:a,result:{status:"failed",error:d.reason}}),d.reason;_e({state:r,name:o,retirement:a,result:{status:"retired"}}),ke({state:r,name:o,owner:i.owner,revision:i.revision})}))}await Promise.all(n)}function TE(t,e){EE(t,e)}function t2(t){let{state:e,desired:r,previousNames:n,previousHosts:o}=t,i=[],s=new Map;for(let[a,c]of r){let u=e.servers.get(a),d=u?ee(e,a,u):D(e,a);if(d?.owner.kind==="local"||d?.owner.kind==="registry"){TE(e,a);continue}u===o.get(a)&&n.has(a)&&kE(u.config,c)||(s.set(a,Ke(e,a,"plugin")),i.push(c))}return{reservedRevisions:s,toConnect:i}}async function r2(t,e,r){let n=r?.connect??Je,o=e.pluginServerSource,i=e.workspaceRoot??process.cwd();e.diagnostics=e.diagnostics.filter(h=>h.origin!=="plugin"),o&&XZ(o,e);let s=new Set(e.pluginServerNames);e.pluginServerHosts??=new Map;for(let[h,m]of e.pluginServerHosts){let g=e.servers.get(h);(g===void 0||g===m)&&ee(e,h,m)}let a=QZ(o,e,i,s);e.configDesiredRevisions??=new Map,e.configRevisions??=new Map;let c=new Map,u=new Set;for(let[h,m]of e.hostLeases)m.owner.kind==="plugin"&&(u.add(h),m.host&&c.set(h,m.host));await e2(a,u,e);let{reservedRevisions:d,toConnect:l}=t2({state:e,desired:a,previousNames:u,previousHosts:c});if(l.length===0)return;km.info(`Plugin MCP source: connecting ${l.length} server(s)`);let f=()=>e.currentLoad?.latestPi??t,p=h=>{let m=d.get(h.name);if(m===void 0||e.configDesiredRevisions.get(h.name)!==m)return!1;let g=D(e,h.name),v=g?.owner.kind!=="local"&&g?.owner.kind!=="registry";return v||TE(e,h.name),v};try{await n(l,e,f(),p,d,"plugin");for(let h of l)p(h)}catch{}finally{e.pluginServerNames=new Set([...e.hostLeases].filter(([,h])=>h.owner.kind==="plugin").map(([h])=>h)),N(f(),e),Se(e)}}function xm(t,e,r){e.pluginReconcileQueue??=Promise.resolve();let o=e.pluginReconcileQueue.then(()=>r2(t,e,r)).catch(i=>{km.warn(`Plugin MCP reconciliation failed: ${i instanceof Error?i.message:String(i)}`)});return e.pluginReconcileQueue=o,o}function AE(t,e){let{name:r,disabled:n,state:o,pi:i}=t,s=o.servers.get(r),a=s?ee(o,r,s):D(o,r);return a?.owner.kind!=="plugin"||a.host!==s?Promise.resolve():(o.sessionPluginDisabledOverrides.set(r,n),xm(o.currentLoad?.latestPi??i,o,e))}function ME(t,e){return{registerServerSource:r=>(e.pluginServerSource=r,xm(e.currentLoad?.latestPi??t,e),()=>{e.pluginServerSource===r&&(e.pluginServerSource=void 0,xm(e.currentLoad?.latestPi??t,e))})}}function o2(t,e){let n=n2.create(t,e).getManagedSettings().mcpServers;return new Set(Object.entries(n??{}).filter(([,o])=>o!==null).map(([o])=>o))}function $E(t){let{server:e,state:r,cwd:n,agentDir:o}=t;if(o2(n,o).has(e))return{kind:"blocked",message:`Cannot toggle "${e}": server is managed and cannot be modified`};let i=r.servers.get(e);if(!i)return{kind:"blocked",message:Pm(e)};if(cd(r.mcpConfigOverride).has(e))return{kind:"session"};if(Pr(i,r.pluginServerHosts,r.hostLeases)!=="local")return{kind:"session"};let s=wE(e,n,o);if(s.length===0)return{kind:"blocked",message:CE(e,n,o)};let{scopes:a,direct:c}=bE(s);return{kind:"local",scopes:a,direct:c}}async function IE(t){let{server:e,disable:r,state:n,pi:o}=t,i=n.servers.get(e);if(!i)return;let s=n.hostLeases?.get(e)??(n.pluginServerHosts?.get(e)===i?ee(n,e,i):void 0);if(s?.owner.kind==="plugin"&&s.host===i){await AE({name:e,disabled:r,state:n,pi:o});return}cd(n.mcpConfigOverride).has(e)&&n.sessionMcpConfigDisabledOverrides.set(e,r),i.config.registrySource!==void 0&&n.sessionRegistryDisabledOverrides.set(e,r);let a={...i.config,disabled:r};await Je([a],n,o,void 0,void 0,s?.owner.kind),Se(n)}async function OE(t){let{server:e,disable:r,scope:n,state:o,pi:i,cwd:s,agentDir:a}=t,c=RE(e,r,n,s,a);if(!c.ok)throw new Error(c.error);return await Tk(e,o,i,s,a),Se(o),c.overridden?{notice:PE(e)}:{}}import{DynamicBorder as P2}from"@augmentcode/auggie-v2";import{Key as x2,matchesKey as k2,SearchableWindowedList as E2,SpinnerTimer as T2,truncateToWidth as Hu,wrapTextWithAnsi as A2}from"@earendil-works/pi-tui";import{getSettingsTargetLabel as i2,scopeToSettingsTarget as s2}from"@augmentcode/auggie-v2";import{truncateToWidth as a2,visibleWidth as Kn,wrapTextWithAnsi as c2}from"@earendil-works/pi-tui";var u2=2,d2=2,Du={name:"Name",source:"Source",status:"Status"};function Em(t){if(t.disabled)return{label:"Disabled",color:"muted"};switch(t.status){case"success":return{label:`${t.tools.length} tools available`,color:"success"};case"failed":return{label:"Failed",color:"error"};case"auth_required":return{label:"Auth required",color:"warning",hint:" Press Enter for options"};case"disabled":return{label:"Disabled",color:"muted"};default:return{label:"Initializing",color:"text"}}}function Tm(t){return t.registrySource==="tenant"?"Shared":t.registrySource==="user"?"Private registry":t.source==="plugin"?"Plugin":t.source==="vfs"?"VFS":"User-configured"}function Am(t,e){let r=e-Kn(t);return r>0?t+" ".repeat(r):t}function Lu(t){return t.reduce((e,r)=>Math.max(e,Kn(r)),0)}function ei(t,e,r,n){let o=`${e}Width`,i=Math.min(Math.max(0,r-t[o]),n);return t[o]+=i,n-i}function zE(t,e){let r=Math.max(1,Math.floor(e)),n=Math.min(u2,r),o=r-n,i=Math.min(3,o),s=i<2?0:Math.min(d2,Math.floor((o-i)/(i-1))),a=o-s*Math.max(0,i-1),c=["name","source","status"].slice(0,i),u={prefixWidth:n,gapWidth:s,nameWidth:0,sourceWidth:0,statusWidth:0};for(let g of c)a=ei(u,g,1,a);for(let g=1;a>0;g++){let v=!1;for(let w of c)if(!(g>=Kn(Du[w]))&&(a=ei(u,w,g+1,a),v=!0,a===0))break;if(!v)break}let d=t.map(g=>Tm(g)),l=t.map(g=>Em(g)),f=Math.max(Kn(Du.source),Lu(d)),p=Math.max(Kn(Du.status),Lu(l.map(g=>g.label))),h=Math.max(Kn(Du.name),Lu(t.map(g=>g.name))),m=Math.max(p,Lu(l.map(g=>g.label+(g.hint??""))));return a=ei(u,"source",f,a),a=ei(u,"status",p,a),a=ei(u,"name",h,a),ei(u,"status",m,a),u}function NE(t,e,r){if(e<=r)return{start:0,end:e};let n=Math.floor(r/2),o=Math.max(0,Math.min(t-n,e-r));return{start:o,end:o+r}}function ti(t,e){let r=Math.max(1,Math.floor(e));return t.flatMap(n=>c2(n,r).map(o=>Kn(o)<=r?o:a2(o,r,"")))}function l2(t,e){return Math.max(0,t-e)}function ri(t,e,r){return Math.max(0,Math.min(t,l2(e,r)))}function DE(t,e,r){let n=ri(t,e,r),o=Math.min(e,n+r);return{start:n,end:o,aboveCount:n,belowCount:e-o,rangeLabel:`Rows ${n+1}-${o} of ${e}`}}function LE(t,e){return String(t+1).padStart(String(e).length," ")}function Mm(t){return i2(s2(t))}import{Key as f2,matchesKey as p2}from"@earendil-works/pi-tui";function ju(t){if(t.source==="plugin"&&t.disabled)return t.canAuthenticate?["authenticate","toggle"]:["toggle"];let e=t.transport==="stdio"?["viewTools","viewLogs"]:["viewTools"];return t.canAuthenticate&&e.unshift("authenticate"),e.push("toggle","reconnect"),e}function jE(){return{step:"serverList",filterQuery:"",selectedServer:null,actionIndex:0,toolIndex:0,logScrollOffset:0,authInput:"",targetScopes:[],targetIndex:0,pendingToggle:null}}var FE=10,Jn=15;var h2="k",m2="j";function ni(t,e){return(t%e+e)%e}function st(t,e){let r=t.findIndex(n=>n.name===e);return r>=0?r:0}function $m(t,e,r=!0){return e.matches(t,"tui.select.up")||r&&t===h2?{kind:"up"}:e.matches(t,"tui.select.down")||r&&t===m2?{kind:"down"}:e.matches(t,"tui.select.confirm")?{kind:"confirm"}:e.matches(t,"tui.select.cancel")?{kind:"cancel"}:p2(t,f2.backspace)?{kind:"back"}:{kind:"ignore"}}function g2(t,e,r){if(e.kind==="filterChanged")return{state:{...t,filterQuery:e.query,selectedServer:r[0]?.name??null}};let n=r.length;if(n===0)return e.kind==="cancel"?{state:t,effect:{kind:"close"}}:{state:t};switch(e.kind){case"up":{let o=ni(st(r,t.selectedServer)-1,n);return{state:{...t,selectedServer:r[o]?.name??null}}}case"down":{let o=ni(st(r,t.selectedServer)+1,n);return{state:{...t,selectedServer:r[o]?.name??null}}}case"confirm":{let o=r[st(r,t.selectedServer)];return o?.status==="auth_required"&&o.canAuthenticate?{state:t,effect:{kind:"authenticate",server:o.name}}:{state:{...t,step:"serverActions",actionIndex:0}}}case"cancel":return{state:t,effect:{kind:"close"}};default:return{state:t}}}function y2(t,e,r){let n=r.snapshots[st(r.snapshots,t.selectedServer)];if(!n)return{state:{...t,step:"serverList"}};let o=ju(n);switch(e.kind){case"up":return{state:{...t,actionIndex:ni(t.actionIndex-1,o.length)}};case"down":return{state:{...t,actionIndex:ni(t.actionIndex+1,o.length)}};case"cancel":case"back":return{state:{...t,step:"serverList"}};case"confirm":{let i=o[t.actionIndex];return i==="viewTools"?{state:{...t,step:"viewTools",toolIndex:0}}:i==="viewLogs"?{state:{...t,step:"viewLogs",logScrollOffset:0}}:i==="authenticate"?{state:t,effect:{kind:"authenticate",server:n.name}}:i==="toggle"?{state:t,effect:{kind:"toggle",server:n.name,disable:!n.disabled}}:{state:t,effect:{kind:"reconnect",server:n.name}}}default:return{state:t}}}function v2(t,e,r){let n=r.snapshots[st(r.snapshots,t.selectedServer)]?.tools.length??0;switch(e.kind){case"up":return{state:{...t,toolIndex:Math.max(0,t.toolIndex-1)}};case"down":return{state:{...t,toolIndex:Math.min(Math.max(0,n-1),t.toolIndex+1)}};case"cancel":case"back":return{state:{...t,step:"serverActions"}};default:return{state:t}}}function _2(t,e,r){let n=r.snapshots[st(r.snapshots,t.selectedServer)]?.logLines()??[],o=ti(n,r.logViewportWidth).length;switch(e.kind){case"up":return{state:{...t,logScrollOffset:ri(t.logScrollOffset-1,o,r.windowSize)}};case"down":return{state:{...t,logScrollOffset:ri(t.logScrollOffset+1,o,r.windowSize)}};case"cancel":case"back":return{state:{...t,step:"serverActions"}};default:return{state:t}}}function S2(t,e){return e.kind==="cancel"||e.kind==="back"?{state:{...t,step:"serverActions",authInput:""}}:{state:t}}function Fu(t,e){return{...t,step:e,targetScopes:[],targetIndex:0,pendingToggle:null}}function w2(t,e){let r=t.targetScopes.length;if(r===0)return{state:Fu(t,"serverActions")};switch(e.kind){case"up":return{state:{...t,targetIndex:ni(t.targetIndex-1,r)}};case"down":return{state:{...t,targetIndex:ni(t.targetIndex+1,r)}};case"cancel":case"back":return{state:Fu(t,"serverActions")};case"confirm":{let n=t.targetScopes[t.targetIndex],o=t.pendingToggle;return n&&o?{state:Fu({...t,actionIndex:0},"serverList"),effect:{kind:"toggleWrite",server:o.server,disable:o.disable,scope:n}}:{state:Fu(t,"serverActions")}}default:return{state:t}}}function UE(t,e,r){switch(t.step){case"serverList":return g2(t,e,r.snapshots);case"serverActions":return y2(t,e,r);case"viewTools":return v2(t,e,r);case"viewLogs":return _2(t,e,r);case"pasteAuthCode":return S2(t,e);case"selectTarget":return w2(t,e);default:return{state:t}}}import{truncateToWidth as Ut,visibleWidth as b2,wrapTextWithAnsi as an}from"@earendil-works/pi-tui";var Im="\u2192 ",Uu=" ";function qE(t,e,r){return e?r.bold(r.fg("accent",t)):r.fg("text",t)}function br(t,e){return e>0?Ut(t,e,"\u2026"):""}function HE(t,e,r,n,o,i,s){let a=Math.max(1,s),c=zE(r,a),u=" ".repeat(c.gapWidth),d=(h,m,g,v)=>{let w=[c.nameWidth>0?Am(m,c.nameWidth):"",c.sourceWidth>0?Am(g,c.sourceWidth):"",c.statusWidth>0?v:""].filter(b=>b.length>0);return h+w.join(u)},l=br(Uu,c.prefixWidth),p=[d(l,i.bold(i.fg("accent",br("Name",c.nameWidth))),i.bold(i.fg("accent",br("Source",c.sourceWidth))),i.bold(i.fg("accent",br("Status",c.statusWidth))))];if(e.length===0)p.push(Ut(i.fg("muted","No MCP servers available"),a,"\u2026"));else if(o.total===0)p.push(Ut(i.fg("muted","No matching MCP servers"),a,"\u2026"));else for(let h of n){let m=h.name===t.selectedServer,g=Em(h),v=br(g.label,c.statusWidth),w=c.statusWidth-b2(v),b=g.hint?br(g.hint,w):"",R=i.fg(g.color,v)+(b?i.fg("muted",b):""),_=br(m?Im:Uu,c.prefixWidth);p.push(d(m?i.fg("accent",_):_,qE(br(h.name,c.nameWidth),m,i),qE(br(Tm(h),c.sourceWidth),m,i),R))}return o.hasOverflow&&p.push(Ut(i.fg("muted",` (${o.current}/${o.total})`),a,"\u2026")),p}var R2={authenticate:{label:"Authenticate",description:"Connect to this server"},viewTools:{label:"View tools",description:"See all tools provided by this server"},viewLogs:{label:"View logs",description:"View logs from this server"},reconnect:{label:"Reconnect",description:"Restart the server connection"},toggle:{label:"Disable",description:"Enable or disable this server"}};function C2(t,e){if(t==="authenticate")return e.status==="auth_required"?{label:"Authenticate",description:"Connect to this server"}:{label:"Reauthenticate",description:"Refresh authentication"};if(t==="toggle"){let r=e.source!=="local";return e.disabled?r?{label:"Enable for this session",description:"Re-enable this server for the current session only"}:{label:"Enable",description:"Enable this server (saved to settings.json)"}:r?{label:"Disable for this session",description:"Disable this server for the current session only"}:{label:"Disable",description:"Disable this server (saved to settings.json)"}}return R2[t]}function GE(t,e,r,n){let o=Math.max(1,n),i=e[st(e,t.selectedServer)];if(!i)return an(r.fg("muted","No MCP servers available"),o);let s=i.transport==="stdio"?"Command: ":"URL: ",a=an(r.fg("muted",s+i.connectionInfo),o);i.source==="plugin"&&a.push(...an(r.fg("muted","Source: plugin (toggles apply to this session only)"),o)),a.push("");let c=ju(i);for(let[u,d]of c.entries()){let l=u===t.actionIndex,f=C2(d,i),p=f.label,h=l?r.bold(r.fg("accent",p)):r.fg("text",p);a.push(Ut((l?Im:Uu)+h+r.fg("muted",` - ${f.description}`),o,"\u2026"))}return a}function ZE(t,e,r,n){let o=Math.max(1,n),i=e[st(e,t.selectedServer)];if(!i)return an(r.fg("muted","No tools available."),o);if(i.disabled)return an(r.fg("muted","Server is disabled; no tools are currently available."),o);if(i.tools.length===0)return an(r.fg("muted","No tools available."),o);let s=i.tools.length,{start:a,end:c}=NE(t.toolIndex,s,Jn),u=[];for(let d=a;d<c;d++){let l=i.tools[d];if(!l)continue;let p=d===t.toolIndex?r.bold(r.fg("accent",l.name)):r.fg("text",l.name);u.push(Ut(r.fg("muted",`${LE(d,s)} `)+p+(l.disabled?r.fg("muted"," (disabled)"):""),o,"\u2026"))}return u}function BE(t,e,r,n){let o=Math.max(1,n),s=e[st(e,t.selectedServer)]?.logLines()??[];if(s.length===0)return an(r.fg("muted","No logs available yet."),o);let a=ti(s,o),c=a.length,u=DE(t.logScrollOffset,c,Jn),d=[];c>Jn&&d.push(Ut(r.fg("muted",u.rangeLabel),o,"\u2026")),u.aboveCount>0&&d.push(Ut(r.fg("dim",`\u2191 ${u.aboveCount} more rows`),o,"\u2026"));for(let l of a.slice(u.start,u.end))d.push(Ut(r.fg("text",l),o,""));return u.belowCount>0&&d.push(Ut(r.fg("dim",`\u2193 ${u.belowCount} more rows`),o,"\u2026")),d}function WE(t,e,r,n){let o=Math.max(1,n),i=e[st(e,t.selectedServer)]?.name??"",s=[...an(r.fg("muted",`Save the toggle for "${i}" to which settings file?`),o),""];for(let[a,c]of t.targetScopes.entries()){let u=a===t.targetIndex,d=u?r.bold(r.fg("accent",Mm(c))):r.fg("text",Mm(c));s.push(Ut((u?Im:Uu)+d,o,"\u2026"))}return s}var qu=3;function M2(t){return t.type==="stdio"?t.command:t.url}function $2(t){let e=t.getLogHistory();if(e.length===0){let r=t.lastError;return r?r.split(`
|
|
143
|
+
</html>`}function sE(t){return iE({title:"Authentication successful",heading:"Authentication successful",message:t,autoClose:!0})}function zu(t,e){return iE({title:"Authentication failed",heading:"Authentication failed",message:t,details:e})}var IZ="127.0.0.1",uE="/callback",aE=3e3,cE=3010,OZ="Authentication successful. You can close this window.",Nu={"Content-Type":"text/html; charset=utf-8"};function dE(t=process.env){return!!(t.SSH_CONNECTION||t.SSH_TTY)}function lE(t,e){let r=t.trim();if(!r)throw new Error("No authorization code provided");let n;try{n=new URL(r).searchParams}catch{(r.includes("code=")||r.includes("error="))&&(n=new URLSearchParams(r))}if(!n)return{kind:"success",result:new URLSearchParams({code:r,state:e})};let o=n.get("state");if(n.has("error")){if(o!==e)throw new Error("OAuth state mismatch");return{kind:"error",params:n}}if(!n.get("code"))throw new Error("Could not find an authorization code in the pasted input");if(o&&o!==e)throw new Error("OAuth state mismatch");return o===null&&n.set("state",e),{kind:"success",result:n}}function bm(t){let e=t.get("error")??"unknown_error",r=t.get("error_description");return new Error(`Authentication did not complete: ${e}${r?`: ${r}`:""}`)}function zZ(t,e,r){try{let n=new URL(t.url??"","http://localhost");if(n.pathname!==uE){e.writeHead(404,Nu),e.end(zu("Callback route not found."));return}let o=n.searchParams.get("code"),i=n.searchParams.get("state"),s=n.searchParams.get("error");if(s){let a=c=>{e.writeHead(400,Nu),e.end(zu("Authentication did not complete.",`Error: ${s}`));let u=bm(n.searchParams);c instanceof Error?u=c:c!==void 0&&(u=new Error(String(c))),r.onError(u)};r.onErrorRetry(n.searchParams).then(c=>{c?(e.writeHead(302,{Location:c}),e.end()):a()}).catch(c=>a(c));return}if(!o||!i){e.writeHead(400,Nu),e.end(zu("Missing code or state parameter.")),r.onError(new Error("OAuth callback missing code or state"));return}e.writeHead(200,Nu),e.end(sE(OZ)),r.onSuccess(n.searchParams)}catch{e.writeHead(500,{"Content-Type":"text/plain; charset=utf-8"}),e.end("Internal error")}}async function NZ(t){for(let e=aE;e<=cE;e++)if(await new Promise(n=>{let o=()=>{t.removeListener("listening",i),n(!1)},i=()=>{t.removeListener("error",o),n(!0)};t.once("error",o),t.once("listening",i),t.listen(e,IZ)}))return e;throw new Error(`No free port in ${aE}-${cE} for the OAuth callback server`)}async function fE(){let t=!1,e,r,n=new Promise((a,c)=>{e=u=>{t||(t=!0,a(u))},r=u=>{t||(t=!0,c(u))}}),o,i=$Z((a,c)=>{zZ(a,c,{onSuccess:u=>e?.(u),onError:u=>r?.(u),onErrorRetry:u=>o?.(u)??Promise.resolve(null)})}),s=await NZ(i);return{port:s,redirectUri:`http://localhost:${s}${uE}`,waitForCode:()=>n,cancelWait:()=>e?.(null),close:()=>i.close(),setErrorRetryHandler:a=>{o=a}}}var Rm=DZ.child({prefix:"pi-mcp"}),LZ=300*1e3,mE="MCP authentication was superseded";function pE(){return dE()?"You appear to be on a remote machine. Open the URL in a local browser, then paste the final redirect URL or code below.":"Complete sign-in in your browser. If it doesn't open, paste the final redirect URL or code below."}function wr(t){if(t.aborted)throw new Error("Authentication cancelled")}function gE(t,e,r){return t.authenticationGeneration===r.authenticationGeneration&&t.servers.get(e)===r.server&&(t.serverGenerations.get(e)??0)===r.serverGeneration&&(t.configRevisions.get(e)??0)===r.installedConfigRevision&&(t.configDesiredRevisions.get(e)??0)===r.desiredConfigRevision&&t.tokens===r.tokenStore&&t.tokens.get(e)===r.token&&yE(t.credentialRevisions.get(e),r.credentialRevision)}function yE(t,e){return t?.revision===e?.revision&&t?.domain===e?.domain}function hE(t,e,r){if(!gE(t,e,r))throw new Error(mE)}async function jZ(t,e,r,n,o,i,s){let a=t.servers.get(e),c=t.tokens,u=c.get(e),d=t.credentialRevisions.get(e);if(c!==r.tokenStore||!a||!u||!pt(r.server.config,a.config))return;let l=a.config,f=Gt(t,a);try{let p=await c.restoreAfterSupersededAuthentication(e,o,u,n,i,f);if(p===void 0||t.tokens!==c||t.servers.get(e)?.config!==l||c.get(e)!==u||!kr(Gt(t,a),f)||!yE(t.credentialRevisions.get(e),d)||c.reconcileCredentialIdentity?.(e,u,f)!==!0)return;un({state:t,name:e,revision:p}),N(t.currentLoad?.latestPi??s,t)}catch{Rm.error(`Failed to restore authoritative MCP OAuth token for "${e}" after superseded authentication`)}}function FZ(t){let e=t.serverMetadata;if(!e.authorization_endpoint||!e.token_endpoint)throw new Error("Authorization server metadata is missing required endpoints");let r=t.client.client_secret,n=t.client.token_endpoint_auth_method;return{accessToken:t.accessToken,refreshToken:t.refreshToken,expiresAt:t.expiresAt,tokenType:t.tokenType,scope:t.scope,resource:t.resource,serverMetadata:{issuer:e.issuer,authorization_endpoint:e.authorization_endpoint,token_endpoint:e.token_endpoint},client:{client_id:t.client.client_id,...typeof r=="string"?{client_secret:r}:{},...typeof n=="string"?{token_endpoint_auth_method:n}:{}}}}function UZ(t,e,r,n){return new Promise((o,i)=>{let s=!1,a,c=()=>{a&&clearTimeout(a),e.signal.removeEventListener("abort",d),t.cancelWait()},u=m=>{s||(s=!0,c(),m())},d=()=>u(()=>i(new Error("Authentication cancelled"))),l=()=>{a&&clearTimeout(a),a=setTimeout(()=>u(()=>i(new Error("Authentication timed out"))),LZ)},f=m=>{let g=m instanceof Error?m.message:String(m);u(()=>i(new Error(`Could not read the pasted authorization code (${g}). Restart sign-in and paste the full redirect URL.`)))},p=async(m,g)=>{let v=await n(m,l);if(!s){if(v){h(g);return}u(()=>i(bm(m)))}},h=(m=e.waitForManualCode())=>{m.then(async g=>{if(!(s||!g))try{let v=lE(g,r());if(v.kind==="success"){u(()=>o(v.result));return}let w=e.waitForManualCode();await p(v.params,w)}catch(v){f(v)}}).catch(g=>u(()=>i(g instanceof Error?g:new Error(String(g)))))};if(t.setErrorRetryHandler(m=>n(m,l)),l(),e.signal.aborted){u(()=>i(new Error("Authentication cancelled")));return}e.signal.addEventListener("abort",d),t.waitForCode().then(m=>{m&&u(()=>o(m))}).catch(m=>u(()=>i(m instanceof Error?m:new Error(String(m))))),h()})}async function vE(t){let{serverName:e,state:r,pi:n,controller:o}=t,i=r.servers.get(e);if(!i)throw new Error(`Unknown MCP server "${e}"`);let s=i.config;if(s.type!=="http"&&s.type!=="sse")throw new Error(`MCP server "${e}" does not use OAuth authentication`);if(r.authenticating)throw new Error("Another MCP authentication is already in progress");r.authenticating=!0,r.authenticatingServerName=e;let a=++r.authenticationGeneration,c={authenticationGeneration:a,server:i,serverGeneration:r.serverGenerations.get(e)??0,installedConfigRevision:r.configRevisions.get(e)??0,desiredConfigRevision:r.configDesiredRevisions.get(e)??0,tokenStore:r.tokens,token:r.tokens.get(e),credentialRevision:r.credentialRevisions.get(e)},u=Gt(r,i),d;try{wr(o.signal),d=await fE(),wr(o.signal);let l=new URL(s.url),f,p;try{f=await Kd(l),wr(o.signal),p=await Jd(f),wr(o.signal)}catch(be){wr(o.signal);let qt=xi(be);throw qt?ki(qt):new Error(`OAuth discovery failed for MCP server "${e}". Verify that the endpoint supports OAuth and publishes discovery metadata.`)}let h=await c.tokenStore.captureAuthenticatedIdentityVersion(u);hE(r,e,c),wr(o.signal);let m=await Yd({config:s.clientId?{clientId:s.clientId}:{},serverMetadata:p,redirectUris:[d.redirectUri],preferStaticClient:s.registrySource===void 0});wr(o.signal);let g=await Na(l,m,p,d.redirectUri,f.resourceScopes?.join(" "),f.resourceIdentifier?new URL(f.resourceIdentifier):void 0);wr(o.signal);let v=g,w=!1,b,R,_=(be,qt)=>{if(w)return R&&b&&Da(be,b)?R.then(lt=>lt.authUri.toString()):Promise.resolve(null);if(!Da(be,v))return Promise.resolve(null);w=!0;let cn=v;return b=cn,qt(),Rm.info(`MCP server "${e}" rejected offline_access (invalid_scope); retrying authorization without it`),R=Xd(cn).then(lt=>(v=lt,o.onAuthUrl({url:lt.authUri.toString(),instructions:pE()}),lt)),R.then(lt=>lt.authUri.toString())};d.setErrorRetryHandler(be=>_(be,()=>{})),o.onAuthUrl({url:g.authUri.toString(),instructions:pE()}),wr(o.signal),await oE(g.authUri.toString());let C=await UZ(d,o,()=>v.state,_),I=await Qd(C,v);hE(r,e,c);let Q=FZ(I),pe=await c.tokenStore.persistAuthenticated(e,Q,u,h);if(!gE(r,e,c))throw await jZ(r,e,c,u,Q,pe,n),new Error(mE);c.tokenStore.commit(e,Q,u),r.preservedCredentialIdentities?.delete(e),un({state:r,name:e,revision:pe}),r.tokens.clearAuthRequired(e),at(r,e),await Xs([e],r,n),N(r.currentLoad?.latestPi??n,r),Se(r),Rm.info(`MCP server "${e}" authenticated`)}finally{d?.close(),r.authenticationGeneration===a&&(r.authenticating=!1,r.authenticatingServerName=void 0)}}import{SettingsManager as n2}from"@augmentcode/auggie-v2";import{resolveTargetFiles as qZ,SETTINGS_TARGET_ORDER as HZ,SettingsManager as GZ,scopeToSettingsTarget as ZZ,settingsTargetToScope as Cm}from"@augmentcode/auggie-v2";var BZ=HZ.map(t=>Cm(t)),_E=(t,e)=>GZ.create(t,e);function SE(t,e){switch(e){case"global":return t.getGlobalSettings().mcpServers;case"project":return t.getProjectSettings().mcpServers;case"local":return t.getLocalSettings().mcpServers;case"managed":return t.getManagedSettings().mcpServers}}function wE(t,e,r){let n=_E(e,r);return BZ.filter(o=>SE(n,o)?.[t])}function bE(t){let e=t.map(n=>({target:ZZ(n),path:n,exists:!0})),r=qZ({files:e});return"directTarget"in r?{scopes:t,direct:Cm(r.directTarget)}:{scopes:r.files.map(n=>Cm(n.target)),direct:null}}function WZ(t,e,r){let{servers:n}=to(e,r);return n.find(o=>o.name===t)?.disabled===!0}function RE(t,e,r,n,o){try{let i=_E(n,o);if(!SE(i,r)?.[t])return{ok:!1,error:`Server "${t}" not found in ${r} settings`};i.update(r,{path:["mcpServers",t,"disabled"],value:e})}catch(i){return{ok:!1,error:i instanceof Error?i.message:String(i)}}return{ok:!0,overridden:WZ(t,n,o)!==e}}function Pm(t){return`Cannot toggle "${t}": server is not in any editable settings file`}function CE(t,e,r){return Pm(t)}function PE(t){return`Saved toggle for "${t}", but a higher-priority settings file overrides it`}import{logger as VZ}from"@hermes/logger";var km=VZ.child({prefix:"pi-mcp"}),xE="hermes:mcp:register-server-source";function KZ(t,e){return t.type==="stdio"?Bt(t,e):Zt(t,e)}function kE(t,e){return JSON.stringify(t)===JSON.stringify(e)}function JZ(t,e){return{...t,disabled:e}}function YZ(t){try{return t.getServers()}catch(e){return km.warn(`plugin MCP server source getServers() threw: ${e instanceof Error?e.message:String(e)}`),[]}}function XZ(t,e){if(t.getDiagnostics)try{for(let r of t.getDiagnostics())e.diagnostics.push({message:r.message,origin:"plugin"})}catch{}}function EE(t,e){t.diagnostics.push({server:e,message:`plugin MCP server "${e}" is shadowed by an existing MCP server of the same name; skipping`,origin:"plugin"})}function QZ(t,e,r,n){let o=new Map;if(!t)return o;for(let i of YZ(t)){let s=e.servers.get(i.name),a=KZ(i,r),c=e.sessionPluginDisabledOverrides.get(i.name),u=JZ(a,c??a.disabled===!0),d=e.pluginServerHosts.get(i.name);s&&d===s&&ee(e,i.name,s);let l=D(e,i.name),f=s!==void 0&&l?.owner.kind==="plugin"&&l.host===s,p=s!==void 0&&d===void 0&&n.has(i.name)&&kE(s.config,u);p&&(ee(e,i.name,s),Ym({state:e,name:i.name,host:s}));let h=l?.owner.kind==="vfs";if(s&&!(f||p||h)){e.pluginServerNames.delete(i.name),e.pluginServerHosts.delete(i.name),EE(e,i.name);continue}o.has(i.name)||o.set(i.name,u)}return o}async function e2(t,e,r){let n=[];for(let o of e){if(t.has(o))continue;r.sessionPluginDisabledOverrides.delete(o);let i=D(r,o);if(i?.owner.kind!=="plugin")continue;let s=i.host;if(!s){ke({state:r,name:o,owner:i.owner,revision:i.revision});continue}let a=ct({state:r,name:o,owner:i.owner,revision:i.revision,host:s});if(!a)continue;let c=ht(r,o,s.config.id,s.config);s.beginDisposal?.(),n.push(Promise.allSettled([c,s.dispose({strict:!0})]).then(u=>{let d=u.find(l=>l.status==="rejected");if(d)throw _e({state:r,name:o,retirement:a,result:{status:"failed",error:d.reason}}),d.reason;_e({state:r,name:o,retirement:a,result:{status:"retired"}}),ke({state:r,name:o,owner:i.owner,revision:i.revision})}))}await Promise.all(n)}function TE(t,e){EE(t,e)}function t2(t){let{state:e,desired:r,previousNames:n,previousHosts:o}=t,i=[],s=new Map;for(let[a,c]of r){let u=e.servers.get(a),d=u?ee(e,a,u):D(e,a);if(d?.owner.kind==="local"||d?.owner.kind==="registry"){TE(e,a);continue}u===o.get(a)&&n.has(a)&&kE(u.config,c)||(s.set(a,Ke(e,a,"plugin")),i.push(c))}return{reservedRevisions:s,toConnect:i}}async function r2(t,e,r){let n=r?.connect??Je,o=e.pluginServerSource,i=e.workspaceRoot??process.cwd();e.diagnostics=e.diagnostics.filter(h=>h.origin!=="plugin"),o&&XZ(o,e);let s=new Set(e.pluginServerNames);e.pluginServerHosts??=new Map;for(let[h,m]of e.pluginServerHosts){let g=e.servers.get(h);(g===void 0||g===m)&&ee(e,h,m)}let a=QZ(o,e,i,s);e.configDesiredRevisions??=new Map,e.configRevisions??=new Map;let c=new Map,u=new Set;for(let[h,m]of e.hostLeases)m.owner.kind==="plugin"&&(u.add(h),m.host&&c.set(h,m.host));await e2(a,u,e);let{reservedRevisions:d,toConnect:l}=t2({state:e,desired:a,previousNames:u,previousHosts:c});if(l.length===0)return;km.info(`Plugin MCP source: connecting ${l.length} server(s)`);let f=()=>e.currentLoad?.latestPi??t,p=h=>{let m=d.get(h.name);if(m===void 0||e.configDesiredRevisions.get(h.name)!==m)return!1;let g=D(e,h.name),v=g?.owner.kind!=="local"&&g?.owner.kind!=="registry";return v||TE(e,h.name),v};try{await n(l,e,f(),p,d,"plugin");for(let h of l)p(h)}catch{}finally{e.pluginServerNames=new Set([...e.hostLeases].filter(([,h])=>h.owner.kind==="plugin").map(([h])=>h)),N(f(),e),Se(e)}}function xm(t,e,r){e.pluginReconcileQueue??=Promise.resolve();let o=e.pluginReconcileQueue.then(()=>r2(t,e,r)).catch(i=>{km.warn(`Plugin MCP reconciliation failed: ${i instanceof Error?i.message:String(i)}`)});return e.pluginReconcileQueue=o,o}function AE(t,e){let{name:r,disabled:n,state:o,pi:i}=t,s=o.servers.get(r),a=s?ee(o,r,s):D(o,r);return a?.owner.kind!=="plugin"||a.host!==s?Promise.resolve():(o.sessionPluginDisabledOverrides.set(r,n),xm(o.currentLoad?.latestPi??i,o,e))}function ME(t,e){return{registerServerSource:r=>(e.pluginServerSource=r,xm(e.currentLoad?.latestPi??t,e),()=>{e.pluginServerSource===r&&(e.pluginServerSource=void 0,xm(e.currentLoad?.latestPi??t,e))})}}function o2(t,e){let n=n2.create(t,e).getManagedSettings().mcpServers;return new Set(Object.entries(n??{}).filter(([,o])=>o!==null).map(([o])=>o))}function $E(t){let{server:e,state:r,cwd:n,agentDir:o}=t;if(o2(n,o).has(e))return{kind:"blocked",message:`Cannot toggle "${e}": server is managed and cannot be modified`};let i=r.servers.get(e);if(!i)return{kind:"blocked",message:Pm(e)};if(cd(r.mcpConfigOverride).has(e))return{kind:"session"};if(Pr(i,r.pluginServerHosts,r.hostLeases)!=="local")return{kind:"session"};let s=wE(e,n,o);if(s.length===0)return{kind:"blocked",message:CE(e,n,o)};let{scopes:a,direct:c}=bE(s);return{kind:"local",scopes:a,direct:c}}async function IE(t){let{server:e,disable:r,state:n,pi:o}=t,i=n.servers.get(e);if(!i)return;let s=n.hostLeases?.get(e)??(n.pluginServerHosts?.get(e)===i?ee(n,e,i):void 0);if(s?.owner.kind==="plugin"&&s.host===i){await AE({name:e,disabled:r,state:n,pi:o});return}cd(n.mcpConfigOverride).has(e)&&n.sessionMcpConfigDisabledOverrides.set(e,r),i.config.registrySource!==void 0&&n.sessionRegistryDisabledOverrides.set(e,r);let a={...i.config,disabled:r};await Je([a],n,o,void 0,void 0,s?.owner.kind),Se(n)}async function OE(t){let{server:e,disable:r,scope:n,state:o,pi:i,cwd:s,agentDir:a}=t,c=RE(e,r,n,s,a);if(!c.ok)throw new Error(c.error);return await Tk(e,o,i,s,a),Se(o),c.overridden?{notice:PE(e)}:{}}import{DynamicBorder as P2}from"@augmentcode/auggie-v2";import{Key as x2,matchesKey as k2,SearchableWindowedList as E2,SpinnerTimer as T2,truncateToWidth as Hu,wrapTextWithAnsi as A2}from"@earendil-works/pi-tui";import{getSettingsTargetLabel as i2,scopeToSettingsTarget as s2}from"@augmentcode/auggie-v2";import{truncateToWidth as a2,visibleWidth as Kn,wrapTextWithAnsi as c2}from"@earendil-works/pi-tui";var u2=2,d2=2,Du={name:"Name",source:"Source",status:"Status"};function Em(t){if(t.disabled)return{label:"Disabled",color:"muted"};switch(t.status){case"success":return{label:`${t.tools.length} tools available`,color:"success"};case"failed":return{label:"Failed",color:"error"};case"auth_required":return{label:"Auth required",color:"warning",hint:" Press Enter for options"};case"disabled":return{label:"Disabled",color:"muted"};default:return{label:"Initializing",color:"text"}}}function Tm(t){return t.registrySource==="tenant"?"Shared":t.registrySource==="user"?"Private registry":t.source==="plugin"?"Plugin":t.source==="vfs"?"VFS":"User-configured"}function Am(t,e){let r=e-Kn(t);return r>0?t+" ".repeat(r):t}function Lu(t){return t.reduce((e,r)=>Math.max(e,Kn(r)),0)}function ei(t,e,r,n){let o=`${e}Width`,i=Math.min(Math.max(0,r-t[o]),n);return t[o]+=i,n-i}function zE(t,e){let r=Math.max(1,Math.floor(e)),n=Math.min(u2,r),o=r-n,i=Math.min(3,o),s=i<2?0:Math.min(d2,Math.floor((o-i)/(i-1))),a=o-s*Math.max(0,i-1),c=["name","source","status"].slice(0,i),u={prefixWidth:n,gapWidth:s,nameWidth:0,sourceWidth:0,statusWidth:0};for(let g of c)a=ei(u,g,1,a);for(let g=1;a>0;g++){let v=!1;for(let w of c)if(!(g>=Kn(Du[w]))&&(a=ei(u,w,g+1,a),v=!0,a===0))break;if(!v)break}let d=t.map(g=>Tm(g)),l=t.map(g=>Em(g)),f=Math.max(Kn(Du.source),Lu(d)),p=Math.max(Kn(Du.status),Lu(l.map(g=>g.label))),h=Math.max(Kn(Du.name),Lu(t.map(g=>g.name))),m=Math.max(p,Lu(l.map(g=>g.label+(g.hint??""))));return a=ei(u,"source",f,a),a=ei(u,"status",p,a),a=ei(u,"name",h,a),ei(u,"status",m,a),u}function NE(t,e,r){if(e<=r)return{start:0,end:e};let n=Math.floor(r/2),o=Math.max(0,Math.min(t-n,e-r));return{start:o,end:o+r}}function ti(t,e){let r=Math.max(1,Math.floor(e));return t.flatMap(n=>c2(n,r).map(o=>Kn(o)<=r?o:a2(o,r,"")))}function l2(t,e){return Math.max(0,t-e)}function ri(t,e,r){return Math.max(0,Math.min(t,l2(e,r)))}function DE(t,e,r){let n=ri(t,e,r),o=Math.min(e,n+r);return{start:n,end:o,aboveCount:n,belowCount:e-o,rangeLabel:`Rows ${n+1}-${o} of ${e}`}}function LE(t,e){return String(t+1).padStart(String(e).length," ")}function Mm(t){return i2(s2(t))}import{Key as f2,matchesKey as p2}from"@earendil-works/pi-tui";function ju(t){if(t.source==="plugin"&&t.disabled)return t.canAuthenticate?["authenticate","toggle"]:["toggle"];let e=t.transport==="stdio"?["viewTools","viewLogs"]:["viewTools"];return t.canAuthenticate&&e.unshift("authenticate"),e.push("toggle","reconnect"),e}function jE(){return{step:"serverList",filterQuery:"",selectedServer:null,actionIndex:0,toolIndex:0,logScrollOffset:0,authInput:"",targetScopes:[],targetIndex:0,pendingToggle:null}}var FE=10,Jn=15;var h2="k",m2="j";function ni(t,e){return(t%e+e)%e}function st(t,e){let r=t.findIndex(n=>n.name===e);return r>=0?r:0}function $m(t,e,r=!0){return e.matches(t,"tui.select.up")||r&&t===h2?{kind:"up"}:e.matches(t,"tui.select.down")||r&&t===m2?{kind:"down"}:e.matches(t,"tui.select.confirm")?{kind:"confirm"}:e.matches(t,"tui.select.cancel")?{kind:"cancel"}:p2(t,f2.backspace)?{kind:"back"}:{kind:"ignore"}}function g2(t,e,r){if(e.kind==="filterChanged")return{state:{...t,filterQuery:e.query,selectedServer:r[0]?.name??null}};let n=r.length;if(n===0)return e.kind==="cancel"?{state:t,effect:{kind:"close"}}:{state:t};switch(e.kind){case"up":{let o=ni(st(r,t.selectedServer)-1,n);return{state:{...t,selectedServer:r[o]?.name??null}}}case"down":{let o=ni(st(r,t.selectedServer)+1,n);return{state:{...t,selectedServer:r[o]?.name??null}}}case"confirm":{let o=r[st(r,t.selectedServer)];return o?.status==="auth_required"&&o.canAuthenticate?{state:t,effect:{kind:"authenticate",server:o.name}}:{state:{...t,step:"serverActions",actionIndex:0}}}case"cancel":return{state:t,effect:{kind:"close"}};default:return{state:t}}}function y2(t,e,r){let n=r.snapshots[st(r.snapshots,t.selectedServer)];if(!n)return{state:{...t,step:"serverList"}};let o=ju(n);switch(e.kind){case"up":return{state:{...t,actionIndex:ni(t.actionIndex-1,o.length)}};case"down":return{state:{...t,actionIndex:ni(t.actionIndex+1,o.length)}};case"cancel":case"back":return{state:{...t,step:"serverList"}};case"confirm":{let i=o[t.actionIndex];return i==="viewTools"?{state:{...t,step:"viewTools",toolIndex:0}}:i==="viewLogs"?{state:{...t,step:"viewLogs",logScrollOffset:0}}:i==="authenticate"?{state:t,effect:{kind:"authenticate",server:n.name}}:i==="toggle"?{state:t,effect:{kind:"toggle",server:n.name,disable:!n.disabled}}:{state:t,effect:{kind:"reconnect",server:n.name}}}default:return{state:t}}}function v2(t,e,r){let n=r.snapshots[st(r.snapshots,t.selectedServer)]?.tools.length??0;switch(e.kind){case"up":return{state:{...t,toolIndex:Math.max(0,t.toolIndex-1)}};case"down":return{state:{...t,toolIndex:Math.min(Math.max(0,n-1),t.toolIndex+1)}};case"cancel":case"back":return{state:{...t,step:"serverActions"}};default:return{state:t}}}function _2(t,e,r){let n=r.snapshots[st(r.snapshots,t.selectedServer)]?.logLines()??[],o=ti(n,r.logViewportWidth).length;switch(e.kind){case"up":return{state:{...t,logScrollOffset:ri(t.logScrollOffset-1,o,r.windowSize)}};case"down":return{state:{...t,logScrollOffset:ri(t.logScrollOffset+1,o,r.windowSize)}};case"cancel":case"back":return{state:{...t,step:"serverActions"}};default:return{state:t}}}function S2(t,e){return e.kind==="cancel"||e.kind==="back"?{state:{...t,step:"serverActions",authInput:""}}:{state:t}}function Fu(t,e){return{...t,step:e,targetScopes:[],targetIndex:0,pendingToggle:null}}function w2(t,e){let r=t.targetScopes.length;if(r===0)return{state:Fu(t,"serverActions")};switch(e.kind){case"up":return{state:{...t,targetIndex:ni(t.targetIndex-1,r)}};case"down":return{state:{...t,targetIndex:ni(t.targetIndex+1,r)}};case"cancel":case"back":return{state:Fu(t,"serverActions")};case"confirm":{let n=t.targetScopes[t.targetIndex],o=t.pendingToggle;return n&&o?{state:Fu({...t,actionIndex:0},"serverList"),effect:{kind:"toggleWrite",server:o.server,disable:o.disable,scope:n}}:{state:Fu(t,"serverActions")}}default:return{state:t}}}function UE(t,e,r){switch(t.step){case"serverList":return g2(t,e,r.snapshots);case"serverActions":return y2(t,e,r);case"viewTools":return v2(t,e,r);case"viewLogs":return _2(t,e,r);case"pasteAuthCode":return S2(t,e);case"selectTarget":return w2(t,e);default:return{state:t}}}import{truncateToWidth as Ut,visibleWidth as b2,wrapTextWithAnsi as an}from"@earendil-works/pi-tui";var Im="\u2192 ",Uu=" ";function qE(t,e,r){return e?r.bold(r.fg("accent",t)):r.fg("text",t)}function br(t,e){return e>0?Ut(t,e,"\u2026"):""}function HE(t,e,r,n,o,i,s){let a=Math.max(1,s),c=zE(r,a),u=" ".repeat(c.gapWidth),d=(h,m,g,v)=>{let w=[c.nameWidth>0?Am(m,c.nameWidth):"",c.sourceWidth>0?Am(g,c.sourceWidth):"",c.statusWidth>0?v:""].filter(b=>b.length>0);return h+w.join(u)},l=br(Uu,c.prefixWidth),p=[d(l,i.bold(i.fg("accent",br("Name",c.nameWidth))),i.bold(i.fg("accent",br("Source",c.sourceWidth))),i.bold(i.fg("accent",br("Status",c.statusWidth))))];if(e.length===0)p.push(Ut(i.fg("muted","No MCP servers available"),a,"\u2026"));else if(o.total===0)p.push(Ut(i.fg("muted","No matching MCP servers"),a,"\u2026"));else for(let h of n){let m=h.name===t.selectedServer,g=Em(h),v=br(g.label,c.statusWidth),w=c.statusWidth-b2(v),b=g.hint?br(g.hint,w):"",R=i.fg(g.color,v)+(b?i.fg("muted",b):""),_=br(m?Im:Uu,c.prefixWidth);p.push(d(m?i.fg("accent",_):_,qE(br(h.name,c.nameWidth),m,i),qE(br(Tm(h),c.sourceWidth),m,i),R))}return o.hasOverflow&&p.push(Ut(i.fg("muted",` (${o.current}/${o.total})`),a,"\u2026")),p}var R2={authenticate:{label:"Authenticate",description:"Connect to this server"},viewTools:{label:"View tools",description:"See all tools provided by this server"},viewLogs:{label:"View logs",description:"View logs from this server"},reconnect:{label:"Reconnect",description:"Restart the server connection"},toggle:{label:"Disable",description:"Enable or disable this server"}};function C2(t,e){if(t==="authenticate")return e.status==="auth_required"?{label:"Authenticate",description:"Connect to this server"}:{label:"Reauthenticate",description:"Refresh authentication"};if(t==="toggle"){let r=e.source!=="local";return e.disabled?r?{label:"Enable for this session",description:"Re-enable this server for the current session only"}:{label:"Enable",description:"Enable this server (saved to settings.json)"}:r?{label:"Disable for this session",description:"Disable this server for the current session only"}:{label:"Disable",description:"Disable this server (saved to settings.json)"}}return R2[t]}function GE(t,e,r,n){let o=Math.max(1,n),i=e[st(e,t.selectedServer)];if(!i)return an(r.fg("muted","No MCP servers available"),o);let s=i.transport==="stdio"?"Command: ":"URL: ",a=an(r.fg("muted",s+i.connectionInfo),o);i.source==="plugin"&&a.push(...an(r.fg("muted","Source: plugin (toggles apply to this session only)"),o)),a.push("");let c=ju(i);for(let[u,d]of c.entries()){let l=u===t.actionIndex,f=C2(d,i),p=f.label,h=l?r.bold(r.fg("accent",p)):r.fg("text",p);a.push(Ut((l?Im:Uu)+h+r.fg("muted",` - ${f.description}`),o,"\u2026"))}return a}function ZE(t,e,r,n){let o=Math.max(1,n),i=e[st(e,t.selectedServer)];if(!i)return an(r.fg("muted","No tools available."),o);if(i.disabled)return an(r.fg("muted","Server is disabled; no tools are currently available."),o);if(i.tools.length===0)return an(r.fg("muted","No tools available."),o);let s=i.tools.length,{start:a,end:c}=NE(t.toolIndex,s,Jn),u=[];for(let d=a;d<c;d++){let l=i.tools[d];if(!l)continue;let p=d===t.toolIndex?r.bold(r.fg("accent",l.name)):r.fg("text",l.name);u.push(Ut(r.fg("muted",`${LE(d,s)} `)+p+(l.disabled?r.fg("muted"," (disabled)"):""),o,"\u2026"))}return u}function BE(t,e,r,n){let o=Math.max(1,n),s=e[st(e,t.selectedServer)]?.logLines()??[];if(s.length===0)return an(r.fg("muted","No logs available yet."),o);let a=ti(s,o),c=a.length,u=DE(t.logScrollOffset,c,Jn),d=[];c>Jn&&d.push(Ut(r.fg("muted",u.rangeLabel),o,"\u2026")),u.aboveCount>0&&d.push(Ut(r.fg("dim",`\u2191 ${u.aboveCount} more rows`),o,"\u2026"));for(let l of a.slice(u.start,u.end))d.push(Ut(r.fg("text",l),o,""));return u.belowCount>0&&d.push(Ut(r.fg("dim",`\u2193 ${u.belowCount} more rows`),o,"\u2026")),d}function WE(t,e,r,n){let o=Math.max(1,n),i=e[st(e,t.selectedServer)]?.name??"",s=[...an(r.fg("muted",`Save the toggle for "${i}" to which settings file?`),o),""];for(let[a,c]of t.targetScopes.entries()){let u=a===t.targetIndex,d=u?r.bold(r.fg("accent",Mm(c))):r.fg("text",Mm(c));s.push(Ut((u?Im:Uu)+d,o,"\u2026"))}return s}var qu=3;function M2(t){return t.type==="stdio"?t.command:t.url}function $2(t){let e=t.getLogHistory();if(e.length===0){let r=t.lastError;return r?r.split(`
|
|
144
144
|
`).map(n=>n.trimEnd()).filter(n=>n.length>0):[]}return e.flatMap(r=>r.split(`
|
|
145
145
|
`)).map(r=>r.trimEnd()).filter(r=>r.length>0)}function VE(t){return t.disabled?2:t.status==="auth_required"?0:1}function I2(t){let e=[];for(let r of t.servers.values())e.push({name:r.name,status:r.status,transport:r.config.type,source:Pr(r,t.pluginServerHosts,t.hostLeases),registrySource:r.config.registrySource,disabled:r.config.disabled===!0,canAuthenticate:r.config.type!=="stdio",tools:r.tools.map(n=>({name:n.name,disabled:!1})),connectionInfo:M2(r.config),logLines:()=>$2(r)});return e.sort((r,n)=>VE(r)-VE(n)),e}function O2(t,e){let r=e[st(e,t.selectedServer)]?.name??"";switch(t.step){case"serverActions":return`MCP Servers \u203A ${r}`;case"viewTools":return`MCP Servers \u203A ${r} \u203A Tools`;case"viewLogs":return`MCP Servers \u203A ${r} \u203A Logs`;case"selectTarget":return`MCP Servers \u203A ${r} \u203A Settings file`;default:return"MCP Servers"}}function z2(t){switch(t){case"serverList":return"Type to filter \xB7 \u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Close";case"serverActions":case"selectTarget":return"\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back";default:return"\u2191\u2193 Navigate \xB7 Esc Back"}}function N2(t,e,r,n,o){switch(t.step){case"serverActions":return GE(t,e,n,o);case"viewTools":return ZE(t,e,n,o);case"viewLogs":return BE(t,e,n,o);case"selectTarget":return WE(t,e,n,o);default:return HE(t,e,r.getMatchingItems(),r.getVisibleItems(),r.getMetadata(),n,o)}}function D2(t,e,r,n,o){let i=Math.max(1,o),s=Hu(n.bold(n.fg("accent",O2(t,e))),i,"\u2026"),a=t.step==="serverList"&&i>=qu?[...r.renderInput(i),""]:[],c=N2(t,e,r,n,i);return[s,"",...a,...c,"",Hu(n.fg("muted",z2(t.step)),i,"\u2026")]}function L2(t,e,r,n,o){let i=Math.max(1,o),s=n.bold(n.fg("accent",`MCP Servers \u203A ${t}`)),a=`${n.fg("accent",r)} ${n.fg("text",`${e} ${t}\u2026`)}`;return[Hu(s,i,"\u2026"),"",Hu(a,i,"\u2026")]}function j2(){let t;return{promise:new Promise(r=>{t=r}),resolve:t}}function F2(t,e,r){let n=s=>s.flatMap(a=>A2(a,Math.max(1,r))),o=e.bold(e.fg("accent",`MCP Servers \u203A ${t.server} \u203A Authenticate`));if(t.status==="error")return n([o,"",e.fg("error","Authentication failed"),e.fg("muted",t.error??"Unknown error"),"",e.fg("muted","Press any key to dismiss")]);let i=[o,"",e.fg("text","Opening your browser to sign in\u2026")];return t.url&&i.push(e.fg("accent",t.url)),t.instructions&&i.push(e.fg("muted",t.instructions)),i.push("",`${e.fg("text","Paste code or redirect URL: ")}${e.fg("accent",t.input)}`,"",e.fg("muted","Enter Submit \xB7 Esc Cancel")),n(i)}function U2(t){return t.length>0&&!t.startsWith("\x1B")&&t>=" "}function KE(t){return t?"Disabling":"Enabling"}function JE(t,e){return`Failed to toggle "${t}": ${e instanceof Error?e.message:String(e)}`}var Om=class{state=jE();config;border;serverList;busy=null;spinner;opDone;authenticating=null;authStatus="pending";authUrl;authInstructions;authError;authAbort;manualCode;queuedManualCodes=[];authInPaste=!1;authPasteBuffer="";authDone;currentWidth;_focused=!1;component=this;get focused(){return this._focused}set focused(e){this._focused=e,this.syncSearchFocus()}constructor(e){this.config=e,this.border=new P2(r=>e.theme.fg("border",r)),this.serverList=new E2({items:[],getIdentity:r=>r.name,getSearchText:r=>r.name,maxVisible:FE})}get reconnectSettled(){return this.opDone}get authSettled(){return this.authDone}render(e){let r=Math.max(1,e);this.currentWidth=r,this.syncSearchFocus();let n;if(this.busy)n=L2(this.busy.server,this.busy.verb,this.spinner?.frame??"",this.config.theme,r);else if(this.authenticating)n=F2({server:this.authenticating,status:this.authStatus,url:this.authUrl,instructions:this.authInstructions,input:this.state.authInput,error:this.authError},this.config.theme,r);else{let o=this.config.snapshots();this.syncServerList(o),this.clampLogScrollOffset(o,r),n=D2(this.state,o,this.serverList,this.config.theme,r)}return[...this.border.render(r),...n,...this.border.render(r)]}handleInput=e=>{this.dispatch(e)};invalidate(){}syncServerList(e){this.serverList.setItems(e);let r=this.state.selectedServer;r!==null&&this.serverList.selectIdentity(r)||(this.state={...this.state,selectedServer:this.serverList.getSelectedIdentity()??null})}isSearchAvailable(){return this.currentWidth===void 0||this.currentWidth>=qu}syncSearchFocus(){let e=this.currentWidth!==void 0&&this.currentWidth>=qu&&this.state.step==="serverList"&&this.busy===null&&this.authenticating===null;this.serverList.setInputFocused(this._focused&&e)}clampLogScrollOffset(e,r){if(this.state.step!=="viewLogs")return;let n=e[st(e,this.state.selectedServer)],o=ti(n?.logLines()??[],r).length,i=ri(this.state.logScrollOffset,o,Jn);i!==this.state.logScrollOffset&&(this.state={...this.state,logScrollOffset:i})}applyAction(e,r){let n=UE(this.state,e,{snapshots:r,windowSize:Jn,logViewportWidth:this.currentWidth??qu});this.state=n.state,n.effect&&this.runEffect(n.effect)}dispatchServerList(e,r){this.syncServerList(r);let n=this.isSearchAvailable(),o=$m(e,this.config.keybindings,!n);if(o.kind==="up"||o.kind==="down"){o.kind==="up"?this.serverList.selectPrevious():this.serverList.selectNext(),this.state={...this.state,selectedServer:this.serverList.getSelectedIdentity()??null};return}if(o.kind==="confirm"||o.kind==="cancel"){this.applyAction(o,[...this.serverList.getMatchingItems()]);return}n&&this.serverList.handleInput(e)&&this.applyAction({kind:"filterChanged",query:this.serverList.getQuery()},[...this.serverList.getMatchingItems()])}dispatch(e){if(this.busy)return;if(this.authenticating){this.handleAuthInput(e);return}let r=this.config.snapshots();this.state.step==="serverList"?this.dispatchServerList(e,r):this.applyAction($m(e,this.config.keybindings),r),this.syncSearchFocus(),this.config.tui.requestRender()}runEffect(e){switch(e.kind){case"close":this.config.done();return;case"reconnect":this.startOp(e.server,"Reconnecting",()=>this.config.reconnect(e.server));return;case"authenticate":this.startAuth(e.server);return;case"toggle":this.startToggle(e.server,e.disable);return;case"toggleWrite":this.startToggleWrite(e.server,e.disable,e.scope);return;default:return}}startToggle(e,r){if(this.busy||this.config.isReconnecting())return;let n=this.config.toggle.classify(e);if(n.kind==="blocked"){this.config.toggle.notify(n.message),this.state={...this.state,step:"serverList",actionIndex:0},this.config.tui.requestRender();return}if(n.kind==="session"){this.startOp(e,KE(r),async()=>{try{await this.config.toggle.applySession(e,r)}catch(o){this.config.toggle.notify(JE(e,o))}});return}if(n.direct){this.startToggleWrite(e,r,n.direct);return}this.state={...this.state,step:"selectTarget",targetScopes:n.scopes,targetIndex:0,pendingToggle:{server:e,disable:r}},this.config.tui.requestRender()}startToggleWrite(e,r,n){this.startOp(e,KE(r),async()=>{try{let{notice:o}=await this.config.toggle.applyLocal(e,r,n);o&&this.config.toggle.notify(o)}catch(o){this.config.toggle.notify(JE(e,o))}})}startOp(e,r,n){this.busy||this.config.isReconnecting()||(this.busy={server:e,verb:r},this.spinner=new T2(()=>this.config.tui.requestRender()),this.opDone=n().finally(()=>{this.spinner?.stop(),this.spinner=void 0,this.busy=null,this.state={...this.state,step:"serverList",actionIndex:0},this.config.tui.requestRender()}))}startAuth(e){if(this.authenticating||this.config.isAuthenticating())return;this.authenticating=e,this.authStatus="pending",this.authUrl=void 0,this.authInstructions=void 0,this.authError=void 0,this.state={...this.state,step:"pasteAuthCode",authInput:""},this.authAbort=new AbortController,this.manualCode=void 0,this.queuedManualCodes.length=0;let r={onAuthUrl:n=>{this.authUrl=n.url,this.authInstructions=n.instructions,this.config.tui.requestRender()},waitForManualCode:()=>{if(this.authenticating!==e)return Promise.resolve(null);let n=this.queuedManualCodes.shift();return n!==void 0?Promise.resolve(n):(this.manualCode??=j2(),this.manualCode.promise)},signal:this.authAbort.signal};this.authDone=this.config.authenticate(e,r).then(()=>{this.authenticating===e&&this.exitAuth()}).catch(n=>{this.authenticating===e&&(this.authStatus="error",this.authError=n instanceof Error?n.message:String(n),this.config.tui.requestRender())})}handleAuthInput(e){if(this.authStatus==="error"){this.exitAuth("serverActions");return}if(this.config.keybindings.matches(e,"tui.select.cancel")){this.authAbort?.abort(),this.manualCode?.resolve(null),this.exitAuth();return}if(this.config.keybindings.matches(e,"tui.select.confirm")){let n=this.state.authInput.trim();if(n){let o=this.manualCode;this.manualCode=void 0,this.state={...this.state,authInput:""},o?o.resolve(n):this.queuedManualCodes.push(n),this.config.tui.requestRender()}return}if(k2(e,x2.backspace)){this.state={...this.state,authInput:this.state.authInput.slice(0,-1)},this.config.tui.requestRender();return}let r=this.consumeAuthPaste(e);r!==void 0&&U2(r)&&(this.state={...this.state,authInput:this.state.authInput+r},this.config.tui.requestRender())}consumeAuthPaste(e){let r=e;if(r.startsWith("\x1B[200~")&&(this.authInPaste=!0,this.authPasteBuffer="",r=r.slice(6)),!this.authInPaste)return r;this.authPasteBuffer+=r;let n=this.authPasteBuffer.indexOf("\x1B[201~");if(n===-1)return;let o=this.authPasteBuffer.slice(0,n),i=this.authPasteBuffer.slice(n+6);this.authInPaste=!1,this.authPasteBuffer="",o&&(this.state={...this.state,authInput:this.state.authInput+o},this.config.tui.requestRender()),i&&this.handleAuthInput(i)}exitAuth(e="serverList"){let r=this.authenticating,n=e==="serverActions"&&r!==null&&this.config.snapshots().some(o=>o.name===r)?"serverActions":"serverList";this.authenticating=null,this.authStatus="pending",this.authUrl=void 0,this.authInstructions=void 0,this.authError=void 0,this.authAbort=void 0,this.manualCode?.resolve(null),this.manualCode=void 0,this.queuedManualCodes.length=0,this.authInPaste=!1,this.authPasteBuffer="",this.state={...this.state,step:n,selectedServer:n==="serverActions"?r:this.state.selectedServer,actionIndex:0,authInput:""},this.config.tui.requestRender()}};async function YE(t,e,r,n,o){await t.ui.custom((i,s,a,c)=>new Om({tui:i,theme:s,keybindings:a,snapshots:()=>I2(e),reconnect:r,toggle:n,isReconnecting:()=>e.reconnecting,authenticate:o,isAuthenticating:()=>e.authenticating,done:()=>c(void 0)}).component)}var Nm=["list"];function XE(t){let{name:e,status:r}=t,n;switch(r){case"success":{let o=t.tools.length;n=o>0?` \u2705 ${e} (${o} tool${o===1?"":"s"})`:` \u2705 ${e} (ready)`;break}case"failed":n=` \u274C ${e} (failed)`;break;case"auth_required":n=` \u{1F510} ${e} (auth required)`;break;case"disabled":n=` \u26AA ${e} (disabled)`;break;default:n=` \u23F3 ${e} (initializing...)`;break}return r==="failed"&&t.lastError?`${n}
|
|
146
146
|
error: ${t.lastError}`:n}function q2(t){return` ! ${t.server?`${t.server}: `:""}${t.message}`}var H2="No MCP servers configured. Add servers under the 'mcpServers' key in ~/.augment/settings.json or your project's .augment/settings.json.";function zm(t,e){return e.length>0?[t,...e]:null}function G2(t){let e=[],r=[];for(let o of t.servers.values())(Pr(o,t.pluginServerHosts,t.hostLeases)==="plugin"?r:e).push(o);let n=[zm("MCP Server Status:",e.map(XE)),zm("Plugin MCP servers:",r.map(XE)),zm("Diagnostics:",t.diagnostics.map(q2))];return t.servers.size===0&&n.unshift([H2]),n.filter(o=>o!==null).map(o=>o.join(`
|
package/package.json
CHANGED