@moon16u/dsh-plugin-mcp-console 0.3.2 → 0.3.4
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 +1 -9
- package/README.zh-CN.md +1 -8
- package/cordis.patch.yml +1 -2
- package/lib/client.js +13 -6
- package/lib/clientAdapter.js +0 -0
- package/lib/import.js +0 -0
- package/lib/index.js +1 -1
- package/lib/orchestrator.js +0 -0
- package/lib/routes.js +0 -0
- package/lib/status.js +0 -0
- package/lib/store.js +0 -0
- package/lib/types/client/index.d.ts +0 -0
- package/lib/types/index.d.ts +0 -0
- package/lib/yamlMigrator.js +0 -0
- package/package.json +10 -6
- package/LICENSE +0 -21
package/README.md
CHANGED
|
@@ -15,9 +15,6 @@ belong to the official `@deepseek-ai/dsh-mcp-client`; this plugin is only
|
|
|
15
15
|
## Installation
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
|
-
# Recommended: the whole pouch bundle (this plugin ships inside it)
|
|
19
|
-
dsh plugin --profile web add @moon16u/dsh-pouch
|
|
20
|
-
# Or standalone:
|
|
21
18
|
dsh plugin --profile web add @moon16u/dsh-plugin-mcp-console
|
|
22
19
|
```
|
|
23
20
|
|
|
@@ -63,12 +60,7 @@ Then open DSH Web → bottom-left Settings → **"MCP servers"**.
|
|
|
63
60
|
## Development
|
|
64
61
|
|
|
65
62
|
```bash
|
|
66
|
-
pnpm --filter @moon16u/dsh-plugin-mcp-console test
|
|
67
|
-
node scripts/sync-root-client.mjs # after editing lib/client.js, sync into the pouch root bundle
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
The marked section inside `lib/client.js` is kept identical to the dsh-pouch
|
|
71
|
-
root `lib/client.js` by the sync script; tests pin it against drift.
|
|
63
|
+
pnpm --filter @moon16u/dsh-plugin-mcp-console test
|
|
72
64
|
|
|
73
65
|
## License
|
|
74
66
|
[MIT](../../LICENSE)
|
package/README.zh-CN.md
CHANGED
|
@@ -9,9 +9,6 @@ DSH(DeepSeek Harness)Web GUI 的 **MCP 服务器管理控制台**:在设
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
# dsh-pouch 已装则跳过(本包随 pouch bundle 分发)
|
|
13
|
-
dsh plugin --profile web add @moon16u/dsh-pouch
|
|
14
|
-
# 独立安装(发布后):
|
|
15
12
|
dsh plugin --profile web add @moon16u/dsh-plugin-mcp-console
|
|
16
13
|
```
|
|
17
14
|
|
|
@@ -56,8 +53,4 @@ dsh plugin --profile web add @moon16u/dsh-plugin-mcp-console
|
|
|
56
53
|
## 开发
|
|
57
54
|
|
|
58
55
|
```bash
|
|
59
|
-
pnpm --filter @moon16u/dsh-plugin-mcp-console test
|
|
60
|
-
node scripts/sync-root-client.mjs # 改 lib/client.js 后同步进 dsh-pouch 根 bundle
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
包内 `lib/client.js` 与 dsh-pouch 根 `lib/client.js` 中的标记段由同步脚本保持一致,测试锁定防漂移。
|
|
56
|
+
pnpm --filter @moon16u/dsh-plugin-mcp-console test
|
package/cordis.patch.yml
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# dsh-mcp-console bundle patch: inserts the console into the loader tree when
|
|
2
|
-
# this package is installed as
|
|
3
|
-
# the root pouch patch already loads it; this file is inert there).
|
|
2
|
+
# this package is installed as its own DSH bundle.
|
|
4
3
|
- insert:
|
|
5
4
|
- id: ui-mcp-console
|
|
6
5
|
name: '@moon16u/dsh-plugin-mcp-console'
|
package/lib/client.js
CHANGED
|
@@ -6,7 +6,7 @@ window.__ModuleLoader__.load({
|
|
|
6
6
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
7
|
var React = require("react");
|
|
8
8
|
|
|
9
|
-
// ==== mcp-console client body
|
|
9
|
+
// ==== mcp-console client body ====
|
|
10
10
|
|
|
11
11
|
var McpIcons = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
12
12
|
var IconRefresh = McpIcons.IconRefreshOutlineRegular || McpIcons.IconRefreshOutline16;
|
|
@@ -19,8 +19,7 @@ window.__ModuleLoader__.load({
|
|
|
19
19
|
|
|
20
20
|
// ---------------------------------------------------------------------------
|
|
21
21
|
// mcp-console client: an "MCP" settings section (mcp-manager-gui-spec.md)
|
|
22
|
-
// over /api/dsh-mcp-console/*. All identifiers carry an Mcp/mcp prefix
|
|
23
|
-
// this body can be pasted verbatim into the dsh-pouch root client bundle.
|
|
22
|
+
// over /api/dsh-mcp-console/*. All identifiers carry an Mcp/mcp prefix.
|
|
24
23
|
// ---------------------------------------------------------------------------
|
|
25
24
|
|
|
26
25
|
var McpNS = "mcp-console";
|
|
@@ -211,6 +210,11 @@ window.__ModuleLoader__.load({
|
|
|
211
210
|
".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
211
|
".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
212
|
".mcp-mgr-iconbtn:disabled{color:var(--dsw-alias-label-dimmed,#9ca3af);cursor:wait}",
|
|
213
|
+
// A refresh keeps the icon at its normal color and spins it; the disabled
|
|
214
|
+
// dimming was the entire feedback, and at ~50 ms it read as a blink.
|
|
215
|
+
".mcp-mgr-iconbtn[data-busy=true]{color:var(--dsw-alias-label-secondary,#6b7280);cursor:progress}",
|
|
216
|
+
".mcp-spin{animation:mcp-spin .8s linear infinite;transform-origin:50% 50%}",
|
|
217
|
+
"@keyframes mcp-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",
|
|
214
218
|
".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
219
|
".mcp-mgr-btn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,#f9fafb);border-color:#d1d5db}",
|
|
216
220
|
".mcp-mgr-btn:disabled{color:var(--dsw-alias-label-dimmed,#9ca3af);cursor:default}",
|
|
@@ -951,6 +955,7 @@ window.__ModuleLoader__.load({
|
|
|
951
955
|
}
|
|
952
956
|
|
|
953
957
|
function refresh() {
|
|
958
|
+
if (refreshing) return;
|
|
954
959
|
setRefreshing(true);
|
|
955
960
|
withBusy(null, function () {
|
|
956
961
|
return mcpApi("/refresh", { method: "POST" }).then(function () { return load(); });
|
|
@@ -1047,7 +1052,6 @@ window.__ModuleLoader__.load({
|
|
|
1047
1052
|
var servers = snapshot && snapshot.servers ? snapshot.servers : [];
|
|
1048
1053
|
var readOnlyServers = snapshot && snapshot.externalServers ? snapshot.externalServers : [];
|
|
1049
1054
|
var allServers = servers.concat(readOnlyServers);
|
|
1050
|
-
var busyAny = busy !== null || refreshing;
|
|
1051
1055
|
|
|
1052
1056
|
var listChildren = [];
|
|
1053
1057
|
if (allServers.length === 0) {
|
|
@@ -1146,7 +1150,9 @@ window.__ModuleLoader__.load({
|
|
|
1146
1150
|
}, t("confirmYes")))));
|
|
1147
1151
|
}
|
|
1148
1152
|
|
|
1149
|
-
|
|
1153
|
+
// Only the refresh control reflects refresh progress. Disabling the two
|
|
1154
|
+
// write buttons for the same round-trip made the whole header blink.
|
|
1155
|
+
var topDisabled = mode !== null;
|
|
1150
1156
|
|
|
1151
1157
|
// Master switch off: the whole host side is down, so the page offers the
|
|
1152
1158
|
// way back instead of actions that cannot work.
|
|
@@ -1164,9 +1170,10 @@ window.__ModuleLoader__.load({
|
|
|
1164
1170
|
McpH("h2", { className: "mcp-mgr-title" }, t("title")),
|
|
1165
1171
|
McpH("button", {
|
|
1166
1172
|
type: "button", className: "mcp-mgr-iconbtn", disabled: refreshing,
|
|
1173
|
+
"data-busy": refreshing ? "true" : "false",
|
|
1167
1174
|
title: t("refresh"), "aria-label": t("refresh"),
|
|
1168
1175
|
onClick: refresh,
|
|
1169
|
-
}, McpH(IconRefresh, { size: 15 })),
|
|
1176
|
+
}, McpH(IconRefresh, { size: 15, className: refreshing ? "mcp-spin" : undefined })),
|
|
1170
1177
|
McpH("button", {
|
|
1171
1178
|
type: "button", className: "mcp-mgr-btn", disabled: topDisabled,
|
|
1172
1179
|
onClick: function () { setEditing(null); setMode("add"); },
|
package/lib/clientAdapter.js
CHANGED
|
File without changes
|
package/lib/import.js
CHANGED
|
File without changes
|
package/lib/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Surface wiring uses dynamic `ctx.inject(...)` scopes rather than a static
|
|
13
13
|
* `inject` export: on a host without the web profile (no webServer) the
|
|
14
|
-
* plugin stays dormant instead of blocking the
|
|
14
|
+
* plugin stays dormant instead of blocking the host. The
|
|
15
15
|
* same mechanism powers the settings-GUI master switches (borrowed from
|
|
16
16
|
* dsh-skills-mcp-manager): `enabled` tears the composition (routes + MCP
|
|
17
17
|
* fibers) up and down live, `announceToAgent` toggles the model-facing
|
package/lib/orchestrator.js
CHANGED
|
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
|
package/lib/types/index.d.ts
CHANGED
|
File without changes
|
package/lib/yamlMigrator.js
CHANGED
|
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.
|
|
3
|
+
"version": "0.3.4",
|
|
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",
|
|
@@ -60,7 +60,15 @@
|
|
|
60
60
|
"optional": true
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"test": "node --test test/*.test.mjs"
|
|
65
|
+
},
|
|
63
66
|
"license": "MIT",
|
|
67
|
+
"repository": {
|
|
68
|
+
"type": "git",
|
|
69
|
+
"url": "git+https://github.com/moon16u/dsh-pouch.git",
|
|
70
|
+
"directory": "packages/dsh-plugin-mcp-console"
|
|
71
|
+
},
|
|
64
72
|
"publishConfig": {
|
|
65
73
|
"access": "public",
|
|
66
74
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -68,9 +76,5 @@
|
|
|
68
76
|
"devDependencies": {
|
|
69
77
|
"react": "18.2.0",
|
|
70
78
|
"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
79
|
}
|
|
76
|
-
}
|
|
80
|
+
}
|
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.
|