三段式侧栏管理项目会话,并可视化配置 MCP 与记忆
28.1/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/11 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Tomcat099/dsh-sidebar该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 42 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 56 处,展示前 54 条)
- 发起网络请求lib/index.js:94
async fetch(request) { - 发起网络请求lib/index.js:112
async fetch(request) { - 发起网络请求lib/index.js:128
async fetch(request) { - 发起网络请求lib/index.js:151
async fetch(request) { - 发起网络请求lib/index.js:179
async fetch(request) { - 发起网络请求lib/index.js:233
async fetch(request) { - 写入本地文件lib/index.js:237
await mkdir(path, { recursive: true }); - 写入本地文件lib/mcp/host.js:170
writeFileSync(file, `${renderStandaloneEntry(entry)}\n`, 'utf8'); - 写入本地文件lib/mcp/host.js:184
mkdirSync(scratchDir(profileDir), { recursive: true, mode: 0o700 }); - 读取本地文件lib/skills.js:107
entries = await readdir(root, { withFileTypes: true }); - 写入本地文件lib/skills.js:162
await mkdir(targetRoot, { recursive: true }); - 删除本地文件递归lib/skills.js:192
await rm(scratch, { recursive: true, force: true }); - 读取本地文件lib/skills.js:207
const raw = await readFile(file, 'utf8'); - 写入本地文件lib/skills.js:211
await writeFile(file, next, 'utf8'); - 读取本地文件lib/skills.js:247
entries = await readdir(root.path, { withFileTypes: true }); - 读取本地文件lib/skills.js:449
return await stat(path); - 读取本地文件lib/skills.js:460
return await readFile(path, 'utf8'); - 读取本地文件lib/skills.js:471
await access(path); - 写入本地文件lib/skills.js:511
await mkdir(dirname(target), { recursive: true }); - 写入本地文件lib/skills.js:512
await writeFile(target, bytes); - 写入本地文件lib/skills.js:553
await mkdir(named); - 写入本地文件lib/skills.js:557
await rename(join(root, entry), join(named, entry)); - 读取本地文件lib/mcp/catalog.js:47
const parsed = JSON.parse(readFileSync(cachePath(profileDir), 'utf8')); - 写入本地文件lib/mcp/catalog.js:90
writeFileSync(temporary, `${JSON.stringify(cache, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/mcp/catalog.js:91
renameSync(temporary, path); - 写入本地文件lib/mcp/paths.js:54
mkdirSync(dir, { recursive: true, mode: 0o700 }); - 读取本地文件lib/mcp/store.js:31
const parsed = JSON.parse(readFileSync(file, 'utf8')); - 读取本地文件lib/mcp/store.js:47
readFileSync(file, 'utf8'); - 写入本地文件lib/mcp/store.js:78
mkdirSync(dirname(file), { recursive: true, mode: 0o700 }); - 写入本地文件lib/mcp/store.js:81
writeFileSync(temporary, `${JSON.stringify(stored, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/mcp/store.js:82
renameSync(temporary, file); - 删除本地文件lib/mcp/store.js:85
rmSync(temporary, { force: true }); - 读取本地文件lib/mcp/store.js:168
existing = readFileSync(path, 'utf8'); - 写入本地文件lib/mcp/store.js:179
writeFileSync(path, next, 'utf8'); - 发起网络请求lib/memory/routes.js:78
async fetch(request) { - 读取本地文件lib/mcp/credentials.js:45
if (!existsSync(file)) - 读取本地文件lib/mcp/credentials.js:48
for (const line of readFileSync(file, 'utf8').split(/ ? /u)) { - 写入本地文件lib/mcp/snapshot.js:26
mkdirSync(dir, { recursive: true, mode: 0o700 }); - 读取本地文件lib/mcp/snapshot.js:45
const parsed = JSON.parse(readFileSync(path, 'utf8')); - 读取本地文件lib/mcp/snapshot.js:72
for (const name of readdirSync(dir)) { - 读取本地文件lib/mcp/snapshot.js:91
return existsSync(path) ? readSnapshotFile(path)?.doc : undefined; - 读取本地文件lib/mcp/snapshot.js:102
if (!existsSync(path)) - 删除本地文件lib/mcp/snapshot.js:104
rmSync(path, { force: true }); - 写入本地文件lib/mcp/snapshot.js:168
writeFileSync(temporary, `${JSON.stringify(payload, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }); - 写入本地文件lib/mcp/snapshot.js:169
renameSync(temporary, path); - 发起网络请求lib/memory/embedding.js:89
const response = await fetch(url, { - 写入本地文件lib/memory/local.js:29
mkdirSync(dirname(dbPath), { recursive: true }); - 发起网络请求lib/memory/remote.js:34
const response = await fetch(url, { - 读取本地文件lib/mcp/env-file.js:93
if (!existsSync(file)) - 读取本地文件lib/mcp/env-file.js:95
return readFileSync(file, 'utf8').split(/ ? /u); - 写入本地文件lib/mcp/env-file.js:160
mkdirSync(dirname(file), { recursive: true, mode: 0o700 }); - 写入本地文件lib/mcp/env-file.js:163
writeFileSync(temporary, text, { encoding: 'utf8', mode: FILE_MODE }); - 写入本地文件lib/mcp/env-file.js:164
renameSync(temporary, file); - 写入本地文件lib/mcp/env-file.js:166
chmodSync(file, FILE_MODE);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-home-paths@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 三段式侧栏导航
- 可视化配置MCP
- 跨会话记忆
DSH 左侧三段式导航(功能菜单 / 项目对话树 / 最近对话)+ 工具箱:可视化配置 MCP、跨会话记忆,让项目与会话一目了然。
README
由 DeepSeek 最新模型翻译生成dsh-sidebar
DeepSeek Harness(DSH)Web 插件:把左侧导航改成三段式布局(功能菜单 · 项目对话树 · 最近对话),并在侧边栏提供「工具箱」,直接管理技能、MCP 服务与跨会话记忆。
功能特性
- 三段式左侧导航:功能菜单、项目对话树、快速对话的最近记录;工作区的折叠、高亮、重命名和删除仍由 DSH 自己渲染,底部「设置」不变。
- 工具箱 → MCP:按「全局 / 工作区」作用域可视化配置 MCP 服务器,保存前真实握手校验,保存后立即生效、无需重启。
- 工具箱 → 记忆:跨会话记住偏好、约定与项目事实。默认自动提炼入库、按输入召回并注入上下文;智能体可调用 memory_search / memory_write / memory_forget。
- 工具箱 → 技能:技能(Skill)管理页,全局 / 项目级切换。
「新对话」始终打开同一个后台项目,项目树里不显示它,会话只出现在「最近对话」。搜索框留在「项目」标题旁(DSH 没有单独的搜索槽)。宿主如果本来就不画出空项目,这里也不会补一行「暂无对话」。
展开完整文档(README 剩余 1 节)
dsh-sidebar DeepSeek Harness(DSH)Web 插件:把左侧导航改成三段式布局(功能菜单 · 项目对话树 · 最近对话),并在侧边栏提供「工具箱」,直接管理技能、MCP 服务与跨会话记忆。 功能特性 - 三段式左侧导航:功能菜单、项目对话树、快速对话的最近记录;工作区的折叠、高亮、重命名和删除仍由 DSH 自己渲染,底部「设置」不变。 - 工具箱 → MCP:按「全局 / 工作区」作用域可视化配置 MCP 服务器,保存前真实握手校验,保存后立即生效、无需重启。 - 工具箱 → 记忆:跨会话记住偏好、约定与项目事实。默认自动提炼入库、按输入召回并注入上下文;智能体可调用 memory_search / memory_write / memory_forget。 - 工具箱 → 技能:技能(Skill)管理页,全局 / 项目级切换。 「新对话」始终打开同一个后台项目,项目树里不显示它,会话只出现在「最近对话」。搜索框留在「项目」标题旁(DSH 没有单独的搜索槽)。宿主如果本来就不画出空项目,这里也不会补一行「暂无对话」。 截图 三段式侧边导航与 MCP 管理 技能管理 记忆管理 安装 从 GitHub 安装(推荐) 第 1 步:安装插件 dsh plugin --profile web add github:Tomcat099/dsh-sidebar 第 2 步:pnpm ≥ 10 首次会报「构建未授权」错误,按提示授权后重装 git 安装拉的是源码(不是构建产物),pnpm 默认拒绝运行 prepare 构建脚本,所以第一次 add 会报 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED。把报错里的包键加入该 profile 的 pnpm-workspace.yaml: 文件:~/.dsh/profiles/web/pnpm-workspace.yaml allowBuilds: dsh-sidebar: true 然后重新执行第 1 步的 add 命令。 这等于允许该包代码在安装时于你的机器上执行,只对源码可信的包授权。也可以锁定 commit 安装,避免仓库后续推送悄悄改变实际运行的内容: dsh plugin --profile web add github:Tomcat099/dsh-sidebar#<commit-sha> 第 3 步:重启生效 dsh web 本地目录安装(开发调试) macOS dsh plugin --profile web add file:/path/to/dsh-sidebar Windows dsh plugin --profile web add file:C:/path/to/dsh-sidebar 必须带 file: 前缀,否则 pnpm 会写成软链。改源码先 npm run build,再重启 dsh web。 file: 安装是硬链复制:改已有文件会同步,但新增文件不会被 pnpm 搬进 profile(会报 Already up to date)。加了新文件后要清掉 profile 里的旧副本再装一次: rm -rf ~/.dsh/profiles/web/node_modules/dsh-sidebar dsh plugin --profile web add file:/path/to/dsh-sidebar 验证是否装好 dsh --profile web --dump-config # 输出里应能看到 "# == dsh-sidebar" 这一层 开发 npm install npm run build # tsc → lib/(prepare 自包含,git 安装时也会执行) npm test # node --test tests/*.test.js client/client.js(浏览器 CJS bundle)与 lib/(Host 构建产物)随仓库提交,git 安装即可直接用。 License Apache License 2.0
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Tomcat099/dsh-sidebar
三段式侧栏管理项目会话,并可视化配置 MCP 与记忆
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目