dsh-mcp-connector 0.2.28 → 0.2.29
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/CHANGELOG.md +9 -1
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/PLUGIN-UPDATE.md +3 -1
- package/docs/screenshots/01-market-overview.jpg +0 -0
- package/docs/screenshots/02-connector-detail.jpg +0 -0
- package/docs/screenshots/03-tool-discovery.jpg +0 -0
- package/docs/screenshots/04-json-import.jpg +0 -0
- package/docs/screenshots/README.md +27 -0
- package/lib/client.js +79 -4
- package/package.json +6 -3
- package/screenshots.json +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.2.29] - 2026-08-30
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- 更新服务返回 `RELEASE_TOO_FRESH` 时明确提示“发布安全等待期”,不再误写为镜像同步;主动跳过等待的操作也改为“立即更新(跳过等待)”。
|
|
12
|
+
- DSH Desktop 或其他无兼容 Update Provider 的宿主直接展示精确版本升级命令,并支持一键复制与打开 npm 页面,不再只给出泛化的“查看更新方式”。
|
|
13
|
+
|
|
7
14
|
## [0.2.28] - 2026-08-29
|
|
8
15
|
|
|
9
16
|
### Documentation
|
|
@@ -449,7 +456,8 @@
|
|
|
449
456
|
- 外部 URL 与导入 Header 执行安全校验。
|
|
450
457
|
- iframe 消息校验同源和消息来源。
|
|
451
458
|
|
|
452
|
-
[Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.
|
|
459
|
+
[Unreleased]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.29...HEAD
|
|
460
|
+
[0.2.29]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.28...v0.2.29
|
|
453
461
|
[0.2.28]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.27...v0.2.28
|
|
454
462
|
[0.2.27]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.26...v0.2.27
|
|
455
463
|
[0.2.26]: https://github.com/duhu2000/dsh-mcp-connector/compare/v0.2.25...v0.2.26
|
package/README.en.md
CHANGED
|
@@ -147,7 +147,7 @@ npm run dev:ui
|
|
|
147
147
|
|
|
148
148
|
Every Registry merge regenerates `catalog-stats.json`; an hourly workflow in this repository synchronizes the Chinese and English product copy plus a local stats snapshot. The static npm README updates with package releases, while the live badges above read the Registry directly and therefore stay current without another npm release.
|
|
149
149
|
|
|
150
|
-
The current public version is [`dsh-mcp-connector@0.2.
|
|
150
|
+
The current public version is [`dsh-mcp-connector@0.2.29`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.29](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.29).
|
|
151
151
|
|
|
152
152
|
See [CHANGELOG.md](CHANGELOG.md) for version history and [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md) for the Desktop release checklist.
|
|
153
153
|
|
package/README.md
CHANGED
|
@@ -142,7 +142,7 @@ npm run dev:ui
|
|
|
142
142
|
|
|
143
143
|
公共 Registry 每次合并后会生成 `catalog-stats.json`;本仓库的定时工作流每小时同步中英文介绍和统计快照。npm 页面中的静态正文随版本发布更新,上方动态统计徽标则直接读取 Registry,可在不发布新 npm 版本时保持实时数量一致。
|
|
144
144
|
|
|
145
|
-
当前公开版本为 [`dsh-mcp-connector@0.2.
|
|
145
|
+
当前公开版本为 [`dsh-mcp-connector@0.2.29`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.29](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.29)。
|
|
146
146
|
|
|
147
147
|
版本能力与变更记录见 [CHANGELOG.md](CHANGELOG.md)。
|
|
148
148
|
Desktop 发版回归见 [docs/DESKTOP-E2E.md](docs/DESKTOP-E2E.md)。
|
package/docs/PLUGIN-UPDATE.md
CHANGED
|
@@ -25,7 +25,9 @@ DSH Market 适配器从 `GET /dsh-market/api/v1/capabilities` 开始,要求 `s
|
|
|
25
25
|
5. 完整性校验通过后,按 Provider 返回的激活结论展示“刷新生效”或重启提示。Web 且 Provider 明确允许进程重启时才展示“立即重启”;Desktop 等由外壳管理生命周期的宿主只提示用户重启,不自行杀进程。
|
|
26
26
|
6. Provider 保留恢复点时展示“回滚”。回滚仍由 Provider 执行,MCP连接器不直接修改 profile、lockfile 或 `node_modules`。
|
|
27
27
|
|
|
28
|
-
失败结果使用稳定代码区分正在运行的 Agent
|
|
28
|
+
失败结果使用稳定代码区分正在运行的 Agent、其他安装任务占用、发布安全等待、镜像同步、版本未变化、超时和权限拒绝,以及 `DOWNGRADE_DETECTED`、`RESOLVED_VERSION_MISMATCH`、`INVALID_UPDATE_RESULT` 三类完整性故障。`RELEASE_TOO_FRESH` 明确显示为约 24 小时的发布安全等待期,并提供“立即更新(跳过等待)”;真正的镜像同步故障保留独立提示,不再混用同一文案。
|
|
29
|
+
|
|
30
|
+
当 DSH Desktop 或其他宿主没有兼容 Update Provider 时,标题区直接展示绑定 npm 精确版本的 CLI 命令,例如 `dsh plugin --profile web add --config.minimumReleaseAge=0 dsh-mcp-connector@<目标版本>`,并提供复制按钮与 npm 页面入口。运行时会把 `<目标版本>` 替换为 npm 已发布的确切版本;命令中的单次覆盖只用于用户主动跳过本次发布安全等待。Connector 仍不自行执行包管理器命令。
|
|
29
31
|
|
|
30
32
|
## 安全边界
|
|
31
33
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# UI 素材说明
|
|
2
|
+
|
|
3
|
+
本目录用于保存 `dsh-mcp-connector` 的公开界面截图。素材于 2026-08-24
|
|
4
|
+
从本机 DSH `web` + `dsh-mcp-connector@0.2.18`(0.2.19 未改动市场 UI)验收环境采集;
|
|
5
|
+
远程 Registry 为当日 `main` 的 61 条描述,和 4 张随包卡片合并后市场显示 65 张。画面只展示
|
|
6
|
+
公开市场元数据、示例 Prompt 和工具名称/说明,不包含 OAuth Token、API Key、本机路径、
|
|
7
|
+
用户会话或查询结果。
|
|
8
|
+
|
|
9
|
+
仓库根目录的 [`screenshots.json`](../../screenshots.json) 按市场总览、连接器详情、工具发现、
|
|
10
|
+
JSON 导入的顺序声明这 4 张图片,供 awesome-dsh-plugin 和 DSH Market 的 App Store 风格详情页
|
|
11
|
+
直接采集。`npm run storefront:check` 会校验数量、相对路径、格式、重复项与文件存在性;
|
|
12
|
+
`npm run check` 已包含该门禁。
|
|
13
|
+
|
|
14
|
+
| 文件 | 展示内容 |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `01-market-overview.jpg` | 65 张合并市场卡片(61 条 Registry + 4 张随包卡片)、推荐章节、9 分类和固定分类栏 |
|
|
17
|
+
| `02-connector-detail.jpg` | Seedream 第三方服务说明、精选 Prompt 和未连接状态 |
|
|
18
|
+
| `03-tool-discovery.jpg` | 北大法宝多 Server 工具数量、描述、搜索和独立滚动区 |
|
|
19
|
+
| `04-json-import.jpg` | Streamable HTTP / stdio JSON 导入与本机凭据提示 |
|
|
20
|
+
|
|
21
|
+
`../demo.gif` 由以上 4 个状态生成,时长 16 秒,分辨率 960×540。更新 UI 后应使用 1280×720
|
|
22
|
+
浏览器视口重新采集,并检查画面不包含凭据、本机路径、真实会话、查询结果或其他
|
|
23
|
+
不应公开的内容。若使用实机已安装连接器采集,只能展示公开工具名称/说明,不得展示
|
|
24
|
+
输入表单中的真实凭据或工具调用结果。
|
|
25
|
+
|
|
26
|
+
截图中的“已安装”数量和连接状态来自采集时的本机验收环境,仅用于展示交互,会因用户
|
|
27
|
+
安装情况、授权有效期和服务可用性而不同。
|
package/lib/client.js
CHANGED
|
@@ -135,6 +135,29 @@ window.__ModuleLoader__.load({
|
|
|
135
135
|
gap: 6px;
|
|
136
136
|
min-width: 0;
|
|
137
137
|
}
|
|
138
|
+
.mcpConnectorManualUpdate {
|
|
139
|
+
display: flex;
|
|
140
|
+
align-items: center;
|
|
141
|
+
gap: 6px;
|
|
142
|
+
min-width: 0;
|
|
143
|
+
flex: 1 1 360px;
|
|
144
|
+
}
|
|
145
|
+
.mcpConnectorManualCommand {
|
|
146
|
+
box-sizing: border-box;
|
|
147
|
+
min-width: 0;
|
|
148
|
+
max-width: 430px;
|
|
149
|
+
overflow-x: auto;
|
|
150
|
+
padding: 5px 8px;
|
|
151
|
+
color: #374151;
|
|
152
|
+
background: #f9fafb;
|
|
153
|
+
border: 1px solid #d1d5db;
|
|
154
|
+
border-radius: 8px;
|
|
155
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
|
|
156
|
+
font-size: 11px;
|
|
157
|
+
line-height: 1.35;
|
|
158
|
+
white-space: nowrap;
|
|
159
|
+
user-select: text;
|
|
160
|
+
}
|
|
138
161
|
.mcpConnectorUpdateStatus {
|
|
139
162
|
max-width: 240px;
|
|
140
163
|
overflow: hidden;
|
|
@@ -175,6 +198,7 @@ window.__ModuleLoader__.load({
|
|
|
175
198
|
.mcpConnectorUpdateButton:focus-visible { background: #3730a3; }
|
|
176
199
|
.mcpConnectorUpdateStatus { color: #bbf7d0; background: #14532d; }
|
|
177
200
|
.mcpConnectorUpdateStatus[data-tone="error"] { color: #fecaca; background: #7f1d1d; }
|
|
201
|
+
.mcpConnectorManualCommand { color: #e5e7eb; background: #111827; border-color: #4b5563; }
|
|
178
202
|
.mcpConnectorUpdateSecondary { color: #d1d5db; background: transparent; border-color: #4b5563; }
|
|
179
203
|
.mcpConnectorMarketClose { color: #c4c8d0; }
|
|
180
204
|
.mcpConnectorMarketClose:hover,
|
|
@@ -361,7 +385,8 @@ window.__ModuleLoader__.load({
|
|
|
361
385
|
const labels = {
|
|
362
386
|
AGENTS_RUNNING: "有任务正在运行,请结束后重试",
|
|
363
387
|
OPERATION_BUSY: "插件市场正在处理其他任务",
|
|
364
|
-
RELEASE_TOO_FRESH: "
|
|
388
|
+
RELEASE_TOO_FRESH: "新版本处于发布安全等待期(约 24 小时)",
|
|
389
|
+
MIRROR_SYNC_PENDING: "镜像尚未同步完整安装包",
|
|
365
390
|
VERSION_UNCHANGED: "下载后版本未变化",
|
|
366
391
|
DOWNGRADE_DETECTED: "已阻止版本降级",
|
|
367
392
|
RESOLVED_VERSION_MISMATCH: "下载版本与预期不一致",
|
|
@@ -373,6 +398,21 @@ window.__ModuleLoader__.load({
|
|
|
373
398
|
return labels[failure?.code] ?? failure?.message ?? "更新失败";
|
|
374
399
|
}
|
|
375
400
|
|
|
401
|
+
function manualUpgradeCommand(version) {
|
|
402
|
+
const parsed = parseClientVersion(version);
|
|
403
|
+
if (parsed === null) return null;
|
|
404
|
+
return `dsh plugin --profile web add --config.minimumReleaseAge=0 ${PLUGIN_PACKAGE_NAME}@${parsed.normalized}`;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
async function copyManualUpgradeCommand(command) {
|
|
408
|
+
if (typeof window.navigator?.clipboard?.writeText === "function") {
|
|
409
|
+
await window.navigator.clipboard.writeText(command);
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
window.prompt?.("请复制以下升级命令", command);
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
|
|
376
416
|
function parseClientVersion(value) {
|
|
377
417
|
if (typeof value !== "string") return null;
|
|
378
418
|
const normalized = value.trim().replace(/^v/i, "");
|
|
@@ -530,6 +570,7 @@ window.__ModuleLoader__.load({
|
|
|
530
570
|
const [updateStarting, setUpdateStarting] = (0, react.useState)(false);
|
|
531
571
|
const [rollbackRunning, setRollbackRunning] = (0, react.useState)(false);
|
|
532
572
|
const [restarting, setRestarting] = (0, react.useState)(false);
|
|
573
|
+
const [manualCommandCopied, setManualCommandCopied] = (0, react.useState)(false);
|
|
533
574
|
const frameRef = (0, react.useRef)(null);
|
|
534
575
|
const closeRef = (0, react.useRef)(null);
|
|
535
576
|
(0, react.useEffect)(() => {
|
|
@@ -600,6 +641,9 @@ window.__ModuleLoader__.load({
|
|
|
600
641
|
window.clearTimeout(pollTimer);
|
|
601
642
|
};
|
|
602
643
|
}, [open]);
|
|
644
|
+
(0, react.useEffect)(() => {
|
|
645
|
+
if (open) setManualCommandCopied(false);
|
|
646
|
+
}, [open, versionStatus?.latestVersion]);
|
|
603
647
|
(0, react.useEffect)(() => {
|
|
604
648
|
if (!open) return void 0;
|
|
605
649
|
let disposed = false;
|
|
@@ -788,7 +832,7 @@ window.__ModuleLoader__.load({
|
|
|
788
832
|
type: "button",
|
|
789
833
|
className: "mcpConnectorUpdateButton",
|
|
790
834
|
onClick: () => startUpdate(force),
|
|
791
|
-
children: force ? "强制重试" : "重试更新"
|
|
835
|
+
children: updateOperation.failure?.code === "RELEASE_TOO_FRESH" ? "立即更新(跳过等待)" : force ? "强制重试" : "重试更新"
|
|
792
836
|
}),
|
|
793
837
|
rollbackRunning && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
794
838
|
className: "mcpConnectorUpdateStatus",
|
|
@@ -887,12 +931,43 @@ window.__ModuleLoader__.load({
|
|
|
887
931
|
children: `一键更新到 v${providerUpdateCheck.latestVersion}`
|
|
888
932
|
});
|
|
889
933
|
}
|
|
934
|
+
const command = manualUpgradeCommand(versionStatus?.latestVersion);
|
|
935
|
+
if (command !== null) {
|
|
936
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
937
|
+
className: "mcpConnectorManualUpdate",
|
|
938
|
+
children: [
|
|
939
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
|
|
940
|
+
className: "mcpConnectorManualCommand",
|
|
941
|
+
title: command,
|
|
942
|
+
children: command
|
|
943
|
+
}),
|
|
944
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
945
|
+
type: "button",
|
|
946
|
+
className: "mcpConnectorUpdateButton",
|
|
947
|
+
onClick: () => {
|
|
948
|
+
copyManualUpgradeCommand(command).then((copied) => {
|
|
949
|
+
if (copied) setManualCommandCopied(true);
|
|
950
|
+
}, (error) => {
|
|
951
|
+
console.warn("[mcp-connector] copy upgrade command failed:", error);
|
|
952
|
+
window.prompt?.("请复制以下升级命令", command);
|
|
953
|
+
});
|
|
954
|
+
},
|
|
955
|
+
children: manualCommandCopied ? "已复制" : "复制升级命令"
|
|
956
|
+
}),
|
|
957
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
958
|
+
type: "button",
|
|
959
|
+
className: "mcpConnectorUpdateButton mcpConnectorUpdateSecondary",
|
|
960
|
+
onClick: () => window.open(NPM_PACKAGE_URL, "_blank", "noopener,noreferrer"),
|
|
961
|
+
children: "查看 npm"
|
|
962
|
+
})
|
|
963
|
+
]
|
|
964
|
+
});
|
|
965
|
+
}
|
|
890
966
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
891
967
|
type: "button",
|
|
892
968
|
className: "mcpConnectorUpdateButton",
|
|
893
|
-
title: `npm 已发布 v${versionStatus?.latestVersion}`,
|
|
894
969
|
onClick: () => openDshPluginMarket(actions),
|
|
895
|
-
children:
|
|
970
|
+
children: "查看更新方式"
|
|
896
971
|
});
|
|
897
972
|
};
|
|
898
973
|
const src = window.location.origin + "/mcp-connector/ui/";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-mcp-connector",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.29",
|
|
4
4
|
"description": "Connect and manage MCP servers in DeepSeek Harness — a universal MCP connector and marketplace with OAuth 2.0 PKCE, API keys, stdio/HTTP, mcpServers JSON import, tools, and prompts. Maintained by Qichacha/QCC.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -22,9 +22,11 @@
|
|
|
22
22
|
"docs/PLUGIN-UPDATE.md",
|
|
23
23
|
"docs/STDIO-SUPPORT.md",
|
|
24
24
|
"docs/USER-GUIDE.md",
|
|
25
|
+
"docs/screenshots",
|
|
25
26
|
"cordis.patch.yml",
|
|
26
27
|
"README.md",
|
|
27
28
|
"README.en.md",
|
|
29
|
+
"screenshots.json",
|
|
28
30
|
"CONTRIBUTING.md",
|
|
29
31
|
"CHANGELOG.md",
|
|
30
32
|
"LICENSE",
|
|
@@ -35,15 +37,16 @@
|
|
|
35
37
|
],
|
|
36
38
|
"scripts": {
|
|
37
39
|
"test": "node --test",
|
|
38
|
-
"lint": "node --check lib/index.js && node --check lib/web.js && node --check lib/client.js && node --check lib/version-status.js && node --check lib/schema.js && node --check lib/catalog.js && node --check lib/prompts.js && node --check lib/probe.js && node --check lib/mcp-validation.js && node --check lib/mcp-http.js && node --check lib/migration.js && node --check lib/stores.js && node --check lib/grant-journal.js && node --check lib/oauth.js && node --check lib/grant-lifecycle.js && node --check lib/callback-server.js && node --check lib/mcp-provision.js && node --check lib/util.js && node --check lib/constants.js && node --check lib/tools.js && node --check lib/connectors/oauth-connector.js && node --check lib/connectors/manual-connector.js && node --check lib/connectors/json-connector.js && node --check scripts/probe-connector.mjs && node --check scripts/build-registry.mjs && node --check scripts/ui-harness.mjs && node --check scripts/check-market-registration.mjs && node --check scripts/check-readme-version.mjs && node --check scripts/sync-registry-stats.mjs",
|
|
40
|
+
"lint": "node --check lib/index.js && node --check lib/web.js && node --check lib/client.js && node --check lib/version-status.js && node --check lib/schema.js && node --check lib/catalog.js && node --check lib/prompts.js && node --check lib/probe.js && node --check lib/mcp-validation.js && node --check lib/mcp-http.js && node --check lib/migration.js && node --check lib/stores.js && node --check lib/grant-journal.js && node --check lib/oauth.js && node --check lib/grant-lifecycle.js && node --check lib/callback-server.js && node --check lib/mcp-provision.js && node --check lib/util.js && node --check lib/constants.js && node --check lib/tools.js && node --check lib/connectors/oauth-connector.js && node --check lib/connectors/manual-connector.js && node --check lib/connectors/json-connector.js && node --check scripts/probe-connector.mjs && node --check scripts/build-registry.mjs && node --check scripts/ui-harness.mjs && node --check scripts/check-market-registration.mjs && node --check scripts/check-readme-version.mjs && node --check scripts/check-storefront-screenshots.mjs && node --check scripts/sync-registry-stats.mjs",
|
|
39
41
|
"registry:build": "node scripts/build-registry.mjs",
|
|
40
42
|
"registry:validate": "node scripts/probe-connector.mjs catalog/catalog.json --validate-only",
|
|
41
43
|
"dev:ui": "node scripts/ui-harness.mjs",
|
|
42
44
|
"market:check": "node scripts/check-market-registration.mjs",
|
|
43
45
|
"registry:stats:sync": "node scripts/sync-registry-stats.mjs",
|
|
44
46
|
"docs:check": "node scripts/check-readme-version.mjs",
|
|
47
|
+
"storefront:check": "node scripts/check-storefront-screenshots.mjs",
|
|
45
48
|
"verify-pack": "node scripts/verify-pack.mjs",
|
|
46
|
-
"check": "npm run lint && npm run docs:check && npm test && npm run verify-pack",
|
|
49
|
+
"check": "npm run lint && npm run docs:check && npm run storefront:check && npm test && npm run verify-pack",
|
|
47
50
|
"prepublishOnly": "npm run check"
|
|
48
51
|
},
|
|
49
52
|
"keywords": [
|