插件目录 / Developer / dsh-file-panel
dsh-file-panel
已验证 · 实测可装 yu2025-luo
功能简介
右侧文件面板:自动弹出,图片/文本预览,文件夹显示
可用 — 实测通过,早期项目
右侧文件面板:自动弹出,图片/文本预览,文件夹显示 实测能干净安装、正常启动。早期项目,但功能可用。
「已验证」表示我们的自动化 CI 在干净 profile 里实际执行了 dsh plugin add 并启动成功——仅此而已。功能描述与版本兼容性均为作者声明。这不是安全审计,也不代表对第三方代码的背书。
README
dsh-file-panel
A plugin for DeepSeek Harness (dsh web GUI) that watches what the agent creates and downloads during a session, and shows it in a right-side popup panel — like the file viewer in Codex.
When a file or image is written to disk during a session, the panel pops up automatically on the right. Every row lets you:
- 👁 Preview — images render inline; text files show their first 256 KB; other types show metadata.
- 📂 Show in folder — opens the OS file manager with the file selected (
explorer.exe /selecton Windows,open -Ron macOS,xdg-openon Linux). - ↗ Open — opens the file with the OS default application (via the harness's built-in
host.openPathRPC). - 📋 Copy path — copies the absolute path to the clipboard.
Also ships a workspace folder shortcut at the bottom of the panel.
Screenshots

The right-docked session files panel: every row previews, opens, reveals, or copies its path; the bottom button opens the session's working directory. The panel is fully draggable (grab the header) and resizable from its left and bottom edges, with scrollbars appearing when it gets narrow.
Installation
Requires DeepSeek Harness dsh CLI (npm package @deepseek-ai/dsh) and pnpm.
From a local checkout
cd dsh-file-panel
npm install # installs esbuild (dev-only)
npm run build # produces lib/index.js + lib/client.js (committed)
# register in the web profile (link: tracks your checkout live)
dsh plugin --profile web add link:.
From GitHub
dsh plugin --profile web add github:yu2025-luo/dsh-file-panel
The built artifacts are committed, so no build step runs during install.
Activate
Restart the dsh web server (plugin sets take effect on restart), then refreshhttp://127.0.0.1:3080. That's it — no configuration required.
Remove with:
dsh plugin --profile web remove dsh-file-panel
Usage
| Gesture | Result |
|---|---|
| Agent creates/downloads a file | Panel pops up automatically (newest files carry a NEW chip) |
| Click a row | Inline preview (image / text / metadata) |
| Row hover actions | Preview, open, show in folder, copy path |
| 🔔 bell | Toggle auto-pop for new files |
– / × |
Collapse to a floating launcher button (with new-file badge) or hide |
| Bottom "open workspace folder" | Opens the session's working directory |
Panel state (open/collapsed) and the auto-pop preference persist inlocalStorage. The auto-pop baseline is per session: files that already
existed when the panel first saw the session do not re-trigger a popup.
How it works
One npm package with two halves, registered as a single loader row
(cordis.patch.yml → row file-panel):
Host half (src/index.js) Browser half (src/client.jsx)
──────────────────────── ──────────────────────────────
ctx.on('fs/observed') ──┐
write/edit tools report │ shell.overlay slot entry:
files (precise, attributed │ a right-docked floating panel
to the session) ├──▶ FileTracker (per-session lists,
recursive fs.watch per │ ignore rules, caps, fence)
session working directory │ │
(catches shell downloads: ──┘ ▼
curl, Invoke-WebRequest, …) RPC channel /file-panel
authority: 'loopback'
list · readText · readImage
reveal · describe
▲
│ poll every 1.5 s
client: ctx.connection.rpc.call()
open file: built-in api.host.openPath
The client half registers into the shipped shell.overlay slot (additive,
frame-wide floating layer), reads the current session through the standarduseSessions prop, and polls the plugin's own loopback-only RPC channel.
The channel is registered with ctx.connection.rpc.handle, the sanctioned
static-package RPC seam.
Security
- The
/file-panelchannel is registered withauthority: 'loopback', so
only pages served from127.0.0.1can call it. When the GUI is accessed
over the network (--trusted-host), the panel shows a notice and stays
inactive. - Every read/reveal endpoint only accepts absolute paths that the tracker
has actually seen (a tool write or a watcher event under a watched working
directory) — the RPC can never be used as a generic file-read/reveal
primitive.
Project layout
src/
index.js host half: tracker wiring + /file-panel RPC endpoints
tracker.js pure-Node file tracker (fs/observed ingestion, recursive
watcher with debounce, ignore rules, caps, RPC fence)
client.jsx browser half: the right-side panel UI (React, JSX)
build.mjs esbuild build for both halves
cordis.patch.yml the bundle patch inserting the loader row
tests/ node:test unit + host-half smoke tests
lib/ built artifacts (committed, so installs need no build step)
Development
npm install
npm run build # rebuild lib/index.js and lib/client.js
npm test # node --test
For a fast client-side iteration loop after changing src/client.jsx:
npm run build
then hard-refresh the GUI page (lib/client.js is served withcache-control: no-cache; plugin sets only change on restart, but bundle
content re-hashes per request — see dsh-client-modules). During active
UI development you can also run pnpm run dev:web from the harness checkout
to rebuild client bundles on change.
Compatibility
Built against the public seams of @deepseek-ai/dsh 0.1.0-rc.x:
- host:
ctx.connection.rpc.handle/ctx.on('fs/observed') - client:
shell.overlayslot,useSessionsstandard prop,ctx.connection.rpc.call,ctx.locale
DeepSeek Harness is pre-release: those seams may move. If the panel stops
working after a dsh upgrade, check the pinned version inpackage.json and re-run the build.
Known limitations
- The recursive watcher uses
fs.watch({ recursive: true })(Node ≥ 20).
On platforms where that is unavailable, the panel still tracks everything
the harnesswrite/edittools produce, but shell-side downloads may be
missed. - The panel is process-local: it starts empty after a restart (it only
records files it actually observed; it does not scan history). node_modules,.git, and temporary-file noise are ignored by design.revealon headless Linux reportscanReveal: falseand hides the
button (no desktop to open).
Publishing to GitHub / npm
Create a GitHub repo and push (the repo is already a git repository with
av0.1.4tag):git remote add origin https://github.com/yu2025-luo/dsh-file-panel.git git push -u origin main --tagsAdd the
dsh-plugintopic on the
repo page (About → gear icon → Topics) together withdeepseek-harness,dsh,deepseek, andfile-preview. The repo then
appears on the public plugin topic page automatically.Users install with
dsh plugin --profile web add github:yu2025-luo/dsh-file-panel#v0.1.4.Optionally publish to npm (
npm publish) — then install withdsh plugin --profile web add dsh-file-panel.
Community catalogs that sync from the dsh-plugin topic:
Oh-My-DSH (auto-synced) and
awesome-deepseek-harness
(PR-based).
Remember to bump the version and re-run npm run build before releasing.
License
安装
装一次目录插件,之后本站所有插件都能让 DeepSeek Harness 自动找、自动装:
dsh plugin add dshbase-catalog 然后对 agent 说「帮我装 dsh-file-panel」,它会在目录里找到并自动安装。文档:dshbase-catalog · 已验证场景包。
该插件是 GitHub 源码(未发 npm)——直接从仓库装:
Web profile:
dsh plugin --profile web add github:yu2025-luo/dsh-file-panel Headless(CLI)profile:
dsh plugin --profile headless add github:yu2025-luo/dsh-file-panel 实测报告
验证通过:从 GitHub 源码完成 L1 安装 + L2 加载 + L3 运行(dsh 0.1.0-rc.6)。
使用场景
扩展 agent 的编码能力面——给它一个新工具、工作流或集成,让它接手以前做不了的开发任务。
适合谁
想让 dsh 在真实代码库上像队友一样干活的开发者——能改、能跑、能验证,而不只是回答问题。
二次开发建议
工具/命令面就是缝:暴露更多 SDK 能力、加更聪明的上下文接线,或收紧改代码与验证之间的循环。