dshmarket 1.21.3 → 1.22.0
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 +5 -1
- package/README.zh.md +5 -1
- package/client/client.js +27 -0
- package/client/client.js.map +1 -1
- package/lib/profile.js +40 -0
- package/lib/routes.js +21 -2
- package/lib/sources.js +45 -4
- package/lib/types/profile.d.ts +17 -0
- package/lib/types/registry.d.ts +1 -0
- package/lib/types/sources.d.ts +4 -4
- package/package.json +1 -1
- package/src/client/MarketSection.tsx +27 -0
- package/src/client/locales.ts +6 -0
- package/src/client/market-data.ts +1 -0
- package/src/profile.ts +39 -0
- package/src/registry.ts +1 -0
- package/src/routes.ts +21 -2
- package/src/sources.ts +41 -5
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ its own dsh: it may be older than the one `npm` would give you (#139).
|
|
|
50
50
|
|
|
51
51
|
## Speed
|
|
52
52
|
|
|
53
|
-
Installs prefer npm
|
|
53
|
+
Installs prefer repo-verified npm packages, then author-supplied prebuilt GitHub Release tarballs, before falling back to full-repo GitHub source downloads. Prebuilt installs are typically seconds and do not need local build scripts; source-only plugins depend on your connection to GitHub.
|
|
54
54
|
|
|
55
55
|
## Security
|
|
56
56
|
|
|
@@ -105,6 +105,10 @@ DSHM_REGISTRY_URL=https://your-mirror.example/plugins.json dsh web
|
|
|
105
105
|
|
|
106
106
|
[deepseek-harness-desktop](https://github.com/hairyf/deepseek-harness-desktop) — a native desktop app for DeepSeek Harness built with **Tauri** (Rust + Web): one-click local install and launch with no Node.js setup required. On first run it offers to install this plugin market as a recommended preset.
|
|
107
107
|
|
|
108
|
+
### DeepSeek Harness Desktop (anywhere-labs)
|
|
109
|
+
|
|
110
|
+
[deepseek-harness-desktop](https://github.com/anywhere-labs/deepseek-harness-desktop) — an Electron desktop app for DeepSeek Harness built around the idea that everything is a plugin, including the desktop itself: profile switching, a bundled Node and pnpm, and a recoverable install path that snapshots the profile before a change. [dshdesktop.cn](https://dshdesktop.cn)
|
|
111
|
+
|
|
108
112
|
### DSH Get
|
|
109
113
|
|
|
110
114
|
[DSH Get](https://www.dshget.com/) — a searchable web directory for discovering DeepSeek Harness plugins: category filters, bilingual descriptions, install commands and per-plugin detail pages. Its normalized catalog snapshot is public at [bobby-sheng/dshget-data](https://github.com/bobby-sheng/dshget-data).
|
package/README.zh.md
CHANGED
|
@@ -47,7 +47,7 @@ dsh plugin --profile web add dshmarket
|
|
|
47
47
|
|
|
48
48
|
## 速度
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
安装依次优先使用经仓库验证的 npm 包、作者提供的 GitHub Release 预构建 tarball,最后才回退到整仓 GitHub 源码下载。预构建安装通常只需数秒且无需执行本地构建脚本;仅提供源码的插件仍取决于你到 GitHub 的网络。
|
|
51
51
|
|
|
52
52
|
## 安全
|
|
53
53
|
|
|
@@ -102,6 +102,10 @@ DSHM_REGISTRY_URL=https://your-mirror.example/plugins.json dsh web
|
|
|
102
102
|
|
|
103
103
|
[deepseek-harness-desktop](https://github.com/hairyf/deepseek-harness-desktop)——基于 **Tauri**(Rust + Web)构建的 DeepSeek Harness 原生桌面客户端:一键本地安装并启动,无需自装 Node.js;首次启动可选择安装本插件市场作为推荐插件。
|
|
104
104
|
|
|
105
|
+
### DeepSeek Harness Desktop(anywhere-labs)
|
|
106
|
+
|
|
107
|
+
[deepseek-harness-desktop](https://github.com/anywhere-labs/deepseek-harness-desktop)——基于 Electron 的 DeepSeek Harness 桌面客户端,理念是「万物皆插件,桌面本身也是插件」:支持 profile 切换、内置 Node 与 pnpm,安装前会先给 profile 拍快照以便回滚。[dshdesktop.cn](https://dshdesktop.cn)
|
|
108
|
+
|
|
105
109
|
### DSH Get
|
|
106
110
|
|
|
107
111
|
[DSH Get](https://www.dshget.com/)——DeepSeek Harness 插件的网页检索目录:分类筛选、中英描述、安装命令与插件详情页;其规范化的目录快照公开在 [bobby-sheng/dshget-data](https://github.com/bobby-sheng/dshget-data)。
|
package/client/client.js
CHANGED
|
@@ -280,6 +280,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
280
280
|
progressHint: "首次安装需要下载与解析依赖,大型插件可能需要 1-3 分钟",
|
|
281
281
|
toastReady: "已安装并已生效",
|
|
282
282
|
toastTheme: "已启用。可在 设置 → 插件市场 → 主题 中随时切换",
|
|
283
|
+
toastToggledOn: "已启用",
|
|
284
|
+
toastToggledOff: "已停用,功能立即停止",
|
|
283
285
|
gotIt: "知道了",
|
|
284
286
|
stateLive: "已生效",
|
|
285
287
|
stateRestart: "已安装,重启后生效",
|
|
@@ -294,6 +296,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
294
296
|
packagesDone: "已处理 {0} 个包",
|
|
295
297
|
updatedLive: "✓ 已更新,已生效",
|
|
296
298
|
partialNote: "已取消,部分变更已写入",
|
|
299
|
+
reconciledNote: "已移除,但 pnpm 收尾时报错(通常是文件被占用);配置已同步,无需重试",
|
|
297
300
|
actWhy: "为什么未生效?",
|
|
298
301
|
tabList: "列表",
|
|
299
302
|
tabGroups: "分组",
|
|
@@ -653,6 +656,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
653
656
|
progressHint: "First installs download and resolve dependencies — large plugins can take 1-3 minutes",
|
|
654
657
|
toastReady: "installed and live",
|
|
655
658
|
toastTheme: "is now active. Switch any time in Settings → Plugin Market → Themes",
|
|
659
|
+
toastToggledOn: "is now on",
|
|
660
|
+
toastToggledOff: "is now off — it stopped working right away",
|
|
656
661
|
gotIt: "Got it",
|
|
657
662
|
stateLive: "Active",
|
|
658
663
|
stateRestart: "Installed — restart to apply",
|
|
@@ -667,6 +672,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
667
672
|
packagesDone: "{0} packages processed",
|
|
668
673
|
updatedLive: "✓ Updated — live",
|
|
669
674
|
partialNote: "Cancelled — some changes were applied",
|
|
675
|
+
reconciledNote: "Removed, but pnpm reported an error while finishing up (usually a locked file). The profile is already reconciled — no retry needed.",
|
|
670
676
|
actWhy: "Why not live?",
|
|
671
677
|
tabList: "List",
|
|
672
678
|
tabGroups: "Groups",
|
|
@@ -4292,6 +4298,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
4292
4298
|
const [removedCount, setRemovedCount] = (0, react.useState)(0);
|
|
4293
4299
|
/** Toggles whose live fiber did not follow the switch — restart to apply. */
|
|
4294
4300
|
const [toggleRestart, setToggleRestart] = (0, react.useState)(0);
|
|
4301
|
+
/** Last completed toggle, shown as a toast (#299). The switch and the row
|
|
4302
|
+
* tag already say the new state, but both live in a row the user may have
|
|
4303
|
+
* scrolled past — a mis-click there goes unnoticed. The toast is fixed on
|
|
4304
|
+
* screen, so it is the part that actually catches an accident. */
|
|
4305
|
+
const [toggled, setToggled] = (0, react.useState)(null);
|
|
4306
|
+
const toggledDone = (0, react.useCallback)(() => setToggled(null), []);
|
|
4295
4307
|
/**
|
|
4296
4308
|
* Dismissal of the host-reported restart notice, keyed to the current boot
|
|
4297
4309
|
* so it reappears after a restart that did not happen and after any new
|
|
@@ -5026,6 +5038,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
5026
5038
|
if (body.partial === true) setInstallError(t("partialNote"));
|
|
5027
5039
|
return;
|
|
5028
5040
|
}
|
|
5041
|
+
if (body.reconciled === true) {
|
|
5042
|
+
if (!body.hot) setRemovedCount((n) => n + 1);
|
|
5043
|
+
refreshInstalled();
|
|
5044
|
+
setInstallError(t("reconciledNote"));
|
|
5045
|
+
return;
|
|
5046
|
+
}
|
|
5029
5047
|
const text = (v) => typeof v === "string" ? v : v && typeof v.text === "string" ? v.text : v == null ? "" : JSON.stringify(v);
|
|
5030
5048
|
setInstallError((text(body.error) || humanOutput(text(body.stderr)) || "error").trim().slice(-600));
|
|
5031
5049
|
}
|
|
@@ -5057,6 +5075,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
5057
5075
|
}));
|
|
5058
5076
|
if (body.restart === true) setToggleRestart((n) => n + 1);
|
|
5059
5077
|
if (body.refresh === true) setRefreshNames((names) => names.includes(name) ? names : names.concat(name));
|
|
5078
|
+
if (!reload) setToggled({
|
|
5079
|
+
name,
|
|
5080
|
+
enabled
|
|
5081
|
+
});
|
|
5060
5082
|
refreshInstalled();
|
|
5061
5083
|
if (reload) {
|
|
5062
5084
|
sessionStorage.removeItem("dshm-toast");
|
|
@@ -7531,6 +7553,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7531
7553
|
text: t("exportLogFail"),
|
|
7532
7554
|
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 14 }),
|
|
7533
7555
|
onDone: exportToastDone
|
|
7556
|
+
}),
|
|
7557
|
+
toggled !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
7558
|
+
text: toggled.name + " " + t(toggled.enabled ? "toastToggledOn" : "toastToggledOff"),
|
|
7559
|
+
icon: toggled.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCheckOutline16, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, { size: 14 }),
|
|
7560
|
+
onDone: toggledDone
|
|
7534
7561
|
})
|
|
7535
7562
|
]
|
|
7536
7563
|
});
|