🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

编辑器侧栏 Enxulansis/dsh-sidebar

DeepSeek Harness
Enxulansis5 天前有提交已提供中文文档扫描:含敏感能力

在 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 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.org
    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: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。
预览分享卡片长什么样 ↓Enxulansis/dsh-sidebar
分享 · DeepSeek Harness Hub
Enxulansis/dsh-sidebar

在 VS Code 里对话、附加选区并查看任务状态

这是你的仓库?认领条目

回到顶部