dsh-m 0.2.12 → 0.2.14
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/docs/DESIGN.md +4 -1
- package/lib/client.js +47 -0
- package/lib/core/dsh-version.js +103 -0
- package/lib/core/host-api.js +14 -1
- package/package.json +2 -2
- package/registry.json +28 -17
package/docs/DESIGN.md
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"id": "dsh-skins", // slug,唯一
|
|
40
40
|
"name": "DSH Skins",
|
|
41
41
|
"description": "中文描述", // v1 只有中文
|
|
42
|
-
"category": "ui", // market|tools|ui|search|
|
|
42
|
+
"category": "ui", // market|tools|ui|search|other 五选一
|
|
43
43
|
"tags": ["主题"],
|
|
44
44
|
"source": "github", // npm|github
|
|
45
45
|
"npm": "可选;source=npm 时必填",
|
|
@@ -59,6 +59,9 @@
|
|
|
59
59
|
4. npm 条目可查;GitHub 条目 repo 存在;`icon`/`homepage` URL 可达(icon 允许为空)。
|
|
60
60
|
自定义 registry 不经过官方 CI——设置页对自定义源展示未校验信任提示。
|
|
61
61
|
|
|
62
|
+
### 2.4 收录文案(registry-copy-guide 定稿)
|
|
63
|
+
`description`/`tags` 的写法另见 [`docs/registry-copy-guide.md`](./registry-copy-guide.md):全条 ≤60 全角当量(对齐卡片收起态两行截断)、统一前置/依赖/兼容三种句式、依赖关系不入 tags。CI 对文案超限打软警告不阻断(§2.3 第 4 步之后追加)。
|
|
64
|
+
|
|
62
65
|
## 3. 安装 / 卸载 / 升级 / 重启
|
|
63
66
|
|
|
64
67
|
底层原语(本机实证):`dsh plugin --profile web add|remove|update`(转发 pnpm,作用于 `$DSH_HOME/profiles/web`)。**profile 的 `package.json` 就是唯一事实源**——不引入任何额外状态文件。
|
package/lib/client.js
CHANGED
|
@@ -604,6 +604,8 @@ var ZH = {
|
|
|
604
604
|
"warn.unlink": "\u5378\u8F7D\u53EA\u79FB\u9664 profile \u5BF9\u672C\u5730\u76EE\u5F55\u7684\u5F15\u7528\uFF08{path}\uFF09\uFF0C\u4E0D\u4F1A\u5220\u9664\u76EE\u5F55\u672C\u8EAB\u3002",
|
|
605
605
|
"warn.core": "\u8FD9\u662F file: \u5B89\u88C5\u7684\u6838\u5FC3/\u5F52\u6863\u5305\uFF0C\u5378\u8F7D\u53EF\u80FD\u5F71\u54CD DSH \u529F\u80FD\uFF0C\u4E14\u9700\u8981\u624B\u52A8\u6062\u590D\u3002",
|
|
606
606
|
"profile.hint": "web profile\uFF1A{path}",
|
|
607
|
+
"dsh.chip.copyhint": "\u70B9\u51FB\u590D\u5236\u7248\u672C\u53F7",
|
|
608
|
+
"dsh.chip.copied": "\u5DF2\u590D\u5236 \u2713",
|
|
607
609
|
"title.panel": "\u63D2\u4EF6\u5E02\u573A",
|
|
608
610
|
"title.full": "DeepSeek Harness \u63D2\u4EF6\u5E02\u573A"
|
|
609
611
|
};
|
|
@@ -770,6 +772,8 @@ var EN = {
|
|
|
770
772
|
"warn.unlink": "Uninstalling only removes the profile's reference to the local directory ({path}); the directory itself is kept.",
|
|
771
773
|
"warn.core": "This is a core/archive package installed via file:. Uninstalling may affect DSH features and requires manual restore.",
|
|
772
774
|
"profile.hint": "web profile: {path}",
|
|
775
|
+
"dsh.chip.copyhint": "Click to copy version",
|
|
776
|
+
"dsh.chip.copied": "Copied \u2713",
|
|
773
777
|
"title.panel": "Plugin Marketplace",
|
|
774
778
|
"title.full": "DeepSeek Harness Plugin Marketplace"
|
|
775
779
|
};
|
|
@@ -885,6 +889,14 @@ var CSS = `
|
|
|
885
889
|
[data-slot="sidebar.footer.action"]{display:flex!important;flex-direction:column;width:100%;min-width:0}
|
|
886
890
|
[data-slot="sidebar.footer.action"]>*{flex:none;min-width:0}
|
|
887
891
|
.dshm-empty{text-align:center;color:var(--dsw-alias-label-caption,#6b7280);font-size:13px;padding:32px 0}
|
|
892
|
+
/* \u5934\u90E8 DSH \u7248\u672C chip\uFF1A\u7B49\u5BBD\u5C0F\u5B57\u5706\u89D2\uFF0Chover \u5C55\u5F00\u8BE6\u60C5\uFF0C\u70B9\u51FB\u590D\u5236\uFF082026-09-14 \u5B9A\u7A3F\uFF09 */
|
|
893
|
+
.dshm-dshchip{position:relative;display:inline-flex;align-items:center;gap:4px;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#f5f6f8);color:var(--dsw-alias-label-secondary,#4b5563);border-radius:999px;padding:4px 10px;font:11px/1 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;cursor:pointer;white-space:nowrap;flex:none}
|
|
894
|
+
.dshm-dshchip:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(38,49,72,.06));color:var(--dsw-alias-label-primary,inherit)}
|
|
895
|
+
.dshm-dshchip-v{font-weight:600;color:var(--dsw-alias-label-primary,inherit)}
|
|
896
|
+
.dshm-dshchip-tip{position:absolute;top:calc(100% + 7px);right:0;visibility:hidden;opacity:0;transition:opacity .12s;z-index:60;background:var(--dsw-alias-bg-overlay,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:9px;box-shadow:var(--dsw-shadow-lv1,0 2px 8px rgb(20 24 32 / 8%));padding:7px 10px;text-align:left;pointer-events:none}
|
|
897
|
+
.dshm-dshchip:hover .dshm-dshchip-tip,.dshm-dshchip:focus-visible .dshm-dshchip-tip{visibility:visible;opacity:1}
|
|
898
|
+
.dshm-dshchip-tiprow{font:12px/16px ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-weight:600;color:var(--dsw-alias-label-primary,inherit)}
|
|
899
|
+
.dshm-dshchip-tipsub{display:block;margin-top:2px;font-size:10px;line-height:14px;color:var(--dsw-alias-label-caption,#9ca3af)}
|
|
888
900
|
`;
|
|
889
901
|
function ensureCss() {
|
|
890
902
|
if (typeof document === "undefined" || document.getElementById("dshm-css")) return;
|
|
@@ -1646,10 +1658,44 @@ var TABS = [
|
|
|
1646
1658
|
["installed", "tab.installed", "installed"],
|
|
1647
1659
|
["settings", "tab.settings", null]
|
|
1648
1660
|
];
|
|
1661
|
+
function DshVersionChip({ version }) {
|
|
1662
|
+
const [copied, setCopied] = useState(false);
|
|
1663
|
+
const copy = async () => {
|
|
1664
|
+
try {
|
|
1665
|
+
await navigator.clipboard.writeText(version);
|
|
1666
|
+
setCopied(true);
|
|
1667
|
+
setTimeout(() => setCopied(false), 1600);
|
|
1668
|
+
} catch {
|
|
1669
|
+
}
|
|
1670
|
+
};
|
|
1671
|
+
return h(
|
|
1672
|
+
"button",
|
|
1673
|
+
{ type: "button", className: "dshm-dshchip", onClick: copy, "aria-label": `DSH ${version}` },
|
|
1674
|
+
"DSH ",
|
|
1675
|
+
h("span", { className: "dshm-dshchip-v" }, version),
|
|
1676
|
+
h(
|
|
1677
|
+
"span",
|
|
1678
|
+
{ className: "dshm-dshchip-tip", role: "tooltip" },
|
|
1679
|
+
h("span", { className: "dshm-dshchip-tiprow" }, `DSH ${version}`),
|
|
1680
|
+
h("span", { className: "dshm-dshchip-tipsub" }, lookup(copied ? "dsh.chip.copied" : "dsh.chip.copyhint"))
|
|
1681
|
+
)
|
|
1682
|
+
);
|
|
1683
|
+
}
|
|
1649
1684
|
function MarketPanel({ onClose }) {
|
|
1650
1685
|
const [tab, setTab] = useState("market");
|
|
1651
1686
|
const market = useMarketData();
|
|
1652
1687
|
const installed = useAsync(() => api("installed"), []);
|
|
1688
|
+
const [dshVersion, setDshVersion] = useState(null);
|
|
1689
|
+
useEffect(() => {
|
|
1690
|
+
let live = true;
|
|
1691
|
+
api("ping").then((r) => {
|
|
1692
|
+
if (live) setDshVersion(typeof r?.dshVersion === "string" && r.dshVersion ? r.dshVersion : null);
|
|
1693
|
+
}).catch(() => {
|
|
1694
|
+
});
|
|
1695
|
+
return () => {
|
|
1696
|
+
live = false;
|
|
1697
|
+
};
|
|
1698
|
+
}, []);
|
|
1653
1699
|
const refreshViews = useCallback(
|
|
1654
1700
|
() => refreshAfterMutation2({ marketReload: market.reload, installedReload: installed.reload }),
|
|
1655
1701
|
[market.reload, installed.reload]
|
|
@@ -1707,6 +1753,7 @@ function MarketPanel({ onClose }) {
|
|
|
1707
1753
|
)
|
|
1708
1754
|
),
|
|
1709
1755
|
h("span", { className: "dshm-spacer" }),
|
|
1756
|
+
dshVersion ? h(DshVersionChip, { version: dshVersion }) : null,
|
|
1710
1757
|
h("button", { className: "dshm-btn", onClick: onClose }, lookup("common.close"))
|
|
1711
1758
|
),
|
|
1712
1759
|
h(
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSH 运行版本解析(市场面板头部 chip 数据源,2026-09-14 设计定稿)。
|
|
3
|
+
*
|
|
4
|
+
* 通路(查证结论,三条免费路径已证伪):生产 host 内 dshArgv() 以 process.argv[1]
|
|
5
|
+
* 定位 launcher entry(…/@deepseek-ai/dsh/lib/bin.js,restart.ts 拉起重启即复用同一
|
|
6
|
+
* 定位),从 entry 向上至多三级找 package.json 读 version——官方 bin.js 的 readVersion
|
|
7
|
+
* 同款做法。CLI/PATH 模式或读取失败回退 spawn `dsh --version`(短超时)。
|
|
8
|
+
*
|
|
9
|
+
* 结果进程内缓存(版本随进程恒定);两级皆失败返回 null,客户端据此隐藏 chip。
|
|
10
|
+
* 注意:`window.__DSH_BOOT__` 只有内容哈希 rev 无 semver;settings.yaml 无版本键;
|
|
11
|
+
* .pnpm 目录名多版本残留无判据——均不走。
|
|
12
|
+
*/
|
|
13
|
+
import { dirname, join } from 'node:path';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
import { spawn } from 'node:child_process';
|
|
16
|
+
import { dshArgv } from './dsh-cli.js';
|
|
17
|
+
/** 从 `dsh --version` 输出提取 semver:容忍 v 前缀与前后散文,取首个命中。 */
|
|
18
|
+
export function parseDshVersionOutput(text) {
|
|
19
|
+
const m = /\bv?([0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)/.exec(text ?? '');
|
|
20
|
+
return m ? m[1] : null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 生产通路:launcher entry 定位 + 就近向上找 package.json。
|
|
24
|
+
* 纯同步、无 spawn;任何一步失败返回 null(不抛)。
|
|
25
|
+
*/
|
|
26
|
+
export function readLauncherPackageVersion(input = {}) {
|
|
27
|
+
try {
|
|
28
|
+
const argv = dshArgv(input);
|
|
29
|
+
const entry = argv.args.length > 0 ? argv.args[argv.args.length - 1] : undefined;
|
|
30
|
+
// 与 dshArgv 同一判定:entry 必须长得像 launcher bin,否则是 CLI/PATH 模式
|
|
31
|
+
if (!entry || !/[\\/](?:bin\.(?:js|ts)|dsh)$/.test(entry))
|
|
32
|
+
return null;
|
|
33
|
+
let dir = dirname(entry);
|
|
34
|
+
for (let up = 0; up < 3; up++) {
|
|
35
|
+
try {
|
|
36
|
+
const pkg = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
|
|
37
|
+
if (typeof pkg?.version === 'string' && pkg.version)
|
|
38
|
+
return pkg.version;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* 该级无 package.json / 不可读,继续向上一级 */
|
|
42
|
+
}
|
|
43
|
+
dir = dirname(dir);
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function spawnDshVersion(timeoutMs) {
|
|
52
|
+
return new Promise((resolveP) => {
|
|
53
|
+
let settled = false;
|
|
54
|
+
const done = (v) => {
|
|
55
|
+
if (!settled) {
|
|
56
|
+
settled = true;
|
|
57
|
+
resolveP(v);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
let child;
|
|
61
|
+
try {
|
|
62
|
+
child = spawn('dsh', ['--version'], { stdio: ['ignore', 'pipe', 'ignore'], shell: process.platform === 'win32' });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
done(null);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let out = '';
|
|
69
|
+
const timer = setTimeout(() => {
|
|
70
|
+
try {
|
|
71
|
+
child.kill('SIGKILL');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
/* already dead */
|
|
75
|
+
}
|
|
76
|
+
done(null);
|
|
77
|
+
}, timeoutMs);
|
|
78
|
+
child.stdout?.on('data', (d) => {
|
|
79
|
+
out += String(d);
|
|
80
|
+
});
|
|
81
|
+
child.on('error', () => {
|
|
82
|
+
clearTimeout(timer);
|
|
83
|
+
done(null);
|
|
84
|
+
});
|
|
85
|
+
child.on('close', () => {
|
|
86
|
+
clearTimeout(timer);
|
|
87
|
+
done(parseDshVersionOutput(out));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
let cache = null;
|
|
92
|
+
/** 进程内缓存的一次性解析;null = 两级皆失败(调用方按「未知」处理)。 */
|
|
93
|
+
export function resolveDshVersion(opts = {}) {
|
|
94
|
+
if (!cache) {
|
|
95
|
+
const direct = readLauncherPackageVersion();
|
|
96
|
+
cache = direct != null ? Promise.resolve(direct) : spawnDshVersion(opts.fallbackTimeoutMs ?? 3_000);
|
|
97
|
+
}
|
|
98
|
+
return cache;
|
|
99
|
+
}
|
|
100
|
+
/** 仅测试:清空进程内缓存。 */
|
|
101
|
+
export function resetDshVersionCacheForTest() {
|
|
102
|
+
cache = null;
|
|
103
|
+
}
|
package/lib/core/host-api.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* trustedRestartRequest host-equivalence guard → typed method/业务错误映射 → 其他 500。
|
|
8
8
|
*/
|
|
9
9
|
import { BOOT_ID, publicInstallStatus } from './dsh-cli.js';
|
|
10
|
+
import { resolveDshVersion } from './dsh-version.js';
|
|
10
11
|
import { listInstalledWithMeta, listMarket, installFromRegistry, uninstallPlugin, upgradePlugin, } from './market.js';
|
|
11
12
|
import { runProfileTransaction, TransactionError, makeNpmWarmPackument } from './profile-transaction.js';
|
|
12
13
|
import { readInstalledPluginReadme } from './installed.js';
|
|
@@ -162,8 +163,13 @@ export function createApiDispatcher(ctx) {
|
|
|
162
163
|
npmLatest: ctx.deps?.npmLatest ?? npmLatest,
|
|
163
164
|
runTransaction: ctx.deps?.runTransaction ?? runProfileTransaction,
|
|
164
165
|
scheduleRestart: ctx.deps?.scheduleRestart ?? scheduleRestart,
|
|
166
|
+
resolveDshVersion: ctx.deps?.resolveDshVersion ?? resolveDshVersion,
|
|
165
167
|
};
|
|
166
168
|
const cfg = () => ctx.controller.config;
|
|
169
|
+
// DSH 版本一次性解析,dispatcher 创建即预热(首个 ping 不吃 spawn 回退的延迟)
|
|
170
|
+
const dshVersionP = Promise.resolve()
|
|
171
|
+
.then(() => d.resolveDshVersion())
|
|
172
|
+
.catch(() => null);
|
|
167
173
|
return async function handleApi(req, res) {
|
|
168
174
|
const abort = new AbortController();
|
|
169
175
|
res.once('close', () => abort.abort());
|
|
@@ -173,7 +179,14 @@ export function createApiDispatcher(ctx) {
|
|
|
173
179
|
let payload;
|
|
174
180
|
switch (method) {
|
|
175
181
|
case 'ping':
|
|
176
|
-
payload = {
|
|
182
|
+
payload = {
|
|
183
|
+
plugin: ctx.pkg.name,
|
|
184
|
+
version: ctx.pkg.version,
|
|
185
|
+
node: process.version,
|
|
186
|
+
boot: BOOT_ID,
|
|
187
|
+
// DSH 运行版本(头部 chip 数据源);解析失败 → undefined → JSON 序列化时字段缺席
|
|
188
|
+
dshVersion: (await dshVersionP) ?? undefined,
|
|
189
|
+
};
|
|
177
190
|
break;
|
|
178
191
|
case 'self-check': {
|
|
179
192
|
try {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-m",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "DSH
|
|
3
|
+
"version": "0.2.14",
|
|
4
|
+
"description": "可自定义收录清单的 DSH 插件市场:收录、安装、卸载、升级一站完成,附 agent 工具与 dshm CLI。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "lib/host.js",
|
package/registry.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
{
|
|
5
5
|
"id": "dsh-m",
|
|
6
6
|
"name": "DSH Marketplace",
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "可自定义收录清单的 DSH 插件市场:收录、安装、卸载、升级一站完成,附 agent 工具与 dshm CLI。",
|
|
8
8
|
"category": "market",
|
|
9
9
|
"tags": ["市场", "插件管理"],
|
|
10
10
|
"source": "npm",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
{
|
|
16
16
|
"id": "dsh-skins",
|
|
17
17
|
"name": "DSH Skins",
|
|
18
|
-
"description": "
|
|
18
|
+
"description": "DSH Web 皮肤插件:多套品牌皮肤侧栏热切换,一键回到官方界面。",
|
|
19
19
|
"category": "ui",
|
|
20
|
-
"tags": ["主题", "美化"],
|
|
20
|
+
"tags": ["皮肤", "主题", "美化"],
|
|
21
21
|
"source": "npm",
|
|
22
22
|
"npm": "@iasiv5/dsh-skins",
|
|
23
23
|
"github": "iasiv5/dsh-skins",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{
|
|
27
27
|
"id": "dsh-copilot-auth",
|
|
28
28
|
"name": "DSH Copilot Auth",
|
|
29
|
-
"description": "
|
|
29
|
+
"description": "为内置 Copilot 提供方补设备码登录/注销设置页,预置开箱路由;凭据入内置凭据库,模型目录兜底不覆盖定制。",
|
|
30
30
|
"category": "tools",
|
|
31
31
|
"tags": ["Copilot", "认证", "模型接入"],
|
|
32
32
|
"source": "npm",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
{
|
|
38
38
|
"id": "dsh-skip-browser-auth",
|
|
39
39
|
"name": "DSH Skip Browser Auth",
|
|
40
|
-
"description": "
|
|
40
|
+
"description": "替换官方 Connection 提供方跳过 BrowserAuth,免输 Token;已适配 0.1.2-rc.1 与 0.1.5-rc.1/rc.2,详见仓库。",
|
|
41
41
|
"category": "tools",
|
|
42
42
|
"tags": ["BrowserAuth", "连接", "安全"],
|
|
43
43
|
"source": "npm",
|
|
@@ -45,10 +45,21 @@
|
|
|
45
45
|
"github": "iasiv5/dsh-skip-browser-auth",
|
|
46
46
|
"homepage": "https://github.com/iasiv5/dsh-skip-browser-auth"
|
|
47
47
|
},
|
|
48
|
+
{
|
|
49
|
+
"id": "dsh-surf",
|
|
50
|
+
"name": "DSH Surf",
|
|
51
|
+
"description": "网络冲浪入口:设置一级菜单一键打开自托管 Selkies/Chrome 远程桌面,视频流直连;需自建容器并挂认证反代。",
|
|
52
|
+
"category": "tools",
|
|
53
|
+
"tags": ["浏览器", "远程桌面", "Selkies", "网络冲浪"],
|
|
54
|
+
"source": "npm",
|
|
55
|
+
"npm": "@iasiv5/dsh-surf",
|
|
56
|
+
"github": "iasiv5/dsh-surf",
|
|
57
|
+
"homepage": "https://github.com/iasiv5/dsh-surf"
|
|
58
|
+
},
|
|
48
59
|
{
|
|
49
60
|
"id": "dsh-better-sidebar",
|
|
50
61
|
"name": "DSH Better Sidebar",
|
|
51
|
-
"description": "
|
|
62
|
+
"description": "开放的侧边栏底座,支持三方拓展注册侧边栏页面;内置文件编辑、终端、侧边对话、Git 与子代理页。",
|
|
52
63
|
"category": "ui",
|
|
53
64
|
"tags": ["侧边栏", "文件编辑", "终端", "Git"],
|
|
54
65
|
"source": "npm",
|
|
@@ -70,9 +81,9 @@
|
|
|
70
81
|
{
|
|
71
82
|
"id": "dsh-docs-panel",
|
|
72
83
|
"name": "DSH Docs Panel",
|
|
73
|
-
"description": "
|
|
84
|
+
"description": "侧边栏「全局文档」:全局 Markdown 笔记任何工作区可读,支持大纲跳转与一键转编辑器;需 better-sidebar ≥0.4.0。",
|
|
74
85
|
"category": "ui",
|
|
75
|
-
"tags": ["文档", "Markdown", "侧边栏"
|
|
86
|
+
"tags": ["文档", "Markdown", "侧边栏"],
|
|
76
87
|
"source": "npm",
|
|
77
88
|
"npm": "dsh-docs-panel",
|
|
78
89
|
"github": "mlosun/dsh-docs-panel",
|
|
@@ -81,9 +92,9 @@
|
|
|
81
92
|
{
|
|
82
93
|
"id": "dsh-server-deck",
|
|
83
94
|
"name": "DSH Server Deck",
|
|
84
|
-
"description": "
|
|
95
|
+
"description": "服务器卡片仪表盘:实时 CPU/内存/磁盘与趋势图(1h~30d),点卡片进 xterm 终端;可选集成 better-sidebar。",
|
|
85
96
|
"category": "tools",
|
|
86
|
-
"tags": ["服务器", "监控", "终端", "
|
|
97
|
+
"tags": ["服务器", "监控", "终端", "趋势图"],
|
|
87
98
|
"source": "npm",
|
|
88
99
|
"npm": "dsh-server-deck",
|
|
89
100
|
"github": "meyaomiao/dsh-server-deck",
|
|
@@ -92,9 +103,9 @@
|
|
|
92
103
|
{
|
|
93
104
|
"id": "dsh-flowglass",
|
|
94
105
|
"name": "DSH Flowglass",
|
|
95
|
-
"description": "
|
|
106
|
+
"description": "流镜:把当前会话画成三列泳道流程图,展示工具调用、并行分组与子代理分支;可选集成 better-sidebar。",
|
|
96
107
|
"category": "ui",
|
|
97
|
-
"tags": ["可视化", "流程图", "会话"
|
|
108
|
+
"tags": ["可视化", "流程图", "会话"],
|
|
98
109
|
"source": "npm",
|
|
99
110
|
"npm": "dsh-flowglass",
|
|
100
111
|
"github": "Iwctwbh/dsh-flowglass",
|
|
@@ -103,7 +114,7 @@
|
|
|
103
114
|
{
|
|
104
115
|
"id": "dsh-auth",
|
|
105
116
|
"name": "DSH Auth",
|
|
106
|
-
"description": "DSH Web
|
|
117
|
+
"description": "DSH Web 管理员认证:Argon2id 口令与可撤销会话,经 Caddy forward_auth 保护页面、API、下载、SSE 与 WebSocket。",
|
|
107
118
|
"category": "tools",
|
|
108
119
|
"tags": ["认证", "安全"],
|
|
109
120
|
"source": "npm",
|
|
@@ -114,7 +125,7 @@
|
|
|
114
125
|
{
|
|
115
126
|
"id": "deepseek-harness-lark",
|
|
116
127
|
"name": "DeepSeek Harness Lark",
|
|
117
|
-
"description": "飞书 / Lark
|
|
128
|
+
"description": "飞书 / Lark 通道插件:把飞书消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
118
129
|
"category": "other",
|
|
119
130
|
"tags": ["飞书", "Lark", "通道"],
|
|
120
131
|
"source": "npm",
|
|
@@ -125,7 +136,7 @@
|
|
|
125
136
|
{
|
|
126
137
|
"id": "deepseek-harness-qqbot",
|
|
127
138
|
"name": "DeepSeek Harness QQBot",
|
|
128
|
-
"description": "QQ Bot
|
|
139
|
+
"description": "QQ Bot 通道插件:把 QQ 机器人消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
129
140
|
"category": "other",
|
|
130
141
|
"tags": ["QQ", "通道"],
|
|
131
142
|
"source": "npm",
|
|
@@ -147,7 +158,7 @@
|
|
|
147
158
|
{
|
|
148
159
|
"id": "deepseek-harness-wecom",
|
|
149
160
|
"name": "DeepSeek Harness WeCom",
|
|
150
|
-
"description": "企业微信 AI Bot
|
|
161
|
+
"description": "企业微信 AI Bot 通道插件:把企业微信消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
151
162
|
"category": "other",
|
|
152
163
|
"tags": ["企业微信", "通道"],
|
|
153
164
|
"source": "npm",
|
|
@@ -158,7 +169,7 @@
|
|
|
158
169
|
{
|
|
159
170
|
"id": "deepseek-harness-dingtalk",
|
|
160
171
|
"name": "DeepSeek Harness DingTalk",
|
|
161
|
-
"description": "钉钉 Stream
|
|
172
|
+
"description": "钉钉 Stream 通道插件:把钉钉消息桥接进 DeepSeek Harness 对话,支持文本与图片收发。",
|
|
162
173
|
"category": "other",
|
|
163
174
|
"tags": ["钉钉", "通道"],
|
|
164
175
|
"source": "npm",
|