多媒体查看器(multimedia-viewer)
August 14, 2026 · View on GitHub
一个 DeepSeek Harness 动态 Cordis 插件:在 Harness 页面内浏览并查看项目结果目录里的 图片与视频。
效果
- 页面右下角出现一个悬浮的 🖼️ 按钮。
- 点击打开「多媒体查看器」面板,只扫描当前工作区(当前会话的
cwd)下的媒体文件, 不会越界展示其它工作区(例如 Desktop)的内容。 - 面板顶部显示当前工作区路径;支持「全部 / 图片 / 视频」过滤,缩略图网格展示。
- 点击任一缩略图在灯箱中放大查看图片,或内联播放视频。
组成
| 文件 | 平台 | 职责 |
|---|---|---|
host.js | Host(Node 进程) | 按 args.root 只扫描给定工作区目录(harness.handle('scan'));注册 /__mmv/media HTTP 路由按需返回媒体字节 |
client.js | Client(浏览器页面) | 在 shell.overlay 插槽注册浮动面板与灯箱;用标准 props useSessions 取当前会话 cwd 作为 root,经 host.call('scan', { root }) 拉取索引 |
如何工作
- 工作区定位:Client 用
shell.overlay提供的标准 hookuseSessions读取s.byId[s.current].cwd(当前会话的工作区目录),把它作为唯一 root 传给 Host。 因此切换工作区/会话后,面板自动只显示对应工作区的内容。 - 索引:Client → Host 的
scanRPC 返回{ root, items, count, truncated }。 每个 item 为{ name, rel, path, kind: 'image' | 'video', mime, size }。 - 文件读取:浏览器用
<img>/<video>直接请求/__mmv/media?root=<encodeURIComponent(root)>&path=<encodeURIComponent(绝对路径)>。 Host 先做根目录包含校验(fs.contains(rootTarget, target)),再fs.readBytes后按 正确Content-Type返回字节。二进制不经过 JSON RPC,因此不会触碰沙箱的 UTF-8-onlybtoa。 - 安全边界:路由只允许读取位于请求所带
root目录内、且扩展名属于图片/视频 白名单的文件,避免路径越界读取。
支持的格式
- 图片:png / jpg / jpeg / gif / webp / svg / bmp / avif / ico
- 视频:mp4 / webm / mov / m4v / mkv / avi / ogv / mpeg / mpg
限制
- 动态插件是进程内、临时的:重启 DSH 进程后需要重新
cordis_define+cordis_run。 - 视频整文件读取(未实现 HTTP Range),超大视频(> 256 MB)会被跳过。
- 扫描有深度/数量上限(
MAX_DEPTH = 14、MAX_SCAN_FILES = 800),并跳过node_modules、.git、dist、build等目录。
作为动态插件激活
这两个文件的内容分别对应 cordis_define 的 code.host 与 code.client。在会话中
定义并运行后,刷新页面即可看到悬浮按钮。