@moon16u/dsh-plugin-mcp-console 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
File without changes
package/README.zh-CN.md CHANGED
File without changes
package/cordis.patch.yml CHANGED
File without changes
package/lib/client.js CHANGED
@@ -211,6 +211,11 @@ window.__ModuleLoader__.load({
211
211
  ".mcp-mgr-iconbtn{border:0;background:0 0;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;border-radius:8px;width:30px;height:30px;display:grid;place-items:center;flex:none;padding:0}",
212
212
  ".mcp-mgr-iconbtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary,#111827)}",
213
213
  ".mcp-mgr-iconbtn:disabled{color:var(--dsw-alias-label-dimmed,#9ca3af);cursor:wait}",
214
+ // A refresh keeps the icon at its normal color and spins it; the disabled
215
+ // dimming was the entire feedback, and at ~50 ms it read as a blink.
216
+ ".mcp-mgr-iconbtn[data-busy=true]{color:var(--dsw-alias-label-secondary,#6b7280);cursor:progress}",
217
+ ".mcp-spin{animation:mcp-spin .8s linear infinite;transform-origin:50% 50%}",
218
+ "@keyframes mcp-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",
214
219
  ".mcp-mgr-btn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-base,#ffffff);color:var(--dsw-alias-label-primary,#111827);font-family:var(--dsw-font-family);cursor:pointer;border-radius:8px;padding:6px 14px;font-size:13px;line-height:20px;display:inline-flex;align-items:center;gap:6px;box-shadow:0 1px 2px rgba(0,0,0,.04)}",
215
220
  ".mcp-mgr-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#f9fafb);border-color:#d1d5db}",
216
221
  ".mcp-mgr-btn:disabled{color:var(--dsw-alias-label-dimmed,#9ca3af);cursor:default}",
@@ -951,6 +956,7 @@ window.__ModuleLoader__.load({
951
956
  }
952
957
 
953
958
  function refresh() {
959
+ if (refreshing) return;
954
960
  setRefreshing(true);
955
961
  withBusy(null, function () {
956
962
  return mcpApi("/refresh", { method: "POST" }).then(function () { return load(); });
@@ -1047,7 +1053,6 @@ window.__ModuleLoader__.load({
1047
1053
  var servers = snapshot && snapshot.servers ? snapshot.servers : [];
1048
1054
  var readOnlyServers = snapshot && snapshot.externalServers ? snapshot.externalServers : [];
1049
1055
  var allServers = servers.concat(readOnlyServers);
1050
- var busyAny = busy !== null || refreshing;
1051
1056
 
1052
1057
  var listChildren = [];
1053
1058
  if (allServers.length === 0) {
@@ -1146,7 +1151,9 @@ window.__ModuleLoader__.load({
1146
1151
  }, t("confirmYes")))));
1147
1152
  }
1148
1153
 
1149
- var topDisabled = refreshing || mode !== null;
1154
+ // Only the refresh control reflects refresh progress. Disabling the two
1155
+ // write buttons for the same round-trip made the whole header blink.
1156
+ var topDisabled = mode !== null;
1150
1157
 
1151
1158
  // Master switch off: the whole host side is down, so the page offers the
1152
1159
  // way back instead of actions that cannot work.
@@ -1164,9 +1171,10 @@ window.__ModuleLoader__.load({
1164
1171
  McpH("h2", { className: "mcp-mgr-title" }, t("title")),
1165
1172
  McpH("button", {
1166
1173
  type: "button", className: "mcp-mgr-iconbtn", disabled: refreshing,
1174
+ "data-busy": refreshing ? "true" : "false",
1167
1175
  title: t("refresh"), "aria-label": t("refresh"),
1168
1176
  onClick: refresh,
1169
- }, McpH(IconRefresh, { size: 15 })),
1177
+ }, McpH(IconRefresh, { size: 15, className: refreshing ? "mcp-spin" : undefined })),
1170
1178
  McpH("button", {
1171
1179
  type: "button", className: "mcp-mgr-btn", disabled: topDisabled,
1172
1180
  onClick: function () { setEditing(null); setMode("add"); },
File without changes
package/lib/import.js CHANGED
File without changes
package/lib/index.js CHANGED
@@ -67,12 +67,14 @@ export function resolveConfig(value, storedConfig) {
67
67
  * settings page instead of hand-edited config files.
68
68
  */
69
69
  const SYSTEM_PROMPT_GUIDANCE =
70
- "本机已安装 MCP 控制台插件(dsh-plugin-mcp-console):DSH Web 设置页「MCP 服务器」分区可管理全部 MCP 服务器——" +
71
- "新增/编辑/删除、启用/停用、逐工具开关、mcpServers JSON 导入、连接测试。启用的服务器经官方 " +
72
- "@deepseek-ai/dsh-mcp-client 真实连接,工具名为 mcp__<服务器名>__<工具名>;被逐工具停用的工具仍会出现在工具" +
73
- "列表中,但调用会被拒绝并提示去设置页开启。配置由插件持久化在 ~/.dsh/dsh-mcp.json,无需也不应手改 " +
74
- "cordis.patch.yml。用户提到「MCP 服务器 / MCP 管理 / 导入 MCP / 测试 MCP 连接」时,引导其到设置页的 " +
75
- "「MCP 服务器」分区操作。";
70
+ "An MCP console plugin (dsh-plugin-mcp-console) is installed on this machine: the \"MCP Servers\" " +
71
+ "section of the DSH Web settings page manages all MCP servers — add/edit/delete, enable/disable, " +
72
+ "per-tool toggles, mcpServers JSON import, and connection testing. Enabled servers connect for real " +
73
+ "via the official @deepseek-ai/dsh-mcp-client, with tools named mcp__<server>__<tool>; tools disabled " +
74
+ "per-tool still appear in the tool list, but calls are rejected with a hint to enable them in the " +
75
+ "settings page. The plugin persists its config in ~/.dsh/dsh-mcp.json — no need to hand-edit, and do " +
76
+ "not hand-edit, cordis.patch.yml. When the user mentions \"MCP servers / MCP management / import MCP / " +
77
+ "test MCP connection\", guide them to the \"MCP Servers\" section of the settings page.";
76
78
 
77
79
  /** System-prompt band this announcement sits in (after plugin guidance basics). */
78
80
  const ANNOUNCEMENT_ORDER = 160;
File without changes
package/lib/routes.js CHANGED
File without changes
package/lib/status.js CHANGED
File without changes
package/lib/store.js CHANGED
File without changes
File without changes
File without changes
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moon16u/dsh-plugin-mcp-console",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Web GUI console for MCP servers: manages the official @deepseek-ai/dsh-mcp-client at runtime — add/edit/enable/disable/reconnect/delete servers, live status, mcpServers JSON import. No MCP protocol code: connection and tool registration are 100% the official client, resolved from the running DSH profile.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -36,15 +36,15 @@
36
36
  },
37
37
  "engines": {
38
38
  "node": ">=20.0.0",
39
- "dsh": ">=0.2.0-rc.2"
39
+ "dsh": ">=0.2.1-rc.1"
40
40
  },
41
41
  "peerDependencies": {
42
- "@deepseek-ai/cordis": "~4.0.4",
43
- "@deepseek-ai/dsh-mcp-client": ">=0.2.0-rc.2",
44
- "@deepseek-ai/dsh-host-webserver": ">=0.2.0-rc.2",
45
- "@deepseek-ai/dsh-settings": ">=0.2.0-rc.2",
46
- "@deepseek-ai/dsh-tools": ">=0.2.0-rc.2",
47
- "@deepseek-ai/schemastery": "~3.18.4"
42
+ "@deepseek-ai/cordis": "~4.0.5",
43
+ "@deepseek-ai/dsh-mcp-client": ">=0.2.1-rc.1",
44
+ "@deepseek-ai/dsh-host-webserver": ">=0.2.1-rc.1",
45
+ "@deepseek-ai/dsh-settings": ">=0.2.1-rc.1",
46
+ "@deepseek-ai/dsh-tools": ">=0.2.1-rc.1",
47
+ "@deepseek-ai/schemastery": "~3.18.5"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@deepseek-ai/dsh-mcp-client": {
@@ -60,6 +60,10 @@
60
60
  "optional": true
61
61
  }
62
62
  },
63
+ "scripts": {
64
+ "test": "node --test test/*.test.mjs",
65
+ "sync-root-client": "node scripts/sync-root-client.mjs"
66
+ },
63
67
  "license": "MIT",
64
68
  "publishConfig": {
65
69
  "access": "public",
@@ -68,9 +72,5 @@
68
72
  "devDependencies": {
69
73
  "react": "18.2.0",
70
74
  "react-dom": "18.2.0"
71
- },
72
- "scripts": {
73
- "test": "node --test test/*.test.mjs",
74
- "sync-root-client": "node scripts/sync-root-client.mjs"
75
75
  }
76
- }
76
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 moon16u
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.