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 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.28...HEAD
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.28`](https://www.npmjs.com/package/dsh-mcp-connector), with [GitHub Release v0.2.28](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.28).
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.28`](https://www.npmjs.com/package/dsh-mcp-connector),对应 [GitHub Release v0.2.28](https://github.com/duhu2000/dsh-mcp-connector/releases/tag/v0.2.28)。
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)。
@@ -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、其他安装任务占用、镜像同步、版本未变化、超时和权限拒绝,以及 `DOWNGRADE_DETECTED`、`RESOLVED_VERSION_MISMATCH`、`INVALID_UPDATE_RESULT` 三类完整性故障。可重试失败保留重试操作;Registry 刚发布但镜像仍未同步时,用户可在看到明确提示后选择强制重试。
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
 
@@ -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: `查看 v${versionStatus?.latestVersion} 更新方式`
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.28",
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": [
@@ -0,0 +1,6 @@
1
+ [
2
+ "docs/screenshots/01-market-overview.jpg",
3
+ "docs/screenshots/02-connector-detail.jpg",
4
+ "docs/screenshots/03-tool-discovery.jpg",
5
+ "docs/screenshots/04-json-import.jpg"
6
+ ]