deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
DSH(DeepSeek Harness)文件预览插件:在 GUI 中浏览工作区文件、预览 Markdown / PDF / 图片 / CSV / 代码,展示当前会话产出/修改过的文件,并可将文件/文件夹拖入对话(插入单行路径)。
English: README.en.md
⚠️ 本插件尚未发布到 npm,
dsh plugin add暂不可用;当前请使用本方式安装。
git clone https://github.com/ld-1101/dsh-file-preview.git
# 将目录链接进 profile 的 node_modules,并在 profile 的 package.json 中:
# 1) dependencies 添加 "dsh-file-preview": "file:<路径>"
# 2) dsh.profile.bundles 数组追加 "dsh-file-preview"
# 然后重启 DSH
安装后完全退出并重新启动 DSH 应用(宿主端插件在启动时加载)。
# 安装到指定 profile(web 或 desktop)
dsh plugin --profile web add dsh-file-preview
dsh plugin --profile desktop add dsh-file-preview
安装后完全退出并重新启动 DSH 应用(宿主端插件在启动时加载)。
C:\Users\...\简历.md),发送即可让 AI 读取「会话产出」列表的数据来自会话事件日志:宿主读取 tool/result 事件中工具结果 JSON 的 locations[].path(与 DSH 自带 deliverables 同源)。注意:若 Agent 通过 run_code 一类的包装工具执行文件操作(不产生 locations),该列表为空——这是平台行为,与原生 deliverables 一致。
宿主端(Node.js) 客户端(Web 壳内 React bundle)
────────────── ────────────────────────────
/file-preview 路由(prefix 注册) ◄─fetch─ 面板组件(__ModuleLoader__ 注入)
roots 工作区列表 ├─ 目录树 / 面包屑 / 多工作区切换
list 目录枚举(目录优先 + 中文排序) ├─ 顶部「本会话产出 / 修改」列表
read 文本读取(5 MiB 上限,截断标记) ├─ 预览视图(MD/PDF/图片/CSV/代码)
raw 二进制原样返回(MIME 识别) └─ 拖拽:dragstart 写自定义类型
session-files 会话产出文件提取 → drop 解析 → 光标处插入路径
└─ 遍历会话事件日志 tool/result 的 locations[].path
(与 DSH 原生 deliverables 同源)
dsh.client 的插件包,将其 client bundle 注入 Web 壳(与官方插件同机制,桌面与 Web 通用)application/x-dsh-file-preview)+ document 捕获阶段 dragover/drop 拦截(dragover 必须 preventDefault 浏览器才允许 drop),原生 setter 写入输入框草稿(React 可控组件兼容),只插入单行路径、不拉取文件内容ctx.sessions.get(id).events 遍历 tool/result,解析 locations,去重、过滤工作区、按修改时间倒序、上限 200 条safeJoin 先规范化 root 再拼接相对路径,逃逸工作区根即拒绝;只读注册工作区dsh-file-preview/
├── lib/
│ ├── index.js # 宿主端:/file-preview 路由(roots/list/read/raw/session-files)
│ └── client.js # 客户端:__ModuleLoader__ bundle(React 组件 + Markdown/CSV 渲染)
├── cordis.patch.yml
├── package.json # dsh.client 声明(platform: web,注入 client-runtime + ui-slots + locale)
├── LICENSE # MIT
├── README.md / README.en.md
└── test/
├── unit-client.mjs # 客户端纯函数单元测试(25 项)
├── smoke.mjs # 基础路由冒烟测试
├── smoke-session.mjs # 会话产出路由测试
├── integration-real-log.mjs # 真实会话日志集成测试
└── run-all.cjs # 一键运行全部测试(可移植,基于脚本自身定位仓库根)
node test/run-all.cjs # 全部测试(语法检查 + 25 项单测 + 冒烟 + 集成)
node test/unit-client.mjs # 仅单元测试(25 项,纯函数,不依赖浏览器)
node test/smoke.mjs # 仅冒烟:基础路由
node test/smoke-session.mjs # 仅冒烟:会话产出路由
改源码后:客户端 bundle 通过 HMR 热更新;宿主端需重启 DSH 应用。
| 问题 | 解决 |
|---|---|
| 「本会话产出 / 修改」列表为空 | 数据来自会话事件日志中 tool/result 的 locations;若 Agent 经 run_code 等包装工具写文件(不产生 locations),列表为空——平台行为,与原生 deliverables 一致 |
| 预览中文乱码 / 显示不全 | 文本读取上限 5 MiB,超限会截断并在面板提示;PDF/图片走 raw 原样返回,请确认文件本身编码 |
| 拖拽没反应 | 需拖到会话界面(非输入框也可),且 dragover 已被插件拦截;若被其他元素抢走 drop,先点一下会话区域再拖 |
| 看不到某个目录 | 只能访问已注册的工作区,工作区外的路径(含路径穿越)一律拒绝 |
| 面板宽度不记得 | 宽度记忆存于 localStorage;双击面板左缘手柄可恢复默认 |
| 其他类型文件打不开 | 预览支持 MD/PDF/图片/CSV/代码文本;其余类型点击后新标签页打开(浏览器决定展示方式) |
| 版本 | 日期 | 说明 |
|---|---|---|
| v0.1.0 | 2026-08-17 | 首个发布版:工作区文件浏览 + 多格式预览 + 会话产出文件 + 拖拽到对话(插入单行路径)+ 25 项单元测试 |
npm publish(需先 npm login)。发布后任何机器可用 dsh plugin --profile <name> add dsh-file-preview 安装dsh-plugin topic,社区目录(Oh-My-DSH 等)会自动同步收录@deepseek-ai/* 包(dsh-client-ui-deliverables、dsh-client-runtime、dsh-client-ui-sidebar、dsh-session* 等)CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。