@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.
Files changed (66) hide show
  1. package/lib/CHANGELOG.md +44 -1
  2. package/lib/chrome/status-line.js +4 -0
  3. package/lib/chrome/status-line.js.map +1 -1
  4. package/lib/chrome/tool-renderers.js +140 -4
  5. package/lib/chrome/tool-renderers.js.map +1 -1
  6. package/lib/commands/auth-account.js +2 -1
  7. package/lib/commands/auth-account.js.map +1 -1
  8. package/lib/commands/export.js +1 -1
  9. package/lib/commands/export.js.map +1 -1
  10. package/lib/commands/files.js +1 -1
  11. package/lib/commands/files.js.map +1 -1
  12. package/lib/commands/integrations.d.ts +1 -1
  13. package/lib/commands/integrations.js +126 -28
  14. package/lib/commands/integrations.js.map +1 -1
  15. package/lib/commands/permission.js +26 -5
  16. package/lib/commands/permission.js.map +1 -1
  17. package/lib/commands/plugins.js +216 -11
  18. package/lib/commands/plugins.js.map +1 -1
  19. package/lib/commands/session.js +18 -1
  20. package/lib/commands/session.js.map +1 -1
  21. package/lib/commands/team.d.ts +12 -0
  22. package/lib/commands/team.js +205 -0
  23. package/lib/commands/team.js.map +1 -0
  24. package/lib/definition.d.ts +3 -0
  25. package/lib/locale/zh.d.ts +164 -1
  26. package/lib/locale/zh.js +165 -2
  27. package/lib/locale/zh.js.map +1 -1
  28. package/lib/runtime/account-settings.js +145 -9
  29. package/lib/runtime/account-settings.js.map +1 -1
  30. package/lib/runtime/file-open.d.ts +2 -1
  31. package/lib/runtime/file-open.js +3 -8
  32. package/lib/runtime/file-open.js.map +1 -1
  33. package/lib/runtime/file-recovery-recording.js +1 -1
  34. package/lib/runtime/file-recovery-recording.js.map +1 -1
  35. package/lib/runtime/file-review.js +2 -2
  36. package/lib/runtime/file-review.js.map +1 -1
  37. package/lib/runtime/image-preview.js +1 -1
  38. package/lib/runtime/image-preview.js.map +1 -1
  39. package/lib/runtime/mcp-settings.d.ts +33 -0
  40. package/lib/runtime/mcp-settings.js +555 -0
  41. package/lib/runtime/mcp-settings.js.map +1 -0
  42. package/lib/runtime/plugin-settings.js +14 -3
  43. package/lib/runtime/plugin-settings.js.map +1 -1
  44. package/lib/runtime/runner.js +1 -1
  45. package/lib/runtime/tmux-settings.d.ts +21 -0
  46. package/lib/runtime/tmux-settings.js +60 -0
  47. package/lib/runtime/tmux-settings.js.map +1 -0
  48. package/lib/runtime/web-settings.js +55 -10
  49. package/lib/runtime/web-settings.js.map +1 -1
  50. package/lib/session/interaction-adapter.js +6 -1
  51. package/lib/session/interaction-adapter.js.map +1 -1
  52. package/lib/session/session-controller.js +109 -39
  53. package/lib/session/session-controller.js.map +1 -1
  54. package/lib/session/subagent-roster.d.ts +4 -1
  55. package/lib/session/subagent-roster.js +43 -14
  56. package/lib/session/subagent-roster.js.map +1 -1
  57. package/lib/session/subagent-tracker.d.ts +14 -3
  58. package/lib/session/subagent-tracker.js +7 -1
  59. package/lib/session/subagent-tracker.js.map +1 -1
  60. package/lib/views/autocomplete.js +1 -1
  61. package/lib/views/autocomplete.js.map +1 -1
  62. package/lib/views/trajectory.js +6 -2
  63. package/lib/views/trajectory.js.map +1 -1
  64. package/lib/views/transcript-render.js +8 -3
  65. package/lib/views/transcript-render.js.map +1 -1
  66. 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: { apiKey: 'API key', apiKeyEnv: 'API key reference', baseURL: 'Endpoint', count: 'Results per search', sendOriginalQuestion: 'Send original question' },
40
- effect: 'Default search and fetch provider: one direct DeepSeek API request without an auxiliary model turn. /login stores the official key under this reference.' },
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;