Su2uka111/dsh-document-drop1

@dsh-external/dsh-document-drop

DeepSeek Harness 文档拖拽读取插件:捕获阶段接管文档拖拽(PDF/Word/Excel/文本),双轨(Inline/Mounted)上下文注入与 doc_read 自主检索

包名
@dsh-external/dsh-document-drop
版本
0.1.0
许可证
BSD-3-Clause
最近更新
2026年9月5日

安装

此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗

简体中文 | 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)优先, 落盘 /.dsh/attachments//, 返回相对工作区的 POSIX 路径;无会话回退 ~/.dsh/attachments//; 文件名白名单化 + 同名内容哈希防覆盖 + 写入路径围栏。
    • 解析:PDF(unpdf,逐页文本 + 扫描件检测:1000 行强制 mounted)/ 文本(UTF-8)。
    • 双轨研判:inline 当且仅当字符 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.OcrEngine zh-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 解析),每页结果写侧车缓存 (.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= bash scripts/build.sh   # host(tsc)+ client(tsdown)
npm pack                                            # 产出 tgz
# 注入器环境内(DSH Agent):dev_inject_plugin 
# 等价 HTTP 通道(web 运行中):
#   POST http://127.0.0.1:
/super-injector/api/inject  {"dir": "..."}
#   GET  http://127.0.0.1:
/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//,安全落盘 + 相对路径
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 正文与高清原图路径。