dsh-document-drop
Document drag-and-drop plugin for DeepSeek Harness: PDF/Word/Excel/text auto-parsed with dual-track context (inline + doc_read), native WinRT OCR for scans. Zero upstream changes, hot-injectable. | DeepSeek Harness 文档拖拽读取插件:PDF/Word/Excel/文本自动解析,双轨上下文(内联 + doc_read 按需检索),扫描件原生 WinRT OCR。零修改上游,运行时热注入。
- Stars
- 1
- Language
- TypeScript
- Created
- Sep 5, 2026
- Updated
- Sep 5, 2026
Introduction
简体中文 | English
@dsh-external/dsh-document-drop
DeepSeek Harness 文档拖拽读取插件(hybrid:Cordis Host + Web Client UI)。 拖入 PDF / Word / Excel / 文本自动解析进对话:轻量文档内联注入,大型文档挂载工作区
doc_read工具按需检索;扫描件自动走 Windows 11 原生 WinRT OCR(中英双语), 页面高清原图可供多模态模型read_image调阅。零修改 DSH 上游,运行时热注入。
安装(DSH 用户)
方式一 · 官方装配(生产态,重启后由 bundles 接管):
# 下载 Release 的 tgz 解压得到插件目录(含 lib/ 与 scripts/),然后:
dsh plugin --profile web add <解压目录>
# 或 git 仓库直装(仓库需含预构建 lib/,本仓库 Release tgz 已含):
dsh plugin --profile web add github:Su2uka111/dsh-document-drop
方式二 · 运行时热注入(开发态,免重启;需环境已常驻 dsh-super-injector):
对 DSH 里的 AI 说:dev_inject_plugin <解压后的插件目录>
环境要求:Windows 11(阶段 5 扫描件 OCR 依赖系统内置 WinRT
PdfDocument/OcrEngine与 PowerShell 5.1;非扫描件功能不受此限制)。DSH ≥ 0.1.0-rc.5。
安装后拖一个 PDF/DOCX 进聊天窗口即可看到输入框上方的文档胶囊。
由 dsh-super-injector dev_scaffold_plugin 形态规范生成,按
plan/DeepSeek-Harness-文档拖拽读取插件开发计划.md 分阶段实现。
阶段进度
- 阶段 0(已交付):hybrid 骨架 + 双端打包 + 注入链路。
Host:日志探针(启动 + 心跳)+ hello API(
GET /dsh-document-drop/api/hello|probe)。 Client:模块装载骨架(ModuleLoader bundle)。 - 阶段 1(已交付):捕获阶段拖拽拦截(
stopImmediatePropagation截断原生 InputBar 图片白名单报错,图片原样放行)+conversation.input.dock文档胶囊栏 (PDF/DOCX/XLS/TXT 徽章、体积、[×] 移除)+ 会话隔离暂存 Store。 - 阶段 2(已交付):Host 存储与解析流水线。
POST /dsh-document-drop/api/doc-drop/upload:裸字节流 + 元数据头 (x-dd-session-id/x-dd-file-name),硬上限 50MB。- 存储:会话 cwd(
ctx.get('sessions')→SessionHeader.cwd)优先, 落盘<workspace>/.dsh/attachments/<sessionId>/<safe-name>, 返回相对工作区的 POSIX 路径;无会话回退~/.dsh/attachments/<sessionId>/; 文件名白名单化 + 同名内容哈希防覆盖 + 写入路径围栏。 - 解析:PDF(unpdf,逐页文本 + 扫描件检测:<50 有效字符或页均 <10 判 scanned → HTTP 422)/ Word(mammoth → Markdown)/ 表格(SheetJS,Sheet 元数据 + 字段头 + 前 50 行 Markdown 预览,>1000 行强制 mounted)/ 文本(UTF-8)。
- 双轨研判:inline 当且仅当字符 < 3,000 且体积 < 15KB(表格按 Markdown 序列化体积判轨,规避 SheetJS zip 基线开销误判);否则 mounted 返回摘要。
- 30 项单测全绿(样本现场合成:txt/xlsx/docx/pdf/扫描件/存储安全)。
- 阶段 3(已交付):双轨 Prompt 组装 +
doc_read自主检索工具。DraftAssembler.ts:Enter 捕获富化 +inputActions.submit包装(双保险,取即清防重复拼接);inputActions 缺席的 hero 屏兜底走 Lexical execCommand 写路径(peek → 写 → 成功才清暂存)。doc_read工具:PDF 按页码范围 / 表格按 Sheet+行偏移 / 文本按行窗口;路径物理定位用上传时登记的会话根表(sessionRoots);永不抛出(操作型错误以可读字符串回传)。- 实测:Agent 真实调用
doc_read分节调阅挂载文档并正确概括(两轮回合验证,标记格式与计划书一致)。
- 阶段 4(已交付):端到端验收与稳定性验证(真实 Web 会话全链路)。
- 测试资产生成器:
tests/gen-e2e-assets.mjs(轻量 docx 多级标题+表格 / 15 页 PDF / 3 Sheet 250 行 xlsx / 纯图片扫描 PDF,全部现场合成免外部依赖)。 - Case 1 轻量 Word:inline 胶囊 → 模型 6 秒直接翻译,零工具调用。
- Case 2 大型 PDF:胶囊"已挂载 15页" → 模型调
doc_read精准引用第 5 页核心论点原文。 - Case 3 扫描件:客户端拒收胶囊"扫描件不支持,请转图片",无崩溃。
- Case 4 移除与清空:[X] 移除的文件不出现在外发消息,剩余文件以正确格式进入。
- 零停机热重载:touch lib 产物 → 注入器 watcher 约 1.5s 自动重载(
probe.appliedAt更新、pid 不变、API 不中断);dev_injected_list等价通道确认 active。 - 验收中发现并修复:表格判轨改为行数语义(§5.2.2 >100 行预览+挂载); submit 包装改为渲染期安装(按钮路径无 keydown); 真机实测修复——拦截 drop 后原生图片遮罩(图片拖动到此处即可添加)永久卡屏: 纯文档拖拽在 dragenter/dragover 捕获期阻断原生遮罩状态机(图片拖拽完全放行), 拦截 drop 后补发 dragend 触发原生 reset()(兼容混合拖拽的遮罩收尾)。
- 测试资产生成器:
- 阶段 5(已交付):PDF 扫描件支持增强——拒收升级为「WinRT 光栅化 + 原生 OCR + 视觉/文本双模态」。
scripts/ocr-pdf.ps1:Windows 11 原生 WinRT 适配器(Windows.Data.Pdf.PdfDocument按页渲染 高清 PNG +Windows.Media.Ocr.OcrEnginezh-Hans-CN/en-US 识别),零外部依赖(无 Tesseract/Python)。 必须走 powershell.exe 5.1(pwsh 7 无 WinRT 投影);脚本需 UTF-8 BOM(PS5.1 无 BOM 按 GBK 解码会炸语法)。src/host/parsers/ocr.ts:Node 侧调度器(spawn + 超时 + 结果 JSON 解析),每页结果写侧车缓存 (<image>.ocr.json),重复查询命中缓存不再拉 PowerShell(实测 84ms → 3ms)。- 上传流水线:unpdf 判 scanned 后不再 422——自动 OCR 前两页,返回 200
{ track:'mounted', isScanned:true, pages, ocrEngine, markdown(前两页OCR预览), imagePages[PNG相对路径] }; OCR 失败也回 200 优雅降级(原图仍挂载,可 read_image)。扫描件强制 mounted 防撑爆输入框。 doc_read:扫描件按页返回 OCR 正文 +[该页高清原图路径: @…,多模态模型可使用 read_image 工具查看原件细节]。- 前端:DocChip 扫描件专属徽章「扫描件 N页 (OCR已就绪)」(不再红色错误);挂载标记注明 「含 OCR 文本与页面原图(doc_read 阅读,read_image 查看原件)」。
- 测试资产升级:
tests/gen-e2e-assets.mjs的 test-scan.pdf 改为 System.Drawing 渲染中英文文字 → JPEG → DCTDecode 内嵌(真·可 OCR 扫描件;手写 PDF 注意字典括号配平与间接 Resources 引用)。 - 实测:拖入扫描件 → 徽章就绪 → 发送带 OCR 说明的挂载标记 → Agent 调
doc_read读出 关键发现(中英双语原文)正确回答。
端到端用例复跑
node tests/gen-e2e-assets.mjs # 生成 .tmp-e2e/ 四类资产(含真·可 OCR 扫描件 test-scan.pdf)
# 在 DSH Web 会话拖入资产目录中的文件,按 README 阶段 4/5 用例核对胶囊与回答
构建与注入
npm install
DSH_CHECKOUT=<dsh checkout> bash scripts/build.sh # host(tsc)+ client(tsdown)
npm pack # 产出 tgz
# 注入器环境内(DSH Agent):dev_inject_plugin <本目录>
# 等价 HTTP 通道(web 运行中):
# POST http://127.0.0.1:<port>/super-injector/api/inject {"dir": "..."}
# GET http://127.0.0.1:<port>/super-injector/api/list (dev_injected_list 等价)
scripts/build.sh 自动探测 DSH checkout($DSH_CHECKOUT → 常见路径 →
本机 D:/code/预设/upstream/deepseek-harness),junction 链接 vendor 基线包后
先以 checkout 的 tsc 编译 host,再以 tsdown 打包 client(lib/client.js)。
结构
src/index.ts Host 入口:日志探针 + hello/probe API + POST /doc-drop/upload(扫描件走 OCR)
src/host/storage.ts 工作区存储:.dsh/attachments/<sessionId>/,安全落盘 + 相对路径
src/host/parsers/index.ts 解析调度 + 双轨研判(inline/mounted,表格按行数判轨)
src/host/parsers/pdf.ts PDF:unpdf 逐页文本 + 扫描件检测(有效字符阈值)
src/host/parsers/word.ts Word:mammoth → Markdown
src/host/parsers/sheet.ts 表格:SheetJS,Sheet 元数据 + 前 50 行预览 + 行窗口读取
src/host/parsers/ocr.ts 扫描件 OCR 调度:spawn powershell + 侧车缓存(阶段 5)
src/host/tools/doc_read.ts doc_read 工具:PDF 按页 / 表格 Sheet+行 / 文本行 / 扫描件 OCR+原图
scripts/ocr-pdf.ps1 WinRT 光栅化 + OcrEngine 适配器(阶段 5,需 powershell.exe 5.1 + UTF-8 BOM)
src/client/index.ts Client 入口:拦截器 + 组装器 + dock 插槽注册
src/client/types.ts 文档类型/白名单/分类/格式化(含 isScanned)
src/client/store.ts 会话隔离暂存 Store(useSyncExternalStore 可观察)
src/client/uploader.ts 上传器:字节流 POST + 状态流转 + OCR 字段回填
src/client/CaptureDropController.ts 捕获阶段拦截器 + 蓝色遮罩 + 原生遮罩收尾(dragend)
src/client/DocAttachmentRail.tsx 胶囊栏(空队列返回 null 不占高度)
src/client/DocChip.tsx 胶囊卡片(徽章/文件名/体积/状态/移除;扫描件专属徽章)
src/client/DraftAssembler.ts 双轨 Prompt 组装(Enter 富化 + submit 包装 + Lexical 兜底)
tests/gen-e2e-assets.mjs 端到端测试资产合成(docx/15页PDF/250行xlsx/真·可OCR扫描件)
验收基线(阶段 0-5)
dev_injected_list(或/super-injector/api/list)可见本插件且 host 激活。- 拖入 PDF/DOCX/XLSX/MD:无原生"图片格式不支持"报错,输入框上方浮现文档胶囊。
- 拖入 PNG/JPG:原生图片拖拽行为不受影响。
GET /dsh-document-drop/api/hello返回插件元信息(stage=s5-ocr);Host 日志可见探针心跳。- 拖入扫描件 PDF:不再拒收——自动 WinRT OCR,胶囊「扫描件 N页 (OCR已就绪)」,
发送带 OCR+原图说明的挂载标记,Agent 调
doc_read读出 OCR 正文与高清原图路径。