多媒体查看器(multimedia-viewer)

August 14, 2026 · View on GitHub

一个 DeepSeek Harness 动态 Cordis 插件:在 Harness 页面内浏览并查看项目结果目录里的 图片与视频。

效果

  • 页面右下角出现一个悬浮的 🖼️ 按钮。
  • 点击打开「多媒体查看器」面板,只扫描当前工作区(当前会话的 cwd)下的媒体文件, 不会越界展示其它工作区(例如 Desktop)的内容。
  • 面板顶部显示当前工作区路径;支持「全部 / 图片 / 视频」过滤,缩略图网格展示。
  • 点击任一缩略图在灯箱中放大查看图片,或内联播放视频。

组成

文件平台职责
host.jsHost(Node 进程)args.root 只扫描给定工作区目录(harness.handle('scan'));注册 /__mmv/media HTTP 路由按需返回媒体字节
client.jsClient(浏览器页面)shell.overlay 插槽注册浮动面板与灯箱;用标准 props useSessions 取当前会话 cwd 作为 root,经 host.call('scan', { root }) 拉取索引

如何工作

  • 工作区定位:Client 用 shell.overlay 提供的标准 hook useSessions 读取 s.byId[s.current].cwd(当前会话的工作区目录),把它作为唯一 root 传给 Host。 因此切换工作区/会话后,面板自动只显示对应工作区的内容。
  • 索引:Client → Host 的 scan RPC 返回 { 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-only btoa
  • 安全边界:路由只允许读取位于请求所带 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 = 14MAX_SCAN_FILES = 800),并跳过 node_modules.gitdistbuild 等目录。

作为动态插件激活

这两个文件的内容分别对应 cordis_definecode.hostcode.client。在会话中 定义并运行后,刷新页面即可看到悬浮按钮。