dsh-mcp-panel 0.6.14 → 0.6.15

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 (48) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README-es.md +12 -6
  3. package/README-hi.md +12 -6
  4. package/README-pt.md +12 -6
  5. package/README-zh.md +12 -6
  6. package/README.md +12 -6
  7. package/cordis.patch.yml +5 -0
  8. package/docs/upstream-proposal.md +9 -0
  9. package/lib/client.js +192 -65
  10. package/lib/client.js.map +1 -1
  11. package/lib/index.js +103 -18
  12. package/lib/typert.host.js +31 -60
  13. package/lib/types/client/McpPanelTab.d.ts.map +1 -1
  14. package/lib/types/client/locales.d.ts +14 -0
  15. package/lib/types/client/locales.d.ts.map +1 -1
  16. package/lib/types/client/remote.d.ts +56 -179
  17. package/lib/types/client/remote.d.ts.map +1 -1
  18. package/lib/types/command.d.ts.map +1 -1
  19. package/lib/types/config.d.ts +8 -0
  20. package/lib/types/config.d.ts.map +1 -1
  21. package/lib/types/index.d.ts +1 -1
  22. package/lib/types/index.d.ts.map +1 -1
  23. package/lib/types/patch.d.ts +7 -6
  24. package/lib/types/patch.d.ts.map +1 -1
  25. package/lib/types/service.d.ts +20 -0
  26. package/lib/types/service.d.ts.map +1 -1
  27. package/lib/types/trial.d.ts +8 -0
  28. package/lib/types/trial.d.ts.map +1 -1
  29. package/lib/types/typert.host.d.ts +56 -179
  30. package/lib/types/typert.host.d.ts.map +1 -1
  31. package/lib/types/upstream.d.ts +27 -20
  32. package/lib/types/upstream.d.ts.map +1 -1
  33. package/lib/types/wire.d.ts +113 -359
  34. package/lib/types/wire.d.ts.map +1 -1
  35. package/package.json +20 -19
  36. package/src/client/McpPanelTab.tsx +79 -0
  37. package/src/client/locales.ts +20 -4
  38. package/src/client/styles.ts +18 -0
  39. package/src/command.ts +8 -4
  40. package/src/config.ts +20 -0
  41. package/src/index.ts +3 -1
  42. package/src/patch.ts +17 -9
  43. package/src/probe.ts +1 -1
  44. package/src/service.ts +83 -4
  45. package/src/trial.ts +32 -6
  46. package/src/upstream.ts +27 -20
  47. package/src/wire.ts +33 -61
  48. package/src/write.ts +6 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.6.15] - 2026-09-15
6
+
7
+ ### Fixed
8
+
9
+ - **Issue #27 — `disable` / `enable` / `edit` emitted `- set:` fragments the loader dialect does not implement (silent no-op).** Both renderers (`renderPatchFragment` and the `/mcp <server> disable|enable` suggestion) now emit the loader's real dialect: `- id: <entryId>` + `name:` + `disabled:` (or a full `config:` block for edits). `appendPatchFragment` reads the file back to confirm the appended block survived, and `writePatch` re-verifies every write against the loader's re-applied state before reporting success — a skipped patch (wrong dialect, a row living in a layer a profile patch cannot reach such as `$DSH_HOME/cordis.patch.yml`, or a name mismatch) now fails honestly instead of reading "written". New config: `writeVerifyEnabled` (default true) and `writeVerifyTimeoutMs` (default 3000).
10
+
11
+ ### Added
12
+
13
+ - **Read-only Resources browser.** The shipped `@deepseek-ai/dsh-mcp-resources` service now bridges MCP resources upstream; the console feature-detects the service + the three registered shared tools and offers list / templates / URI read per server card through the OFFICIAL tool pipeline (results stay panel-only). `callTool` now accepts the three shared resource tools and injects the requested `server` into their arguments (conflicts fail closed). Capability detection no longer probes the never-shipped `mcpCatalog` face; Prompts stays `available: false` until upstream bridges prompt templates.
14
+
15
+ ### Changed
16
+
17
+ - Compatibility baseline raised to `dsh-v0.1.6-alpha.1`: all `@deepseek-ai/dsh-*` dev/test pins and the runtime `dsh-subprocess` pin moved to `0.1.6-alpha.1`; `dshWorkshop.compatibility.dshVersions` gains `0.1.6-alpha.1`; the five-language READMEs now document the id-override CRUD dialect, the Resources browser, the write-verification hardening, and the corrected capabilities wording (Prompts + resource subscriptions pending).
18
+
5
19
  ## [0.6.14] - 2026-09-12
6
20
 
7
21
  ### Changed
package/README-es.md CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  | Superficie | Estado |
28
28
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (tag de GitHub, verificado el 2026-09-11) (adaptado el 2026-09-09): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados - Session.append aún no puede estamparlo, por lo que el comportamiento de la puerta no cambia. Verificado el 2026-09-11 contra el checkout master dsh-v0.1.5-rc.2 (cadena completa de puertas + smoke de instalación de perfil). |
29
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.1` (tag de GitHub, verificado el 2026-09-16): cadena completa de puertas (typecheck / typecheck:ci / test / build / verify / package) más smoke de instalación de perfil contra el checkout 0.1.6-alpha.1. El servicio `@deepseek-ai/dsh-mcp-resources` ahora puentea Resources, que la consola detecta y navega en solo lectura. Línea base anterior: `dsh-v0.1.5-rc.2` (verificado el 2026-09-11). |
30
30
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
31
  | Plataformas | Web GUI (doble cara: host + navegador) |
32
32
  | Modelo | Cualquiera (el panel es de solo lectura; solo la salida de `/mcp` es legible por el modelo) |
@@ -40,7 +40,8 @@
40
40
  - **`/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*.
41
41
  - **`/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.
42
42
  - **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.
43
- - **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.
43
+ - **CRUD de servidores** — formularios de alta/edición/borrado → `insert` para alta y anulaciones dirigidas por id (`- id:` + `name:` + `disabled:`/`config:`) para edición/borrado → copia al portapapeles o escritura con aprobación, copias de seguridad automáticas y re-verificación contra el loader.
44
+ - **Navegación de Resources** — listado de recursos, listado de plantillas y lecturas de URI de solo lectura mediante las herramientas oficiales `list_mcp_resources` / `list_mcp_resource_templates` / `read_mcp_resource` (puenteadas por el servicio `@deepseek-ai/dsh-mcp-resources`); los resultados se muestran solo en la pestaña, nunca en el contexto del modelo.
44
45
  - **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
46
 
46
47
  ## Architecture: official client = bridge, this plugin = console
@@ -78,7 +79,7 @@ La consola **lee** el cliente por su seam de observabilidad `mcp/status` (evento
78
79
  |---|---|---|
79
80
  | Añadir servidor | Editar YAML, cuidar indentación/comillas | Formulario → fragmento de parche → **copiar** o **escribir** (aprobación + copia de seguridad) |
80
81
  | 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 |
81
- | Eliminar servidor | Borrar la fila | Operación `set disabled: true` (el vocabulario de parches no tiene remove) — re-habilitable |
82
+ | Eliminar servidor | Borrar la fila | Anulación `- id:` + `disabled: true` (el vocabulario de parches no tiene remove) — re-habilitable |
82
83
  | Ver estado | Leer logs | Insignias + reconexiones + último error, en vivo desde `mcp/status` |
83
84
  | Probar una herramienta | Pedírselo al modelo | Banco de pruebas → pipeline oficial `ctx.tools.execute()` (permisos y aprobación en vigor) |
84
85
  | Diagnosticar fallos | grep de logs | `/mcp <servidor> health` con sugerencias derivadas |
@@ -132,6 +133,8 @@ Todas las opciones son campos Schemastery `Config` (modificables desde cordis.ym
132
133
  | `trialTimeoutMs` | `120000` | Plazo del panel por llamada de prueba en ms |
133
134
  | `trialMaxResultChars` | `60000` | Tope del payload de resultado de prueba en caracteres |
134
135
  | `writeEnabled` | `true` | Interruptor de seguridad: `false` rechaza toda escritura (copiar sigue funcionando) |
136
+ | `writeVerifyEnabled` | `true` | Re-verifica cada escritura contra el estado re-aplicado del loader antes de reportar éxito |
137
+ | `writeVerifyTimeoutMs` | `3000` | Presupuesto de sondeo para la verificación de escritura en ms |
135
138
  | `backupCount` | `5` | Copias de `cordis.patch.yml` retenidas por escritura |
136
139
  | `catalogEntries` | `[]` | Superposición de usuario para el directorio recomendado: anexa entradas; una entrada con el mismo `id` reemplaza la integrada |
137
140
 
@@ -149,7 +152,9 @@ Todas las opciones son campos Schemastery `Config` (modificables desde cordis.ym
149
152
 
150
153
  ## Resources & Prompts
151
154
 
152
- 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**.
155
+ Resources YA están puenteados upstream: el bundle base monta `@deepseek-ai/dsh-mcp-resources`, el cliente oficial registra el provider de recursos de cada conexión en `ctx.mcpResources`, y ese paquete posee las tres herramientas compartidas (`list_mcp_resources`, `list_mcp_resource_templates`, `read_mcp_resource`). La consola detecta el servicio y las herramientas registradas, y ofrece un navegador de Resources de solo lectura (lista / plantillas / lectura de URI) en cada tarjeta de servidor — cada llamada pasa por el pipeline OFICIAL de herramientas y los resultados nunca entran en el contexto del modelo.
156
+
157
+ Las **plantillas de prompts** y las **suscripciones a recursos** siguen diferidas upstream; el tablero de capacidades marca Prompts **pendiente de soporte upstream**.
153
158
 
154
159
  ## Permissions & data
155
160
 
@@ -160,14 +165,15 @@ El cliente oficial documenta que *"Tools are the only bridged MCP capability"*
160
165
 
161
166
  - **El puente sigue siendo el puente.** Sin cambios de transporte, OAuth o protocolo; una fila mcp-client por servidor, exactamente como a mano.
162
167
  - **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.
163
- - **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.
168
+ - **Escrituras solo-anexar, con aprobación y respaldo.** La consola nunca reescribe `cordis.patch.yml`; anexa operaciones generadas, conserva las `backupCount` copias más recientes y re-verifica cada escritura contra el estado re-aplicado del loader antes de reportar éxito (un parche omitido nunca se muestra como éxito).
164
169
  - **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.
165
170
 
166
171
  ## Known limitations
167
172
 
168
- - **Resources y Prompts** están pendientes de soporte upstream — el cliente oficial solo puentea herramientas.
173
+ - **Plantillas de prompts y suscripciones a recursos** están pendientes de soporte upstream — el cliente oficial puentea herramientas y recursos, pero no prompts ni suscripciones.
169
174
  - **Códigos de salida / stderr** se etiquetan *pendiente de soporte upstream* hasta que el cliente los exponga.
170
175
  - **Panel de solo lectura** — la consola nunca falsifica un estado de conexión; los campos no observables leen `unknown` / `-1` / `—`.
176
+ - **Las escrituras se verifican, no se garantizan** — la consola re-verifica cada escritura contra el estado re-aplicado del loader y falla honestamente cuando el loader no la aplicó (p. ej. una fila insertada por `$DSH_HOME/cordis.patch.yml`, que un parche de capa de perfil no puede alcanzar).
171
177
 
172
178
  ## Development
173
179
 
package/README-hi.md CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  | सतह | स्थिति |
28
28
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, 2026-09-11 को सत्यापित) (2026-09-09 को अनुकूलित): सत्र लिफ़ाफ़ा अपना ignorable फ़ील्ड केवल संग्रहीत-लॉग पठन संगतता के लिए रखता है - Session.append अभी भी इसे स्टैम्प नहीं कर सकता, इसलिए गेट व्यवहार अपरिवर्तित है। 2026-09-11 को dsh-v0.1.5-rc.2 master checkout के विरुद्ध सत्यापित (पूर्ण गेट शृंखला + प्रोफ़ाइल इंस्टॉल स्मोक)। |
29
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.1` (GitHub tag, 2026-09-16 को सत्यापित): 0.1.6-alpha.1 checkout के विरुद्ध पूर्ण गेट शृंखला (typecheck / typecheck:ci / test / build / verify / package) + प्रोफ़ाइल इंस्टॉल स्मोक। `@deepseek-ai/dsh-mcp-resources` सेवा अब Resources जोड़ती है, जिसे कंसोल फ़ीचर-डिटेक्ट कर रीड-ओनली ब्राउज़ करता है। पिछली आधार रेखा: `dsh-v0.1.5-rc.2` (2026-09-11 को सत्यापित)। |
30
30
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
31
  | प्लेटफ़ॉर्म | Web GUI (दोहरा चेहरा: host + browser) |
32
32
  | मॉडल | कोई भी (पैनल रीड-ओनली है; केवल `/mcp` आउटपुट मॉडल-पठनीय है) |
@@ -40,7 +40,8 @@
40
40
  - **`/mcp <server> health`** — व्युत्पन्न स्व-उपचार सुझाव (ENOENT → अनुपलब्ध निर्भरता, ECONNREFUSED, टाइमआउट, 401/403/404, DNS, दर सीमा, रीकनेक्ट समाप्त…); एग्ज़िट कोड / stderr पूँछ ईमानदारी से *upstream समर्थन की प्रतीक्षा में* चिह्नित।
41
41
  - **`/mcp <server> call <tool> [json]`** — **आधिकारिक टूल पाइपलाइन** (`ctx.tools.execute()`) से परीक्षण कॉल; प्री-एग्ज़ीक्यूट अनुमति नीति, अनुमोदन, guards और post-execute सब लागू।
42
42
  - **सेटिंग्स → प्लगइन्स → MCP टैब** — बैज, निदान और प्रोब वाले स्थिति कार्ड, साथ में सर्वर CRUD और टूल ट्रायल कंसोल।
43
- - **सर्वर CRUD** — जोड़/बदल/हटा फ़ॉर्म → `insert`/`set`/`set disabled` अंश → क्लिपबोर्ड कॉपी या अनुमोदित लेखन, स्वचालित बैकअप के साथ।
43
+ - **सर्वर CRUD** — जोड़/बदल/हटा फ़ॉर्म → जोड़ने के लिए `insert` और बदलने/हटाने के लिए id-लक्षित ओवरराइड (`- id:` + `name:` + `disabled:`/`config:`) → क्लिपबोर्ड कॉपी या अनुमोदित लेखन, स्वचालित बैकअप और loader के विरुद्ध पुनः सत्यापन के साथ।
44
+ - **Resources ब्राउज़िंग** — आधिकारिक `list_mcp_resources` / `list_mcp_resource_templates` / `read_mcp_resource` टूल से रीड-ओनली संसाधन सूची, टेम्पलेट सूची और URI पठन (`@deepseek-ai/dsh-mcp-resources` सेवा द्वारा जोड़े गए); परिणाम केवल टैब में दिखते हैं, मॉडल संदर्भ में कभी नहीं।
44
45
  - **टूल ट्रायल कंसोल** — सर्वर → `mcp__*` टूल → JSON तर्क → कैनोनिकल JSON परिणाम + रेंडर सामग्री; `trialMaxResultChars` से सीमित; केवल पैनल, मॉडल संदर्भ में कभी नहीं।
45
46
 
46
47
  ## Architecture: official client = bridge, this plugin = console
@@ -78,7 +79,7 @@
78
79
  |---|---|---|
79
80
  | सर्वर जोड़ें | YAML संपादित करें, इंडेंट/कोट्स का ध्यान | फ़ॉर्म → patch अंश → **कॉपी** या **लिखें** (अनुमोदन + बैकअप) |
80
81
  | सर्वर बदलें | YAML संपादित करें, रीस्टार्ट/हॉट-रीलोड | लाइव पंक्ति से पहले से भरा फ़ॉर्म; बिना बदले सीक्रेट host पर ही रहते हैं |
81
- | सर्वर हटाएँ | पंक्ति मिटाएँ | `set disabled: true` ऑपरेशन (patch शब्दावली में remove नहीं) — कभी भी फिर से सक्षम करने योग्य |
82
+ | सर्वर हटाएँ | पंक्ति मिटाएँ | `- id:` + `disabled: true` ओवरराइड (patch शब्दावली में remove नहीं) — कभी भी फिर से सक्षम करने योग्य |
82
83
  | स्थिति देखें | लॉग पढ़ें | बैज + रीकनेक्ट + अंतिम त्रुटि, `mcp/status` से लाइव |
83
84
  | टूल आज़माएँ | मॉडल से कहें | ट्रायल कंसोल → आधिकारिक `ctx.tools.execute()` पाइपलाइन (अनुमतियाँ और अनुमोदन लागू) |
84
85
  | विफलताओं का निदान | लॉग grep करें | `/mcp <server> health` व्युत्पन्न सुझावों के साथ |
@@ -132,6 +133,8 @@ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
132
133
  | `trialTimeoutMs` | `120000` | प्रति ट्रायल कॉल पैनल-साइड समय सीमा (ms) |
133
134
  | `trialMaxResultChars` | `60000` | ट्रायल परिणाम payload की सीमा (वर्ण) |
134
135
  | `writeEnabled` | `true` | कठोर स्विच: `false` हर प्रोफ़ाइल लेखन अस्वीकार करता है (कॉपी फिर भी चलती है) |
136
+ | `writeVerifyEnabled` | `true` | सफलता बताने से पहले हर लेखन को loader के पुनः-लागू अवस्था के विरुद्ध सत्यापित करता है |
137
+ | `writeVerifyTimeoutMs` | `3000` | लेखन सत्यापन के लिए पोलिंग बजट (मि.से.) |
135
138
  | `backupCount` | `5` | प्रति लेखन रखे गए `cordis.patch.yml` बैकअप |
136
139
  | `catalogEntries` | `[]` | अनुशंसित निर्देशिका के लिए उपयोगकर्ता ओवरले: प्रविष्टियाँ जोड़ता है; समान `id` वाली प्रविष्टि अंतर्निहित को बदल देती है |
137
140
 
@@ -149,7 +152,9 @@ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
149
152
 
150
153
  ## Resources & Prompts
151
154
 
152
- आधिकारिक क्लाइंट दस्तावेज़ कहता है कि *"Tools are the only bridged MCP capability"* — Resources और Prompts स्थगित हैं। कंसोल प्रस्तावित upstream catalog seam को फ़ीचर-डिटेक्ट करता है और उसके आते ही रीड-ओनली सूचियाँ दिखाएगा; तब तक क्षमता बोर्ड दोनों को **upstream समर्थन की प्रतीक्षा में** दर्शाता है।
155
+ Resources अब upstream जोड़ चुका है: base bundle `@deepseek-ai/dsh-mcp-resources` माउंट करता है, आधिकारिक क्लाइंट हर कनेक्शन का संसाधन provider `ctx.mcpResources` में पंजीकृत करता है, और वह पैकेज तीन साझा टूल (`list_mcp_resources`, `list_mcp_resource_templates`, `read_mcp_resource`) रखता है। कंसोल सेवा और पंजीकृत टूल को फ़ीचर-डिटेक्ट करता है, और हर सर्वर कार्ड पर रीड-ओनली Resources ब्राउज़र (सूची / टेम्पलेट / URI पठन) देता है — हर कॉल आधिकारिक टूल पाइपलाइन से जाती है और परिणाम मॉडल संदर्भ में कभी नहीं जाते।
156
+
157
+ MCP **prompt टेम्पलेट** और **संसाधन सदस्यताएँ** अभी भी upstream स्थगित हैं; क्षमता बोर्ड Prompts को **upstream समर्थन की प्रतीक्षा में** दर्शाता है।
153
158
 
154
159
  ## Permissions & data
155
160
 
@@ -160,14 +165,15 @@ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
160
165
 
161
166
  - **पुल पुल ही रहता है।** ट्रांसपोर्ट, OAuth या प्रोटोकॉल में कोई बदलाव नहीं; प्रति सर्वर एक mcp-client पंक्ति, ठीक हाथ से लिखी हुई।
162
167
  - **कोई नकली स्थिति नहीं।** बिना upstream अवलोकन वाले कनेक्शन फ़ील्ड `unknown` / `—` और `statusSource: 'derived'` पढ़ते हैं; एग्ज़िट कोड और stderr पूँछ कभी गढ़े नहीं जाते।
163
- - **लेखन केवल-जोड़ने वाला, अनुमोदित, बैकअप सहित।** कंसोल कभी `cordis.patch.yml` को दोबारा नहीं लिखता; यह जनरेट किए ऑपरेशन जोड़ता है और नवीनतम `backupCount` बैकअप रखता है।
168
+ - **लेखन केवल-जोड़ने वाला, अनुमोदित, बैकअप सहित।** कंसोल कभी `cordis.patch.yml` को दोबारा नहीं लिखता; यह जनरेट किए ऑपरेशन जोड़ता है, नवीनतम `backupCount` बैकअप रखता है, और सफलता बताने से पहले हर लेखन को loader के पुनः-लागू अवस्था के विरुद्ध सत्यापित करता है (छोड़ा गया patch कभी सफल नहीं दिखता)।
164
169
  - **कोई प्रॉम्प्ट इंजेक्शन नहीं।** पैनल कोई प्रॉम्प्ट अनुभाग पंजीकृत नहीं करता; मॉडल को दिखने वाला उसका एकमात्र पाठ दो टूल/कमांड विवरण हैं।
165
170
 
166
171
  ## Known limitations
167
172
 
168
- - **Resources और Prompts** upstream समर्थन की प्रतीक्षा में — आधिकारिक क्लाइंट केवल टूल जोड़ता है।
173
+ - **prompt टेम्पलेट और संसाधन सदस्यताएँ** upstream समर्थन की प्रतीक्षा में — आधिकारिक क्लाइंट टूल और संसाधन जोड़ता है, पर prompts या सदस्यताएँ नहीं।
169
174
  - **एग्ज़िट कोड / stderr पूँछ** तब तक *upstream समर्थन की प्रतीक्षा में* चिह्नित रहते हैं जब तक क्लाइंट उन्हें उजागर न करे।
170
175
  - **रीड-ओनली पैनल** — कंसोल कभी कनेक्शन स्थिति नहीं गढ़ता; अप्रेक्षणीय फ़ील्ड `unknown` / `-1` / `—` पढ़ते हैं।
176
+ - **लेखन सत्यापित होते हैं, गारंटी नहीं** — कंसोल हर लेखन को loader के पुनः-लागू अवस्था के विरुद्ध सत्यापित करता है और जब loader उसे लागू न करे (जैसे `$DSH_HOME/cordis.patch.yml` द्वारा डाली गई पंक्ति, जिसे प्रोफ़ाइल-परत patch नहीं पहुँच सकता) तो ईमानदारी से विफल होता है।
171
177
 
172
178
  ## Development
173
179
 
package/README-pt.md CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  | Superfície | Status |
28
28
  |---|---|
29
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (tag do GitHub, verificado em 2026-09-11) (adaptado em 2026-09-09): o envelope de sessão mantém seu campo ignorable apenas para compatibilidade de leitura de logs armazenados - o Session.append ainda não consegue estampá-lo, então o comportamento da porta não muda. Verificado em 2026-09-11 contra o checkout master dsh-v0.1.5-rc.2 (cadeia completa de portas + smoke de instalação de perfil). |
29
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.1` (tag do GitHub, verificado em 2026-09-16): cadeia completa de portas (typecheck / typecheck:ci / test / build / verify / package) mais smoke de instalação de perfil contra o checkout 0.1.6-alpha.1. O serviço `@deepseek-ai/dsh-mcp-resources` agora pontua Resources, que o console detecta e navega somente leitura. Linha de base anterior: `dsh-v0.1.5-rc.2` (verificado em 2026-09-11). |
30
30
  | Node | `^22.19.0 \|\| >=24.0.0` |
31
31
  | Plataformas | Web GUI (duas faces: host + navegador) |
32
32
  | Modelo | Qualquer (o painel é somente leitura; só a saída de `/mcp` é legível pelo modelo) |
@@ -40,7 +40,8 @@ O `dsh-mcp-panel` é a camada de experiência sobre o cliente MCP oficial: uma v
40
40
  - **`/mcp <servidor> health`** — sugestões de autorreparo derivadas (ENOENT → dependência ausente, ECONNREFUSED, timeouts, 401/403/404, DNS, rate limit, reconexão esgotada…); código de saída / cauda de stderr rotulados honestamente como *aguardando suporte upstream*.
41
41
  - **`/mcp <servidor> call <tool> [json]`** — chamada de teste pelo **pipeline oficial de ferramentas** (`ctx.tools.execute()`); política de permissão pré-execução, aprovação, guards e pós-execução, tudo em vigor.
42
42
  - **Configurações → Plugins → MCP** — cartões de status com selos, diagnósticos e sondas, mais o CRUD de servidores e o banco de testes de ferramentas.
43
- - **CRUD de servidores** — formulários de adicionar/editar/remover → fragmentos `insert`/`set`/`set disabled` → cópia para a área de transferência ou gravação com aprovação e backups automáticos.
43
+ - **CRUD de servidores** — formulários de adicionar/editar/remover → `insert` para adicionar e anulações dirigidas por id (`- id:` + `name:` + `disabled:`/`config:`) para editar/remover → cópia para a área de transferência ou gravação com aprovação, backups automáticos e re-verificação contra o loader.
44
+ - **Navegação de Resources** — listagem de recursos, listagem de templates e leituras de URI somente leitura pelas ferramentas oficiais `list_mcp_resources` / `list_mcp_resource_templates` / `read_mcp_resource` (ponteadas pelo serviço `@deepseek-ai/dsh-mcp-resources`); os resultados aparecem apenas na aba, nunca no contexto do modelo.
44
45
  - **Banco de testes de ferramentas** — servidor → ferramenta `mcp__*` → argumentos JSON → resultado JSON canônico + conteúdo renderizado; limitado por `trialMaxResultChars`; somente painel, nunca contexto do modelo.
45
46
 
46
47
  ## Architecture: official client = bridge, this plugin = console
@@ -78,7 +79,7 @@ O console **lê** o cliente pelo seu seam de observabilidade `mcp/status` (event
78
79
  |---|---|---|
79
80
  | Adicionar servidor | Editar YAML, cuidar indentação/aspas | Formulário → fragmento de patch → **copiar** ou **gravar** (aprovação + backup) |
80
81
  | Editar servidor | Editar YAML, reiniciar/recarga a quente | Formulário pré-preenchido da linha ao vivo; segredos inalterados preservam o valor no host |
81
- | Remover servidor | Apagar a linha | Operação `set disabled: true` (o vocabulário de patches não tem remove) — re-habilitável |
82
+ | Remover servidor | Apagar a linha | Anulação `- id:` + `disabled: true` (o vocabulário de patches não tem remove) — re-habilitável |
82
83
  | Ver status | Ler logs | Selos + reconexões + último erro, ao vivo do `mcp/status` |
83
84
  | Testar uma ferramenta | Pedir ao modelo | Banco de testes → pipeline oficial `ctx.tools.execute()` (permissões e aprovação em vigor) |
84
85
  | Diagnosticar falhas | grep de logs | `/mcp <servidor> health` com sugestões derivadas |
@@ -132,6 +133,8 @@ Todas as opções são campos Schemastery `Config` (modificáveis a partir do co
132
133
  | `trialTimeoutMs` | `120000` | Prazo do painel por chamada de teste em ms |
133
134
  | `trialMaxResultChars` | `60000` | Teto do payload do resultado de teste em caracteres |
134
135
  | `writeEnabled` | `true` | Interruptor de segurança: `false` rejeita toda gravação (copiar continua funcionando) |
136
+ | `writeVerifyEnabled` | `true` | Re-verifica cada gravação contra o estado re-aplicado do loader antes de reportar sucesso |
137
+ | `writeVerifyTimeoutMs` | `3000` | Orçamento de sondagem para a verificação de gravação em ms |
135
138
  | `backupCount` | `5` | Backups de `cordis.patch.yml` retidos por gravação |
136
139
  | `catalogEntries` | `[]` | Sobreposição do usuário para o diretório recomendado: anexa entradas; uma entrada com o mesmo `id` substitui a integrada |
137
140
 
@@ -149,7 +152,9 @@ Todas as opções são campos Schemastery `Config` (modificáveis a partir do co
149
152
 
150
153
  ## Resources & Prompts
151
154
 
152
- O cliente oficial documenta que *"Tools are the only bridged MCP capability"* — Resources e Prompts estão adiados. O console detecta um seam de catálogo proposto e exibirá listas somente leitura no dia em que for enviado; até lá o painel de capacidades marca ambos **aguardando suporte upstream**.
155
+ Resources JÁ são ponteados upstream: o bundle base monta `@deepseek-ai/dsh-mcp-resources`, o cliente oficial registra o provider de recursos de cada conexão em `ctx.mcpResources`, e esse pacote possui as três ferramentas compartilhadas (`list_mcp_resources`, `list_mcp_resource_templates`, `read_mcp_resource`). O console detecta o serviço e as ferramentas registradas, e oferece um navegador de Resources somente leitura (lista / templates / leitura de URI) em cada cartão de servidor — cada chamada passa pelo pipeline OFICIAL de ferramentas e os resultados nunca entram no contexto do modelo.
156
+
157
+ **Templates de prompts** e **assinaturas de recursos** permanecem adiados upstream; o painel de capacidades marca Prompts **aguardando suporte upstream**.
153
158
 
154
159
  ## Permissions & data
155
160
 
@@ -160,14 +165,15 @@ O cliente oficial documenta que *"Tools are the only bridged MCP capability"*
160
165
 
161
166
  - **A ponte continua sendo a ponte.** Sem mudanças de transporte, OAuth ou protocolo; uma linha mcp-client por servidor, exatamente como à mão.
162
167
  - **Sem status falso.** Campos de conexão sem observações upstream leem `unknown` / `—` com `statusSource: 'derived'`; códigos de saída e stderr nunca são inventados.
163
- - **Gravações somente-anexar, com aprovação e backup.** O console nunca reescreve o `cordis.patch.yml`; anexa operações geradas e conserva os `backupCount` backups mais recentes.
168
+ - **Gravações somente-anexar, com aprovação e backup.** O console nunca reescreve o `cordis.patch.yml`; anexa operações geradas, conserva os `backupCount` backups mais recentes e re-verifica cada gravação contra o estado re-aplicado do loader antes de reportar sucesso (um patch omitido nunca aparece como sucesso).
164
169
  - **Sem injeção de prompts.** O painel não registra seções de prompt; seu único texto visível ao modelo são as duas descrições de ferramenta/comando.
165
170
 
166
171
  ## Known limitations
167
172
 
168
- - **Resources e Prompts** aguardam suporte upstream — o cliente oficial só pontua ferramentas.
173
+ - **Templates de prompts e assinaturas de recursos** aguardam suporte upstream — o cliente oficial pontua ferramentas e recursos, mas não prompts nem assinaturas.
169
174
  - **Códigos de saída / caudas de stderr** são rotulados *aguardando suporte upstream* até o cliente expô-los.
170
175
  - **Painel somente leitura** — o console nunca falsifica um estado de conexão; campos não observáveis leem `unknown` / `-1` / `—`.
176
+ - **Gravações são verificadas, não garantidas** — o console re-verifica cada gravação contra o estado re-aplicado do loader e falha honestamente quando o loader não a aplicou (ex.: uma linha inserida por `$DSH_HOME/cordis.patch.yml`, que um patch de camada de perfil não alcança).
171
177
 
172
178
  ## Development
173
179
 
package/README-zh.md CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  | 维度 | 状态 |
30
30
  |---|---|
31
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2`(GitHub tag,2026-09-11 已核验)(2026-09-09 已适配):会话信封保留 ignorable 字段但仅用于存量日志读取兼容——Session.append 仍无法盖章,门控行为不变。已于 2026-09-11 对照 dsh-v0.1.5-rc.2 master checkout 核验(全量门禁链 + profile 安装冒烟)。 |
31
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.1`(GitHub tag,2026-09-16 已核验):全量门禁链(typecheck / typecheck:ci / test / build / verify / package)+ 对照 0.1.6-alpha.1 checkout 的 profile 安装冒烟。上游 `@deepseek-ai/dsh-mcp-resources` 现已桥接 Resources,控制台特征探测后提供只读浏览。上一基线:`dsh-v0.1.5-rc.2`(2026-09-11 已核验)。 |
32
32
  | Node | `^22.19.0 \|\| >=24.0.0` |
33
33
  | 平台 | Web GUI(双面:Host + 浏览器) |
34
34
  | 模型 | 任意(面板只读;仅 `/mcp` 输出对模型可见) |
@@ -42,7 +42,8 @@
42
42
  - **`/mcp <server> health`** —— 派生自愈建议(ENOENT → 依赖缺失、ECONNREFUSED、超时、401/403/404、DNS、限流、重连耗尽…);退出码 / stderr 尾部如实标注*待官方支持*。
43
43
  - **`/mcp <server> call <tool> [json]`** —— 经**官方工具管线**(`ctx.tools.execute()`)试用调用;pre-execute 权限策略、审批、guard、post-execute 全部生效。
44
44
  - **设置 → 插件 → MCP 页** —— 状态卡片(徽章、诊断、探测),加 server CRUD 与工具试用台。
45
- - **Server CRUD** —— 增删改表单 → `insert`/`set`/`set disabled` 片段 → 剪贴板复制或审批写入,自动备份。
45
+ - **Server CRUD** —— 增删改表单 → 添加用 `insert`,编辑/删除用 id 定向覆盖(`- id:` + `name:` + `disabled:`/`config:`)→ 剪贴板复制或审批写入,自动备份,并在报成功前对照 loader 复验。
46
+ - **Resources 浏览** —— 经官方 `list_mcp_resources` / `list_mcp_resource_templates` / `read_mcp_resource` 工具只读列出资源、模板与 URI 读取(由上游 `@deepseek-ai/dsh-mcp-resources` 服务桥接);结果只显示在本页、绝不进入模型上下文。
46
47
  - **工具试用台** —— 选 server → 选 `mcp__*` 工具 → JSON 填参 → 规范 JSON 结果 + render 内容;按 `trialMaxResultChars` 截断;仅面板可见、永不进入模型上下文。
47
48
 
48
49
  ## Architecture: official client = bridge, this plugin = console
@@ -80,7 +81,7 @@
80
81
  |---|---|---|
81
82
  | 添加服务器 | 改 YAML,注意缩进与引号 | 表单 → patch 片段 → **一键复制**或**写入**(审批 + 自动备份) |
82
83
  | 修改服务器 | 改 YAML,重启/热重载 | 表单预填当前行;未改动的密钥在 host 侧保留原值 |
83
- | 删除服务器 | 删掉该行 | 追加 `set disabled: true` 操作(patch 词汇表没有 remove)——可随时重新启用 |
84
+ | 删除服务器 | 删掉该行 | 追加 `- id:` + `disabled: true` 覆盖操作(patch 词汇表没有 remove)——可随时重新启用 |
84
85
  | 查看状态 | 翻日志 | 徽章 + 重连次数 + 最近错误,来自 `mcp/status` seam 实时数据 |
85
86
  | 试用工具 | 让模型调用 | 试用台 → 官方 `ctx.tools.execute()` 管线(权限与审批全程生效) |
86
87
  | 排查故障 | grep 日志 | `/mcp <server> health` 派生自愈建议 |
@@ -134,6 +135,8 @@ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
134
135
  | `trialTimeoutMs` | `120000` | 每次试用调用的面板侧截止时间(ms) |
135
136
  | `trialMaxResultChars` | `60000` | 试用结果载荷上限(字符) |
136
137
  | `writeEnabled` | `true` | 总开关:`false` 拒绝一切 profile 写入(仍可复制片段) |
138
+ | `writeVerifyEnabled` | `true` | 每次写入在报成功前对照 loader 重放后的状态复验 |
139
+ | `writeVerifyTimeoutMs` | `3000` | 写入复验的轮询预算(毫秒) |
137
140
  | `backupCount` | `5` | 每次写入保留的 `cordis.patch.yml` 备份数 |
138
141
  | `catalogEntries` | `[]` | 推荐服务器目录的用户覆盖:追加条目,同 `id` 的条目替换内置条目 |
139
142
 
@@ -151,7 +154,9 @@ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
151
154
 
152
155
  ## Resources & Prompts
153
156
 
154
- 官方 client 明确记载 *"Tools 是当前唯一桥接的 MCP 能力"*——Resources 与 Prompts 处于 deferred 状态。控制台特征探测了上游提案中的 catalog seam,一旦落地即可只读展示列表;在此之前,能力一览中二者均标注**待官方支持**。
157
+ Resources 已由上游桥接:base bundle 默认挂载 `@deepseek-ai/dsh-mcp-resources`,官方 client 把每个连接的资源 provider 注册进 `ctx.mcpResources`,该包拥有三个共享工具(`list_mcp_resources`、`list_mcp_resource_templates`、`read_mcp_resource`)。控制台特征探测该服务与已注册工具,并在每个 server 卡上提供只读 Resources 浏览(列表 / 模板 / URI 读取)——每次调用都走**官方工具管线**,结果只显示在本页、绝不进入模型上下文。
158
+
159
+ MCP **prompt 模板**与**资源订阅**仍待上游;能力一览中 Prompts 标注**待官方支持**。
155
160
 
156
161
  ## Permissions & data
157
162
 
@@ -162,14 +167,15 @@ dsh --profile web --dump-config | grep -A3 'id: mcp-panel'
162
167
 
163
168
  - **桥接层仍是桥接层。** 不改传输、OAuth、协议;每个 server 一行 mcp-client,与你手写完全一致。
164
169
  - **不伪造状态。** 无上游观测时连接字段显示 `unknown` / `—` 并标注 `statusSource: 'derived'`;退出码与 stderr 尾部绝不臆造。
165
- - **写入只追加、走审批、先备份。** 控制台从不改写 `cordis.patch.yml`:只追加生成的操作,并保留最新 `backupCount` 份备份。
170
+ - **写入只追加、走审批、先备份。** 控制台从不改写 `cordis.patch.yml`:只追加生成的操作,保留最新 `backupCount` 份备份,并在报成功前对照 loader 重放后的状态复验(被跳过的补丁绝不显示为成功)。
166
171
  - **零提示词注入。** 本插件不注册任何提示词段落;对模型可见的文本只有两个工具/命令描述。
167
172
 
168
173
  ## Known limitations
169
174
 
170
- - **Resources 与 Prompts** 待官方支持——官方 client 仅桥接工具。
175
+ - **prompt 模板与资源订阅** 待官方支持——官方 client 桥接工具与资源,但未桥接 prompts 与订阅。
171
176
  - **退出码 / stderr 尾部** 在 client 暴露前如实标注*待官方支持*。
172
177
  - **只读面板** —— 控制台从不伪造连接状态;不可观测字段显示 `unknown` / `-1` / `—`。
178
+ - **写入复验而非保证** —— 控制台对照 loader 重放后的状态复验每次写入;loader 未应用时(例如该行由 `$DSH_HOME/cordis.patch.yml` 插入、profile 层补丁够不着)如实报失败。
173
179
 
174
180
  ## Development
175
181
 
package/README.md CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  | Surface | Status |
31
31
  |---|---|
32
- | Harness | DeepSeek Harness `dsh-v0.1.5-rc.2` (GitHub tag, verified 2026-09-11) (adapted 2026-09-09): the session envelope keeps its ignorable field for stored-log read compatibility only - Session.append still cannot stamp it, so audit-gate behavior is unchanged. Verified 2026-09-11 against the dsh-v0.1.5-rc.2 master checkout (full gate chain + profile install smoke). |
32
+ | Harness | DeepSeek Harness `dsh-v0.1.6-alpha.1` (GitHub tag, verified 2026-09-16): full gate chain (typecheck / typecheck:ci / test / build / verify / package) plus a profile install smoke against the 0.1.6-alpha.1 checkout. The shipped `@deepseek-ai/dsh-mcp-resources` service now bridges Resources, which the console feature-detects and browses read-only. Previous baseline: `dsh-v0.1.5-rc.2` (verified 2026-09-11). |
33
33
  | Node | `^22.19.0 \|\| >=24.0.0` |
34
34
  | Platforms | Web GUI (dual-face: host + browser) |
35
35
  | Model | Any (the panel is read-only; only `/mcp` output is model-readable) |
@@ -43,7 +43,8 @@
43
43
  - **`/mcp <server> health`** — derived self-heal suggestions (ENOENT → missing dependency, ECONNREFUSED, timeouts, 401/403/404, DNS, rate limit, reconnect exhaustion…); exit code / stderr tail honestly labeled *pending upstream support* until the client exposes them.
44
44
  - **`/mcp <server> call <tool> [json]`** — trial-call through the **official tool pipeline** (`ctx.tools.execute()`); pre-execute permission policy, approval, guards, and post-execute all apply.
45
45
  - **Settings → Plugins → MCP tab** — status cards with badges, diagnostics, and probes, plus the server CRUD and the tool trial console.
46
- - **Server CRUD** — add/edit/remove forms → `insert`/`set`/`set disabled` fragments → clipboard copy or approval-gated write with automatic backups.
46
+ - **Server CRUD** — add/edit/remove forms → `insert` for add and id-targeted overrides (`- id:` + `name:` + `disabled:`/`config:`) for edit/remove → clipboard copy or approval-gated write with automatic backups and loader re-verification.
47
+ - **Resources browse** — read-only resource listing, template listing, and URI reads through the official `list_mcp_resources` / `list_mcp_resource_templates` / `read_mcp_resource` tools (bridged by the shipped `@deepseek-ai/dsh-mcp-resources` service); results are shown in the tab only, never in model context.
47
48
  - **Recommended directory** — a built-in community MCP server catalog (filesystem, git, github, fetch, playwright, …) served in the snapshot; `catalogEntries` appends/overrides entries, and `catalogToConfigInput` turns one into a one-click add.
48
49
  - **Config import/export** — `exportConfigs()` serializes the server rows to a versioned JSON document (a `!!js` row exports as `null` with a reason), and `importPreview()` parses an export back into per-server `add` patch fragments for review.
49
50
  - **Tool trial console** — server → `mcp__*` tool → JSON args → canonical JSON result + rendered content; capped by `trialMaxResultChars`; panel-only, never model context.
@@ -83,7 +84,7 @@ The console **reads** the client through its proposed `mcp/status` observability
83
84
  |---|---|---|
84
85
  | Add a server | Edit YAML, mind indent/quoting | Form → patch fragment → **copy** or **write** (approval + auto backup) |
85
86
  | Edit a server | Edit YAML, restart/hot-reload | Form pre-filled from the live row; unchanged secrets keep their raw values host-side |
86
- | Remove a server | Delete the row | `set disabled: true` operation (the patch vocabulary has no remove) — re-enableable anytime |
87
+ | Remove a server | Delete the row | `- id:` + `disabled: true` override (the patch vocabulary has no remove) — re-enableable anytime |
87
88
  | See status | Read logs | Badges + reconnects + last error, live from the `mcp/status` seam |
88
89
  | Try a tool | Ask the model to call it | Trial console → official `ctx.tools.execute()` pipeline (permission & approval stay in force) |
89
90
  | Diagnose failures | Grep logs | `/mcp <server> health` with derived self-heal suggestions |
@@ -137,6 +138,8 @@ All tunables are Schemastery `Config` fields (changeable from cordis.yml). `cord
137
138
  | `trialTimeoutMs` | `120000` | Panel-side deadline per trial call in ms |
138
139
  | `trialMaxResultChars` | `60000` | Cap on the trial result payload in chars |
139
140
  | `writeEnabled` | `true` | Kill switch: `false` rejects every profile write (copy still works) |
141
+ | `writeVerifyEnabled` | `true` | Re-verify each write against the loader's re-applied state before reporting success |
142
+ | `writeVerifyTimeoutMs` | `3000` | Polling budget for write verification in ms |
140
143
  | `backupCount` | `5` | `cordis.patch.yml` backups retained per write |
141
144
  | `catalogEntries` | `[]` | User overlay for the recommended server directory: entries append, an entry with the same `id` replaces the built-in one |
142
145
 
@@ -154,7 +157,9 @@ All tunables are Schemastery `Config` fields (changeable from cordis.yml). `cord
154
157
 
155
158
  ## Resources & Prompts
156
159
 
157
- The official client documents that *"Tools are the only bridged MCP capability"* — Resources and Prompts are deferred. The console feature-detects a proposed upstream catalog seam and will show read-only lists the day it ships; until then the capabilities board marks both **pending upstream support**.
160
+ Resources ARE bridged upstream: the base bundle mounts `@deepseek-ai/dsh-mcp-resources`, the official client registers each connection's resource provider into `ctx.mcpResources`, and that package owns the three shared tools (`list_mcp_resources`, `list_mcp_resource_templates`, `read_mcp_resource`). The console feature-detects the service and the registered tools, and offers a read-only Resources browser (list / templates / URI read) on every server card — each call runs through the OFFICIAL tool pipeline, and results never enter model context.
161
+
162
+ MCP **prompt templates** and **resource subscriptions** remain deferred upstream; the capabilities board marks Prompts **pending upstream support**.
158
163
 
159
164
  ## Permissions & data
160
165
 
@@ -165,14 +170,15 @@ The official client documents that *"Tools are the only bridged MCP capability"*
165
170
 
166
171
  - **The bridge stays the bridge.** No transport, OAuth, or protocol changes; one mcp-client row per server, exactly as hand-written.
167
172
  - **No fake status.** Connection fields without upstream observations read `unknown` / `—` with `statusSource: 'derived'`; exit codes and stderr tails are never invented.
168
- - **Writes are append-only, approval-gated, and backed up.** The console never rewrites `cordis.patch.yml`; it appends generated operations and keeps the newest `backupCount` backups.
173
+ - **Writes are append-only, approval-gated, and backed up.** The console never rewrites `cordis.patch.yml`; it appends generated operations, keeps the newest `backupCount` backups, and re-verifies every write against the loader's re-applied state before reporting success (a skipped patch never reads as success).
169
174
  - **No prompt injection.** The panel registers **no prompt sections**; its only model-facing text is the two tool/command descriptions.
170
175
 
171
176
  ## Known limitations
172
177
 
173
- - **Resources & Prompts** are pending upstream support — the official client bridges tools only.
178
+ - **Prompt templates & resource subscriptions** are pending upstream support — the official client bridges tools and resources, but not prompts or subscriptions.
174
179
  - **Exit codes / stderr tails** are labeled *pending upstream support* until the client exposes them.
175
180
  - **Read-only panel** — the console never fakes a connection state; unobservable fields read `unknown` / `-1` / `—`.
181
+ - **Writes are verified, not guaranteed** — the console re-verifies each write against the loader's re-applied state and fails honestly when the loader did not apply it (e.g. a row inserted by `$DSH_HOME/cordis.patch.yml`, which a profile-layer patch cannot reach).
176
182
 
177
183
  ## Development
178
184
 
package/cordis.patch.yml CHANGED
@@ -32,5 +32,10 @@
32
32
  # Kill switch for profile-patch writes: false rejects every write
33
33
  # (fragments stay copyable).
34
34
  # writeEnabled: true
35
+ # Verify each write against the loader's re-applied state before
36
+ # reporting success (a skipped patch must not read as success).
37
+ # writeVerifyEnabled: true
38
+ # Polling budget for write verification in milliseconds.
39
+ # writeVerifyTimeoutMs: 3000
35
40
  # Number of cordis.patch.yml backups retained per write.
36
41
  # backupCount: 5
@@ -167,3 +167,12 @@ both before and after this proposal lands.
167
167
  `PerryLink/deepseek-harness:feat/mcp-client-status-observability-seam`.
168
168
  - Everything else in this document stands as written.
169
169
 
170
+ ## Status check 2026-09-16 (0.1.6-alpha.1)
171
+
172
+ > Measured read-only against `origin/master` = `0d1f5000` (`0.1.6-alpha.1`, a 666-commit interval since the previous baseline).
173
+
174
+ - **The `mcp/status` seam is still missing.** `mcp/status` / `mcpStatus` / `McpStatus` -> 0 hits across `packages`; the mcp-client still exposes no per-server status/observability surface, so the panel keeps its feature-detected, derived-status fallback. The proposal and its tripwire remain unchanged.
175
+ - **Resources shipped differently than proposed.** The upstream bridge now provides Resources through a NEW package, `@deepseek-ai/dsh-mcp-resources` (mounted by `packages/bundle/base/cordis.patch.yml:471-472`): the client registers each connection's provider into `ctx.mcpResources`, and the package owns three shared tools (`list_mcp_resources`, `list_mcp_resource_templates`, `read_mcp_resource`). The console's old "catalog seam" idea (`mcpCatalog`) is therefore retired — the panel feature-detects `ctx.mcpResources` + the registered tools and browses resources through the OFFICIAL tools (`src/upstream.ts`, `src/service.ts`, `src/trial.ts`).
176
+ - **Prompts and resource subscriptions remain deferred** (`packages/mcp/mcp-client/README.md:209` documents prompts as unsupported); the capabilities board keeps Prompts `available: false`.
177
+ - The `dsh-mcp-panel` package now runs its full gate chain against `0.1.6-alpha.1` (compatibility baseline raised from `0.1.5-rc.2`).
178
+