dsh-mcp-panel 0.3.0 → 0.4.1

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 (73) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.es.md +166 -96
  3. package/README.hi.md +166 -96
  4. package/README.md +162 -92
  5. package/README.pt.md +167 -97
  6. package/README.zh.md +165 -95
  7. package/cordis.patch.yml +17 -4
  8. package/lib/client.js +1350 -48
  9. package/lib/client.js.map +1 -1
  10. package/lib/index.js +1200 -46
  11. package/lib/schemas-BhI7GrM5.js +4091 -0
  12. package/lib/typert.host.js +193 -4099
  13. package/lib/types/aggregate.d.ts +20 -3
  14. package/lib/types/aggregate.d.ts.map +1 -1
  15. package/lib/types/client/McpPanelTab.d.ts +12 -6
  16. package/lib/types/client/McpPanelTab.d.ts.map +1 -1
  17. package/lib/types/client/ServerEditor.d.ts +25 -0
  18. package/lib/types/client/ServerEditor.d.ts.map +1 -0
  19. package/lib/types/client/TrialConsole.d.ts +20 -0
  20. package/lib/types/client/TrialConsole.d.ts.map +1 -0
  21. package/lib/types/client/index.d.ts +12 -10
  22. package/lib/types/client/index.d.ts.map +1 -1
  23. package/lib/types/client/locales.d.ts +157 -1
  24. package/lib/types/client/locales.d.ts.map +1 -1
  25. package/lib/types/client/present.d.ts +7 -1
  26. package/lib/types/client/present.d.ts.map +1 -1
  27. package/lib/types/client/remote.d.ts +175 -2
  28. package/lib/types/client/remote.d.ts.map +1 -1
  29. package/lib/types/command.d.ts +34 -5
  30. package/lib/types/command.d.ts.map +1 -1
  31. package/lib/types/config.d.ts +41 -1
  32. package/lib/types/config.d.ts.map +1 -1
  33. package/lib/types/diagnostics.d.ts +55 -0
  34. package/lib/types/diagnostics.d.ts.map +1 -0
  35. package/lib/types/grouping.d.ts +1 -1
  36. package/lib/types/index.d.ts +40 -23
  37. package/lib/types/index.d.ts.map +1 -1
  38. package/lib/types/patch.d.ts +176 -0
  39. package/lib/types/patch.d.ts.map +1 -0
  40. package/lib/types/probe.d.ts +1 -1
  41. package/lib/types/service.d.ts +76 -9
  42. package/lib/types/service.d.ts.map +1 -1
  43. package/lib/types/trial.d.ts +79 -0
  44. package/lib/types/trial.d.ts.map +1 -0
  45. package/lib/types/typert.host.d.ts +164 -0
  46. package/lib/types/typert.host.d.ts.map +1 -1
  47. package/lib/types/upstream.d.ts +44 -15
  48. package/lib/types/upstream.d.ts.map +1 -1
  49. package/lib/types/wire.d.ts +507 -10
  50. package/lib/types/wire.d.ts.map +1 -1
  51. package/lib/types/write.d.ts +30 -0
  52. package/lib/types/write.d.ts.map +1 -0
  53. package/package.json +57 -5
  54. package/src/aggregate.ts +79 -2
  55. package/src/client/McpPanelTab.tsx +138 -17
  56. package/src/client/ServerEditor.tsx +290 -0
  57. package/src/client/TrialConsole.tsx +145 -0
  58. package/src/client/index.ts +45 -18
  59. package/src/client/locales.ts +169 -5
  60. package/src/client/present.ts +9 -0
  61. package/src/client/remote.ts +17 -2
  62. package/src/client/styles.ts +201 -0
  63. package/src/command.ts +139 -18
  64. package/src/config.ts +88 -2
  65. package/src/diagnostics.ts +126 -0
  66. package/src/index.ts +49 -16
  67. package/src/patch.ts +493 -0
  68. package/src/probe.ts +1 -1
  69. package/src/service.ts +257 -9
  70. package/src/trial.ts +199 -0
  71. package/src/upstream.ts +45 -15
  72. package/src/wire.ts +292 -10
  73. package/src/write.ts +97 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.4.1] - 2026-08-19
6
+
7
+ ### Fixed
8
+
9
+ - The trial console's callId counter now lives on a per-service-instance trial caller (`createTrialCaller`) instead of a module-level `let`, matching its documented per-instance semantics — a plugin reload no longer carries counter state across mounts. (`runTrialCall` is now exported through the caller factory.)
10
+
11
+ ## [0.4.0] - 2026-08-16
12
+
13
+ ### Added
14
+
15
+ - **MCP management console** (the official `@deepseek-ai/dsh-mcp-client` stays the only bridge; this plugin is now its full experience layer):
16
+ - **Server CRUD in the Settings tab**: add/edit/remove servers through a visual form (stdio and streamable-http shapes); every edit renders as an APPEND-ONLY `cordis.patch.yml` operation (`insert` / `set` / `set disabled: true` — the patch vocabulary has no remove, so removal disables the row and keeps it re-enableable). One-click copy, or approval-gated write: the host asks `ctx.approval` when an agent with an open turn exists, otherwise the explicit interactive confirmation is the approval channel; every write first copies the file to a timestamped backup and prunes to the newest `backupCount`.
17
+ - **Tool trial console**: pick a server → registered `mcp__*` tools → JSON arguments → call through the OFFICIAL `ctx.tools.execute()` pipeline (pre-execute permission policy, approval asks, guards, and post-execute all stay in force). Results show the canonical JSON value plus the rendered content, capped by `trialMaxResultChars`; panel-only, never model context. `/mcp <server> call <tool> [json]` exposes the same pipeline to the model with approval routed through the command's agent.
18
+ - **Health diagnostics**: `/mcp <server> health` and per-card suggestion lists derived from sanitized error text (ENOENT → dependency missing, ECONNREFUSED, ETIMEDOUT, 401/403/404, DNS, rate limit, reconnect exhaustion, failed fiber). Child exit codes / stderr tails are honestly labeled "pending upstream support" until the official client exposes them (proposed in the harness `docs/upstream-proposal.md`).
19
+ - **Capabilities board**: Resources/Prompts availability is feature-detected against a proposed upstream catalog seam; today the console clearly labels both "pending upstream support" (the official client bridges tools only).
20
+ - Config: `trialEnabled` / `trialTimeoutMs` / `trialMaxResultChars` / `writeEnabled` (kill switch) / `backupCount`, all with Schemastery schema, fail-loud bounds, and explicit `resolveConfig` re-validation.
21
+ - The panel injects NO prompt sections; the only model-facing text it adds remains the two tool/command descriptions.
22
+
23
+ ### Changed
24
+
25
+ - The snapshot now carries sanitized per-server config views (env/header VALUES never leave the host — keys only, with keep-semantics re-merge for edits), derived diagnostics, and the trial/write policy; the upstream seam consumption now also carries the proposed `exitCode`/`stderrTail` fields when present.
26
+ - `/mcp` usage now documents `call` and `health`; the command output stays model-readable and log-reconstructable.
27
+ - Sanitization rules unchanged and extended over the new surfaces: fragment previews never contain `!!js` expressions and never echo secret values.
28
+
5
29
  ## [0.3.0] - 2026-08-15
6
30
 
7
31
  ### Added
package/README.es.md CHANGED
@@ -1,141 +1,211 @@
1
+ <div align="center">
2
+
1
3
  # dsh-mcp-panel
2
4
 
3
- **Panel de gestión en tiempo de ejecución, de solo lectura, para el cliente MCP oficial de DeepSeek Harness: consulta el estado, las herramientas, los errores y los contadores de reconexión de cada servidor MCP sin tocar tu configuración.**
5
+ **La consola de gestión MCP para el cliente MCP oficial de DeepSeek Harness: añade, edita, elimina y prueba servidores MCP desde una página de ajustes, con estado honesto, diagnósticos de salud y escrituras de perfil seguras y reversibles.**
4
6
 
5
- [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
7
+ *Cliente oficial = puente, este plugin = consola: lee el estado por el seam `mcp/status`, escribe solo parches de perfil de solo-anexar y con aprobación.*
6
8
 
7
9
  [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
8
- [![npm](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
9
- [![downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
10
- [![CI](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml/badge.svg)](https://github.com/PerryLink/dsh-mcp-panel/actions/workflows/ci.yml)
11
- [![dsh-plugin](https://img.shields.io/badge/ecosystem-dsh--plugin-8b5cf6)](https://github.com/topics/dsh-plugin)
12
- [![deepseek-harness](https://img.shields.io/badge/runtime-deepseek--harness-4f46e5)](https://github.com/deepseek-ai/deepseek-harness)
10
+ [![DSH plugin](https://img.shields.io/badge/dsh-plugin-✅-green)](https://github.com/topics/dsh-plugin)
11
+ [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-brightgreen.svg)](#)
12
+ [![CI](https://img.shields.io/github/actions/workflow/status/PerryLink/dsh-mcp-panel/ci.yml?branch=main&label=CI)](https://github.com/PerryLink/dsh-mcp-panel/actions)
13
+ [![Version](https://img.shields.io/github/v/tag/PerryLink/dsh-mcp-panel?label=version)](https://github.com/PerryLink/dsh-mcp-panel/releases)
14
+ [![npm version](https://img.shields.io/npm/v/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
15
+ [![npm downloads](https://img.shields.io/npm/dm/dsh-mcp-panel)](https://www.npmjs.com/package/dsh-mcp-panel)
13
16
 
14
- > 🔭 **La observabilidad primero.** [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/mcp-client) mantiene privado su estado de conexión: solo registra logs. Este plugin muestra todo lo que *sí* puede observar (configuración, registro de herramientas, estado del Loader) y dice **"unknown"** para lo que no puede, en lugar de adivinar. También propone la costura mínima que haría el estado real: consulta la [propuesta upstream](docs/upstream-proposal.md).
17
+ [English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
15
18
 
16
- ## Compatibilidad
19
+ </div>
17
20
 
18
- - **Runtime**: DeepSeek Harness ≥ `0.1.0-rc.5` (las peerDependencies fijan la línea `0.1.0-rc.6`).
19
- - **Última versión**: v0.3.0 (2026-08-15) — compuerta completa en verde con la cadena TypeScript 7 / Vitest 4 / jsdom 30, 109 pruebas.
20
- - **Última verificación**: 2026-08-14 contra un checkout del código fuente de deepseek-harness (paquetes del workspace en `0.1.0-rc.5`, mainline `7b9644f`) — `/mcp` headless de extremo a extremo más un perfil web en vivo; evidencia en [docs/research-notes.zh.md](docs/research-notes.zh.md). Reverificado el mismo día contra mainline `47f9438` con la rama de la costura `mcp/status` (`feat/mcp-client-status-observability-seam`): una fila real de `server-everything` muestra `status: connected (source: upstream-event)` a través del plugin empaquetado, más el flujo de compatibilidad fiel al lanzador; registro en [docs/optimization-plan-v2.zh.md](docs/optimization-plan-v2.zh.md).
21
+ ---
21
22
 
22
- ## Qué obtienes
23
+ ## Compatibility
23
24
 
24
- | Superficie | Qué muestra |
25
+ | Superficie | Estado |
25
26
  |---|---|
26
- | **Comando `/mcp`** | transporte, destino, número de herramientas, estado de conexión, último error, contador de reconexiones — legible por el modelo y reconstruible desde el log, cinco idiomas de salida (`outputLanguage: en\|zh\|es\|pt\|hi`) |
27
- | **Ajustes → Plugins → pestaña MCP** | la misma instantánea en solo lectura, con insignias de estado, listas de herramientas expandibles, errores saneados y resultados de sondas |
28
- | **De un vistazo** | recuentos de resumen sobre las tarjetas, un buscador de servidores y botones de expandir/contraer todo |
29
- | **Botón de sonda del panel** | sonda de conectividad de un clic para un servidor streamable-http desde la pestaña; los resultados siguen siendo solo del panel |
30
- | **Sondas pasivas** | insignias de alcanzabilidad opcionales en segundo plano por servidor, separadas del estado de conexión |
31
- | **Refresco automático** | el host sugiere un intervalo de refresco (`refreshIntervalMs`); la pestaña consulta y se pausa mientras está oculta |
32
- | **`/mcp <server> disable\|enable`** | la línea exacta de `cordis.patch.yml` a aplicar — una *sugerencia*, nunca una escritura |
33
- | **Herramienta `mcp_probe`** | sonda de conectividad de un solo uso para Streamable HTTP como tarea en segundo plano; los resultados son **solo del panel** |
27
+ | Harness | DeepSeek Harness `0.1.0-rc.5`–`0.1.0-rc.6` |
28
+ | Node | `^22.19.0 \|\| >=24.0.0` |
29
+ | Plataformas | Web GUI (doble cara: host + navegador) |
30
+ | Modelo | Cualquiera (el panel es de solo lectura; solo la salida de `/mcp` es legible por el modelo) |
34
31
 
35
- ## Inicio rápido
32
+ ## What you get
36
33
 
37
- ```sh
38
- # canal git (compila mediante el script prepare del paquete)
39
- dsh plugin --profile web add github:PerryLink/dsh-mcp-panel#v0.3.0
40
- # canal npm (tarball publicado, sin aprobación de compilación)
41
- dsh plugin --profile web add dsh-mcp-panel@0.3.0
42
- ```
34
+ `dsh-mcp-panel` es la capa de experiencia sobre el cliente MCP oficial: una vista de runtime de solo lectura más escrituras de perfil seguras y reversibles.
43
35
 
44
- Reinicia (o deja que la superficie web recargue su `cordis.patch.yml`) y ejecuta:
36
+ - **Comando `/mcp`** una fila por servidor: transporte, destino, número de herramientas, estado de conexión (desde el seam upstream; `unknown` cuando no hay observación), último error, reconexiones — legible por el modelo, reconstruible del log de sesión, cinco idiomas de salida.
37
+ - **`/mcp <servidor> tools`** — nombres y descripciones de las herramientas `mcp__*` visibles para el modelo.
38
+ - **`/mcp <servidor> health`** — sugerencias de autorreparación derivadas (ENOENT → dependencia faltante, ECONNREFUSED, timeouts, 401/403/404, DNS, rate limit, reconexión agotada…); código de salida / stderr etiquetados honestamente como *pendiente de soporte upstream*.
39
+ - **`/mcp <servidor> call <tool> [json]`** — llamada de prueba por el **pipeline oficial de herramientas** (`ctx.tools.execute()`); política de permisos pre-ejecución, aprobación, guards y post-ejecución, todo en vigor.
40
+ - **Ajustes → Plugins → MCP** — tarjetas de estado con insignias, diagnósticos y sondas, más el CRUD de servidores y el banco de pruebas de herramientas.
41
+ - **CRUD de servidores** — formularios de alta/edición/borrado → fragmentos `insert`/`set`/`set disabled` → copia al portapapeles o escritura con aprobación y copias de seguridad automáticas.
42
+ - **Banco de pruebas de herramientas** — servidor → herramienta `mcp__*` → argumentos JSON → resultado JSON canónico + contenido renderizado; limitado por `trialMaxResultChars`; solo panel, nunca contexto del modelo.
45
43
 
46
- ```text
47
- /mcp
48
- /mcp everything tools
49
- /mcp everything disable
50
- ```
44
+ ## Architecture: official client = bridge, this plugin = console
45
+
46
+ [`@deepseek-ai/dsh-mcp-client`](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/mcp/mcp-client) es el **único puente**: una instancia por servidor MCP, configurada como fila escrita a mano en `cordis.yml`, que conecta el transporte, sincroniza herramientas y registra los nombres `mcp__<servidor>__<herramienta>`. Este plugin nunca lo sustituye: es la **capa de experiencia** encima:
51
47
 
52
48
  ```text
53
- MCP servers (1):
54
- - everything [mcp-everything] stdio node …/server-everything/dist/index.js
55
- | 13 tools | enabled | status: unknown (source: derived) | reconnects: — | last error: —
49
+ ┌────────────────────────────────────────────┐
50
+ profile │ cordis.yml / cordis.patch.yml │
51
+ composición │ - id: mcp-github │
52
+ (una fila por │ name: '@deepseek-ai/dsh-mcp-client' │
53
+ servidor, a mano) │ config: { serverName, transport, … } │
54
+ │ - id: mcp-panel │
55
+ │ name: dsh-mcp-panel ◄── este plugin │
56
+ └───────────────┬────────────────────────────┘
57
+
58
+ ┌───────────────────────────┴───────────────────────────┐
59
+ │ │
60
+ ┌────▼──────────────┐ ┌───────────────────────────┐ │
61
+ │ @deepseek-ai/dsh- │ │ dsh-mcp-panel (consola) │ │
62
+ │ mcp-client │ │ │ │
63
+ │ • transporte │ │ • comando /mcp │ │
64
+ │ • sincronización │ │ • Ajustes → Plugins → │ │
65
+ │ • herramientas │◄──────►│ MCP: CRUD, banco de │ │
66
+ │ • seam mcp/status │ estado │ • diagnósticos de salud │ │
67
+ └───────────────────┘ │ • sondas, capacidades │ │
68
+ └───────────────────────────┘ │
56
69
  ```
57
70
 
58
- Instalación manual: coloca `dsh-mcp-panel` en el `node_modules` del perfil (o en el
59
- respaldo compartido `$DSH_HOME/profiles/node_modules`) y añade la fila a `cordis.patch.yml`:
71
+ La consola **lee** el cliente por su seam de observabilidad `mcp/status` (evento + servicio de consulta `mcpStatus`), el registro de herramientas y el loader; **escribe** solo en la capa de parches del perfil solo-anexar, con aprobación y siempre con copia de seguridad. Transporte, OAuth y protocolo permanecen intactos.
72
+
73
+ ## Console vs. hand-written cordis.yml
74
+
75
+ | | cordis.yml a mano | Consola dsh-mcp-panel |
76
+ |---|---|---|
77
+ | Añadir servidor | Editar YAML, cuidar indentación/comillas | Formulario → fragmento de parche → **copiar** o **escribir** (aprobación + copia de seguridad) |
78
+ | Editar servidor | Editar YAML, reiniciar/recarga en caliente | Formulario precargado de la fila en vivo; los secretos sin cambios conservan su valor en el host |
79
+ | Eliminar servidor | Borrar la fila | Operación `set disabled: true` (el vocabulario de parches no tiene remove) — re-habilitable |
80
+ | Ver estado | Leer logs | Insignias + reconexiones + último error, en vivo desde `mcp/status` |
81
+ | Probar una herramienta | Pedírselo al modelo | Banco de pruebas → pipeline oficial `ctx.tools.execute()` (permisos y aprobación en vigor) |
82
+ | Diagnosticar fallos | grep de logs | `/mcp <servidor> health` con sugerencias derivadas |
83
+ | Errores | Revertir a mano | Cada escritura es solo-anexar y deja una copia de seguridad con marca de tiempo |
84
+
85
+ La salida de la consola ES el vocabulario de `cordis.patch.yml` — las mismas líneas que escribirías a mano, generadas, previsualizadas y aplicadas con seguridad.
86
+
87
+ ## Quick start
60
88
 
61
- ```yaml
62
- - insert:
63
- - id: mcp-panel
64
- name: dsh-mcp-panel
65
- config:
66
- probeEnabled: true
67
- probeTimeoutMs: 10000
89
+ ```sh
90
+ # 1. instala el bundle en tu perfil
91
+ dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"
92
+
93
+ # o desde npm (versiones publicadas)
94
+ dsh plugin --profile web add dsh-mcp-panel
95
+
96
+ # 2. reinicia y verifica la fila
97
+ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
68
98
  ```
69
99
 
70
- ### Desinstalación
100
+ Luego abre **Ajustes → Plugins → MCP**, o ejecuta:
101
+
102
+ ```text
103
+ /mcp
104
+ /mcp everything tools
105
+ /mcp everything health
106
+ /mcp everything call echo '{"message": "hi"}'
107
+ ```
71
108
 
72
- 1. Quita la fila `mcp-panel` de `cordis.patch.yml` (la superficie web la recarga en caliente; otras superficies se reinician).
73
- 2. Elimina el paquete del `node_modules` del perfil (o del respaldo compartido `profiles/node_modules`).
74
- 3. Verifica con `dsh web --dump-config` que no quede ninguna fila `mcp-panel`.
109
+ ## Install & uninstall
75
110
 
76
- ## Honestidad por contrato
111
+ - **Canal git** (último `main`): `dsh plugin --profile web add "github:PerryLink/dsh-mcp-panel#main"` — el script `prepare` construye solo con dependencias de producción.
112
+ - **Canal npm** (versiones publicadas): `dsh plugin --profile web add dsh-mcp-panel`.
113
+ - **Canal tarball**: `pnpm pack` en este repo, luego `dsh plugin --profile web add ./dsh-mcp-panel-<version>.tgz`.
114
+ - **Desinstalar**: elimina la fila `mcp-panel` de `cordis.patch.yml` (la superficie web la recarga en caliente), borra el paquete del `node_modules` del perfil y verifica con `dsh web --dump-config` que no quede ninguna fila `mcp-panel`.
77
115
 
78
- - **Solo lectura.** Nunca se escribe ningún archivo de configuración. `disable`/`enable` imprime una sugerencia que tú aplicas.
79
- - **Sin estado falso.** Los campos de conexión sin datos upstream muestran `unknown` / `—`, con `statusSource: derived`.
80
- - **Visualización saneada.** Las credenciales en query strings, contraseñas userinfo, valores de cabeceras, tokens bearer y JWT se redactan antes de renderizar; las `headers` configuradas nunca entran en ninguna instantánea.
81
- - **Resultados solo del panel.** Los detalles de las sondas viven en la pestaña de ajustes, nunca en el contexto del modelo; `/mcp` es la superficie legible por el modelo y es totalmente reconstruible desde el log de sesión.
82
- - **Sin cambios en mcp-client.** Transporte, OAuth y protocolo quedan intactos — la brecha de observabilidad la cubre la [propuesta upstream](docs/upstream-proposal.md), que este plugin ya consume (evento tipado `mcp/status` + servicio de consulta `mcpStatus`, detectados en tiempo de ejecución).
116
+ ## Configuration
83
117
 
84
- ## Configuración
118
+ Todas las opciones son campos Schemastery `Config` (modificables desde cordis.yml). `cordis.patch.yml` documenta cada clave.
85
119
 
86
- | Campo | Por defecto | Descripción |
120
+ | Clave | Por defecto | Significado |
87
121
  |---|---|---|
88
- | `probeEnabled` | `true` | Registra la herramienta `mcp_probe` (requiere `ctx.jobs` en la composición) |
89
- | `probeTimeoutMs` | `10000` | Tiempo límite por sonda |
90
- | `maxProbes` | `10` | Límite de registros de sonda mostrados en el panel |
91
- | `refreshIntervalMs` | `0` | Intervalo de refresco sugerido para el panel en ms (`0` = solo bajo demanda) |
92
- | `outputLanguage` | `en` | Idioma de salida del comando `/mcp` (`en` \| `zh` \| `es` \| `pt` \| `hi`) |
93
- | `passiveProbeEnabled` | `false` | Sondear periódicamente servidores streamable-http en segundo plano |
94
- | `passiveProbeIntervalMs` | `60000` | Intervalo de la sonda pasiva en milisegundos |
122
+ | `probeEnabled` | `true` | Registra la herramienta `mcp_probe` (resultados solo del panel) |
123
+ | `probeTimeoutMs` | `10000` | Tiempo límite por sonda en ms |
124
+ | `maxProbes` | `10` | Registros de sonda mostrados en el panel |
125
+ | `refreshIntervalMs` | `0` | Refresco sugerido del panel en ms; `0` = bajo demanda |
126
+ | `outputLanguage` | `en` | Idioma de salida de `/mcp`: `en \| zh \| es \| pt \| hi` |
127
+ | `passiveProbeEnabled` | `false` | Sondear periódicamente servidores streamable-http |
128
+ | `passiveProbeIntervalMs` | `60000` | Intervalo de sonda pasiva en ms |
129
+ | `trialEnabled` | `true` | Banco de pruebas de herramientas (pestaña de ajustes + `/mcp call`) |
130
+ | `trialTimeoutMs` | `120000` | Plazo del panel por llamada de prueba en ms |
131
+ | `trialMaxResultChars` | `60000` | Tope del payload de resultado de prueba en caracteres |
132
+ | `writeEnabled` | `true` | Interruptor de seguridad: `false` rechaza toda escritura (copiar sigue funcionando) |
133
+ | `backupCount` | `5` | Copias de `cordis.patch.yml` retenidas por escritura |
134
+
135
+ ## Tools & surfaces
136
+
137
+ | Superficie | Tipo | Notas |
138
+ |---|---|---|
139
+ | `/mcp` | command | Fila de estado por servidor; legible por el modelo y reconstruible del log |
140
+ | `/mcp <servidor> tools` | command | Nombres + descripciones de `mcp__*` visibles para el modelo |
141
+ | `/mcp <servidor> health` | command | Sugerencias de autorreparación derivadas del texto de error saneado |
142
+ | `/mcp <servidor> call <tool> [json]` | command | Llamada de prueba por el pipeline oficial de herramientas |
143
+ | `mcp_probe` | tool | Sonda opcional de conectividad Streamable HTTP (trabajo en segundo plano) |
144
+ | Ajustes → Plugins → MCP | Slot de UI | Tarjetas de estado, CRUD de servidores y banco de pruebas |
145
+ | Remote Typert `mcpPanel` | service | Canal de instantáneas de solo lectura (host → cliente) |
95
146
 
96
- ## Permisos y datos
147
+ ## Resources & Prompts
97
148
 
98
- - **Lee**: filas del Loader, el registro de herramientas (nombres `mcp__<server>__`) y, cuando upstream lo implemente, eventos `mcp/status`.
99
- - **Escribe**: nada. Ningún archivo de configuración se modifica jamás.
100
- - **Red**: solo la sonda de un solo uso `mcp_probe` (y la sonda pasiva opcional) envía una petición MCP `initialize` a los endpoints que tú configuraste; las cabeceras configuradas se usan para la petición y nunca se muestran ni registran.
101
- - Sin telemetría, sin servicios externos, sin trabajo en segundo plano salvo los temporizadores de sonda opcionales.
149
+ El cliente oficial documenta que *"Tools are the only bridged MCP capability"* — Resources y Prompts están diferidos. La consola detecta un seam de catálogo propuesto y mostrará listas de solo lectura el día que se envíe; hasta entonces el tablero de capacidades marca ambos **pendientes de soporte upstream**.
102
150
 
103
- ## Solución de problemas
151
+ ## Permissions & data
104
152
 
105
- - ¿La fila no aparece? Ejecuta `dsh web --dump-config` y comprueba que el insert `mcp-panel` se aplicó con un id único.
106
- - El panel muestra `status: unknown (source: derived)` esperado hasta que la costura upstream aterrice; consulta [docs/upstream-proposal.md](docs/upstream-proposal.md).
107
- - ¿El panel se ve desactualizado? Establece `refreshIntervalMs` a un valor positivo (p. ej. `5000`) en la fila de configuración `mcp-panel` para consultar automáticamente.
108
- - El log de arranque muestra un fiber `mcp-panel` FAILED — el paquete debe resolverse desde el perfil (el `name: dsh-mcp-panel` desnudo se resuelve vía el `node_modules` del perfil o el respaldo compartido).
109
- - Rollback: quita la fila (ver Desinstalación).
153
+ - **Permisos**: el manifiesto `dshWorkshop` declara `network:outbound` y `native-code:none`.
154
+ - **Datos**: el panel es de solo lectura; escribe solo fragmentos de `cordis.patch.yml` de solo-anexar (con aprobación, respaldo primero). Credenciales en URLs, contraseñas userinfo, valores de headers, tokens bearer y JWTs se redactan antes de renderizar; los `headers` configurados nunca entran en ninguna instantánea, y los **valores** de env/headers nunca salen del host (el editor ve solo claves).
110
155
 
111
- ## Seguridad
156
+ ## Security boundaries
112
157
 
113
- ¿Encontraste un problema de seguridad? Abre un issue de GitHub **sin** pegar secretos, claves o tokens redáctalo todo primero. Este plugin mantiene las credenciales de tus servidores MCP configurados solo en memoria para las peticiones de sonda; nunca llegan a logs ni instantáneas.
158
+ - **El puente sigue siendo el puente.** Sin cambios de transporte, OAuth o protocolo; una fila mcp-client por servidor, exactamente como a mano.
159
+ - **Sin estado falso.** Los campos de conexión sin observaciones upstream leen `unknown` / `—` con `statusSource: 'derived'`; códigos de salida y stderr nunca se inventan.
160
+ - **Escrituras solo-anexar, con aprobación y respaldo.** La consola nunca reescribe `cordis.patch.yml`; anexa operaciones generadas y conserva las `backupCount` copias más recientes.
161
+ - **Sin inyección de prompts.** El panel no registra secciones de prompt; su único texto visible al modelo son las dos descripciones de herramienta/comando.
114
162
 
115
- ## Cómo funciona
163
+ ## Known limitations
116
164
 
117
- - **Mitad host** un servicio Typert Remote `mcpPanel` ensambla la instantánea desde tres fuentes de solo lectura: filas del Loader (entradas `@deepseek-ai/dsh-mcp-client`), `ctx.tools.schemas()` agrupadas por el espacio de nombres `mcp__<server>__`, y observaciones upstream `mcp/status`. El manifiesto `./typert` escrito a mano registra `mcpPanel/status` en el gateway; `zod` se incluye en el bundle, de modo que la mitad host es autocontenida.
118
- - **Mitad navegador** un bundle `dsh.client` (servido en `/plugins/dsh-mcp-panel/client.js`) monta el mismo descriptor mediante `ctx.remote.$mount` y registra una entrada `settings.plugins.tab` de solo lectura (`id: mcp`). El presentador es una función pura; los estilos tienen alcance y usan tokens de tema.
119
- - **El comando `/mcp`** pasa por el registro de comandos estándar cada línea aterriza en los eventos de sesión `command/run` + `command/done`.
165
+ - **Resources y Prompts** están pendientes de soporte upstream el cliente oficial solo puentea herramientas.
166
+ - **Códigos de salida / stderr** se etiquetan *pendiente de soporte upstream* hasta que el cliente los exponga.
167
+ - **Panel de solo lectura** la consola nunca falsifica un estado de conexión; los campos no observables leen `unknown` / `-1` / `—`.
120
168
 
121
- ## Desarrollo
169
+ ## Development
122
170
 
123
171
  ```sh
124
- pnpm install
125
- pnpm run typecheck # compuerta local: resuelve las caras de tipo frescas del checkout del harness vía rutas tsconfig
126
- pnpm run typecheck:ci # compuerta npm: resuelve las caras de tipo publicadas 0.1.0-rc.6 (lo que ejecuta CI)
127
- pnpm test # 109 pruebas: extremos del saneador, agrupación, tolerancia de agregación, salida del comando (5 idiomas), control de sondas, cableado del cliente, presentador (insignias/resumen/filtro)
128
- pnpm run build # declaraciones tsc → lib/types; tsdown → lib/index.js + lib/typert.host.js + lib/client.js
129
- pnpm run verify:self-contained
130
- pnpm run verify:artifacts
131
- pnpm pack
172
+ pnpm run typecheck && pnpm run typecheck:ci && pnpm test && pnpm run build && pnpm run verify:self-contained && pnpm run verify:artifacts && pnpm pack
132
173
  ```
133
174
 
134
- Publicación: `node scripts/release.mjs <x.y.z>` sube la versión, sella el CHANGELOG, vuelve a ejecutar la compuerta, hace commit y crea el tag; al empujar el tag se publican npm y el GitHub Release automáticamente (ver [CONTRIBUTING.md](CONTRIBUTING.md)).
175
+ `scripts/verify-headless.mjs` arranca el perfil web real e imprime la salida exacta de `/mcp`. Publicación: `node scripts/release.mjs <x.y.z>` ejecuta la puerta completa, hace commit y etiqueta `v<x.y.z>` localmente (nunca empuja).
176
+
177
+ ## Topics
178
+
179
+ `dsh`, `dsh-plugin`, `deepseek-harness`, `deepseek`, `cordis`, `mcp`, `mcp-client`, `observability`, `panel`
180
+
181
+ ## Contributors
135
182
 
136
- Verificación contra un checkout real del harness:
137
- `node --import tsx/esm scripts/verify-headless.mjs` arranca el perfil web completo en proceso (puerto efímero) e imprime la salida exacta de `/mcp`, `/mcp <server> tools` y `/mcp <server> disable`.
183
+ - [@PerryLink](https://github.com/PerryLink) creador y mantenedor.
184
+ - [@xiaoyuyu6420](https://github.com/xiaoyuyu6420) diagnosticó las devDependencies de client faltantes detrás de los fallos de build en checkouts limpios (PR #5).
138
185
 
139
- ## Licencia
186
+ ## PerryLink DSH Plugin Family
187
+
188
+ Este proyecto es uno de los [plugins de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, los demás probablemente también:
189
+
190
+ | Plugin | En una línea |
191
+ |---|---|
192
+ | [dsh-mask](https://github.com/PerryLink/dsh-mask) | Middleware de enmascaramiento de PII: anonimiza en el límite del modelo, restaura en la capa de visualización |
193
+ | **[dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel)** | Panel MCP de solo lectura: comando /mcp + pestaña de ajustes con estado, herramientas y errores |
194
+ | [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Guardia de disciplina de ingeniería: interrogatorio de requisitos, puertas de pruebas, revisión adversaria |
195
+ | [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Agentes hijos en segundo plano con barra lateral web, mensajería e interrupción |
196
+ | [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | Diagnóstico, formato, autocompletado, acciones de código y renombrado LSP |
197
+ | [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Cambio de estilo en tiempo de ejecución equivalente a outputStyles de Claude Code |
198
+ | [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Equivalente a /rewind de Claude Code: snapshots, forks de sesión, restauración de un clic |
199
+ | [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Reglas de permisos declarativas allow/deny/ask estilo Claude Code, con auditoría |
200
+ | [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Autorrevisión de segundo modelo en la cadena de aprobación, fail-closed por defecto |
201
+ | [dsh-memento](https://github.com/PerryLink/dsh-memento) | Memoria entre sesiones con aprobación: seam ctx.memory + SQLite + herramienta memory |
202
+ | [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Paquete de skills de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro |
203
+ | [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Fija sesiones en la barra lateral web con orden duradero |
204
+ | [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Historial de entrada estilo terminal para el compositor web: flechas, búsqueda Ctrl+R |
205
+ | [dsh-github](https://github.com/PerryLink/dsh-github) | Integración de PR/issues de GitHub para DSH, toda escritura con aprobación |
206
+ | [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Base de conocimiento de desarrollo de plugins como skill de agente bajo demanda |
207
+ | [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migra sesiones, memoria, skills y CLAUDE.md de Claude Code a DSH |
208
+
209
+ ## License
140
210
 
141
211
  [Apache License 2.0](LICENSE) © 2026 colaboradores de dsh-mcp-panel