把文件面板移到聊天左侧,右侧保留原生预览
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Wfssll/dsh-three-pane该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · browser
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 10 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 47 处,展示前 35 条)
- 读取本地文件lib/fileops.js:47
try { anchors = JSON.parse(await readFile(anchorFile, 'utf8')); } catch { } - 写入本地文件lib/fileops.js:109
mkdirSync(directory, { recursive: true, mode: 0o700 }); - 执行外部命令固定命令lib/fileops.js:117
const child = spawn('ssh', [...sshOptions(), target.alias, command], { stdio: [stdin ? 'pipe' : 'ignore', 'pipe', 'pipe'], signal }); - 读取本地文件lib/fileops.js:142
const realRoot = await realpath(root).catch(() => { throw new FileOpError('工作区目录不存在或无法访问。', 404); }); - 读取本地文件lib/fileops.js:144
const real = await realpath(probe).catch(() => { throw new FileOpError('目标不存在。', 404); }); - 读取本地文件lib/fileops.js:148
const exists = path => lstat(path).then(() => true, () => false); - 读取本地文件lib/fileops.js:208
async stat(where, path) { - 读取本地文件lib/fileops.js:219
const info = await stat(full), name = parts.at(-1) ?? basename(where.root); - 执行外部命令固定命令lib/fileops.js:260
const child = spawn('tar', ['-cf', '-', '-C', dirname(full), '--', basename(full)], { stdio: ['ignore', 'pipe', 'pipe'], signal }); - 写入本地文件lib/fileops.js:288
await mkdir(folder, { recursive: true }); - 写入本地文件lib/fileops.js:292
await pipeline(Readable.fromWeb(body), createWriteStream(temp, { flags: 'wx' }), ...(signal ? [{ signal }] : [])); - 写入本地文件lib/fileops.js:293
if (replace) await rename(temp, target); - 写入本地文件lib/fileops.js:298
await rename(temp, target); - 删除本地文件lib/fileops.js:301
} finally { await unlink(temp).catch(() => {}); } - 写入本地文件lib/fileops.js:305
async rename(where, path, newName) { - 删除本地文件递归lib/fileops.js:333
await rm(full, { recursive: true }); - 读取本地文件src/fileops.js:47
try { anchors = JSON.parse(await readFile(anchorFile, 'utf8')); } catch { } - 写入本地文件src/fileops.js:109
mkdirSync(directory, { recursive: true, mode: 0o700 }); - 执行外部命令固定命令src/fileops.js:117
const child = spawn('ssh', [...sshOptions(), target.alias, command], { stdio: [stdin ? 'pipe' : 'ignore', 'pipe', 'pipe'], signal }); - 读取本地文件src/fileops.js:142
const realRoot = await realpath(root).catch(() => { throw new FileOpError('工作区目录不存在或无法访问。', 404); }); - 读取本地文件src/fileops.js:144
const real = await realpath(probe).catch(() => { throw new FileOpError('目标不存在。', 404); }); - 读取本地文件src/fileops.js:148
const exists = path => lstat(path).then(() => true, () => false); - 读取本地文件src/fileops.js:208
async stat(where, path) { - 读取本地文件src/fileops.js:219
const info = await stat(full), name = parts.at(-1) ?? basename(where.root); - 执行外部命令固定命令src/fileops.js:260
const child = spawn('tar', ['-cf', '-', '-C', dirname(full), '--', basename(full)], { stdio: ['ignore', 'pipe', 'pipe'], signal }); - 写入本地文件src/fileops.js:288
await mkdir(folder, { recursive: true }); - 写入本地文件src/fileops.js:292
await pipeline(Readable.fromWeb(body), createWriteStream(temp, { flags: 'wx' }), ...(signal ? [{ signal }] : [])); - 写入本地文件src/fileops.js:293
if (replace) await rename(temp, target); - 写入本地文件src/fileops.js:298
await rename(temp, target); - 删除本地文件src/fileops.js:301
} finally { await unlink(temp).catch(() => {}); } - 写入本地文件src/fileops.js:305
async rename(where, path, newName) { - 删除本地文件递归src/fileops.js:333
await rm(full, { recursive: true }); - 发起网络请求src/files.js:33
const response = await fetch(`${FILES_API}/${op}?${new URLSearchParams(params)}`, { - 写入剪贴板src/files.js:231
{ label: absolute ? '复制路径' : '复制相对路径', run: () => navigator.clipboard?.writeText(info.ref.relative) }] : []), - 写入剪贴板src/files.js:421
...(ref ? [{ label: '引用到聊天', run: () => addReference(id, ref) }, { label: '复制相对路径', run: () => navigator.clipboard?.writeText(ref.relative) }] : []),
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 三栏工作区:独立左侧文件列表、中间聊天、右侧原生 PDF/文件预览,兼容可收缩的对话历史栏。
README
由 DeepSeek 最新模型翻译生成dsh-three-pane
DeepSeek Harness 原生文件面板移位插件。把原本在右侧的「文件」面板移到聊天左边,文件预览继续留在右边。
一个独立的原生文件浏览器,用于 DeepSeek Harness:文件在左,对话居中,原生预览在右侧侧栏。会话历史开关旁边新增文件夹按钮,独立控制文件浏览器,不受两侧侧栏影响。
当前版本
当前版本:0.3.0。这是首次公开发行版,使用原生文件面板,并为文件栏提供独立开关。
文件页签、图标、路径栏、刷新按钮、打开方式和文件行全部使用 Harness 原生组件及其现有插件扩展。本插件只调整面板位置和宽度,不添加独立文件浏览界面。文件栏不再显示右侧侧栏的分栏、全屏和侧栏收缩按钮。
原生文件面板移至左侧
收起后完全隐藏
展开时: [ 对话历史(可收起) ] [ 原生文件面板 ] [ 聊天 ] [ 原生文件预览 ]
收起后: [ 对话历史(可收起) ] [ 聊天 ] [ 原生文件预览 ]
安装
先下载 预构建安装包,或在 版本页面 下载固定版本。安装包包含已构建的客户端,无运行时 npm 依赖,不需要本地构建。
官方 Desktop: 打开「插件 → 添加插件 → 安装第三方插件」,输入下载的 .tgz 文件的完整本地路径,安装并按提示启用。
展开完整文档(README 剩余 1 节)
dsh-three-pane DeepSeek Harness 原生文件面板移位插件。把原本在右侧的「文件」面板移到聊天左边,文件预览继续留在右边。 一个独立的原生文件浏览器,用于 DeepSeek Harness:文件在左,对话居中,原生预览在右侧侧栏。会话历史开关旁边新增文件夹按钮,独立控制文件浏览器,不受两侧侧栏影响。 当前版本 当前版本:0.3.0。这是首次公开发行版,使用原生文件面板,并为文件栏提供独立开关。 文件页签、图标、路径栏、刷新按钮、打开方式和文件行全部使用 Harness 原生组件及其现有插件扩展。本插件只调整面板位置和宽度,不添加独立文件浏览界面。文件栏不再显示右侧侧栏的分栏、全屏和侧栏收缩按钮。 原生文件面板移至左侧 收起后完全隐藏 展开时: [ 对话历史(可收起) ] [ 原生文件面板 ] [ 聊天 ] [ 原生文件预览 ] 收起后: [ 对话历史(可收起) ] [ 聊天 ] [ 原生文件预览 ] 安装 先下载 预构建安装包,或在 版本页面 下载固定版本。安装包包含已构建的客户端,无运行时 npm 依赖,不需要本地构建。 官方 Desktop: 打开「插件 → 添加插件 → 安装第三方插件」,输入下载的 .tgz 文件的完整本地路径,安装并按提示启用。desktop profile 在应用运行期间由桌面版专门管理,不能通过外部 CLI 修改。升级已有社区插件时,如宿主要求先卸载旧版,先在插件详情页卸载,再安装新包;不会删除聊天和工作区文件。 Web profile: dsh plugin --profile web add https://github.com/Wfssll/dsh-three-pane/releases/download/v0.3.0/dsh-three-pane-0.3.0.tgz 将 web 换成自己的 profile 名称。安装后重新加载客户端,必要时重启该 profile。尚未发布到 npm,请使用 GitHub Release 安装包。 Desktop (English): Download the prebuilt .tgz, then open Plugins → Add plugin → Install third-party plugin, paste the full local archive path, install, and enable. For Web profiles, use the command above. 使用 会话历史栏的收起按钮左侧新增文件夹图标,点击可独立展开、收起文件栏。历史栏收起后,文件夹按钮仍与「展开会话历史」「新建会话」两个原生按钮一起保留,顺序为「文件 → 会话历史 → 新建会话」。 文件栏和右侧侧栏各自管理开关,互不联动:收起预览不会收起文件,开关文件栏也不会开关预览。隐藏文件栏保留原生文件页签和目录展开状态;文件页签上的关闭按钮也只隐藏文件栏。 点击文件会在右侧原生侧栏预览。右侧侧栏保留原来的分栏、全屏和收起功能;文件栏顶部不再提供这些侧栏控件,也不再显示新建侧栏页签按钮。 文件栏右边缘可拖动调宽;聚焦分隔线后可用左右方向键调节,双击恢复 300px。文件栏始终占用独立列,右侧预览优先缩小以保留至少 400px 的聊天区域;极窄窗口可横向滚动,不覆盖聊天内容。 实现与兼容性 - 已在 DeepSeek Harness 0.2.1-rc.3 的 Web 与官方 macOS Desktop 上验证。其他宿主版本未逐一实测。 - 复用原生 rightbar.session 注册的组件、Store、注入服务及子 Slot 授权。 - 只为渲染生成「文件」和「预览」布局视图;文件栏的可见状态由插件按会话独立管理,不跟随右侧侧栏的展开状态。目录仍使用原生文件页签,不复制文件数据。 - 本插件不自行读取文件;本地文件与 SSH 文件都由宿主已有文件面板处理。 - 原生组件装饰依赖当前版本的 Slot 注册结构;未来宿主升级后可能需要适配。 - 停用或卸载会恢复原生组件并移除自己的样式和布局留白。 开发 npm ci --ignore-scripts npm run check mkdir -p dist npm pack --pack-destination dist src/client.js 负责原生面板装饰与显示位置,src/model.js 负责只读布局投影,src/style.css 包含几何布局与文件夹按钮样式。 验证:11 项自动检查通过,覆盖独立开关、预览状态保持、会话隔离、历史栏折叠后按钮保留、原生组件复用及卸载恢复;另在真实宿主中验证本地和 SSH 文件的 PDF 预览。上面的截图使用合成测试工作区,不含私人对话或研究数据。 卸载 Desktop 在「插件」页卸载 dsh-three-pane。Web 使用 dsh plugin --profile web remove dsh-three-pane。 License MIT.
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Wfssll/dsh-three-pane
把文件面板移到聊天左侧,右侧保留原生预览
相关插件 · 浏览器
智能体插件框架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
这是你的仓库?认领条目