@agi-fans/dsh-tui 0.26.1 → 0.28.0
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/lib/CHANGELOG.md +44 -1
- package/lib/chrome/status-line.js +4 -0
- package/lib/chrome/status-line.js.map +1 -1
- package/lib/chrome/tool-renderers.js +140 -4
- package/lib/chrome/tool-renderers.js.map +1 -1
- package/lib/commands/auth-account.js +2 -1
- package/lib/commands/auth-account.js.map +1 -1
- package/lib/commands/export.js +1 -1
- package/lib/commands/export.js.map +1 -1
- package/lib/commands/files.js +1 -1
- package/lib/commands/files.js.map +1 -1
- package/lib/commands/integrations.d.ts +1 -1
- package/lib/commands/integrations.js +126 -28
- package/lib/commands/integrations.js.map +1 -1
- package/lib/commands/permission.js +26 -5
- package/lib/commands/permission.js.map +1 -1
- package/lib/commands/plugins.js +216 -11
- package/lib/commands/plugins.js.map +1 -1
- package/lib/commands/session.js +18 -1
- package/lib/commands/session.js.map +1 -1
- package/lib/commands/team.d.ts +12 -0
- package/lib/commands/team.js +205 -0
- package/lib/commands/team.js.map +1 -0
- package/lib/definition.d.ts +3 -0
- package/lib/locale/zh.d.ts +164 -1
- package/lib/locale/zh.js +165 -2
- package/lib/locale/zh.js.map +1 -1
- package/lib/runtime/account-settings.js +145 -9
- package/lib/runtime/account-settings.js.map +1 -1
- package/lib/runtime/file-open.d.ts +2 -1
- package/lib/runtime/file-open.js +3 -8
- package/lib/runtime/file-open.js.map +1 -1
- package/lib/runtime/file-recovery-recording.js +1 -1
- package/lib/runtime/file-recovery-recording.js.map +1 -1
- package/lib/runtime/file-review.js +2 -2
- package/lib/runtime/file-review.js.map +1 -1
- package/lib/runtime/image-preview.js +1 -1
- package/lib/runtime/image-preview.js.map +1 -1
- package/lib/runtime/mcp-settings.d.ts +33 -0
- package/lib/runtime/mcp-settings.js +555 -0
- package/lib/runtime/mcp-settings.js.map +1 -0
- package/lib/runtime/plugin-settings.js +14 -3
- package/lib/runtime/plugin-settings.js.map +1 -1
- package/lib/runtime/runner.js +1 -1
- package/lib/runtime/tmux-settings.d.ts +21 -0
- package/lib/runtime/tmux-settings.js +60 -0
- package/lib/runtime/tmux-settings.js.map +1 -0
- package/lib/runtime/web-settings.js +55 -10
- package/lib/runtime/web-settings.js.map +1 -1
- package/lib/session/interaction-adapter.js +6 -1
- package/lib/session/interaction-adapter.js.map +1 -1
- package/lib/session/session-controller.js +109 -39
- package/lib/session/session-controller.js.map +1 -1
- package/lib/session/subagent-roster.d.ts +4 -1
- package/lib/session/subagent-roster.js +43 -14
- package/lib/session/subagent-roster.js.map +1 -1
- package/lib/session/subagent-tracker.d.ts +14 -3
- package/lib/session/subagent-tracker.js +7 -1
- package/lib/session/subagent-tracker.js.map +1 -1
- package/lib/views/autocomplete.js +1 -1
- package/lib/views/autocomplete.js.map +1 -1
- package/lib/views/trajectory.js +6 -2
- package/lib/views/trajectory.js.map +1 -1
- package/lib/views/transcript-render.js +8 -3
- package/lib/views/transcript-render.js.map +1 -1
- package/package.json +72 -57
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
/** Live MCP server management over dsh-mcp-manager and dsh-settings. */
|
|
2
|
+
import { SERVER_NAME_PATTERN, assertTemplateSyntax, connectionStatusOf, } from '@deepseek-ai/dsh-mcp-client';
|
|
3
|
+
import { askPrompt, choosePrompt, confirmPrompt } from "../prompt-intents.js";
|
|
4
|
+
import { resolveUiLanguage, uiText } from "../locale/index.js";
|
|
5
|
+
export const MCP_MANAGER_NS = 'mcp-manager';
|
|
6
|
+
export const MCP_SETTINGS_ID = 'mcp:servers';
|
|
7
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
|
+
function describeManager(ctx) {
|
|
9
|
+
return ctx.get('settings')?.describe({ redactSecrets: true }).find(section => section.ns === MCP_MANAGER_NS);
|
|
10
|
+
}
|
|
11
|
+
function configuredServerMap(value) {
|
|
12
|
+
if (!isRecord(value) || !isRecord(value.servers))
|
|
13
|
+
return {};
|
|
14
|
+
const result = {};
|
|
15
|
+
for (const [name, entry] of Object.entries(value.servers)) {
|
|
16
|
+
if (isRecord(entry))
|
|
17
|
+
result[name] = entry;
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
/** Read live connection status for a static `@deepseek-ai/dsh-mcp-client` Loader entry when mounted. */
|
|
22
|
+
export function staticMcpConnectionStatus(ctx, entryId) {
|
|
23
|
+
const loader = ctx.get('loader');
|
|
24
|
+
if (loader === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const entry = [...loader.entries()].find(candidate => candidate.options.id === entryId);
|
|
27
|
+
return entry?.fiber === undefined ? undefined : connectionStatusOf(entry.fiber)?.current();
|
|
28
|
+
}
|
|
29
|
+
/** Format any managed or client MCP status for single-line summaries and diagnostics. */
|
|
30
|
+
export function formatMcpStatus(status, t = (source, values) => uiText('en', source, values)) {
|
|
31
|
+
if (status === undefined)
|
|
32
|
+
return t('not mounted');
|
|
33
|
+
switch (status.state) {
|
|
34
|
+
case 'connected':
|
|
35
|
+
return t('connected · {count} tools', { count: status.toolCount });
|
|
36
|
+
case 'connecting':
|
|
37
|
+
return status.attempt > 0
|
|
38
|
+
? t('connecting (attempt {attempt})', { attempt: status.attempt + 1 })
|
|
39
|
+
: t('connecting');
|
|
40
|
+
case 'waiting-credentials':
|
|
41
|
+
return status.lastError
|
|
42
|
+
? `${t('waiting for credentials')} · ${status.lastError}`
|
|
43
|
+
: t('waiting for credentials');
|
|
44
|
+
case 'reconnecting':
|
|
45
|
+
return `${t('reconnecting ({attempt}/{max})', { attempt: status.attempt, max: status.maxAttempts })}${status.lastError ? ` · ${status.lastError}` : ''}`;
|
|
46
|
+
case 'disabled':
|
|
47
|
+
return t('disabled');
|
|
48
|
+
case 'closed':
|
|
49
|
+
return status.result.cleanupError
|
|
50
|
+
? `${t('closed')} · ${status.result.cleanupError}`
|
|
51
|
+
: t('closed');
|
|
52
|
+
case 'failed': {
|
|
53
|
+
if (status.reason === 'cleanup') {
|
|
54
|
+
const detail = status.result.cleanupError ?? (status.result.closeConfirmed ? '' : t('transport closure unconfirmed'));
|
|
55
|
+
return detail ? `${t('failed (cleanup)')} · ${detail}` : t('failed (cleanup)');
|
|
56
|
+
}
|
|
57
|
+
return status.lastError
|
|
58
|
+
? `${t('failed ({reason})', { reason: status.reason })} · ${status.lastError}`
|
|
59
|
+
: t('failed ({reason})', { reason: status.reason });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Render a stage-classified MCP probe outcome without leaking credentials. */
|
|
64
|
+
export function formatMcpProbeResult(name, result, t = (source, values) => uiText('en', source, values)) {
|
|
65
|
+
const lines = [];
|
|
66
|
+
if (result.ok) {
|
|
67
|
+
const serverLabel = result.serverInfo ? `${result.serverInfo.name} ${result.serverInfo.version}`.trim() : name;
|
|
68
|
+
lines.push(t('Probe succeeded ({duration}ms) · {server} · Tools: {count}', {
|
|
69
|
+
duration: Math.round(result.durationMs),
|
|
70
|
+
server: serverLabel,
|
|
71
|
+
count: result.toolNames.length,
|
|
72
|
+
}));
|
|
73
|
+
if (result.toolNames.length > 0) {
|
|
74
|
+
const preview = result.toolNames.map(tool => `\`${tool}\``).join(', ');
|
|
75
|
+
lines.push(result.truncated ? `${preview} …` : preview);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
lines.push(t('Probe failed during {stage} ({duration}ms): {message}', {
|
|
80
|
+
stage: result.stage,
|
|
81
|
+
duration: Math.round(result.durationMs),
|
|
82
|
+
message: result.message,
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
if (!result.closeConfirmed || result.cleanupError !== undefined) {
|
|
86
|
+
lines.push(t('Probe cleanup warning: {detail}', {
|
|
87
|
+
detail: result.cleanupError ?? t('transport closure was not confirmed'),
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
return lines.join('\n');
|
|
91
|
+
}
|
|
92
|
+
/** Parse optional command arguments from either a JSON string array or shell-like tokens. */
|
|
93
|
+
export function parseMcpArgs(raw) {
|
|
94
|
+
const trimmed = raw.trim();
|
|
95
|
+
if (trimmed === '')
|
|
96
|
+
return [];
|
|
97
|
+
if (trimmed.startsWith('[')) {
|
|
98
|
+
const parsed = JSON.parse(trimmed);
|
|
99
|
+
if (!Array.isArray(parsed) || parsed.some(item => typeof item !== 'string')) {
|
|
100
|
+
throw new Error('Arguments JSON must be an array of strings.');
|
|
101
|
+
}
|
|
102
|
+
return parsed;
|
|
103
|
+
}
|
|
104
|
+
const tokens = [];
|
|
105
|
+
let current = '';
|
|
106
|
+
let quote = null;
|
|
107
|
+
let escaped = false;
|
|
108
|
+
for (const ch of trimmed) {
|
|
109
|
+
if (escaped) {
|
|
110
|
+
current += ch;
|
|
111
|
+
escaped = false;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (ch === '\\' && quote !== "'") {
|
|
115
|
+
escaped = true;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (quote !== null) {
|
|
119
|
+
if (ch === quote)
|
|
120
|
+
quote = null;
|
|
121
|
+
else
|
|
122
|
+
current += ch;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (ch === '"' || ch === "'") {
|
|
126
|
+
quote = ch;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (/\s/u.test(ch)) {
|
|
130
|
+
if (current !== '') {
|
|
131
|
+
tokens.push(current);
|
|
132
|
+
current = '';
|
|
133
|
+
}
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
current += ch;
|
|
137
|
+
}
|
|
138
|
+
if (escaped || quote !== null)
|
|
139
|
+
throw new Error('Unterminated quote or escape in arguments.');
|
|
140
|
+
if (current !== '')
|
|
141
|
+
tokens.push(current);
|
|
142
|
+
return tokens;
|
|
143
|
+
}
|
|
144
|
+
/** Parse newline- or semicolon-separated `KEY=VALUE` pairs for env or headers. */
|
|
145
|
+
export function parseMcpKeyValues(raw, kind) {
|
|
146
|
+
const trimmed = raw.trim();
|
|
147
|
+
if (trimmed === '')
|
|
148
|
+
return {};
|
|
149
|
+
if (trimmed.startsWith('{')) {
|
|
150
|
+
const parsed = JSON.parse(trimmed);
|
|
151
|
+
if (!isRecord(parsed) || Object.values(parsed).some(item => typeof item !== 'string')) {
|
|
152
|
+
throw new Error(`${kind === 'env' ? 'Environment variables' : 'Headers'} JSON must be a string map.`);
|
|
153
|
+
}
|
|
154
|
+
return Object.fromEntries(Object.entries(parsed).map(([k, v]) => [k, String(v)]));
|
|
155
|
+
}
|
|
156
|
+
const result = {};
|
|
157
|
+
for (const segment of trimmed.split(/\r?\n|;/u)) {
|
|
158
|
+
const line = segment.trim();
|
|
159
|
+
if (line === '')
|
|
160
|
+
continue;
|
|
161
|
+
const eq = line.indexOf('=');
|
|
162
|
+
const colon = kind === 'headers' && (eq === -1 || (line.indexOf(':') !== -1 && line.indexOf(':') < eq))
|
|
163
|
+
? line.indexOf(':')
|
|
164
|
+
: -1;
|
|
165
|
+
const sep = colon !== -1 ? colon : eq;
|
|
166
|
+
if (sep <= 0) {
|
|
167
|
+
throw new Error(`Invalid ${kind === 'env' ? 'KEY=VALUE' : 'Header=Value'} entry: ${line}`);
|
|
168
|
+
}
|
|
169
|
+
const key = line.slice(0, sep).trim();
|
|
170
|
+
const value = line.slice(sep + 1).trim();
|
|
171
|
+
if (key === '')
|
|
172
|
+
throw new Error(`Empty key in ${line}`);
|
|
173
|
+
result[key] = value;
|
|
174
|
+
}
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
function summarizeEntry(entry, t) {
|
|
178
|
+
if (entry === undefined)
|
|
179
|
+
return [];
|
|
180
|
+
if (entry.transport === 'streamable-http') {
|
|
181
|
+
const headerKeys = isRecord(entry.headers) ? Object.keys(entry.headers) : [];
|
|
182
|
+
return [
|
|
183
|
+
`${t('Transport')}: streamable-http`,
|
|
184
|
+
...(entry.url ? [`URL: ${entry.url}`] : []),
|
|
185
|
+
...(headerKeys.length > 0 ? [`${t('Headers')}: ${headerKeys.join(', ')}`] : []),
|
|
186
|
+
];
|
|
187
|
+
}
|
|
188
|
+
if (entry.transport === 'stdio') {
|
|
189
|
+
const args = Array.isArray(entry.args) && entry.args.length > 0 ? ` ${entry.args.join(' ')}` : '';
|
|
190
|
+
const envKeys = isRecord(entry.env) ? Object.keys(entry.env) : [];
|
|
191
|
+
return [
|
|
192
|
+
`${t('Transport')}: stdio`,
|
|
193
|
+
...(entry.command ? [`${t('Command')}: ${entry.command}${args}`] : []),
|
|
194
|
+
...(entry.cwd ? [`cwd: ${entry.cwd}`] : []),
|
|
195
|
+
...(envKeys.length > 0 ? [`env: ${envKeys.join(', ')}`] : []),
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
return [];
|
|
199
|
+
}
|
|
200
|
+
function managerSummary(ctx) {
|
|
201
|
+
const views = ctx.get('mcpManager')?.list();
|
|
202
|
+
if (views === undefined)
|
|
203
|
+
return 'Configure';
|
|
204
|
+
if (views.length === 0)
|
|
205
|
+
return 'None configured';
|
|
206
|
+
const connected = views.filter(view => view.status.state === 'connected').length;
|
|
207
|
+
return connected > 0 ? `${connected}/${views.length} connected` : `${views.length} configured`;
|
|
208
|
+
}
|
|
209
|
+
export function mcpSettingsEntry(ctx) {
|
|
210
|
+
if (ctx.get('mcpManager') === undefined && describeManager(ctx) === undefined)
|
|
211
|
+
return [];
|
|
212
|
+
const writable = ctx.get('settings')?.writable === true;
|
|
213
|
+
return [{
|
|
214
|
+
id: MCP_SETTINGS_ID,
|
|
215
|
+
label: 'MCP servers',
|
|
216
|
+
section: 'integrations',
|
|
217
|
+
subgroup: 'MCP',
|
|
218
|
+
fields: [],
|
|
219
|
+
behavior: writable ? 'Profile · Saves immediately · Live' : 'Profile · Read only',
|
|
220
|
+
summary: managerSummary(ctx),
|
|
221
|
+
keywords: ['mcp', 'servers', 'stdio', 'streamable-http', 'tools'],
|
|
222
|
+
description: 'Add, enable, probe, restart, or remove live MCP servers. Static mcp.json servers continue to mount alongside them.',
|
|
223
|
+
}];
|
|
224
|
+
}
|
|
225
|
+
/** Interactive wizard to add a stdio or streamable-http MCP server to `mcp-manager`. */
|
|
226
|
+
export async function promptAddMcpServer(ctx, tui, signal) {
|
|
227
|
+
const language = resolveUiLanguage(ctx.get('tui')?.prefs?.().uiLanguage);
|
|
228
|
+
const t = (source, values) => uiText(language, source, values);
|
|
229
|
+
const settings = ctx.get('settings');
|
|
230
|
+
if (settings === undefined || !settings.writable) {
|
|
231
|
+
tui.notice?.(t('This profile is read-only.'), { level: 'error' });
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
const section = describeManager(ctx);
|
|
235
|
+
if (section === undefined) {
|
|
236
|
+
tui.notice?.(t('MCP manager configuration is unavailable in this host.'), { level: 'error' });
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const rawName = await tui.prompt(askPrompt({
|
|
240
|
+
title: t('Add MCP server'),
|
|
241
|
+
question: t('Server name'),
|
|
242
|
+
detail: t('Use 1–32 letters, digits, hyphens, or underscores (for example: docs). Tools register as mcp__<name>__<tool>.'),
|
|
243
|
+
signal,
|
|
244
|
+
}));
|
|
245
|
+
if (rawName === null || signal.aborted)
|
|
246
|
+
return null;
|
|
247
|
+
const name = rawName.trim();
|
|
248
|
+
if (!SERVER_NAME_PATTERN.test(name)) {
|
|
249
|
+
throw new Error(t('Server name must match [A-Za-z0-9_-]{1,32}.'));
|
|
250
|
+
}
|
|
251
|
+
const existing = ctx.get('mcpManager')?.list().some(view => view.name === name && view.configured)
|
|
252
|
+
|| Object.hasOwn(configuredServerMap(section.value), name);
|
|
253
|
+
if (existing) {
|
|
254
|
+
throw new Error(t('Server "{name}" already exists.', { name }));
|
|
255
|
+
}
|
|
256
|
+
const transport = await tui.prompt(choosePrompt({
|
|
257
|
+
title: t('Add MCP server'),
|
|
258
|
+
question: t('Choose transport for {name}', { name }),
|
|
259
|
+
options: [
|
|
260
|
+
{ label: t('Local process (stdio)'), value: 'stdio', description: t('Spawn a local command over stdin/stdout.') },
|
|
261
|
+
{ label: t('Remote endpoint (Streamable HTTP)'), value: 'streamable-http', description: t('Connect to an HTTP/SSE MCP endpoint.') },
|
|
262
|
+
],
|
|
263
|
+
signal,
|
|
264
|
+
}));
|
|
265
|
+
if (transport === null || signal.aborted)
|
|
266
|
+
return null;
|
|
267
|
+
let entry;
|
|
268
|
+
if (transport === 'stdio') {
|
|
269
|
+
const command = (await tui.prompt(askPrompt({
|
|
270
|
+
title: name,
|
|
271
|
+
question: t('Executable command'),
|
|
272
|
+
detail: t('Executable started without a shell (for example: npx, uvx, or node).'),
|
|
273
|
+
signal,
|
|
274
|
+
})))?.trim() ?? '';
|
|
275
|
+
if (!command || signal.aborted)
|
|
276
|
+
return null;
|
|
277
|
+
assertTemplateSyntax(command, `servers.${name}.command`);
|
|
278
|
+
const rawArgs = await tui.prompt(askPrompt({
|
|
279
|
+
title: name,
|
|
280
|
+
question: t('Arguments (optional)'),
|
|
281
|
+
detail: t('Space-separated arguments or a JSON array (for example: -y @modelcontextprotocol/server-memory). Leave empty for none.'),
|
|
282
|
+
signal,
|
|
283
|
+
}));
|
|
284
|
+
if (rawArgs === null || signal.aborted)
|
|
285
|
+
return null;
|
|
286
|
+
const args = parseMcpArgs(rawArgs);
|
|
287
|
+
args.forEach((arg, index) => assertTemplateSyntax(arg, `servers.${name}.args[${index}]`));
|
|
288
|
+
const rawEnv = await tui.prompt(askPrompt({
|
|
289
|
+
title: name,
|
|
290
|
+
question: t('Environment variables (optional)'),
|
|
291
|
+
detail: t('Enter KEY=VALUE pairs (separated by ";" or newlines). Use ${credential:NAME} to reference stored secrets.'),
|
|
292
|
+
signal,
|
|
293
|
+
}));
|
|
294
|
+
if (rawEnv === null || signal.aborted)
|
|
295
|
+
return null;
|
|
296
|
+
const env = parseMcpKeyValues(rawEnv, 'env');
|
|
297
|
+
for (const [key, value] of Object.entries(env))
|
|
298
|
+
assertTemplateSyntax(value, `servers.${name}.env.${key}`);
|
|
299
|
+
entry = {
|
|
300
|
+
transport: 'stdio',
|
|
301
|
+
command,
|
|
302
|
+
...(args.length > 0 ? { args } : {}),
|
|
303
|
+
...(Object.keys(env).length > 0 ? { env } : {}),
|
|
304
|
+
enabled: true,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
const url = (await tui.prompt(askPrompt({
|
|
309
|
+
title: name,
|
|
310
|
+
question: t('MCP endpoint URL'),
|
|
311
|
+
detail: t('HTTP or HTTPS Streamable HTTP endpoint (for example: https://example.com/mcp).'),
|
|
312
|
+
signal,
|
|
313
|
+
})))?.trim() ?? '';
|
|
314
|
+
if (!url || signal.aborted)
|
|
315
|
+
return null;
|
|
316
|
+
assertTemplateSyntax(url, `servers.${name}.url`);
|
|
317
|
+
const rawHeaders = await tui.prompt(askPrompt({
|
|
318
|
+
title: name,
|
|
319
|
+
question: t('Request headers (optional)'),
|
|
320
|
+
detail: t('Enter Header=Value pairs (separated by ";" or newlines). Use ${credential:NAME} to reference stored secrets.'),
|
|
321
|
+
signal,
|
|
322
|
+
}));
|
|
323
|
+
if (rawHeaders === null || signal.aborted)
|
|
324
|
+
return null;
|
|
325
|
+
const headers = parseMcpKeyValues(rawHeaders, 'headers');
|
|
326
|
+
for (const [key, value] of Object.entries(headers))
|
|
327
|
+
assertTemplateSyntax(value, `servers.${name}.headers.${key}`);
|
|
328
|
+
entry = {
|
|
329
|
+
transport: 'streamable-http',
|
|
330
|
+
url,
|
|
331
|
+
...(Object.keys(headers).length > 0 ? { headers } : {}),
|
|
332
|
+
enabled: true,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
const latest = describeManager(ctx);
|
|
336
|
+
if (latest === undefined)
|
|
337
|
+
throw new Error(t('MCP manager configuration is no longer available.'));
|
|
338
|
+
await settings.mutate(MCP_MANAGER_NS, [{ op: 'set', path: ['servers', name], value: entry }], latest.revision);
|
|
339
|
+
tui.notice?.(t('MCP server "{name}" saved.', { name }), { transient: true });
|
|
340
|
+
return name;
|
|
341
|
+
}
|
|
342
|
+
/** Manage one runtime MCP server: inspect status, enable/disable, probe, restart, or remove. */
|
|
343
|
+
export async function manageMcpServer(ctx, tui, name, signal, extraDetail) {
|
|
344
|
+
const language = resolveUiLanguage(ctx.get('tui')?.prefs?.().uiLanguage);
|
|
345
|
+
const t = (source, values) => uiText(language, source, values);
|
|
346
|
+
let diagnostic = '';
|
|
347
|
+
let initialValue;
|
|
348
|
+
while (!signal.aborted) {
|
|
349
|
+
const manager = ctx.get('mcpManager');
|
|
350
|
+
const section = describeManager(ctx);
|
|
351
|
+
const configured = configuredServerMap(section?.value);
|
|
352
|
+
const baseServers = configuredServerMap(section?.base);
|
|
353
|
+
const userServers = configuredServerMap(section?.user);
|
|
354
|
+
const entry = configured[name];
|
|
355
|
+
const hasConfig = entry !== undefined;
|
|
356
|
+
const hasOverride = Object.hasOwn(userServers, name);
|
|
357
|
+
const hasInherited = Object.hasOwn(baseServers, name);
|
|
358
|
+
const view = manager?.list().find(item => item.name === name);
|
|
359
|
+
if (view === undefined && !hasConfig)
|
|
360
|
+
return;
|
|
361
|
+
const origin = hasConfig
|
|
362
|
+
? (hasOverride ? t('Profile override') : t('Inherited'))
|
|
363
|
+
: view?.configured
|
|
364
|
+
? t('Registered by plugin')
|
|
365
|
+
: t('Removed (cleanup pending)');
|
|
366
|
+
const enabled = entry?.enabled ?? (view?.status.state !== 'disabled');
|
|
367
|
+
const writable = ctx.get('settings')?.writable === true && section !== undefined;
|
|
368
|
+
const detail = [
|
|
369
|
+
`${t('Status')}: ${formatMcpStatus(view?.status, t)} · ${origin}`,
|
|
370
|
+
...summarizeEntry(entry, t),
|
|
371
|
+
diagnostic,
|
|
372
|
+
extraDetail?.() ?? '',
|
|
373
|
+
].filter(Boolean).join('\n\n');
|
|
374
|
+
const options = [
|
|
375
|
+
...(hasConfig && writable ? [{
|
|
376
|
+
label: t(enabled ? 'Disable server' : 'Enable server'),
|
|
377
|
+
value: 'toggle',
|
|
378
|
+
}] : []),
|
|
379
|
+
...(manager !== undefined && (view?.configured ?? hasConfig) ? [
|
|
380
|
+
{ label: t('Probe connection'), value: 'probe', description: t('Connect once, list tools, and close without touching the live instance.') },
|
|
381
|
+
{ label: t('Restart server'), value: 'restart', description: t('Reconnect from scratch with a fresh retry budget.') },
|
|
382
|
+
] : []),
|
|
383
|
+
...(hasOverride && writable ? [{
|
|
384
|
+
label: t(hasInherited ? 'Restore inherited configuration' : 'Remove server'),
|
|
385
|
+
value: 'unset',
|
|
386
|
+
}] : []),
|
|
387
|
+
{ label: t('Refresh'), value: 'refresh' },
|
|
388
|
+
{ label: t('Back'), value: 'back' },
|
|
389
|
+
];
|
|
390
|
+
const action = await tui.prompt({
|
|
391
|
+
title: name,
|
|
392
|
+
question: t('Manage MCP server'),
|
|
393
|
+
detail,
|
|
394
|
+
options,
|
|
395
|
+
allowCustom: false,
|
|
396
|
+
notify: false,
|
|
397
|
+
...(initialValue === undefined ? {} : { initialValue }),
|
|
398
|
+
signal,
|
|
399
|
+
});
|
|
400
|
+
if (action === null || action === 'back' || signal.aborted)
|
|
401
|
+
return;
|
|
402
|
+
initialValue = action;
|
|
403
|
+
if (action === 'refresh') {
|
|
404
|
+
diagnostic = '';
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
try {
|
|
408
|
+
if (action === 'toggle') {
|
|
409
|
+
const current = describeManager(ctx);
|
|
410
|
+
if (current === undefined)
|
|
411
|
+
throw new Error(t('MCP manager configuration is unavailable.'));
|
|
412
|
+
const latestEnabled = configuredServerMap(current.value)[name]?.enabled ?? true;
|
|
413
|
+
await ctx.settings.update(MCP_MANAGER_NS, { servers: { [name]: { enabled: !latestEnabled } } }, current.revision);
|
|
414
|
+
diagnostic = t(!latestEnabled ? 'Server enabled.' : 'Server disabled.');
|
|
415
|
+
}
|
|
416
|
+
else if (action === 'probe' && manager !== undefined) {
|
|
417
|
+
const result = await manager.probe(name, { signal });
|
|
418
|
+
diagnostic = formatMcpProbeResult(name, result, t);
|
|
419
|
+
}
|
|
420
|
+
else if (action === 'restart' && manager !== undefined) {
|
|
421
|
+
await manager.restart(name);
|
|
422
|
+
diagnostic = t('Server restarted.');
|
|
423
|
+
}
|
|
424
|
+
else if (action === 'unset') {
|
|
425
|
+
const confirmLabel = hasInherited ? t('Restore inherited configuration') : t('Remove server');
|
|
426
|
+
const confirmed = await confirmPrompt(tui.prompt, {
|
|
427
|
+
title: name,
|
|
428
|
+
question: `${confirmLabel}?`,
|
|
429
|
+
detail: hasInherited
|
|
430
|
+
? t('Removes your profile override for "{name}" and restores the inherited server definition.', { name })
|
|
431
|
+
: t('Removes "{name}" from your profile and unmounts its tools.', { name }),
|
|
432
|
+
acceptLabel: confirmLabel,
|
|
433
|
+
cancelLabel: t('Cancel'),
|
|
434
|
+
signal,
|
|
435
|
+
});
|
|
436
|
+
if (!confirmed || signal.aborted)
|
|
437
|
+
continue;
|
|
438
|
+
const current = describeManager(ctx);
|
|
439
|
+
if (current === undefined)
|
|
440
|
+
throw new Error(t('MCP manager configuration is unavailable.'));
|
|
441
|
+
await ctx.settings.mutate(MCP_MANAGER_NS, [{ op: 'unset', path: ['servers', name] }], current.revision);
|
|
442
|
+
tui.notice?.(t(hasInherited ? 'Restored inherited configuration for "{name}".' : 'Removed MCP server "{name}".', { name }), { transient: true });
|
|
443
|
+
if (!hasInherited)
|
|
444
|
+
return;
|
|
445
|
+
diagnostic = '';
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
if (signal.aborted)
|
|
450
|
+
return;
|
|
451
|
+
diagnostic = error instanceof Error ? error.message : String(error);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
/** Settings → Integrations → MCP servers page with live watch updates. */
|
|
456
|
+
export async function openMcpSettings(ctx, signal, resetOnly = false) {
|
|
457
|
+
const manager = ctx.get('mcpManager');
|
|
458
|
+
if (manager === undefined && describeManager(ctx) === undefined)
|
|
459
|
+
return;
|
|
460
|
+
const lifetime = new AbortController();
|
|
461
|
+
const live = AbortSignal.any([signal, lifetime.signal]);
|
|
462
|
+
const language = resolveUiLanguage(ctx.tui.prefs?.().uiLanguage);
|
|
463
|
+
const t = (source, values) => uiText(language, source, values);
|
|
464
|
+
let views = manager?.list() ?? [];
|
|
465
|
+
let diagnostic = '';
|
|
466
|
+
if (manager !== undefined) {
|
|
467
|
+
void (async () => {
|
|
468
|
+
try {
|
|
469
|
+
for await (const next of manager.watch(live)) {
|
|
470
|
+
if (live.aborted)
|
|
471
|
+
break;
|
|
472
|
+
views = next;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
/* Surface reads fall back to direct list() calls. */
|
|
477
|
+
}
|
|
478
|
+
})();
|
|
479
|
+
}
|
|
480
|
+
const readRows = () => {
|
|
481
|
+
views = manager?.list() ?? views;
|
|
482
|
+
const section = describeManager(ctx);
|
|
483
|
+
const configured = configuredServerMap(section?.value);
|
|
484
|
+
const userServers = configuredServerMap(section?.user);
|
|
485
|
+
const names = [...new Set([...views.map(view => view.name), ...Object.keys(configured)])];
|
|
486
|
+
return { section, configured, userServers, names };
|
|
487
|
+
};
|
|
488
|
+
const details = () => {
|
|
489
|
+
const { names } = readRows();
|
|
490
|
+
return [
|
|
491
|
+
diagnostic,
|
|
492
|
+
names.length === 0
|
|
493
|
+
? t('No runtime MCP servers are configured. Static servers in `.dsh/mcp.json` or `$OMDSH_HOME/mcp.json` remain active alongside this list.')
|
|
494
|
+
: t('Runtime MCP servers reconcile live without restarting omdsh.'),
|
|
495
|
+
].filter(Boolean).join('\n\n');
|
|
496
|
+
};
|
|
497
|
+
const options = () => {
|
|
498
|
+
const { userServers, names } = readRows();
|
|
499
|
+
const writable = ctx.get('settings')?.writable === true;
|
|
500
|
+
const visible = resetOnly ? names.filter(name => Object.hasOwn(userServers, name)) : names;
|
|
501
|
+
return [
|
|
502
|
+
...visible.map(name => {
|
|
503
|
+
const view = views.find(item => item.name === name);
|
|
504
|
+
return {
|
|
505
|
+
label: name,
|
|
506
|
+
value: `server:${name}`,
|
|
507
|
+
description: formatMcpStatus(view?.status, t),
|
|
508
|
+
};
|
|
509
|
+
}),
|
|
510
|
+
...(!resetOnly && writable ? [{ label: t('Add server…'), value: 'add', description: t('Configure a stdio or Streamable HTTP server.') }] : []),
|
|
511
|
+
{ label: t('Refresh'), value: 'refresh' },
|
|
512
|
+
{ label: t('Back'), value: 'back' },
|
|
513
|
+
];
|
|
514
|
+
};
|
|
515
|
+
try {
|
|
516
|
+
while (!live.aborted) {
|
|
517
|
+
const action = await ctx.tui.prompt({
|
|
518
|
+
title: t('MCP servers'),
|
|
519
|
+
question: t(resetOnly ? 'Choose a server override to restore' : 'Manage live MCP servers'),
|
|
520
|
+
detail: details(),
|
|
521
|
+
refreshDocument: details,
|
|
522
|
+
options: options(),
|
|
523
|
+
refreshOptions: options,
|
|
524
|
+
filterable: true,
|
|
525
|
+
allowCustom: false,
|
|
526
|
+
notify: false,
|
|
527
|
+
signal: live,
|
|
528
|
+
});
|
|
529
|
+
if (action === null || action === 'back' || live.aborted)
|
|
530
|
+
return;
|
|
531
|
+
if (action === 'refresh') {
|
|
532
|
+
diagnostic = '';
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
if (action === 'add') {
|
|
536
|
+
try {
|
|
537
|
+
diagnostic = '';
|
|
538
|
+
await promptAddMcpServer(ctx, ctx.tui, live);
|
|
539
|
+
}
|
|
540
|
+
catch (error) {
|
|
541
|
+
if (!live.aborted)
|
|
542
|
+
diagnostic = error instanceof Error ? error.message : String(error);
|
|
543
|
+
}
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
if (action.startsWith('server:')) {
|
|
547
|
+
await manageMcpServer(ctx, ctx.tui, action.slice(7), live);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
finally {
|
|
552
|
+
lifetime.abort();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=mcp-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-settings.js","sourceRoot":"","sources":["../../src/runtime/mcp-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import z from '@deepseek-ai/schemastery';
|
|
|
5
5
|
import { editSettingsDraft } from "./settings-draft.js";
|
|
6
6
|
import { BTW_PRESET } from "./btw-policy.js";
|
|
7
7
|
import { accountSettingsEntry, openAccountSettings } from "./account-settings.js";
|
|
8
|
+
import { MCP_MANAGER_NS, MCP_SETTINGS_ID, mcpSettingsEntry, openMcpSettings } from "./mcp-settings.js";
|
|
8
9
|
import { modelSettingsEntry, openModelSettings } from "./model-settings.js";
|
|
9
10
|
import { SUBAGENT_SETTINGS_FIELDS, openSubagentSettings, subagentSettingsEntry } from "./subagent-settings.js";
|
|
10
11
|
import { WEB_SETTINGS_FIELDS, openWebSettings, webSettingsEntry } from "./web-settings.js";
|
|
@@ -32,12 +33,17 @@ const PRODUCT_FORMS = {
|
|
|
32
33
|
bash: SHELL_FORM,
|
|
33
34
|
pwsh: SHELL_FORM,
|
|
34
35
|
'file-recovery': { label: 'File recovery snapshots', behavior: 'Profile · Saves immediately · Next turn', section: 'tools', fields: { enabled: 'Snapshots' }, inline: 'enabled', effect: 'Keeps private file contents. Changes apply to the next Turn; existing snapshots remain readable.' },
|
|
36
|
+
worktree: { label: 'Keep worktrees when archiving', behavior: 'Profile · Saves immediately · Applies now', section: 'tools', fields: { retainOnArchive: 'Keep worktrees when archiving' }, inline: 'retainOnArchive',
|
|
37
|
+
effect: 'When off, archiving a session removes its clean, unreferenced Git worktree checkout while keeping the branch.' },
|
|
38
|
+
'tmux-context': { label: 'Tmux location context', behavior: 'Profile · Saves immediately · Next turn', section: 'tools',
|
|
39
|
+
fields: { enabled: 'Tmux location context', refreshIntervalMs: 'Minimum refresh interval' }, inline: 'enabled',
|
|
40
|
+
effect: 'When enabled inside a real tmux pane, appends session, window, pane and layout context when the pane layout changes.' },
|
|
35
41
|
'hook-settings': { label: 'Command hooks', section: 'integrations', fields: { bridge: 'Hook compatibility', configPath: 'Configuration file' }, inline: 'bridge' },
|
|
36
42
|
web: { label: 'Web providers', section: 'integrations', fields: { searchProvider: 'Search provider', fetchProvider: 'Fetch provider' },
|
|
37
43
|
effect: 'Default: deepseek-search-api and deepseek-fetch-api. Fallbacks: deepseek-official (Messages) and http (local). With more than one provider installed, an empty value is ambiguous.' },
|
|
38
44
|
'web-deepseek-api': { label: 'Web search · API', section: 'integrations',
|
|
39
|
-
fields: {
|
|
40
|
-
effect: 'Default search and fetch provider: one direct DeepSeek API request without an auxiliary model turn
|
|
45
|
+
fields: { count: 'Results per search', searchBilling: 'Search billing', fetchBilling: 'Fetch billing', searchRequestsPerSecond: 'Search rate limit', sendOriginalQuestion: 'Send original question', searchBaseURL: 'Search endpoint', searchApiKeyEnv: 'Search API key reference', fetchBaseURL: 'Fetch endpoint', fetchApiKeyEnv: 'Fetch API key reference' },
|
|
46
|
+
effect: 'Default search and fetch provider: one direct DeepSeek API request without an auxiliary model turn, billed to the selected account or API key.' },
|
|
41
47
|
'web-search-deepseek': { label: 'Web search · Messages', section: 'integrations',
|
|
42
48
|
fields: { maxTokens: 'Token limit', maxUses: 'Search limit', apiKey: 'API key', apiKeyEnv: 'API key reference', baseURL: 'Endpoint', model: 'Model', apiVersion: 'API version' },
|
|
43
49
|
effect: 'Fallback search provider: one auxiliary Messages turn. Select it under Web providers.' },
|
|
@@ -50,6 +56,7 @@ const DEDICATED_FIELDS = {
|
|
|
50
56
|
// its profile; normal sessions always run in the Session's current directory.
|
|
51
57
|
bash: ['cwd'],
|
|
52
58
|
pwsh: ['cwd'],
|
|
59
|
+
[MCP_MANAGER_NS]: ['servers'],
|
|
53
60
|
'subagent-codex': ['model', 'permissionMode', 'env'],
|
|
54
61
|
'subagent-claude-code': ['model', 'permissionMode', 'env'],
|
|
55
62
|
};
|
|
@@ -258,7 +265,7 @@ export function pluginSettingsEntries(ctx, bundles) {
|
|
|
258
265
|
summary: bundles === undefined ? 'Details' : bundle === undefined || bundle.availability === 'missing' ? 'Unavailable' : bundle.error !== undefined ? 'Load error' : bundle.enabled ? 'Enabled' : 'Disabled',
|
|
259
266
|
description: 'Provider model, permissions and profile enablement. Native login has not been checked; Installation status reports registration.' };
|
|
260
267
|
}));
|
|
261
|
-
return [...entries, ...accountSettingsEntry(ctx), ...modelSettingsEntry(ctx), ...webEntries, ...subagentEntries];
|
|
268
|
+
return [...entries, ...accountSettingsEntry(ctx), ...modelSettingsEntry(ctx), ...mcpSettingsEntry(ctx), ...webEntries, ...subagentEntries];
|
|
262
269
|
}
|
|
263
270
|
/** Write the displayed snapshot's revision; a concurrent change must never be silently overwritten. */
|
|
264
271
|
export async function setSettingsEntry(ctx, entry, choice, signal) {
|
|
@@ -288,6 +295,10 @@ export async function editSettingsEntry(ctx, id, signal, resetOnly = false) {
|
|
|
288
295
|
await openWebSettings(ctx, signal);
|
|
289
296
|
return;
|
|
290
297
|
}
|
|
298
|
+
if (id === MCP_SETTINGS_ID) {
|
|
299
|
+
await openMcpSettings(ctx, signal, resetOnly);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
291
302
|
if (id === 'account:deepseek') {
|
|
292
303
|
await openAccountSettings(ctx, signal);
|
|
293
304
|
return;
|