@akon-labs/nexus-cli 0.1.10 → 0.1.11-rc.2
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/cli/require-login.d.ts.map +1 -1
- package/dist/cli/require-login.js +2 -2
- package/dist/cli/require-login.js.map +1 -1
- package/dist/cli.js +1919 -1040
- package/dist/core/agent-session.d.ts +3 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +4 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +14 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +18 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/extensions/gitnexus/config.d.ts +15 -1
- package/dist/extensions/gitnexus/config.d.ts.map +1 -1
- package/dist/extensions/gitnexus/config.js +86 -2
- package/dist/extensions/gitnexus/config.js.map +1 -1
- package/dist/extensions/gitnexus/index.d.ts.map +1 -1
- package/dist/extensions/gitnexus/index.js +2 -2
- package/dist/extensions/gitnexus/index.js.map +1 -1
- package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
- package/dist/extensions/gitnexus/observatory.js +2 -2
- package/dist/extensions/gitnexus/observatory.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/commands.d.ts +22 -2
- package/dist/extensions/mcp/commands.d.ts.map +1 -1
- package/dist/extensions/mcp/commands.js +201 -9
- package/dist/extensions/mcp/commands.js.map +1 -1
- package/dist/extensions/mcp/config.d.ts +2 -0
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +6 -1
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +54 -5
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/mcp-setup-panel.d.ts +63 -2
- package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -1
- package/dist/extensions/mcp/mcp-setup-panel.js +563 -77
- package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts +2 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +19 -6
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent-render.d.ts +3 -0
- package/dist/extensions/subagent-render.d.ts.map +1 -0
- package/dist/extensions/subagent-render.js +39 -0
- package/dist/extensions/subagent-render.js.map +1 -0
- package/dist/index.js +1951 -1072
- package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -3
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +1919 -1040
- package/dist/utils/hidden-spawn.d.ts +29 -0
- package/dist/utils/hidden-spawn.d.ts.map +1 -0
- package/dist/utils/hidden-spawn.js +101 -0
- package/dist/utils/hidden-spawn.js.map +1 -0
- package/dist/vendor/ai.js +233 -233
- package/native/win32/build.mjs +95 -0
- package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
- package/native/win32/src/hidden-spawn.c +157 -0
- package/npm-shrinkwrap.json +2 -37
- package/package.json +7 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ensureCompatibilityImports, getMcpDiscoverySummary, getMcpStandardConfigSummary, getProjectConfigPath, getServerProvenance, previewCompatibilityImports, previewSharedServerEntry, previewStarterProjectConfig, writeDirectToolsConfig, writeSharedServerEntry, writeStarterProjectConfig, } from "./config.js";
|
|
1
|
+
import { ensureCompatibilityImports, getMcpDiscoverySummary, getMcpStandardConfigSummary, getProjectConfigPath, getServerProvenance, previewCompatibilityImports, previewSharedServerEntry, previewStarterProjectConfig, writeDirectToolsConfig, writeProjectServerDisabledOverride, writeSharedServerEntry, writeStarterProjectConfig, } from "./config.js";
|
|
2
2
|
import { clearFailure, getFailureAgeSeconds, getFailureMessage, markKeepAliveAfterConnect, notifyToolMetadataUpdated, recordFailure, updateMetadataCache, updateStatusBar, } from "./init.js";
|
|
3
3
|
import { getAuthStorageOptions, inspectAuthForUrl } from "./mcp-auth.js";
|
|
4
4
|
import { authenticate, removeAuth, supportsOAuth } from "./mcp-auth-flow.js";
|
|
@@ -200,7 +200,20 @@ export async function reconnectServers(state, ctx, targetServer) {
|
|
|
200
200
|
}
|
|
201
201
|
updateStatusBar(state);
|
|
202
202
|
}
|
|
203
|
-
|
|
203
|
+
/** Whether stored OAuth tokens actually exist for a server — independent of whether it's currently connected. */
|
|
204
|
+
function isSignedInForOAuth(serverName, definition, state) {
|
|
205
|
+
try {
|
|
206
|
+
const serverUrl = resolveServerUrl(definition);
|
|
207
|
+
if (!serverUrl)
|
|
208
|
+
return false;
|
|
209
|
+
const authStatus = inspectAuthForUrl(serverName, serverUrl, state.authStorageOptions);
|
|
210
|
+
return authStatus.status !== "absent" && authStatus.status !== "unavailable" && !!authStatus.entry.tokens;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
export async function authenticateServer(serverName, config, ctx, signal, runtime, nexus) {
|
|
204
217
|
const ui = ctx.hasUI ? ctx.ui : undefined;
|
|
205
218
|
const cwd = ctx.cwd;
|
|
206
219
|
signal ??= ctx.signal;
|
|
@@ -234,7 +247,18 @@ export async function authenticateServer(serverName, config, ctx, signal, runtim
|
|
|
234
247
|
const authStorageOptions = getAuthStorageOptions(config.settings?.oauthDir, cwd);
|
|
235
248
|
const status = await authenticate(serverName, serverUrl, definition, {
|
|
236
249
|
...(authStorageOptions.baseDir ? { authStorageOptions } : {}),
|
|
237
|
-
onAuthorizationUrl: () => {
|
|
250
|
+
onAuthorizationUrl: async (authorizationUrl) => {
|
|
251
|
+
// Best-effort: launch the user's browser straight to the authorization page
|
|
252
|
+
// instead of relying on them to click (or copy) the link printed below.
|
|
253
|
+
if (!nexus)
|
|
254
|
+
return;
|
|
255
|
+
try {
|
|
256
|
+
await openPath(nexus, authorizationUrl);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// The link is still shown in the prompt text below; nothing else to do here.
|
|
260
|
+
}
|
|
261
|
+
},
|
|
238
262
|
onAuthorizationInput: async (authorizationUrl, inputSignal) => {
|
|
239
263
|
if (inputSignal.aborted)
|
|
240
264
|
return undefined;
|
|
@@ -383,6 +407,123 @@ export async function manageBearerToken(action, serverName, state, ctx) {
|
|
|
383
407
|
ui.notify(message, "info");
|
|
384
408
|
return { ok: true, message };
|
|
385
409
|
}
|
|
410
|
+
const ADD_SERVER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
411
|
+
function parseKeyValueFlag(flag, raw) {
|
|
412
|
+
const eq = raw?.indexOf("=") ?? -1;
|
|
413
|
+
if (!raw || eq <= 0)
|
|
414
|
+
return { ok: false, error: `${flag} expects KEY=VALUE, got "${raw ?? ""}".` };
|
|
415
|
+
return { ok: true, key: raw.slice(0, eq), value: raw.slice(eq + 1) };
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Parses `/mcp add <name> ...` arguments. Mirrors the rest of /mcp's naive
|
|
419
|
+
* whitespace-split argument handling (no quoting support) rather than
|
|
420
|
+
* inventing a shell-quote parser just for this subcommand.
|
|
421
|
+
*/
|
|
422
|
+
export function parseAddServerArgs(argv) {
|
|
423
|
+
const name = argv[0];
|
|
424
|
+
if (!name)
|
|
425
|
+
return { ok: false, error: "Missing server name." };
|
|
426
|
+
if (!ADD_SERVER_NAME_PATTERN.test(name)) {
|
|
427
|
+
return { ok: false, error: `Invalid server name "${name}" — use letters, digits, ".", "_", "-".` };
|
|
428
|
+
}
|
|
429
|
+
const rest = argv.slice(1);
|
|
430
|
+
const env = {};
|
|
431
|
+
const headers = {};
|
|
432
|
+
let cwd;
|
|
433
|
+
let url;
|
|
434
|
+
let auth;
|
|
435
|
+
let bearerTokenEnv;
|
|
436
|
+
let commandArgv;
|
|
437
|
+
let i = 0;
|
|
438
|
+
while (i < rest.length) {
|
|
439
|
+
const token = rest[i];
|
|
440
|
+
if (token === "--") {
|
|
441
|
+
commandArgv = rest.slice(i + 1);
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
if (token === "--url") {
|
|
445
|
+
url = rest[i + 1];
|
|
446
|
+
i += 2;
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
if (token === "--env" || token === "--header") {
|
|
450
|
+
const parsed = parseKeyValueFlag(token, rest[i + 1]);
|
|
451
|
+
if (!parsed.ok)
|
|
452
|
+
return parsed;
|
|
453
|
+
(token === "--env" ? env : headers)[parsed.key] = parsed.value;
|
|
454
|
+
i += 2;
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
if (token === "--cwd") {
|
|
458
|
+
cwd = rest[i + 1];
|
|
459
|
+
i += 2;
|
|
460
|
+
continue;
|
|
461
|
+
}
|
|
462
|
+
if (token === "--auth") {
|
|
463
|
+
const value = rest[i + 1];
|
|
464
|
+
if (value !== "oauth" && value !== "bearer") {
|
|
465
|
+
return { ok: false, error: `--auth expects "oauth" or "bearer", got "${value ?? ""}".` };
|
|
466
|
+
}
|
|
467
|
+
auth = value;
|
|
468
|
+
i += 2;
|
|
469
|
+
continue;
|
|
470
|
+
}
|
|
471
|
+
if (token === "--bearer-env") {
|
|
472
|
+
bearerTokenEnv = rest[i + 1];
|
|
473
|
+
i += 2;
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
return { ok: false, error: `Unrecognized argument "${token}".` };
|
|
477
|
+
}
|
|
478
|
+
if (url && commandArgv) {
|
|
479
|
+
return { ok: false, error: "Use either --url (remote server) or -- <command> (local server), not both." };
|
|
480
|
+
}
|
|
481
|
+
if (!url && !commandArgv) {
|
|
482
|
+
return { ok: false, error: "Specify a server type: --url <url> (remote), or -- <command> [args...] (local)." };
|
|
483
|
+
}
|
|
484
|
+
if (commandArgv) {
|
|
485
|
+
const [command, ...args] = commandArgv;
|
|
486
|
+
if (!command)
|
|
487
|
+
return { ok: false, error: "Missing command after --." };
|
|
488
|
+
const entry = { command, ...(args.length ? { args } : {}) };
|
|
489
|
+
if (Object.keys(env).length)
|
|
490
|
+
entry.env = env;
|
|
491
|
+
if (cwd)
|
|
492
|
+
entry.cwd = cwd;
|
|
493
|
+
return { ok: true, name, entry };
|
|
494
|
+
}
|
|
495
|
+
const entry = { url: url };
|
|
496
|
+
if (Object.keys(headers).length)
|
|
497
|
+
entry.headers = headers;
|
|
498
|
+
if (bearerTokenEnv) {
|
|
499
|
+
entry.bearerTokenEnv = bearerTokenEnv;
|
|
500
|
+
entry.auth = auth ?? "bearer";
|
|
501
|
+
}
|
|
502
|
+
else if (auth) {
|
|
503
|
+
entry.auth = auth;
|
|
504
|
+
}
|
|
505
|
+
return { ok: true, name, entry };
|
|
506
|
+
}
|
|
507
|
+
export const ADD_SERVER_USAGE = [
|
|
508
|
+
"Usage:",
|
|
509
|
+
" /mcp add <name> -- <command> [args...] local server, runs over stdio",
|
|
510
|
+
" /mcp add <name> --url <url> remote server over HTTP",
|
|
511
|
+
"",
|
|
512
|
+
"Flags:",
|
|
513
|
+
" --env KEY=VALUE extra environment variable (local, repeatable)",
|
|
514
|
+
" --cwd <path> working directory (local)",
|
|
515
|
+
" --header KEY=VALUE extra HTTP header (remote, repeatable)",
|
|
516
|
+
" --auth oauth|bearer auth mode (remote; default is OAuth auto-detection)",
|
|
517
|
+
" --bearer-env <VAR> read a bearer token from this env var (remote)",
|
|
518
|
+
"",
|
|
519
|
+
"For fields not covered here (lifecycle, includeTools, ...), edit the config",
|
|
520
|
+
'file directly — /mcp setup, then "Open detected config paths".',
|
|
521
|
+
].join("\n");
|
|
522
|
+
/** Adds a server to the project's shared MCP config. Reused by both `/mcp add` and any UI entry point. */
|
|
523
|
+
export function addCustomServer(cwd, name, entry) {
|
|
524
|
+
const path = writeSharedServerEntry(getProjectConfigPath(cwd), name, entry);
|
|
525
|
+
return { path };
|
|
526
|
+
}
|
|
386
527
|
function buildSharedConfigNoticeLines(configOverridePath, cwd) {
|
|
387
528
|
const discovery = getMcpStandardConfigSummary(configOverridePath, cwd);
|
|
388
529
|
const onboardingState = loadOnboardingState();
|
|
@@ -412,7 +553,18 @@ export async function openMcpSetup(state, nexus, ctx, configOverridePath, mode =
|
|
|
412
553
|
}
|
|
413
554
|
const discovery = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options);
|
|
414
555
|
const onboardingState = loadOnboardingState();
|
|
556
|
+
const installedServers = Object.entries(state.config.mcpServers).map(([name, definition]) => {
|
|
557
|
+
const authCapable = supportsOAuth(definition);
|
|
558
|
+
return {
|
|
559
|
+
name,
|
|
560
|
+
disabled: isServerDisabled(definition),
|
|
561
|
+
kind: (definition.command ? "stdio" : "http"),
|
|
562
|
+
authCapable,
|
|
563
|
+
signedIn: authCapable ? isSignedInForOAuth(name, definition, state) : false,
|
|
564
|
+
};
|
|
565
|
+
});
|
|
415
566
|
let configChanged = false;
|
|
567
|
+
let overlayHandle;
|
|
416
568
|
const callbacks = {
|
|
417
569
|
previewImports: (imports) => previewCompatibilityImports(imports, configOverridePath),
|
|
418
570
|
previewStarterProject: () => previewStarterProjectConfig(ctx.cwd),
|
|
@@ -454,17 +606,57 @@ export async function openMcpSetup(state, nexus, ctx, configOverridePath, mode =
|
|
|
454
606
|
markSetupCompleted: () => {
|
|
455
607
|
persistSetupCompleted(discovery.fingerprint);
|
|
456
608
|
},
|
|
609
|
+
seedEditor: (text) => {
|
|
610
|
+
if (ctx.hasUI)
|
|
611
|
+
ctx.ui.setEditorText(text);
|
|
612
|
+
},
|
|
613
|
+
toggleServerDisabled: async (serverName, disabled) => {
|
|
614
|
+
const result = writeProjectServerDisabledOverride(configOverridePath, ctx.cwd, serverName, disabled);
|
|
615
|
+
if (result.changed)
|
|
616
|
+
configChanged = true;
|
|
617
|
+
return { path: result.path, changed: result.changed };
|
|
618
|
+
},
|
|
619
|
+
authenticateServer: async (serverName, fallbackEntry) => {
|
|
620
|
+
// A server added this session isn't in the live config until /reload —
|
|
621
|
+
// hand authenticateServer a synthetic config with just that one entry
|
|
622
|
+
// merged in, rather than making the user reload first.
|
|
623
|
+
const effectiveConfig = state.config.mcpServers[serverName] || !fallbackEntry
|
|
624
|
+
? state.config
|
|
625
|
+
: { ...state.config, mcpServers: { ...state.config.mcpServers, [serverName]: fallbackEntry } };
|
|
626
|
+
// The auth prompt (the actual link, and the "paste the callback URL"
|
|
627
|
+
// input) renders as a *separate* overlay. Without hiding this one first,
|
|
628
|
+
// it stays drawn on top and the auth prompt is invisible underneath it.
|
|
629
|
+
overlayHandle?.setHidden(true);
|
|
630
|
+
try {
|
|
631
|
+
const result = await authenticateServer(serverName, effectiveConfig, ctx, ctx.signal, state.oauthRuntime, nexus);
|
|
632
|
+
return {
|
|
633
|
+
ok: result.ok,
|
|
634
|
+
message: result.message ??
|
|
635
|
+
(result.ok ? `Signed in to "${serverName}".` : `Sign-in failed for "${serverName}".`),
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
finally {
|
|
639
|
+
overlayHandle?.setHidden(false);
|
|
640
|
+
overlayHandle?.focus();
|
|
641
|
+
}
|
|
642
|
+
},
|
|
457
643
|
};
|
|
458
644
|
return new Promise((resolve) => {
|
|
459
645
|
ctx.ui.custom((tui, _theme, keybindings, done) => {
|
|
460
|
-
return createMcpSetupPanel(discovery, callbacks, { mode, onboardingState, keybindings }, tui, () => {
|
|
646
|
+
return createMcpSetupPanel(discovery, callbacks, { mode, onboardingState, keybindings, installedServers }, tui, () => {
|
|
461
647
|
done(undefined);
|
|
462
648
|
resolve({ configChanged });
|
|
463
649
|
});
|
|
464
|
-
}, {
|
|
650
|
+
}, {
|
|
651
|
+
overlay: true,
|
|
652
|
+
overlayOptions: { anchor: "center", width: 92, maxHeight: "90%" },
|
|
653
|
+
onHandle: (handle) => {
|
|
654
|
+
overlayHandle = handle;
|
|
655
|
+
},
|
|
656
|
+
});
|
|
465
657
|
});
|
|
466
658
|
}
|
|
467
|
-
function buildMcpPanelCallbacks(state, config, ctx, getOverlayHandle) {
|
|
659
|
+
function buildMcpPanelCallbacks(state, config, ctx, nexus, getOverlayHandle) {
|
|
468
660
|
// Panel-only diagnostics keep status inspection from mutating connection
|
|
469
661
|
// failure state while allowing the existing panel failure UI to show why the
|
|
470
662
|
// credential store could not be inspected.
|
|
@@ -479,7 +671,7 @@ function buildMcpPanelCallbacks(state, config, ctx, getOverlayHandle) {
|
|
|
479
671
|
const overlay = getOverlayHandle?.();
|
|
480
672
|
overlay?.setHidden(true);
|
|
481
673
|
try {
|
|
482
|
-
return await authenticateServer(serverName, config, ctx, state.owner?.signal, state.oauthRuntime);
|
|
674
|
+
return await authenticateServer(serverName, config, ctx, state.owner?.signal, state.oauthRuntime, nexus);
|
|
483
675
|
}
|
|
484
676
|
finally {
|
|
485
677
|
overlay?.setHidden(false);
|
|
@@ -549,7 +741,7 @@ export async function openMcpPanel(state, nexus, ctx, configOverridePath, onDire
|
|
|
549
741
|
const provenanceMap = getServerProvenance(configPath, ctx.cwd);
|
|
550
742
|
const { lines: noticeLines, fingerprint } = buildSharedConfigNoticeLines(configPath, ctx.cwd);
|
|
551
743
|
let overlayHandle;
|
|
552
|
-
const callbacks = buildMcpPanelCallbacks(state, config, ctx, () => overlayHandle);
|
|
744
|
+
const callbacks = buildMcpPanelCallbacks(state, config, ctx, nexus, () => overlayHandle);
|
|
553
745
|
let configChanged = false;
|
|
554
746
|
await new Promise((resolve) => {
|
|
555
747
|
ctx.ui.custom((tui, _theme, keybindings, done) => {
|
|
@@ -605,7 +797,7 @@ export async function openMcpAuthPanel(state, nexus, ctx, configOverridePath) {
|
|
|
605
797
|
const configPath = nexus.getFlag("mcp-config") ?? configOverridePath;
|
|
606
798
|
const provenanceMap = getServerProvenance(configPath, ctx.cwd);
|
|
607
799
|
let overlayHandle;
|
|
608
|
-
const callbacks = buildMcpPanelCallbacks(state, config, ctx, () => overlayHandle);
|
|
800
|
+
const callbacks = buildMcpPanelCallbacks(state, config, ctx, nexus, () => overlayHandle);
|
|
609
801
|
await new Promise((resolve) => {
|
|
610
802
|
ctx.ui.custom((tui, _theme, keybindings, done) => {
|
|
611
803
|
return createMcpPanel(config, cache, provenanceMap, callbacks, tui, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/extensions/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OverlayHandle } from \"@earendil-works/pi-tui\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport {\n\tensureCompatibilityImports,\n\tgetMcpDiscoverySummary,\n\tgetMcpStandardConfigSummary,\n\tgetProjectConfigPath,\n\tgetServerProvenance,\n\ttype KnownServerPreset,\n\tpreviewCompatibilityImports,\n\tpreviewSharedServerEntry,\n\tpreviewStarterProjectConfig,\n\twriteDirectToolsConfig,\n\twriteSharedServerEntry,\n\twriteStarterProjectConfig,\n} from \"./config.ts\";\nimport {\n\tclearFailure,\n\tgetFailureAgeSeconds,\n\tgetFailureMessage,\n\tmarkKeepAliveAfterConnect,\n\tnotifyToolMetadataUpdated,\n\trecordFailure,\n\tupdateMetadataCache,\n\tupdateStatusBar,\n} from \"./init.ts\";\nimport { getAuthStorageOptions, inspectAuthForUrl } from \"./mcp-auth.ts\";\nimport { authenticate, type McpOAuthRuntime, removeAuth, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { inspectBearerTokenForUrl, removeBearerToken } from \"./mcp-bearer-store.ts\";\nimport { createMcpPanel } from \"./mcp-panel.ts\";\nimport { createMcpSetupPanel } from \"./mcp-setup-panel.ts\";\nimport { loadMetadataCache, reconstructPromptMetadata } from \"./metadata-cache.ts\";\nimport {\n\tloadOnboardingState,\n\tmarkSharedConfigHintShown,\n\tmarkSetupCompleted as persistSetupCompleted,\n} from \"./onboarding-state.ts\";\nimport { isAbortError } from \"./runtime-owner.ts\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport { buildToolMetadata } from \"./tool-metadata.ts\";\nimport {\n\ttype ImportKind,\n\tisServerDisabled,\n\ttype McpAuthResult,\n\ttype McpConfig,\n\ttype McpPanelCallbacks,\n\ttype McpPanelResult,\n} from \"./types.ts\";\nimport { openPath, resolveServerUrl, sanitizeTerminalText } from \"./utils.ts\";\n\nfunction terminalHyperlink(label: string, url: string): string {\n\treturn `\\u001B]8;;${sanitizeTerminalText(url)}\\u001B\\\\${sanitizeTerminalText(label)}\\u001B]8;;\\u001B\\\\`;\n}\n\n/**\n * True when this run mode can display a `ctx.ui.custom()` overlay.\n *\n * `ctx.hasUI` only reports that *some* UI context is bound. In rpc/print mode\n * that context is a headless stub whose `custom()` returns immediately without\n * ever invoking the factory or the `done` callback, so a panel awaited through\n * `new Promise(resolve => ctx.ui.custom(...))` never settles and the command\n * hangs. Overlay panels therefore additionally require `ctx.mode === \"tui\"`.\n */\nfunction canRenderPanel(ctx: ExtensionContext): boolean {\n\treturn ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function showStatus(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\n\tconst lines: string[] = [\"MCP Server Status:\", \"\"];\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tif (isServerDisabled(definition)) {\n\t\t\tlines.push(`⊘ ${name}: disabled (run /mcp enable ${name}, then /reload)`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst connection = state.manager.getConnection(name);\n\t\tconst metadata = state.toolMetadata.get(name);\n\t\tconst toolCount = metadata?.length ?? 0;\n\t\tconst failedAgo = getFailureAgeSeconds(state, name);\n\t\tlet status = \"not connected\";\n\t\tlet statusIcon = \"○\";\n\t\tlet failed = false;\n\n\t\tif (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tstatusIcon = \"✓\";\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs auth\";\n\t\t\tstatusIcon = \"⚠\";\n\t\t} else if (failedAgo !== null) {\n\t\t\tconst reason = sanitizeTerminalText(getFailureMessage(state, name) ?? \"\");\n\t\t\tstatus = reason ? `failed ${failedAgo}s ago — ${reason}` : `failed ${failedAgo}s ago`;\n\t\t\tstatusIcon = \"✗\";\n\t\t\tfailed = true;\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\tconst toolSuffix = failed ? \"\" : ` (${toolCount} tools${status === \"cached\" ? \", cached\" : \"\"})`;\n\t\tlines.push(`${statusIcon} ${name}: ${status}${toolSuffix}`);\n\t}\n\n\tif (Object.keys(state.config.mcpServers).length === 0) {\n\t\tlines.push(\"No MCP servers configured\");\n\t\tlines.push(\"Run /mcp setup to adopt imports or scaffold .nexus/mcp.json\");\n\t}\n\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function showPrompts(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\tconst allPrompts = [...(state.promptMetadata?.values() ?? [])].flat();\n\tconst failedPromptServers = [...(state.manager.getAllConnections?.() ?? [])]\n\t\t.filter(([, connection]) => connection.status === \"connected\" && connection.promptDiscoveryFailed)\n\t\t.map(([serverName]) => serverName)\n\t\t.sort();\n\tif (allPrompts.length === 0) {\n\t\tconst failureNote =\n\t\t\tfailedPromptServers.length > 0 ? ` Prompt discovery failed for: ${failedPromptServers.join(\", \")}.` : \"\";\n\t\tctx.ui.notify(\n\t\t\t`No MCP prompts available. Prompts are discovered when servers with the \\`prompts\\` capability connect.${failureNote}`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn;\n\t}\n\tconst lines = [\"MCP Prompts:\", \"\"];\n\tconst grouped = new Map<string, typeof allPrompts>();\n\tfor (const prompt of allPrompts) {\n\t\tconst list = grouped.get(prompt.serverName) ?? [];\n\t\tlist.push(prompt);\n\t\tgrouped.set(prompt.serverName, list);\n\t}\n\tfor (const [serverName, prompts] of [...grouped.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n\t\tlines.push(`${serverName}:`);\n\t\tfor (const prompt of prompts.sort((a, b) => a.commandName.localeCompare(b.commandName))) {\n\t\t\tconst args = prompt.arguments\n\t\t\t\t.map((argument) => (argument.required ? `<${argument.name}>` : `[${argument.name}]`))\n\t\t\t\t.join(\" \");\n\t\t\tlines.push(` /${prompt.commandName}${args ? ` ${args}` : \"\"}`);\n\t\t\tif (prompt.description) lines.push(` ${prompt.description}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\tlines.push(`Total: ${allPrompts.length} prompt${allPrompts.length === 1 ? \"\" : \"s\"}`);\n\tif (failedPromptServers.length > 0) {\n\t\tlines.push(\n\t\t\t`Prompt discovery failed for: ${failedPromptServers.join(\", \")}. Cached prompt metadata may be stale.`,\n\t\t);\n\t}\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function showTools(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\n\tconst allTools = [...state.toolMetadata.entries()]\n\t\t.filter(([serverName]) => !isServerDisabled(state.config.mcpServers[serverName]))\n\t\t.flatMap(([, metadata]) => metadata.map((m) => m.name));\n\n\tif (allTools.length === 0) {\n\t\tctx.ui.notify(\"No MCP tools available\", \"info\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"MCP Tools:\", \"\", ...allTools.map((t) => ` ${t}`), \"\", `Total: ${allTools.length} tools`];\n\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function reconnectServer(state: McpExtensionState, ctx: ExtensionContext, name: string): Promise<boolean> {\n\tconst definition = state.config.mcpServers[name];\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst signal = state.owner?.signal;\n\tif (!definition) {\n\t\tif (ui) {\n\t\t\tui.notify(`Server \"${name}\" not found in config`, \"error\");\n\t\t}\n\t\treturn false;\n\t}\n\tif (isServerDisabled(definition)) {\n\t\tif (ui) ui.notify(`MCP: ${name} is disabled. Run /mcp enable ${name}, then /reload.`, \"warning\");\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tawait state.manager.close(name);\n\t\tstate.owner?.throwIfInactive();\n\t\tconst connection = signal\n\t\t\t? await state.manager.connect(name, definition, signal)\n\t\t\t: await state.manager.connect(name, definition);\n\t\tstate.owner?.throwIfInactive();\n\t\tif (connection.status === \"needs-auth\") {\n\t\t\tif (ui) {\n\t\t\t\tui.notify(`MCP: ${name} requires OAuth. Run /mcp-auth ${name} first.`, \"warning\");\n\t\t\t}\n\t\t\tupdateStatusBar(state);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst prefix = state.config.settings?.toolPrefix ?? \"server\";\n\t\tconst { metadata, failedTools } = buildToolMetadata(\n\t\t\tconnection.tools,\n\t\t\tconnection.resources,\n\t\t\tdefinition,\n\t\t\tname,\n\t\t\tprefix,\n\t\t\tstate.config.mcpServers,\n\t\t\tstate.toolMetadata,\n\t\t);\n\t\tstate.toolMetadata.set(name, metadata);\n\t\tif (!connection.promptDiscoveryFailed) {\n\t\t\tstate.promptMetadata?.set(name, reconstructPromptMetadata(name, connection.prompts ?? [], prefix, definition));\n\t\t\tstate.promptMetadataLive?.add(name);\n\t\t}\n\t\tif (connection.instructions) {\n\t\t\tstate.serverInstructions.set(name, connection.instructions);\n\t\t} else {\n\t\t\tstate.serverInstructions.delete(name);\n\t\t}\n\t\tupdateMetadataCache(state, name);\n\t\tnotifyToolMetadataUpdated(state, name, \"command-reconnect\");\n\t\tmarkKeepAliveAfterConnect(state, name);\n\t\tclearFailure(state, name);\n\n\t\tif (ui) {\n\t\t\tui.notify(\n\t\t\t\t`MCP: Reconnected to ${name} (${connection.tools.length} tools, ${connection.resources.length} resources)`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tif (failedTools.length > 0) {\n\t\t\t\tui.notify(`MCP: ${name} - ${failedTools.length} tools skipped`, \"warning\");\n\t\t\t}\n\t\t}\n\t\tupdateStatusBar(state);\n\t\treturn true;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (isAbortError(error, signal)) throw error;\n\t\trecordFailure(state, name, message);\n\t\tif (ui) {\n\t\t\tui.notify(`MCP: Failed to reconnect to ${name}: ${sanitizeTerminalText(message)}`, \"error\");\n\t\t}\n\t\tupdateStatusBar(state);\n\t\treturn false;\n\t}\n}\n\nexport async function reconnectServers(\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n\ttargetServer?: string,\n): Promise<void> {\n\tif (targetServer && !state.config.mcpServers[targetServer]) {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(`Server \"${targetServer}\" not found in config`, \"error\");\n\t\t}\n\t\treturn;\n\t}\n\n\tconst names = targetServer ? [targetServer] : Object.keys(state.config.mcpServers);\n\tfor (const name of names) {\n\t\tawait reconnectServer(state, ctx, name);\n\t}\n\n\tupdateStatusBar(state);\n}\n\nexport async function authenticateServer(\n\tserverName: string,\n\tconfig: McpConfig,\n\tctx: ExtensionContext,\n\tsignal?: AbortSignal,\n\truntime?: McpOAuthRuntime,\n): Promise<McpAuthResult> {\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst cwd = ctx.cwd;\n\tsignal ??= ctx.signal;\n\tif (!ui) return { ok: false, message: \"OAuth authentication requires an interactive session.\" };\n\n\tconst definition = config.mcpServers[serverName];\n\tif (!definition) {\n\t\tconst message = `Server \"${serverName}\" not found in config`;\n\t\tui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\tif (isServerDisabled(definition)) {\n\t\tconst message = `Server \"${serverName}\" is disabled. Run /mcp enable ${serverName}, then /reload.`;\n\t\tui.notify(message, \"warning\");\n\t\treturn { ok: false, message };\n\t}\n\n\tif (!supportsOAuth(definition)) {\n\t\tconst message = `Server \"${serverName}\" does not use OAuth authentication. Set \"auth\": \"oauth\" or omit auth for auto-detection.`;\n\t\tui.notify(\n\t\t\t`Server \"${serverName}\" does not use OAuth authentication.\\n` +\n\t\t\t\t`Set \"auth\": \"oauth\" or omit auth for auto-detection.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn { ok: false, message };\n\t}\n\n\ttry {\n\t\tconst serverUrl = resolveServerUrl(definition);\n\t\tif (!serverUrl) {\n\t\t\tconst message = `Server \"${serverName}\" has no URL configured (OAuth requires HTTP transport)`;\n\t\t\tui.notify(message, \"error\");\n\t\t\treturn { ok: false, message };\n\t\t}\n\n\t\tui.setStatus(\"mcp-auth\", `Authenticating ${serverName}...`);\n\t\tconst authStorageOptions = getAuthStorageOptions(config.settings?.oauthDir, cwd);\n\t\tconst status = await authenticate(serverName, serverUrl, definition, {\n\t\t\t...(authStorageOptions.baseDir ? { authStorageOptions } : {}),\n\t\t\tonAuthorizationUrl: () => {},\n\t\t\tonAuthorizationInput: async (authorizationUrl, inputSignal) => {\n\t\t\t\tif (inputSignal.aborted) return undefined;\n\t\t\t\treturn ui.input(\n\t\t\t\t\t`Complete ${serverName} OAuth\\n\\n` +\n\t\t\t\t\t\t`${terminalHyperlink(\"Open authorization page\", authorizationUrl)}\\n${authorizationUrl}\\n\\n` +\n\t\t\t\t\t\t\"Approve access, then paste the full localhost callback URL below.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ signal: inputSignal },\n\t\t\t\t);\n\t\t\t},\n\t\t\t...(signal ? { signal } : {}),\n\t\t\t...(runtime ? { runtime } : {}),\n\t\t});\n\t\tif (signal?.aborted) signal.throwIfAborted();\n\n\t\tif (status === \"authenticated\") {\n\t\t\tconst message = `OAuth authentication successful for \"${serverName}\".`;\n\t\t\tui.notify(message, \"info\");\n\t\t\treturn { ok: true, message };\n\t\t}\n\n\t\tconst message = `OAuth authentication failed for \"${serverName}\".`;\n\t\tui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tui.notify(`Failed to authenticate \"${serverName}\": ${message}`, \"error\");\n\t\treturn { ok: false, message };\n\t} finally {\n\t\tif (!signal?.aborted) ui.setStatus(\"mcp-auth\", undefined);\n\t}\n}\n\nexport async function logoutServer(\n\tserverName: string,\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n): Promise<{ ok: boolean; message: string }> {\n\tconst definition = state.config.mcpServers[serverName];\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tif (!definition) {\n\t\tconst message = `Server \"${serverName}\" not found in config`;\n\t\tif (ui) ui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tconst signal = state.owner?.signal;\n\ttry {\n\t\tawait removeAuth(serverName, {\n\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\tsignal,\n\t\t\truntime: state.oauthRuntime,\n\t\t});\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) {\n\t\t\tui.notify(`Failed to clear OAuth credentials for \"${serverName}\": ${sanitizeTerminalText(message)}`, \"error\");\n\t\t}\n\t\treturn { ok: false, message };\n\t}\n\n\tstate.owner?.throwIfInactive();\n\ttry {\n\t\tawait state.manager.close(serverName);\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) {\n\t\t\tui.notify(\n\t\t\t\t`OAuth credentials were cleared for \"${serverName}\", but its connection could not be closed: ${sanitizeTerminalText(message)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { ok: false, message };\n\t}\n\n\tstate.owner?.throwIfInactive();\n\tupdateStatusBar(state);\n\n\tconst message = `OAuth credentials cleared for \"${serverName}\". Run /mcp-auth ${serverName} to authenticate again.`;\n\tif (ui) ui.notify(message, \"info\");\n\treturn { ok: true, message };\n}\n\nfunction validateBearerTokenStoreServer(\n\tserverName: string,\n\tstate: McpExtensionState,\n): { ok: true; serverUrl: string } | { ok: false; message: string; type: \"error\" | \"warning\" } {\n\tconst safeName = sanitizeTerminalText(serverName);\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) return { ok: false, message: `Server \"${safeName}\" not found in config`, type: \"error\" };\n\tif (isServerDisabled(definition))\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage: `Server \"${safeName}\" is disabled. Run /mcp enable ${safeName}, then /reload.`,\n\t\t\ttype: \"warning\",\n\t\t};\n\tif (definition.auth !== \"bearer\" || definition.bearerTokenStore !== true) {\n\t\treturn { ok: false, message: `Server \"${safeName}\" is not configured for bearerTokenStore.`, type: \"error\" };\n\t}\n\t// resolveServerUrl embeds the interpolated URL in its exceptions; redact it\n\t// because the URL can carry userinfo or interpolated secrets.\n\tlet serverUrl: string | undefined;\n\ttry {\n\t\tserverUrl = resolveServerUrl(definition);\n\t} catch {\n\t\treturn { ok: false, message: `Server \"${safeName}\" has an invalid or unresolvable URL.`, type: \"error\" };\n\t}\n\tif (!serverUrl) return { ok: false, message: `Server \"${safeName}\" has no URL configured.`, type: \"error\" };\n\treturn { ok: true, serverUrl };\n}\n\nexport async function manageBearerToken(\n\taction: \"set\" | \"remove\" | \"status\",\n\tserverName: string,\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n): Promise<{ ok: boolean; message: string }> {\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst safeName = sanitizeTerminalText(serverName);\n\tconst validation = validateBearerTokenStoreServer(serverName, state);\n\tif (!validation.ok) {\n\t\tif (ui) ui.notify(validation.message, validation.type);\n\t\treturn { ok: false, message: validation.message };\n\t}\n\n\tif (action === \"set\") {\n\t\tconst message = `Nexus will not collect bearer tokens through an unmasked prompt. Configure bearerTokenEnv for \"${safeName}\" in MCP config, then reload.`;\n\t\tif (ui) ui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tif (action === \"status\") {\n\t\tconst status = inspectBearerTokenForUrl(serverName, validation.serverUrl);\n\t\tconst message =\n\t\t\tstatus.status === \"present\"\n\t\t\t\t? `Bearer token is stored for \"${safeName}\".`\n\t\t\t\t: status.status === \"url-mismatch\"\n\t\t\t\t\t? `Bearer token is stored for \"${safeName}\", but its URL does not match the current server URL.`\n\t\t\t\t\t: status.status === \"unavailable\"\n\t\t\t\t\t\t? status.message\n\t\t\t\t\t\t: `No bearer token is stored for \"${safeName}\".`;\n\t\tif (ui) ui.notify(message, status.status === \"unavailable\" ? \"error\" : \"info\");\n\t\treturn { ok: status.status !== \"unavailable\", message };\n\t}\n\n\ttry {\n\t\tremoveBearerToken(serverName);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) ui.notify(`Failed to remove bearer token for \"${safeName}\": ${sanitizeTerminalText(message)}`, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tconst message = `Bearer token removed for \"${safeName}\".`;\n\tif (ui) ui.notify(message, \"info\");\n\treturn { ok: true, message };\n}\n\nexport interface PanelFlowResult {\n\tconfigChanged: boolean;\n}\n\nfunction buildSharedConfigNoticeLines(\n\tconfigOverridePath: string | undefined,\n\tcwd: string,\n): { lines: string[]; fingerprint: string | null } {\n\tconst discovery = getMcpStandardConfigSummary(configOverridePath, cwd);\n\tconst onboardingState = loadOnboardingState();\n\tif (!discovery.hasSharedServers || onboardingState.sharedConfigHintShown) {\n\t\treturn { lines: [], fingerprint: null };\n\t}\n\n\tconst sharedSources = discovery.sources.filter((source) => source.kind === \"shared\" && source.serverCount > 0);\n\tconst sourceList = sharedSources.map((source) => source.path).join(\", \");\n\treturn {\n\t\tlines: [\n\t\t\t`Using MCP configuration from ${sourceList}.`,\n\t\t\t\"Nexus writes compatibility imports and MCP-specific overrides only to Nexus configuration files.\",\n\t\t],\n\t\tfingerprint: discovery.fingerprint,\n\t};\n}\n\nexport async function openMcpSetup(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n\tmode: \"empty\" | \"setup\" = \"setup\",\n\toptions: { includeHostConfigs?: boolean } = {},\n): Promise<PanelFlowResult> {\n\tif (!ctx.hasUI) return { configChanged: false };\n\tif (!canRenderPanel(ctx)) {\n\t\tctx.ui.notify(\n\t\t\t`The interactive MCP setup panel is only available in the terminal UI (current mode: ${ctx.mode}). Edit .nexus/mcp.json directly, or run /mcp status to review servers.`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn { configChanged: false };\n\t}\n\tif (state.programmaticConfig) {\n\t\tctx.ui.notify(\"MCP setup is unavailable when config is supplied by createMcpAdapter().\", \"info\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst discovery = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options);\n\tconst onboardingState = loadOnboardingState();\n\tlet configChanged = false;\n\n\tconst callbacks = {\n\t\tpreviewImports: (imports: ImportKind[]) => previewCompatibilityImports(imports, configOverridePath),\n\t\tpreviewStarterProject: () => previewStarterProjectConfig(ctx.cwd),\n\t\tpreviewRepoPrompt: () => {\n\t\t\tconst repoPrompt = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options).repoPrompt;\n\t\t\tif (!repoPrompt.entry || !repoPrompt.targetPath || !repoPrompt.serverName) return null;\n\t\t\treturn previewSharedServerEntry(repoPrompt.targetPath, repoPrompt.serverName, repoPrompt.entry);\n\t\t},\n\t\tpreviewKnownServer: (preset: KnownServerPreset) =>\n\t\t\tpreviewSharedServerEntry(getProjectConfigPath(ctx.cwd), preset.id, preset.entry),\n\t\tadoptImports: async (imports: ImportKind[]) => {\n\t\t\tconst result = ensureCompatibilityImports(imports, configOverridePath);\n\t\t\tif (result.added.length > 0) configChanged = true;\n\t\t\treturn result;\n\t\t},\n\t\tscaffoldProjectConfig: async () => {\n\t\t\tconst path = writeStarterProjectConfig(ctx.cwd);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path };\n\t\t},\n\t\taddRepoPrompt: async () => {\n\t\t\tconst repoPrompt = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options).repoPrompt;\n\t\t\tif (!repoPrompt.entry || !repoPrompt.targetPath || !repoPrompt.serverName) {\n\t\t\t\tthrow new Error(\"RepoPrompt is not available to add from this setup screen.\");\n\t\t\t}\n\t\t\tconst path = writeSharedServerEntry(repoPrompt.targetPath, repoPrompt.serverName, repoPrompt.entry);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path, serverName: repoPrompt.serverName };\n\t\t},\n\t\taddKnownServer: async (preset: KnownServerPreset) => {\n\t\t\tconst path = writeSharedServerEntry(getProjectConfigPath(ctx.cwd), preset.id, preset.entry);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path, serverName: preset.name };\n\t\t},\n\t\topenPath: async (targetPath: string) => {\n\t\t\tawait openPath(nexus, targetPath);\n\t\t},\n\t\tmarkSetupCompleted: () => {\n\t\t\tpersistSetupCompleted(discovery.fingerprint);\n\t\t},\n\t};\n\n\treturn new Promise<PanelFlowResult>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpSetupPanel(discovery, callbacks, { mode, onboardingState, keybindings }, tui, () => {\n\t\t\t\t\tdone(undefined);\n\t\t\t\t\tresolve({ configChanged });\n\t\t\t\t});\n\t\t\t},\n\t\t\t{ overlay: true, overlayOptions: { anchor: \"center\", width: 92 } },\n\t\t);\n\t});\n}\n\nfunction buildMcpPanelCallbacks(\n\tstate: McpExtensionState,\n\tconfig: McpConfig,\n\tctx: ExtensionContext,\n\tgetOverlayHandle?: () => OverlayHandle | undefined,\n): McpPanelCallbacks {\n\t// Panel-only diagnostics keep status inspection from mutating connection\n\t// failure state while allowing the existing panel failure UI to show why the\n\t// credential store could not be inspected.\n\tconst authStatusFailures = new Map<string, string>();\n\n\treturn {\n\t\treconnect: (serverName: string) => reconnectServer(state, ctx, serverName),\n\t\tcanAuthenticate: (serverName: string) => {\n\t\t\tconst definition = config.mcpServers[serverName];\n\t\t\treturn definition ? !isServerDisabled(definition) && supportsOAuth(definition) : false;\n\t\t},\n\t\tauthenticate: async (serverName: string) => {\n\t\t\tconst overlay = getOverlayHandle?.();\n\t\t\toverlay?.setHidden(true);\n\t\t\ttry {\n\t\t\t\treturn await authenticateServer(serverName, config, ctx, state.owner?.signal, state.oauthRuntime);\n\t\t\t} finally {\n\t\t\t\toverlay?.setHidden(false);\n\t\t\t\toverlay?.focus();\n\t\t\t}\n\t\t},\n\t\tgetConnectionStatus: (serverName: string) => {\n\t\t\tauthStatusFailures.delete(serverName);\n\t\t\tconst definition = config.mcpServers[serverName];\n\t\t\tif (isServerDisabled(definition)) return \"disabled\";\n\t\t\tconst connection = state.manager.getConnection(serverName);\n\t\t\tlet serverUrl: string | undefined;\n\t\t\ttry {\n\t\t\t\tserverUrl = definition ? resolveServerUrl(definition) : undefined;\n\t\t\t} catch {\n\t\t\t\treturn \"failed\";\n\t\t\t}\n\t\t\tif (\n\t\t\t\tdefinition?.auth === \"oauth\" &&\n\t\t\t\tserverUrl &&\n\t\t\t\tdefinition.oauth !== false &&\n\t\t\t\tdefinition.oauth?.grantType !== \"client_credentials\"\n\t\t\t) {\n\t\t\t\tconst authStatus = inspectAuthForUrl(serverName, serverUrl, state.authStorageOptions);\n\t\t\t\tif (authStatus.status === \"unavailable\") {\n\t\t\t\t\tauthStatusFailures.set(serverName, authStatus.message);\n\t\t\t\t\treturn \"failed\";\n\t\t\t\t}\n\t\t\t\tif (authStatus.status === \"absent\" || !authStatus.entry.tokens) {\n\t\t\t\t\treturn \"needs-auth\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (connection?.status === \"needs-auth\") return \"needs-auth\";\n\t\t\tif (connection?.status === \"connected\") return \"connected\";\n\t\t\tif (getFailureAgeSeconds(state, serverName) !== null) return \"failed\";\n\t\t\treturn \"idle\";\n\t\t},\n\t\tgetFailureMessage: (serverName: string) =>\n\t\t\tauthStatusFailures.get(serverName) ?? getFailureMessage(state, serverName),\n\t\trefreshCacheAfterReconnect: (serverName: string) => {\n\t\t\tconst freshCache = loadMetadataCache();\n\t\t\treturn freshCache?.servers?.[serverName] ?? null;\n\t\t},\n\t};\n}\n\nexport async function openMcpPanel(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n\tonDirectToolsConfigChanged?: (changes: Map<string, true | string[] | false>) => void | Promise<void>,\n): Promise<PanelFlowResult> {\n\tif (state.programmaticConfig) {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(\n\t\t\t\t\"MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tawait showStatus(state, ctx);\n\t\t}\n\t\treturn { configChanged: false };\n\t}\n\tif (!canRenderPanel(ctx)) {\n\t\t// No overlay here, but the same information is available as text.\n\t\tawait showStatus(state, ctx);\n\t\treturn { configChanged: false };\n\t}\n\tif (Object.keys(state.config.mcpServers).length === 0) {\n\t\treturn openMcpSetup(state, nexus, ctx, configOverridePath, \"empty\", { includeHostConfigs: false });\n\t}\n\n\tconst config = state.config;\n\tconst cache = loadMetadataCache();\n\tconst configPath = (nexus.getFlag(\"mcp-config\") as string | undefined) ?? configOverridePath;\n\tconst provenanceMap = getServerProvenance(configPath, ctx.cwd);\n\tconst { lines: noticeLines, fingerprint } = buildSharedConfigNoticeLines(configPath, ctx.cwd);\n\n\tlet overlayHandle: OverlayHandle | undefined;\n\tconst callbacks = buildMcpPanelCallbacks(state, config, ctx, () => overlayHandle);\n\n\tlet configChanged = false;\n\n\tawait new Promise<void>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpPanel(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcache,\n\t\t\t\t\tprovenanceMap,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\ttui,\n\t\t\t\t\t(result: McpPanelResult) => {\n\t\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\t\tif (!result.cancelled && result.changes.size > 0) {\n\t\t\t\t\t\t\t\twriteDirectToolsConfig(result.changes, provenanceMap);\n\t\t\t\t\t\t\t\tconfigChanged = true;\n\t\t\t\t\t\t\t\tawait onDirectToolsConfigChanged?.(result.changes);\n\t\t\t\t\t\t\t\tctx.ui.notify(\"Direct tools updated for this session.\", \"info\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t})().catch((error) => {\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tctx.ui.notify(`Direct tools updated, but live refresh failed: ${message}`, \"error\");\n\t\t\t\t\t\t\tconfigChanged = true;\n\t\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{ noticeLines, keybindings },\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 82 },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n\n\tif (noticeLines.length > 0 && fingerprint) {\n\t\tmarkSharedConfigHintShown(fingerprint);\n\t}\n\n\treturn { configChanged };\n}\n\nexport async function openMcpAuthPanel(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n): Promise<PanelFlowResult> {\n\tif (!ctx.hasUI) return { configChanged: false };\n\tif (!canRenderPanel(ctx)) {\n\t\tctx.ui.notify(\n\t\t\t`The interactive MCP auth panel is only available in the terminal UI (current mode: ${ctx.mode}). Use /mcp-auth <server> to authenticate a specific server.`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn { configChanged: false };\n\t}\n\tif (state.programmaticConfig) {\n\t\tctx.ui.notify(\"Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.\", \"info\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst config = state.config;\n\tconst oauthServers = Object.entries(config.mcpServers).filter(\n\t\t([, definition]) => !isServerDisabled(definition) && supportsOAuth(definition),\n\t);\n\tif (oauthServers.length === 0) {\n\t\tctx.ui.notify(\"No OAuth-capable MCP servers are configured.\", \"warning\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst cache = loadMetadataCache();\n\tconst configPath = (nexus.getFlag(\"mcp-config\") as string | undefined) ?? configOverridePath;\n\tconst provenanceMap = getServerProvenance(configPath, ctx.cwd);\n\tlet overlayHandle: OverlayHandle | undefined;\n\tconst callbacks = buildMcpPanelCallbacks(state, config, ctx, () => overlayHandle);\n\tawait new Promise<void>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpPanel(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcache,\n\t\t\t\t\tprovenanceMap,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\ttui,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tauthOnly: true,\n\t\t\t\t\t\tkeybindings,\n\t\t\t\t\t\tnoticeLines: [\"Select an OAuth MCP server and press Enter or ctrl+a to authenticate.\"],\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 82 },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n\n\treturn { configChanged: false };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/extensions/mcp/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OverlayHandle } from \"@earendil-works/pi-tui\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport {\n\tensureCompatibilityImports,\n\tgetMcpDiscoverySummary,\n\tgetMcpStandardConfigSummary,\n\tgetProjectConfigPath,\n\tgetServerProvenance,\n\ttype KnownServerPreset,\n\tpreviewCompatibilityImports,\n\tpreviewSharedServerEntry,\n\tpreviewStarterProjectConfig,\n\twriteDirectToolsConfig,\n\twriteProjectServerDisabledOverride,\n\twriteSharedServerEntry,\n\twriteStarterProjectConfig,\n} from \"./config.ts\";\nimport {\n\tclearFailure,\n\tgetFailureAgeSeconds,\n\tgetFailureMessage,\n\tmarkKeepAliveAfterConnect,\n\tnotifyToolMetadataUpdated,\n\trecordFailure,\n\tupdateMetadataCache,\n\tupdateStatusBar,\n} from \"./init.ts\";\nimport { getAuthStorageOptions, inspectAuthForUrl } from \"./mcp-auth.ts\";\nimport { authenticate, type McpOAuthRuntime, removeAuth, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { inspectBearerTokenForUrl, removeBearerToken } from \"./mcp-bearer-store.ts\";\nimport { createMcpPanel } from \"./mcp-panel.ts\";\nimport { createMcpSetupPanel } from \"./mcp-setup-panel.ts\";\nimport { loadMetadataCache, reconstructPromptMetadata } from \"./metadata-cache.ts\";\nimport {\n\tloadOnboardingState,\n\tmarkSharedConfigHintShown,\n\tmarkSetupCompleted as persistSetupCompleted,\n} from \"./onboarding-state.ts\";\nimport { isAbortError } from \"./runtime-owner.ts\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport { buildToolMetadata } from \"./tool-metadata.ts\";\nimport {\n\ttype ImportKind,\n\tisServerDisabled,\n\ttype McpAuthResult,\n\ttype McpConfig,\n\ttype McpPanelCallbacks,\n\ttype McpPanelResult,\n\ttype ServerEntry,\n} from \"./types.ts\";\nimport { openPath, resolveServerUrl, sanitizeTerminalText } from \"./utils.ts\";\n\nfunction terminalHyperlink(label: string, url: string): string {\n\treturn `\\u001B]8;;${sanitizeTerminalText(url)}\\u001B\\\\${sanitizeTerminalText(label)}\\u001B]8;;\\u001B\\\\`;\n}\n\n/**\n * True when this run mode can display a `ctx.ui.custom()` overlay.\n *\n * `ctx.hasUI` only reports that *some* UI context is bound. In rpc/print mode\n * that context is a headless stub whose `custom()` returns immediately without\n * ever invoking the factory or the `done` callback, so a panel awaited through\n * `new Promise(resolve => ctx.ui.custom(...))` never settles and the command\n * hangs. Overlay panels therefore additionally require `ctx.mode === \"tui\"`.\n */\nfunction canRenderPanel(ctx: ExtensionContext): boolean {\n\treturn ctx.hasUI && ctx.mode === \"tui\";\n}\n\nexport async function showStatus(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\n\tconst lines: string[] = [\"MCP Server Status:\", \"\"];\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tif (isServerDisabled(definition)) {\n\t\t\tlines.push(`⊘ ${name}: disabled (run /mcp enable ${name}, then /reload)`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst connection = state.manager.getConnection(name);\n\t\tconst metadata = state.toolMetadata.get(name);\n\t\tconst toolCount = metadata?.length ?? 0;\n\t\tconst failedAgo = getFailureAgeSeconds(state, name);\n\t\tlet status = \"not connected\";\n\t\tlet statusIcon = \"○\";\n\t\tlet failed = false;\n\n\t\tif (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tstatusIcon = \"✓\";\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs auth\";\n\t\t\tstatusIcon = \"⚠\";\n\t\t} else if (failedAgo !== null) {\n\t\t\tconst reason = sanitizeTerminalText(getFailureMessage(state, name) ?? \"\");\n\t\t\tstatus = reason ? `failed ${failedAgo}s ago — ${reason}` : `failed ${failedAgo}s ago`;\n\t\t\tstatusIcon = \"✗\";\n\t\t\tfailed = true;\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\tconst toolSuffix = failed ? \"\" : ` (${toolCount} tools${status === \"cached\" ? \", cached\" : \"\"})`;\n\t\tlines.push(`${statusIcon} ${name}: ${status}${toolSuffix}`);\n\t}\n\n\tif (Object.keys(state.config.mcpServers).length === 0) {\n\t\tlines.push(\"No MCP servers configured\");\n\t\tlines.push(\"Run /mcp setup to adopt imports or scaffold .nexus/mcp.json\");\n\t}\n\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function showPrompts(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\tconst allPrompts = [...(state.promptMetadata?.values() ?? [])].flat();\n\tconst failedPromptServers = [...(state.manager.getAllConnections?.() ?? [])]\n\t\t.filter(([, connection]) => connection.status === \"connected\" && connection.promptDiscoveryFailed)\n\t\t.map(([serverName]) => serverName)\n\t\t.sort();\n\tif (allPrompts.length === 0) {\n\t\tconst failureNote =\n\t\t\tfailedPromptServers.length > 0 ? ` Prompt discovery failed for: ${failedPromptServers.join(\", \")}.` : \"\";\n\t\tctx.ui.notify(\n\t\t\t`No MCP prompts available. Prompts are discovered when servers with the \\`prompts\\` capability connect.${failureNote}`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn;\n\t}\n\tconst lines = [\"MCP Prompts:\", \"\"];\n\tconst grouped = new Map<string, typeof allPrompts>();\n\tfor (const prompt of allPrompts) {\n\t\tconst list = grouped.get(prompt.serverName) ?? [];\n\t\tlist.push(prompt);\n\t\tgrouped.set(prompt.serverName, list);\n\t}\n\tfor (const [serverName, prompts] of [...grouped.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n\t\tlines.push(`${serverName}:`);\n\t\tfor (const prompt of prompts.sort((a, b) => a.commandName.localeCompare(b.commandName))) {\n\t\t\tconst args = prompt.arguments\n\t\t\t\t.map((argument) => (argument.required ? `<${argument.name}>` : `[${argument.name}]`))\n\t\t\t\t.join(\" \");\n\t\t\tlines.push(` /${prompt.commandName}${args ? ` ${args}` : \"\"}`);\n\t\t\tif (prompt.description) lines.push(` ${prompt.description}`);\n\t\t}\n\t\tlines.push(\"\");\n\t}\n\tlines.push(`Total: ${allPrompts.length} prompt${allPrompts.length === 1 ? \"\" : \"s\"}`);\n\tif (failedPromptServers.length > 0) {\n\t\tlines.push(\n\t\t\t`Prompt discovery failed for: ${failedPromptServers.join(\", \")}. Cached prompt metadata may be stale.`,\n\t\t);\n\t}\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function showTools(state: McpExtensionState, ctx: ExtensionContext): Promise<void> {\n\tif (!ctx.hasUI) return;\n\n\tconst allTools = [...state.toolMetadata.entries()]\n\t\t.filter(([serverName]) => !isServerDisabled(state.config.mcpServers[serverName]))\n\t\t.flatMap(([, metadata]) => metadata.map((m) => m.name));\n\n\tif (allTools.length === 0) {\n\t\tctx.ui.notify(\"No MCP tools available\", \"info\");\n\t\treturn;\n\t}\n\n\tconst lines = [\"MCP Tools:\", \"\", ...allTools.map((t) => ` ${t}`), \"\", `Total: ${allTools.length} tools`];\n\n\tctx.ui.notify(lines.join(\"\\n\"), \"info\");\n}\n\nexport async function reconnectServer(state: McpExtensionState, ctx: ExtensionContext, name: string): Promise<boolean> {\n\tconst definition = state.config.mcpServers[name];\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst signal = state.owner?.signal;\n\tif (!definition) {\n\t\tif (ui) {\n\t\t\tui.notify(`Server \"${name}\" not found in config`, \"error\");\n\t\t}\n\t\treturn false;\n\t}\n\tif (isServerDisabled(definition)) {\n\t\tif (ui) ui.notify(`MCP: ${name} is disabled. Run /mcp enable ${name}, then /reload.`, \"warning\");\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tawait state.manager.close(name);\n\t\tstate.owner?.throwIfInactive();\n\t\tconst connection = signal\n\t\t\t? await state.manager.connect(name, definition, signal)\n\t\t\t: await state.manager.connect(name, definition);\n\t\tstate.owner?.throwIfInactive();\n\t\tif (connection.status === \"needs-auth\") {\n\t\t\tif (ui) {\n\t\t\t\tui.notify(`MCP: ${name} requires OAuth. Run /mcp-auth ${name} first.`, \"warning\");\n\t\t\t}\n\t\t\tupdateStatusBar(state);\n\t\t\treturn false;\n\t\t}\n\n\t\tconst prefix = state.config.settings?.toolPrefix ?? \"server\";\n\t\tconst { metadata, failedTools } = buildToolMetadata(\n\t\t\tconnection.tools,\n\t\t\tconnection.resources,\n\t\t\tdefinition,\n\t\t\tname,\n\t\t\tprefix,\n\t\t\tstate.config.mcpServers,\n\t\t\tstate.toolMetadata,\n\t\t);\n\t\tstate.toolMetadata.set(name, metadata);\n\t\tif (!connection.promptDiscoveryFailed) {\n\t\t\tstate.promptMetadata?.set(name, reconstructPromptMetadata(name, connection.prompts ?? [], prefix, definition));\n\t\t\tstate.promptMetadataLive?.add(name);\n\t\t}\n\t\tif (connection.instructions) {\n\t\t\tstate.serverInstructions.set(name, connection.instructions);\n\t\t} else {\n\t\t\tstate.serverInstructions.delete(name);\n\t\t}\n\t\tupdateMetadataCache(state, name);\n\t\tnotifyToolMetadataUpdated(state, name, \"command-reconnect\");\n\t\tmarkKeepAliveAfterConnect(state, name);\n\t\tclearFailure(state, name);\n\n\t\tif (ui) {\n\t\t\tui.notify(\n\t\t\t\t`MCP: Reconnected to ${name} (${connection.tools.length} tools, ${connection.resources.length} resources)`,\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tif (failedTools.length > 0) {\n\t\t\t\tui.notify(`MCP: ${name} - ${failedTools.length} tools skipped`, \"warning\");\n\t\t\t}\n\t\t}\n\t\tupdateStatusBar(state);\n\t\treturn true;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (isAbortError(error, signal)) throw error;\n\t\trecordFailure(state, name, message);\n\t\tif (ui) {\n\t\t\tui.notify(`MCP: Failed to reconnect to ${name}: ${sanitizeTerminalText(message)}`, \"error\");\n\t\t}\n\t\tupdateStatusBar(state);\n\t\treturn false;\n\t}\n}\n\nexport async function reconnectServers(\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n\ttargetServer?: string,\n): Promise<void> {\n\tif (targetServer && !state.config.mcpServers[targetServer]) {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(`Server \"${targetServer}\" not found in config`, \"error\");\n\t\t}\n\t\treturn;\n\t}\n\n\tconst names = targetServer ? [targetServer] : Object.keys(state.config.mcpServers);\n\tfor (const name of names) {\n\t\tawait reconnectServer(state, ctx, name);\n\t}\n\n\tupdateStatusBar(state);\n}\n\n/** Whether stored OAuth tokens actually exist for a server — independent of whether it's currently connected. */\nfunction isSignedInForOAuth(serverName: string, definition: ServerEntry, state: McpExtensionState): boolean {\n\ttry {\n\t\tconst serverUrl = resolveServerUrl(definition);\n\t\tif (!serverUrl) return false;\n\t\tconst authStatus = inspectAuthForUrl(serverName, serverUrl, state.authStorageOptions);\n\t\treturn authStatus.status !== \"absent\" && authStatus.status !== \"unavailable\" && !!authStatus.entry.tokens;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport async function authenticateServer(\n\tserverName: string,\n\tconfig: McpConfig,\n\tctx: ExtensionContext,\n\tsignal?: AbortSignal,\n\truntime?: McpOAuthRuntime,\n\tnexus?: ExtensionAPI,\n): Promise<McpAuthResult> {\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst cwd = ctx.cwd;\n\tsignal ??= ctx.signal;\n\tif (!ui) return { ok: false, message: \"OAuth authentication requires an interactive session.\" };\n\n\tconst definition = config.mcpServers[serverName];\n\tif (!definition) {\n\t\tconst message = `Server \"${serverName}\" not found in config`;\n\t\tui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\tif (isServerDisabled(definition)) {\n\t\tconst message = `Server \"${serverName}\" is disabled. Run /mcp enable ${serverName}, then /reload.`;\n\t\tui.notify(message, \"warning\");\n\t\treturn { ok: false, message };\n\t}\n\n\tif (!supportsOAuth(definition)) {\n\t\tconst message = `Server \"${serverName}\" does not use OAuth authentication. Set \"auth\": \"oauth\" or omit auth for auto-detection.`;\n\t\tui.notify(\n\t\t\t`Server \"${serverName}\" does not use OAuth authentication.\\n` +\n\t\t\t\t`Set \"auth\": \"oauth\" or omit auth for auto-detection.`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn { ok: false, message };\n\t}\n\n\ttry {\n\t\tconst serverUrl = resolveServerUrl(definition);\n\t\tif (!serverUrl) {\n\t\t\tconst message = `Server \"${serverName}\" has no URL configured (OAuth requires HTTP transport)`;\n\t\t\tui.notify(message, \"error\");\n\t\t\treturn { ok: false, message };\n\t\t}\n\n\t\tui.setStatus(\"mcp-auth\", `Authenticating ${serverName}...`);\n\t\tconst authStorageOptions = getAuthStorageOptions(config.settings?.oauthDir, cwd);\n\t\tconst status = await authenticate(serverName, serverUrl, definition, {\n\t\t\t...(authStorageOptions.baseDir ? { authStorageOptions } : {}),\n\t\t\tonAuthorizationUrl: async (authorizationUrl) => {\n\t\t\t\t// Best-effort: launch the user's browser straight to the authorization page\n\t\t\t\t// instead of relying on them to click (or copy) the link printed below.\n\t\t\t\tif (!nexus) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait openPath(nexus, authorizationUrl);\n\t\t\t\t} catch {\n\t\t\t\t\t// The link is still shown in the prompt text below; nothing else to do here.\n\t\t\t\t}\n\t\t\t},\n\t\t\tonAuthorizationInput: async (authorizationUrl, inputSignal) => {\n\t\t\t\tif (inputSignal.aborted) return undefined;\n\t\t\t\treturn ui.input(\n\t\t\t\t\t`Complete ${serverName} OAuth\\n\\n` +\n\t\t\t\t\t\t`${terminalHyperlink(\"Open authorization page\", authorizationUrl)}\\n${authorizationUrl}\\n\\n` +\n\t\t\t\t\t\t\"Approve access, then paste the full localhost callback URL below.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\t{ signal: inputSignal },\n\t\t\t\t);\n\t\t\t},\n\t\t\t...(signal ? { signal } : {}),\n\t\t\t...(runtime ? { runtime } : {}),\n\t\t});\n\t\tif (signal?.aborted) signal.throwIfAborted();\n\n\t\tif (status === \"authenticated\") {\n\t\t\tconst message = `OAuth authentication successful for \"${serverName}\".`;\n\t\t\tui.notify(message, \"info\");\n\t\t\treturn { ok: true, message };\n\t\t}\n\n\t\tconst message = `OAuth authentication failed for \"${serverName}\".`;\n\t\tui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t} catch (error) {\n\t\tif (signal?.aborted) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tui.notify(`Failed to authenticate \"${serverName}\": ${message}`, \"error\");\n\t\treturn { ok: false, message };\n\t} finally {\n\t\tif (!signal?.aborted) ui.setStatus(\"mcp-auth\", undefined);\n\t}\n}\n\nexport async function logoutServer(\n\tserverName: string,\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n): Promise<{ ok: boolean; message: string }> {\n\tconst definition = state.config.mcpServers[serverName];\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tif (!definition) {\n\t\tconst message = `Server \"${serverName}\" not found in config`;\n\t\tif (ui) ui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tconst signal = state.owner?.signal;\n\ttry {\n\t\tawait removeAuth(serverName, {\n\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\tsignal,\n\t\t\truntime: state.oauthRuntime,\n\t\t});\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) {\n\t\t\tui.notify(`Failed to clear OAuth credentials for \"${serverName}\": ${sanitizeTerminalText(message)}`, \"error\");\n\t\t}\n\t\treturn { ok: false, message };\n\t}\n\n\tstate.owner?.throwIfInactive();\n\ttry {\n\t\tawait state.manager.close(serverName);\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) {\n\t\t\tui.notify(\n\t\t\t\t`OAuth credentials were cleared for \"${serverName}\", but its connection could not be closed: ${sanitizeTerminalText(message)}`,\n\t\t\t\t\"error\",\n\t\t\t);\n\t\t}\n\t\treturn { ok: false, message };\n\t}\n\n\tstate.owner?.throwIfInactive();\n\tupdateStatusBar(state);\n\n\tconst message = `OAuth credentials cleared for \"${serverName}\". Run /mcp-auth ${serverName} to authenticate again.`;\n\tif (ui) ui.notify(message, \"info\");\n\treturn { ok: true, message };\n}\n\nfunction validateBearerTokenStoreServer(\n\tserverName: string,\n\tstate: McpExtensionState,\n): { ok: true; serverUrl: string } | { ok: false; message: string; type: \"error\" | \"warning\" } {\n\tconst safeName = sanitizeTerminalText(serverName);\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) return { ok: false, message: `Server \"${safeName}\" not found in config`, type: \"error\" };\n\tif (isServerDisabled(definition))\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage: `Server \"${safeName}\" is disabled. Run /mcp enable ${safeName}, then /reload.`,\n\t\t\ttype: \"warning\",\n\t\t};\n\tif (definition.auth !== \"bearer\" || definition.bearerTokenStore !== true) {\n\t\treturn { ok: false, message: `Server \"${safeName}\" is not configured for bearerTokenStore.`, type: \"error\" };\n\t}\n\t// resolveServerUrl embeds the interpolated URL in its exceptions; redact it\n\t// because the URL can carry userinfo or interpolated secrets.\n\tlet serverUrl: string | undefined;\n\ttry {\n\t\tserverUrl = resolveServerUrl(definition);\n\t} catch {\n\t\treturn { ok: false, message: `Server \"${safeName}\" has an invalid or unresolvable URL.`, type: \"error\" };\n\t}\n\tif (!serverUrl) return { ok: false, message: `Server \"${safeName}\" has no URL configured.`, type: \"error\" };\n\treturn { ok: true, serverUrl };\n}\n\nexport async function manageBearerToken(\n\taction: \"set\" | \"remove\" | \"status\",\n\tserverName: string,\n\tstate: McpExtensionState,\n\tctx: ExtensionContext,\n): Promise<{ ok: boolean; message: string }> {\n\tconst ui = ctx.hasUI ? ctx.ui : undefined;\n\tconst safeName = sanitizeTerminalText(serverName);\n\tconst validation = validateBearerTokenStoreServer(serverName, state);\n\tif (!validation.ok) {\n\t\tif (ui) ui.notify(validation.message, validation.type);\n\t\treturn { ok: false, message: validation.message };\n\t}\n\n\tif (action === \"set\") {\n\t\tconst message = `Nexus will not collect bearer tokens through an unmasked prompt. Configure bearerTokenEnv for \"${safeName}\" in MCP config, then reload.`;\n\t\tif (ui) ui.notify(message, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tif (action === \"status\") {\n\t\tconst status = inspectBearerTokenForUrl(serverName, validation.serverUrl);\n\t\tconst message =\n\t\t\tstatus.status === \"present\"\n\t\t\t\t? `Bearer token is stored for \"${safeName}\".`\n\t\t\t\t: status.status === \"url-mismatch\"\n\t\t\t\t\t? `Bearer token is stored for \"${safeName}\", but its URL does not match the current server URL.`\n\t\t\t\t\t: status.status === \"unavailable\"\n\t\t\t\t\t\t? status.message\n\t\t\t\t\t\t: `No bearer token is stored for \"${safeName}\".`;\n\t\tif (ui) ui.notify(message, status.status === \"unavailable\" ? \"error\" : \"info\");\n\t\treturn { ok: status.status !== \"unavailable\", message };\n\t}\n\n\ttry {\n\t\tremoveBearerToken(serverName);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (ui) ui.notify(`Failed to remove bearer token for \"${safeName}\": ${sanitizeTerminalText(message)}`, \"error\");\n\t\treturn { ok: false, message };\n\t}\n\n\tconst message = `Bearer token removed for \"${safeName}\".`;\n\tif (ui) ui.notify(message, \"info\");\n\treturn { ok: true, message };\n}\n\ntype ParsedAddServer = { ok: true; name: string; entry: ServerEntry } | { ok: false; error: string };\n\nconst ADD_SERVER_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\nfunction parseKeyValueFlag(\n\tflag: string,\n\traw: string | undefined,\n): { ok: true; key: string; value: string } | { ok: false; error: string } {\n\tconst eq = raw?.indexOf(\"=\") ?? -1;\n\tif (!raw || eq <= 0) return { ok: false, error: `${flag} expects KEY=VALUE, got \"${raw ?? \"\"}\".` };\n\treturn { ok: true, key: raw.slice(0, eq), value: raw.slice(eq + 1) };\n}\n\n/**\n * Parses `/mcp add <name> ...` arguments. Mirrors the rest of /mcp's naive\n * whitespace-split argument handling (no quoting support) rather than\n * inventing a shell-quote parser just for this subcommand.\n */\nexport function parseAddServerArgs(argv: string[]): ParsedAddServer {\n\tconst name = argv[0];\n\tif (!name) return { ok: false, error: \"Missing server name.\" };\n\tif (!ADD_SERVER_NAME_PATTERN.test(name)) {\n\t\treturn { ok: false, error: `Invalid server name \"${name}\" — use letters, digits, \".\", \"_\", \"-\".` };\n\t}\n\n\tconst rest = argv.slice(1);\n\tconst env: Record<string, string> = {};\n\tconst headers: Record<string, string> = {};\n\tlet cwd: string | undefined;\n\tlet url: string | undefined;\n\tlet auth: \"oauth\" | \"bearer\" | undefined;\n\tlet bearerTokenEnv: string | undefined;\n\tlet commandArgv: string[] | undefined;\n\n\tlet i = 0;\n\twhile (i < rest.length) {\n\t\tconst token = rest[i];\n\t\tif (token === \"--\") {\n\t\t\tcommandArgv = rest.slice(i + 1);\n\t\t\tbreak;\n\t\t}\n\t\tif (token === \"--url\") {\n\t\t\turl = rest[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--env\" || token === \"--header\") {\n\t\t\tconst parsed = parseKeyValueFlag(token, rest[i + 1]);\n\t\t\tif (!parsed.ok) return parsed;\n\t\t\t(token === \"--env\" ? env : headers)[parsed.key] = parsed.value;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--cwd\") {\n\t\t\tcwd = rest[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--auth\") {\n\t\t\tconst value = rest[i + 1];\n\t\t\tif (value !== \"oauth\" && value !== \"bearer\") {\n\t\t\t\treturn { ok: false, error: `--auth expects \"oauth\" or \"bearer\", got \"${value ?? \"\"}\".` };\n\t\t\t}\n\t\t\tauth = value;\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (token === \"--bearer-env\") {\n\t\t\tbearerTokenEnv = rest[i + 1];\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\treturn { ok: false, error: `Unrecognized argument \"${token}\".` };\n\t}\n\n\tif (url && commandArgv) {\n\t\treturn { ok: false, error: \"Use either --url (remote server) or -- <command> (local server), not both.\" };\n\t}\n\tif (!url && !commandArgv) {\n\t\treturn { ok: false, error: \"Specify a server type: --url <url> (remote), or -- <command> [args...] (local).\" };\n\t}\n\n\tif (commandArgv) {\n\t\tconst [command, ...args] = commandArgv;\n\t\tif (!command) return { ok: false, error: \"Missing command after --.\" };\n\t\tconst entry: ServerEntry = { command, ...(args.length ? { args } : {}) };\n\t\tif (Object.keys(env).length) entry.env = env;\n\t\tif (cwd) entry.cwd = cwd;\n\t\treturn { ok: true, name, entry };\n\t}\n\n\tconst entry: ServerEntry = { url: url as string };\n\tif (Object.keys(headers).length) entry.headers = headers;\n\tif (bearerTokenEnv) {\n\t\tentry.bearerTokenEnv = bearerTokenEnv;\n\t\tentry.auth = auth ?? \"bearer\";\n\t} else if (auth) {\n\t\tentry.auth = auth;\n\t}\n\treturn { ok: true, name, entry };\n}\n\nexport const ADD_SERVER_USAGE = [\n\t\"Usage:\",\n\t\" /mcp add <name> -- <command> [args...] local server, runs over stdio\",\n\t\" /mcp add <name> --url <url> remote server over HTTP\",\n\t\"\",\n\t\"Flags:\",\n\t\" --env KEY=VALUE extra environment variable (local, repeatable)\",\n\t\" --cwd <path> working directory (local)\",\n\t\" --header KEY=VALUE extra HTTP header (remote, repeatable)\",\n\t\" --auth oauth|bearer auth mode (remote; default is OAuth auto-detection)\",\n\t\" --bearer-env <VAR> read a bearer token from this env var (remote)\",\n\t\"\",\n\t\"For fields not covered here (lifecycle, includeTools, ...), edit the config\",\n\t'file directly — /mcp setup, then \"Open detected config paths\".',\n].join(\"\\n\");\n\n/** Adds a server to the project's shared MCP config. Reused by both `/mcp add` and any UI entry point. */\nexport function addCustomServer(cwd: string, name: string, entry: ServerEntry): { path: string } {\n\tconst path = writeSharedServerEntry(getProjectConfigPath(cwd), name, entry);\n\treturn { path };\n}\n\nexport interface PanelFlowResult {\n\tconfigChanged: boolean;\n}\n\nfunction buildSharedConfigNoticeLines(\n\tconfigOverridePath: string | undefined,\n\tcwd: string,\n): { lines: string[]; fingerprint: string | null } {\n\tconst discovery = getMcpStandardConfigSummary(configOverridePath, cwd);\n\tconst onboardingState = loadOnboardingState();\n\tif (!discovery.hasSharedServers || onboardingState.sharedConfigHintShown) {\n\t\treturn { lines: [], fingerprint: null };\n\t}\n\n\tconst sharedSources = discovery.sources.filter((source) => source.kind === \"shared\" && source.serverCount > 0);\n\tconst sourceList = sharedSources.map((source) => source.path).join(\", \");\n\treturn {\n\t\tlines: [\n\t\t\t`Using MCP configuration from ${sourceList}.`,\n\t\t\t\"Nexus writes compatibility imports and MCP-specific overrides only to Nexus configuration files.\",\n\t\t],\n\t\tfingerprint: discovery.fingerprint,\n\t};\n}\n\nexport async function openMcpSetup(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n\tmode: \"empty\" | \"setup\" = \"setup\",\n\toptions: { includeHostConfigs?: boolean } = {},\n): Promise<PanelFlowResult> {\n\tif (!ctx.hasUI) return { configChanged: false };\n\tif (!canRenderPanel(ctx)) {\n\t\tctx.ui.notify(\n\t\t\t`The interactive MCP setup panel is only available in the terminal UI (current mode: ${ctx.mode}). Edit .nexus/mcp.json directly, or run /mcp status to review servers.`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn { configChanged: false };\n\t}\n\tif (state.programmaticConfig) {\n\t\tctx.ui.notify(\"MCP setup is unavailable when config is supplied by createMcpAdapter().\", \"info\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst discovery = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options);\n\tconst onboardingState = loadOnboardingState();\n\tconst installedServers = Object.entries(state.config.mcpServers).map(([name, definition]) => {\n\t\tconst authCapable = supportsOAuth(definition);\n\t\treturn {\n\t\t\tname,\n\t\t\tdisabled: isServerDisabled(definition),\n\t\t\tkind: (definition.command ? \"stdio\" : \"http\") as \"stdio\" | \"http\",\n\t\t\tauthCapable,\n\t\t\tsignedIn: authCapable ? isSignedInForOAuth(name, definition, state) : false,\n\t\t};\n\t});\n\tlet configChanged = false;\n\tlet overlayHandle: OverlayHandle | undefined;\n\n\tconst callbacks = {\n\t\tpreviewImports: (imports: ImportKind[]) => previewCompatibilityImports(imports, configOverridePath),\n\t\tpreviewStarterProject: () => previewStarterProjectConfig(ctx.cwd),\n\t\tpreviewRepoPrompt: () => {\n\t\t\tconst repoPrompt = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options).repoPrompt;\n\t\t\tif (!repoPrompt.entry || !repoPrompt.targetPath || !repoPrompt.serverName) return null;\n\t\t\treturn previewSharedServerEntry(repoPrompt.targetPath, repoPrompt.serverName, repoPrompt.entry);\n\t\t},\n\t\tpreviewKnownServer: (preset: KnownServerPreset) =>\n\t\t\tpreviewSharedServerEntry(getProjectConfigPath(ctx.cwd), preset.id, preset.entry),\n\t\tadoptImports: async (imports: ImportKind[]) => {\n\t\t\tconst result = ensureCompatibilityImports(imports, configOverridePath);\n\t\t\tif (result.added.length > 0) configChanged = true;\n\t\t\treturn result;\n\t\t},\n\t\tscaffoldProjectConfig: async () => {\n\t\t\tconst path = writeStarterProjectConfig(ctx.cwd);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path };\n\t\t},\n\t\taddRepoPrompt: async () => {\n\t\t\tconst repoPrompt = getMcpDiscoverySummary(configOverridePath, ctx.cwd, options).repoPrompt;\n\t\t\tif (!repoPrompt.entry || !repoPrompt.targetPath || !repoPrompt.serverName) {\n\t\t\t\tthrow new Error(\"RepoPrompt is not available to add from this setup screen.\");\n\t\t\t}\n\t\t\tconst path = writeSharedServerEntry(repoPrompt.targetPath, repoPrompt.serverName, repoPrompt.entry);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path, serverName: repoPrompt.serverName };\n\t\t},\n\t\taddKnownServer: async (preset: KnownServerPreset) => {\n\t\t\tconst path = writeSharedServerEntry(getProjectConfigPath(ctx.cwd), preset.id, preset.entry);\n\t\t\tconfigChanged = true;\n\t\t\treturn { path, serverName: preset.name };\n\t\t},\n\t\topenPath: async (targetPath: string) => {\n\t\t\tawait openPath(nexus, targetPath);\n\t\t},\n\t\tmarkSetupCompleted: () => {\n\t\t\tpersistSetupCompleted(discovery.fingerprint);\n\t\t},\n\t\tseedEditor: (text: string) => {\n\t\t\tif (ctx.hasUI) ctx.ui.setEditorText(text);\n\t\t},\n\t\ttoggleServerDisabled: async (serverName: string, disabled: boolean) => {\n\t\t\tconst result = writeProjectServerDisabledOverride(configOverridePath, ctx.cwd, serverName, disabled);\n\t\t\tif (result.changed) configChanged = true;\n\t\t\treturn { path: result.path, changed: result.changed };\n\t\t},\n\t\tauthenticateServer: async (serverName: string, fallbackEntry?: ServerEntry) => {\n\t\t\t// A server added this session isn't in the live config until /reload —\n\t\t\t// hand authenticateServer a synthetic config with just that one entry\n\t\t\t// merged in, rather than making the user reload first.\n\t\t\tconst effectiveConfig: McpConfig =\n\t\t\t\tstate.config.mcpServers[serverName] || !fallbackEntry\n\t\t\t\t\t? state.config\n\t\t\t\t\t: { ...state.config, mcpServers: { ...state.config.mcpServers, [serverName]: fallbackEntry } };\n\t\t\t// The auth prompt (the actual link, and the \"paste the callback URL\"\n\t\t\t// input) renders as a *separate* overlay. Without hiding this one first,\n\t\t\t// it stays drawn on top and the auth prompt is invisible underneath it.\n\t\t\toverlayHandle?.setHidden(true);\n\t\t\ttry {\n\t\t\t\tconst result = await authenticateServer(\n\t\t\t\t\tserverName,\n\t\t\t\t\teffectiveConfig,\n\t\t\t\t\tctx,\n\t\t\t\t\tctx.signal,\n\t\t\t\t\tstate.oauthRuntime,\n\t\t\t\t\tnexus,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tok: result.ok,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tresult.message ??\n\t\t\t\t\t\t(result.ok ? `Signed in to \"${serverName}\".` : `Sign-in failed for \"${serverName}\".`),\n\t\t\t\t};\n\t\t\t} finally {\n\t\t\t\toverlayHandle?.setHidden(false);\n\t\t\t\toverlayHandle?.focus();\n\t\t\t}\n\t\t},\n\t};\n\n\treturn new Promise<PanelFlowResult>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpSetupPanel(\n\t\t\t\t\tdiscovery,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\t{ mode, onboardingState, keybindings, installedServers },\n\t\t\t\t\ttui,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\tresolve({ configChanged });\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 92, maxHeight: \"90%\" },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n}\n\nfunction buildMcpPanelCallbacks(\n\tstate: McpExtensionState,\n\tconfig: McpConfig,\n\tctx: ExtensionContext,\n\tnexus: ExtensionAPI,\n\tgetOverlayHandle?: () => OverlayHandle | undefined,\n): McpPanelCallbacks {\n\t// Panel-only diagnostics keep status inspection from mutating connection\n\t// failure state while allowing the existing panel failure UI to show why the\n\t// credential store could not be inspected.\n\tconst authStatusFailures = new Map<string, string>();\n\n\treturn {\n\t\treconnect: (serverName: string) => reconnectServer(state, ctx, serverName),\n\t\tcanAuthenticate: (serverName: string) => {\n\t\t\tconst definition = config.mcpServers[serverName];\n\t\t\treturn definition ? !isServerDisabled(definition) && supportsOAuth(definition) : false;\n\t\t},\n\t\tauthenticate: async (serverName: string) => {\n\t\t\tconst overlay = getOverlayHandle?.();\n\t\t\toverlay?.setHidden(true);\n\t\t\ttry {\n\t\t\t\treturn await authenticateServer(serverName, config, ctx, state.owner?.signal, state.oauthRuntime, nexus);\n\t\t\t} finally {\n\t\t\t\toverlay?.setHidden(false);\n\t\t\t\toverlay?.focus();\n\t\t\t}\n\t\t},\n\t\tgetConnectionStatus: (serverName: string) => {\n\t\t\tauthStatusFailures.delete(serverName);\n\t\t\tconst definition = config.mcpServers[serverName];\n\t\t\tif (isServerDisabled(definition)) return \"disabled\";\n\t\t\tconst connection = state.manager.getConnection(serverName);\n\t\t\tlet serverUrl: string | undefined;\n\t\t\ttry {\n\t\t\t\tserverUrl = definition ? resolveServerUrl(definition) : undefined;\n\t\t\t} catch {\n\t\t\t\treturn \"failed\";\n\t\t\t}\n\t\t\tif (\n\t\t\t\tdefinition?.auth === \"oauth\" &&\n\t\t\t\tserverUrl &&\n\t\t\t\tdefinition.oauth !== false &&\n\t\t\t\tdefinition.oauth?.grantType !== \"client_credentials\"\n\t\t\t) {\n\t\t\t\tconst authStatus = inspectAuthForUrl(serverName, serverUrl, state.authStorageOptions);\n\t\t\t\tif (authStatus.status === \"unavailable\") {\n\t\t\t\t\tauthStatusFailures.set(serverName, authStatus.message);\n\t\t\t\t\treturn \"failed\";\n\t\t\t\t}\n\t\t\t\tif (authStatus.status === \"absent\" || !authStatus.entry.tokens) {\n\t\t\t\t\treturn \"needs-auth\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (connection?.status === \"needs-auth\") return \"needs-auth\";\n\t\t\tif (connection?.status === \"connected\") return \"connected\";\n\t\t\tif (getFailureAgeSeconds(state, serverName) !== null) return \"failed\";\n\t\t\treturn \"idle\";\n\t\t},\n\t\tgetFailureMessage: (serverName: string) =>\n\t\t\tauthStatusFailures.get(serverName) ?? getFailureMessage(state, serverName),\n\t\trefreshCacheAfterReconnect: (serverName: string) => {\n\t\t\tconst freshCache = loadMetadataCache();\n\t\t\treturn freshCache?.servers?.[serverName] ?? null;\n\t\t},\n\t};\n}\n\nexport async function openMcpPanel(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n\tonDirectToolsConfigChanged?: (changes: Map<string, true | string[] | false>) => void | Promise<void>,\n): Promise<PanelFlowResult> {\n\tif (state.programmaticConfig) {\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.notify(\n\t\t\t\t\"MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t\tawait showStatus(state, ctx);\n\t\t}\n\t\treturn { configChanged: false };\n\t}\n\tif (!canRenderPanel(ctx)) {\n\t\t// No overlay here, but the same information is available as text.\n\t\tawait showStatus(state, ctx);\n\t\treturn { configChanged: false };\n\t}\n\tif (Object.keys(state.config.mcpServers).length === 0) {\n\t\treturn openMcpSetup(state, nexus, ctx, configOverridePath, \"empty\", { includeHostConfigs: false });\n\t}\n\n\tconst config = state.config;\n\tconst cache = loadMetadataCache();\n\tconst configPath = (nexus.getFlag(\"mcp-config\") as string | undefined) ?? configOverridePath;\n\tconst provenanceMap = getServerProvenance(configPath, ctx.cwd);\n\tconst { lines: noticeLines, fingerprint } = buildSharedConfigNoticeLines(configPath, ctx.cwd);\n\n\tlet overlayHandle: OverlayHandle | undefined;\n\tconst callbacks = buildMcpPanelCallbacks(state, config, ctx, nexus, () => overlayHandle);\n\n\tlet configChanged = false;\n\n\tawait new Promise<void>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpPanel(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcache,\n\t\t\t\t\tprovenanceMap,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\ttui,\n\t\t\t\t\t(result: McpPanelResult) => {\n\t\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\t\tif (!result.cancelled && result.changes.size > 0) {\n\t\t\t\t\t\t\t\twriteDirectToolsConfig(result.changes, provenanceMap);\n\t\t\t\t\t\t\t\tconfigChanged = true;\n\t\t\t\t\t\t\t\tawait onDirectToolsConfigChanged?.(result.changes);\n\t\t\t\t\t\t\t\tctx.ui.notify(\"Direct tools updated for this session.\", \"info\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t})().catch((error) => {\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tctx.ui.notify(`Direct tools updated, but live refresh failed: ${message}`, \"error\");\n\t\t\t\t\t\t\tconfigChanged = true;\n\t\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\t{ noticeLines, keybindings },\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 82 },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n\n\tif (noticeLines.length > 0 && fingerprint) {\n\t\tmarkSharedConfigHintShown(fingerprint);\n\t}\n\n\treturn { configChanged };\n}\n\nexport async function openMcpAuthPanel(\n\tstate: McpExtensionState,\n\tnexus: ExtensionAPI,\n\tctx: ExtensionContext,\n\tconfigOverridePath?: string,\n): Promise<PanelFlowResult> {\n\tif (!ctx.hasUI) return { configChanged: false };\n\tif (!canRenderPanel(ctx)) {\n\t\tctx.ui.notify(\n\t\t\t`The interactive MCP auth panel is only available in the terminal UI (current mode: ${ctx.mode}). Use /mcp-auth <server> to authenticate a specific server.`,\n\t\t\t\"info\",\n\t\t);\n\t\treturn { configChanged: false };\n\t}\n\tif (state.programmaticConfig) {\n\t\tctx.ui.notify(\"Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.\", \"info\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst config = state.config;\n\tconst oauthServers = Object.entries(config.mcpServers).filter(\n\t\t([, definition]) => !isServerDisabled(definition) && supportsOAuth(definition),\n\t);\n\tif (oauthServers.length === 0) {\n\t\tctx.ui.notify(\"No OAuth-capable MCP servers are configured.\", \"warning\");\n\t\treturn { configChanged: false };\n\t}\n\n\tconst cache = loadMetadataCache();\n\tconst configPath = (nexus.getFlag(\"mcp-config\") as string | undefined) ?? configOverridePath;\n\tconst provenanceMap = getServerProvenance(configPath, ctx.cwd);\n\tlet overlayHandle: OverlayHandle | undefined;\n\tconst callbacks = buildMcpPanelCallbacks(state, config, ctx, nexus, () => overlayHandle);\n\tawait new Promise<void>((resolve) => {\n\t\tctx.ui.custom(\n\t\t\t(tui, _theme, keybindings, done) => {\n\t\t\t\treturn createMcpPanel(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcache,\n\t\t\t\t\tprovenanceMap,\n\t\t\t\t\tcallbacks,\n\t\t\t\t\ttui,\n\t\t\t\t\t() => {\n\t\t\t\t\t\tdone(undefined);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tauthOnly: true,\n\t\t\t\t\t\tkeybindings,\n\t\t\t\t\t\tnoticeLines: [\"Select an OAuth MCP server and press Enter or ctrl+a to authenticate.\"],\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t},\n\t\t\t{\n\t\t\t\toverlay: true,\n\t\t\t\toverlayOptions: { anchor: \"center\", width: 82 },\n\t\t\t\tonHandle: (handle) => {\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t});\n\n\treturn { configChanged: false };\n}\n"]}
|
|
@@ -5,6 +5,8 @@ export interface KnownServerPreset {
|
|
|
5
5
|
name: string;
|
|
6
6
|
summary: string;
|
|
7
7
|
entry: ServerEntry;
|
|
8
|
+
/** Optional "learn more" link shown in the setup panel. Not used for anything functional. */
|
|
9
|
+
docsUrl?: string;
|
|
8
10
|
}
|
|
9
11
|
export declare const KNOWN_SERVER_PRESETS: readonly KnownServerPreset[];
|
|
10
12
|
interface ConfigSourceSpec {
|