在 VS Code 里对话、附加选区并查看任务状态
31/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Enxulansis/dsh-sidebar该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 5 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 98 处,展示前 78 条)
- 删除本地文件src/debug-runtime-contribution.ts:16
await unlink(filePath) - 写入本地文件src/debug-runtime-contribution.ts:59
await mkdir(storage.fsPath, { recursive: true }) - 写入本地文件src/debug-runtime-contribution.ts:61
await writeFile(patchPath, debugRuntimePatch(endpoint), { encoding: 'utf8', mode: 0o600 }) - 读取本地文件src/debug-tools.ts:161
realpath(this.workspace.uri.fsPath), - 读取本地文件src/debug-tools.ts:162
realpath(absolutePath), - 读取本地文件src/diff-review.ts:112
return await vscode.workspace.fs.stat(uri) - 读取本地文件src/diff-review.ts:125
const stat = fs.statSync(filePath) - 读取本地文件src/diff-review.ts:127
return { text: fs.readFileSync(filePath, 'utf8') } - 删除本地文件src/diff-review.ts:563
fs.unlinkSync(review.absolutePath) - 写入本地文件src/diff-review.ts:569
fs.mkdirSync(path.dirname(review.absolutePath), { recursive: true }) - 写入本地文件src/diff-review.ts:570
fs.writeFileSync(review.absolutePath, before, 'utf8') - 读取本地文件src/draft-store.ts:138
if (file === undefined || !existsSync(file)) return { version: 1, drafts: {} } - 读取本地文件src/draft-store.ts:140
const parsed = JSON.parse(readFileSync(file, 'utf8')) as DraftIndex - 写入本地文件src/draft-store.ts:155
mkdirSync(this.root as string, { recursive: true }) - 写入本地文件src/draft-store.ts:156
writeFileSync(file, JSON.stringify(index)) - 删除本地文件递归src/draft-store.ts:176
rmSync(dir, { recursive: true, force: true }) - 写入本地文件src/draft-store.ts:177
mkdirSync(dir, { recursive: true }) - 写入本地文件src/draft-store.ts:181
writeFileSync(join(dir, file), Buffer.from(image.base64, 'base64')) - 删除本地文件递归src/draft-store.ts:199
if (dir !== undefined) rmSync(dir, { recursive: true, force: true }) - 读取本地文件src/draft-store.ts:221
if (!existsSync(file)) continue - 读取本地文件src/draft-store.ts:222
const base64 = readFileSync(file).toString('base64') - 删除本地文件递归src/draft-store.ts:235
rmSync(this.root, { recursive: true, force: true }) - 发起网络请求src/dsh-client.ts:228
const response = await fetch(this.baseUrl, { redirect: 'manual', signal: AbortSignal.timeout(15_000) }) - 发起网络请求src/dsh-client.ts:1017
const response = await fetch(url, { headers: this.authHeaders(), signal: AbortSignal.timeout(15_000) }) - 发起网络请求src/dsh-client.ts:1032
const response = await fetch(new URL('/turn-rewind', this.baseUrl), { - 发起网络请求src/dsh-client.ts:1048
const response = await fetch(new URL('/api/dsh-context/detail', this.baseUrl), { - 发起网络请求src/dsh-client.ts:1272
const response = await fetch(new URL(`/api/${method}`, this.baseUrl), { - 执行外部命令固定命令src/extension.ts:624
execFile( - 读取本地文件src/extension.ts:696
const stat = await fsp.stat(dir) - 读取本地文件src/extension.ts:704
const entries = await fsp.readdir(current, { withFileTypes: true }) - 读取本地文件src/extension.ts:708
try { total += (await fsp.stat(full)).size } catch { } - 读取本地文件src/extension.ts:739
const entries = await fsp.readdir(os.tmpdir()) - 删除本地文件src/extension.ts:742
try { await fsp.rm(path.join(os.tmpdir(), name), { force: true }); removed += 1 } catch { } - 读取本地文件src/extension.ts:959
if (!fs.existsSync(patchPath)) return - 读取本地文件src/extension.ts:960
const text = fs.readFileSync(patchPath, 'utf8') - 写入本地文件src/extension.ts:963
fs.writeFileSync(patchPath, result.text, 'utf8') - 请求外部主机registry.npmjs.orgsrc/extension.ts:4892
const response = await fetch(`https://registry.npmjs.org/-/package/${name.replace('/', '%2F')}/dist-tags`, { signal: AbortSignal.timeout(6000) }) - 发起网络请求src/extension.ts:4892
const response = await fetch(`https://registry.npmjs.org/-/package/${name.replace('/', '%2F')}/dist-tags`, { signal: AbortSignal.timeout(6000) }) - 执行外部命令来自配置/变量src/extension.ts:4917
execFile(command, args, { timeout: timeoutMs, windowsHide: true, encoding: 'utf8', maxBuffer: 1024 * 1024 }, (error, stdout) => { - 发起网络请求src/extension.ts:4936
const response = await fetch(url, { signal: AbortSignal.timeout(8000) }) - 写入本地文件src/extension.ts:5814
await vscode.workspace.fs.writeFile(vscode.Uri.joinPath(folder, storedName), data) - 写入剪贴板src/extension.ts:6022
if (typeof value.text === 'string') void vscode.env.clipboard.writeText(value.text) - 写入剪贴板src/extension.ts:6033
void vscode.env.clipboard.writeText(fullText) - 写入本地文件src/extension.ts:6048
await vscode.workspace.fs.writeFile(vscode.Uri.file(svgFile), Buffer.from(value.svg, 'utf8')) - 写入本地文件src/extension.ts:6049
if (pngRaw !== '') await vscode.workspace.fs.writeFile(vscode.Uri.file(pngFile), Buffer.from(pngRaw, 'base64')) - 写入本地文件src/extension.ts:6066
await vscode.workspace.fs.writeFile(vscode.Uri.file(htmlFile), Buffer.from(cfHtmlDocument(value.mathml), 'utf8')) - 写入本地文件src/extension.ts:6083
await vscode.workspace.fs.writeFile(vscode.Uri.file(formulaFile), Buffer.from(formulaRaw, 'base64')) - 写入本地文件src/image-origin-store.ts:58
await fsp.mkdir(this.rootDir, { recursive: true }) - 读取本地文件src/image-origin-store.ts:59
const raw = JSON.parse(await fsp.readFile(path.join(this.rootDir, MANIFEST_FILE), 'utf8')) as unknown - 读取本地文件src/image-origin-store.ts:68
for (const name of await fsp.readdir(this.rootDir)) { - 删除本地文件src/image-origin-store.ts:70
void fsp.rm(path.join(this.rootDir, name), { force: true }) - 读取本地文件src/image-origin-store.ts:130
const rawBase64 = (await fsp.readFile(file)).toString('base64') - 写入本地文件src/image-origin-store.ts:166
const write = fsp.mkdir(this.rootDir, { recursive: true }) - 写入本地文件src/image-origin-store.ts:167
.then(() => fsp.writeFile(target, Buffer.from(entry.rawBase64, 'base64'))) - 删除本地文件src/image-origin-store.ts:226
void fsp.rm(path.join(this.rootDir, file), { force: true }).catch(() => { }) - 写入本地文件src/image-origin-store.ts:243
await fsp.writeFile(temp, JSON.stringify(this.manifest)) - 写入本地文件src/image-origin-store.ts:244
await fsp.rename(temp, target) - 写入本地文件src/jsonl-log.ts:10
fs.appendFileSync(file, line + '\n') - 读取本地文件src/jsonl-log.ts:11
if (fs.statSync(file).size <= COMPACT_THRESHOLD_BYTES) return - 读取本地文件src/jsonl-log.ts:12
let lines = fs.readFileSync(file, 'utf8').split('\n').filter(item => item.trim() !== '') - 写入本地文件src/jsonl-log.ts:14
fs.writeFileSync(file, lines.join('\n') + '\n') - 读取本地文件src/launch.ts:128
const entry = readdirSync(directory).find(value => value.toLowerCase() === fileName.toLowerCase()) - 读取本地文件src/launch.ts:131
return statSync(candidate).isFile() ? candidate : undefined - 读取本地文件src/launch.ts:167
if (!existsSync(manifestPath)) return undefined - 读取本地文件src/launch.ts:170
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as { - 读取本地文件src/launch.ts:183
if (packageRelative.startsWith('..') || isAbsolute(packageRelative) || !existsSync(entry)) return undefined - 读取本地文件src/launch.ts:196
if (existsSync(adjacent)) return adjacent - 读取本地文件src/message-files.ts:185
return fs.statSync(absolute).isFile() ? 'active' : 'expired' - 发起网络请求src/plugin-manager.ts:280
response = await fetch(COMMUNITY_REGISTRY_URL, { - 执行外部命令来自配置/变量src/plugin-manager.ts:537
const child = spawn(launch.command, launch.args, { - 读取本地文件src/plugin-profile.ts:57
source = readFileSync(manifestPath, 'utf8') - 读取本地文件src/plugin-profile.ts:88
const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as { version?: unknown } - 发起网络请求src/runtime-endpoint.ts:14
const response = await fetch(new URL('/api/session.list', baseUrl), { - 执行外部命令来自配置/变量src/runtime.ts:56
child = spawn(launch.command, launch.args, { - 执行外部命令来自配置/变量src/runtime.ts:209
child = spawn(launch.command, launch.args, { - 执行外部命令固定命令src/system-clipboard.ts:81
execFile('powershell.exe', ['-NoProfile', '-NonInteractive', '-WindowStyle', 'Hidden', '-EncodedCommand', toEncodedCommand(script)], { timeout: 15000 - 执行外部命令固定命令src/system-clipboard.ts:102
execFile('rundll32.exe', ['shell32.dll,OpenAs_RunDLL', absolutePath], { timeout: 15000 }, (error) => { - 读取本地文件src/webview.ts:46
if (typeof __dirname === 'string') return readFileSync(join(__dirname, file), 'utf8')
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DSH Sidebar 的 Windows 预览版,已适配 DeepSeek Harness 0.2.1-rc.4。第三方运行时插件不再维护。
README
由 DeepSeek 最新模型翻译生成_file:
created: "2026-10-29 15:08"
updated: "2026-10-29 17:58"
status: final
DSH Sidebar
DSH Sidebar 把 DeepSeek Harness 的对话、工具调用、审批和任务状态放进 VS Code。你可以围绕当前项目提问、附加选区或文件、检查代码改动,并在编辑器里继续对话。
0.1.171 · Windows 预览候选 · DeepSeek Harness 0.2.1-rc.4
这是基于 Lixxx1/dsh-vscode 整理的独立 RC4 适配版本,由 Enxulansis 维护。本项目保留原作者署名;不代表原项目或 DeepSeek 官方发布。
预发布安装包 · 问题反馈 · 来源与许可
特色一览
DSH Sidebar 实际对话:表格、数学公式、代码块与用量信息
在 VS Code 内阅读和处理项目任务:回答中的表格、公式与代码保留各自的排版;需要时使用对应复制入口,把结果继续用于编辑和写作。
展开完整文档(README 剩余 1 节)
_file: created: "2026-10-29 15:08" updated: "2026-10-29 17:58" status: final DSH Sidebar DSH Sidebar 把 DeepSeek Harness 的对话、工具调用、审批和任务状态放进 VS Code。你可以围绕当前项目提问、附加选区或文件、检查代码改动,并在编辑器里继续对话。 0.1.171 · Windows 预览候选 · DeepSeek Harness 0.2.1-rc.4 这是基于 Lixxx1/dsh-vscode 整理的独立 RC4 适配版本,由 Enxulansis 维护。本项目保留原作者署名;不代表原项目或 DeepSeek 官方发布。 预发布安装包 · 问题反馈 · 来源与许可 特色一览 DSH Sidebar 实际对话:表格、数学公式、代码块与用量信息 在 VS Code 内阅读和处理项目任务:回答中的表格、公式与代码保留各自的排版;需要时使用对应复制入口,把结果继续用于编辑和写作。 | 功能 | 日常能解决什么问题 | | 文件、图片与草稿 | 带着选区或截图提问,保留未发送内容 | | 模式与三档权限 | 先规划再动手,按任务确认执行范围 | | 消息队列与后台任务 | 运行中补充要求、编辑待处理消息,并检查任务状态 | | 表格与公式复制 | 按目标用途选择 TSV/CSV、TeX/MathML 或 SVG/PNG | | 搜索、轮次导航与标注 | 在长对话里找回结论和关键决定 | | 阅读与通知设置 | 调整折叠、内容宽度、附件上限及提醒方式 | 普通和计划模式与三档执行权限分开显示 普通/计划决定工作方式;仅可查看、工作区内修改、完全权限决定后端提供的执行权限。详见下文说明。 打开完整特色功能图解 →,查看 12 张真实截图、文件格式徽标、公式/表格/代码复制反馈,以及提问停点和金色收藏的区别。图标来源见许可说明。 文档导航 - 特色功能图解:真实截图与使用场景 - 安装、升级与回退 - 故障排查与反馈 - 验证范围和已知限制 - 维护者发布检查 - English overview 发布和维护范围 本项目维护 VS Code 侧栏及配套安装说明。DeepSeek Harness 是独立后端,模型能力、工具目录和实际执行权限由后端及其配置提供。 第三方运行时插件不在本项目的发布、适配或维护范围内。 不打包旧环境中的第三方插件,不承诺迁移其配置、修复其兼容性或跟随其版本更新。侧栏保留的插件管理入口不改变这一范围;相关问题请联系对应插件维护者。 Router Standard/Router Spec 是此前配套环境验收所用的可选预设,不是安装侧栏就自带的模型或服务。基本使用可从后端提供的 standard 预设开始;使用自定义预设时,以其实际装配和维护来源为准。本项目不为其中的第三方依赖提供维护。 环境要求 | 项目 | 要求 | | 系统 | Windows;其他平台未列入本候选验收范围 | | VS Code | 1.100.0 或更高 | | Node.js | 扩展声明为 ^22.19.0 或 >=24.0.0;测试环境使用 24.16.0 | | 后端 | 精确版本 @deepseek-ai/dsh@0.2.1-rc.4 | | 模型 | 自行配置可用接口、凭据和额度 | | 项目 | 打开你信任的工作区;受限模式不激活本扩展 | 旧 0.1.5 后端和后续 alpha 版本不属于本候选支持目标。为保持既有安装连续性,扩展 ID 仍为 lixxx1.dsh-sidebar;本候选通过 GitHub 分发,不代表原 Marketplace 发布者背书。VSIX 不包含完整后端、模型凭据或个人数据。 第一次使用 1. 按 安装指南 准备独立 RC4 后端和数据目录,安装候选 VSIX 并重载窗口。 2. 打开右侧 DeepSeek Harness;找不到时运行 DeepSeek Harness: 打开聊天,也可选择 在编辑器中打开聊天。 3. 点击钥匙按钮打开 模型与连接,配置凭据并选择模型。凭据由当前后端管理,不要写入仓库设置或 Issue。 4. 新建会话,选择预设、权限、普通/计划模式及推理强度。先发送只读任务确认连接正常。 示例: 阅读项目 README 和入口文件,概括启动方式及主要模块,先不要修改文件。 检查修改时先看文件差异,再决定保留或回退。文件回退不等于 Git 提交,也不能撤销已经执行的外部操作。 模式与权限 盾牌菜单承载两组设置。「普通/计划」是工作模式,配套 RC4 base profile 另提供三档权限。 | 设置 | 用途 | | 普通 | 在当前权限下处理任务 | | 计划 | 先研究和制定方案;不会因此自动获得更多权限 | | 仅可查看 | 以只读操作为主;额外权限由后端决定拦截或请求审批 | | 工作区内修改 | 按后端预设处理工作区修改,不等于任意系统路径可写 | | 完全权限 | 使用后端配置的更宽权限;切换时保留确认流程 | 选项来自后端权限目录,选中项来自当前会话;自定义 profile 可能改变目录。审批卡表示某项操作需要决定,请先读操作和原因。权限选择不是操作系统级安全隔离保证。 连接中断时的审批决定不会自动重放。恢复连接后需重新确认;切换会话或重连后仍待处理的审批会恢复,已处理的请求不应重新成为待办。 队列和后台任务 任务运行期间发送的新消息可以进入队列。对未消费的消息,可使用界面入口编辑、保存,或引导当前任务。引导用于更新工作方向,不保证立刻打断已运行的工具。 停止当前生成后,继续检查是否还有待处理消息和运行中的后台任务;停止按钮不代表清空全部任务。后台任务列表显示后端报告的运行状态、完成状态和退出码。 审批、追问和任务结束可触发通知。设置台支持全部通知、仅需要操作和关闭。 文件、图片和草稿 - 编辑器右键 把选区加到聊天,或通过 @ 添加文件/文件夹。发送前核对输入区上下文。 - 图片可粘贴、拖入、预览和缩放;支持的动图可选帧,所选帧作为静态图片发送。 - 附件数量、大小、压缩策略可在设置台调整。能附图不代表所选模型支持视觉输入。 - 默认保留未发送的文字、图片和文件草稿,成功发送后清除;关闭保留或清理存储会影响恢复。 - 已验证的图片准备阶段可停止并恢复草稿,需要配套 运行时取消修补。修补不保证立即中止原生解码,也不会撤销已执行工具的副作用。 会话导航、搜索与复制 会话标签用于切换对话;搜索可定位正文、图片名称和文件路径。当前工作区搜索由侧栏实现,其他工作区结果依赖后端索引,不保证自定义配置档默认可用。 轮次导航条支持跳转、收藏和标注。消息、代码块、表格及公式提供对应复制入口;公式支持的导出格式包括 TeX、MathML、SVG 和 PNG,表格支持 TSV 或 CSV。目标应用的格式支持会影响粘贴效果。 会话工具包括在 Diff 编辑器审阅改动、会话分叉及按现有入口回退。先检查操作提示中的影响范围;分叉会话不等于恢复磁盘文件。 模型、预设与设置 「模型与连接」管理当前后端支持的接口、凭据和模型标识。自定义服务商所需组件须自行具备,不作为第三方插件随侧栏分发。图片输入、推理强度和费用展示以实际模型能力及后端信息为准;token 统计不等于账单。 预设决定会话装配的工具与工作方式,可选项来自后端。应在首轮发送前选择;已开始的会话按后端规则锁定预设。171 包含重启后恢复持久化预设标签的修复。 | 常用设置 | 默认值及说明 | | deepseekHarness.home | 空;使用 DSH_HOME 或默认目录。独立环境应显式配置,修改后重载 | | deepseekHarness.executable | 空;自动寻找后端。候选应显式指向 RC4 启动器 | | deepseekHarness.arguments | web --host 127.0.0.1 --port 0;使用本机随机端口 | | deepseekHarness.autoStart | true;首次打开侧栏启动后端 | | deepseekHarness.reuseExistingRuntime | true;符合条件时复用本机 3080 端口后端。自定义 home 会阻止复用无关实例 | | deepseekHarness.ui.keepDrafts | true;保留未发送草稿 | | deepseekHarness.ui.notifyLevel | all;也可选 action 或 off | | deepseekHarness.ui.diagnostics | false;排障时开启,查看输出面板 | 更多设置包括附件上限、图片压缩、折叠、搜索高亮、轮次导航和通知样式。在设置台或 VS Code 设置中搜索 deepseekHarness,以安装版本实际选项为准。 可选自主调试 deepseekHarness.autonomousDebugging 默认关闭。启用后需要有效的 .vscode/launch.json 和对应语言调试扩展,并由侧栏启动受管理后端。它可向模型提供启动调试、断点、单步和变量检查能力,未列入本次 RC4 原生界面的完整验收项。 升级与验证范围 升级前保留旧 VSIX、旧后端、数据目录和 DSH 设置。切换 home 不会自动迁移旧会话;本候选不承诺完整旧会话数据库迁移。参见 回退步骤。 候选完成 1111 项单测、类型检查和构建;实际界面证据按场景分别对应 169、170、171。详见 验证范围,不将历史结果当作 171 所有场景重新运行。 反馈与许可 反馈请提供扩展/后端版本、系统环境、复现步骤、预期与实际结果及脱敏日志。不要提交密钥、个人会话库或完整 home 目录。问题请提交到 Issues。 侧栏采用 MIT License,保留原作者署名。DeepSeek Harness 及其他依赖遵循各自许可,侧栏许可不替代其许可。随包依赖声明见 THIRD-PARTY-NOTICES.txt,字体许可见 OFL 1.1。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Enxulansis/dsh-sidebar
在 VS Code 里对话、附加选区并查看任务状态
相关插件 · 浏览器
智能体插件框架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
这是你的仓库?认领条目