Releases: linkingoscar/dsh-attachment-formats
Releases · linkingoscar/dsh-attachment-formats
Release list
v0.6.4
v0.6.4 — 会话归属正确 + 零拷贝哈希校验
把本地自 v0.6.3 以来的修复合并为一次发布。
附件会话归属(修复「附件跑到别的对话框」)
- 文本/文档卡片的归属改按 shell 当前会话解析(sessions.list 快照的 current,
与浏览器标题同源):按钮路径用按钮自身 sessionId,拖放/粘贴用当前会话,
插槽单例仅作最后兜底——chips 打标、合并/移除、cwd、零拷贝、上下文预算
全部跟随同一解析 - 转换图片在合成 drop 前等待当前会话空闲(input phase 为 adjudicating/
submitting 视为忙,最多 15s),不再因「当前会话忙时拒绝、其它空闲会话
接住」而流到别的对话;README 补充多会话并存的 Harness 原生限制
工作区零拷贝同源校验
- 不再把「文件名+字节数」当作同源:浏览器本地读文件计算完整 SHA-256,
host 在 name+size 候选上逐字节比对哈希才返回引用;无哈希直接拒绝判定——
同名同大小的不同内容不再被静默替换 - 512KB~16MB 尝试零拷贝;>16MB 明确拒绝(产品边界,README 如实标注)
缓存与 INDEX
- INDEX.md 单元格转义(管道符/反斜杠/换行),文件名不再炸裂表格
- INDEX 重建按工作区串行化(per-root async queue),并发写请求不再互相覆盖
- 缓存命中回传 sourceCharCount/sourceLineCount:命中与重新转换的响应 shape
一致(cache-transparent) - legacy Office(.doc/.xls/.ppt)manifest 直接标注 libreoffice+builtin 引擎,
/attach list 等读 manifest 的口径一致
门禁
- 新增冒烟:SHA-256 同源命中/同名同大小内容区分/无哈希拒绝、INDEX 转义、
缓存命中保留 source 口径、会话路由(切到其它会话后 Enter 不合并本会话芯片) - CI(Node 20/22,actions v7)全绿
v0.6.3
v0.6.3 — 缓存生命周期加固
针对 v0.6.2 缓存重构遗留的迁移死角与口径问题逐项收口。
迁移与生命周期
- v0.6.1 遗留的 8-hex 缓存目录:active 查找仍只认 16-hex,但 cleanupCache / clearCache 会识别并直接删除这些目录——不再有"不会命中、不在设置页、不清 TTL、清空也删不掉"的不可见孤儿
- INDEX.md 改为全量重建(每次 write/delete/TTL cleanup 后从合法 manifest 重新生成):设置页删除与 TTL 清理后不再残留 ghost 行,旧 sha-8 记录随重建自然消失;修复"转存时间"列恒为空的问题(此前 createdAt 未传入)
- manifest / INDEX 写入改为原子写(临时文件 + rename),消除并发读半截文件的缓存命中抖动
尺寸口径
- JSON 转存区分 sourceCharCount/sourceLineCount(上传源文本)与 charCount/lineCount(落盘 doc.* 实际尺寸):索引卡与 delivery tier 一律用产物口径——70k 单行压缩 JSON pretty 成 120k 后,缓存命中也不会再被误判为可直插
惰性页面图状态机闭环
- 同一 PDF 第一次高预算直插(不渲染页图),之后低预算命中缓存降级为 index 时,此刻才补生成 pages/ 并回写 manifest——同输入同最终 tier 的能力不再依赖首次解析时的历史状态
legacy Office 缓存语义
- .doc/.xls/.ppt 的缓存键改为用户上传的原始 OLE 字节:命中直接复用转换产物、跳过 LibreOffice;引擎标记 libreoffice+ 在命中路径同样生效
门禁
- 新增冒烟:sha-8 遗留目录 cleanup/clear、JSON 产物口径与缓存命中分流、直插→低预算命中惰性补页图、INDEX ghost 行与转存时间
- CI(Node 20/22)全绿
v0.6.2
v0.6.2 — 缓存正确性与快路径修复
修复上一版 CI 门禁暴露的问题,并把内容寻址缓存升级为真正的 correctness cache。
CI
- 修复 CI 唯一红灯:无 traineddata 时 smoke:ocr 的缓存目录计数对 ENOENT 返回 0
- actions/checkout、setup-node 升级到 v7(消除 Node 20 runner 弃用告警),Node 20/22 双矩阵全绿
缓存正确性
- 缓存目录 id 从 8 hex 升到 16 hex(64 bit 碰撞空间);manifest.sourceHash 存完整 SHA-256,命中时严格相等——短 id 碰撞不再同时击穿两边
- 新增转换策略指纹 converterFingerprint(schema + 插件版本 + 引擎/OCR/doc-server 策略 + 外部二进制可用性):切换引擎或 OCR 配置后旧缓存自动失效、重跑当前引擎,不再吃到昨天的 tesseract 结果
- manifest 不再缓存索引卡字符串,只存结构化 metadata;缓存命中时永远用当前文件名重建索引卡——字节相同的不同文件不再显示串名
- schema 升到 v2,旧缓存自动失效重解析
性能与产品
- 小 PDF 快路径:直插结果不再先整本光栅化页面图;页面图惰性生成,只有走索引卡路径才渲染
- 2–16MB 的文本文件(工作区零拷贝未命中时)不再被浏览器 2MB 上限拒绝,直接交主机 text-cache 全量落盘;>16MB 才拒绝
- TTL 语义对齐「未访问」:cleanup 纳入主文档 atime/mtime,模型直接用 read 工具读 doc.md 也算访问;文案改为「约 7 天未访问」
工程化
- 消除 CacheSettings/AttachDock 的 React key 警告,smoke-client 新增 key 警告门禁
- engines 提升到 Node >=20,与 CI 验证矩阵一致
- 新增门禁:缓存身份(16 hex/完整哈希)、atime 续期、同字节换引擎不命中旧缓存
v0.6.1
v0.6.1 — 正确性修复版本
针对代码评审发现的缺陷逐项修复,并补齐工程门禁。
修复(P0 正确性)
- 附件条崩溃:补回 useCallback 解构引用,dock 组件不再运行时抛错
- 转换器移除 capText 预截断,全文落盘索引卡,端到端恢复「永不静默截断」
- 路由统一由 host 会话派生工作区(sessionCwd),客户端 cwd 仅作提示,未知会话返回 400
- XLSX 改为矩形网格按列补齐,修复空列导致的坐标漂移
- 缓存升级为真转换缓存:解析前按源文件哈希命中,manifest 记录 sourceHash/schemaVersion
- 缓存 TTL 以 manifest.lastAccessedAt 为准(读取时 touch)
- 合并进草稿后回读校验,失败报错并保留文档卡片,消除 DOM 桥静默丢失
工程化
- ESLint 9 平铺配置 + lint 脚本(no-undef 门禁,可拦截此类钩子引用缺失)
- CI(GitHub Actions,Node 20/22:npm ci + lint + 全量冒烟)
- 冒烟测试升级:SSR 真实挂载四个客户端组件、缓存命中增量断言、P2 路由隔离
v0.6.0 — 格式覆盖 · 云 OCR · 自适应引擎 · 缓存管理
相对 v0.5.0 的合并发布。
保真度与格式覆盖
- DOCX 表格保留为 Markdown 管道表(mammoth HTML → turndown + GFM)
- TIFF 转 PNG(sharp,多页 ≤20);epub/odt/rtf(pandoc 探测 + zip 兜底)
- 旧 .doc/.xls/.ppt(LibreOffice headless 探测)
- PDF 书签目录优先作为索引卡大纲
云端 OCR 与引擎
- 百度 OCR API:免费额度 1000 次/月(个人认证),配额耗尽自动回退本地 tesseract.js
- 远程 VLM OCR(OpenAI 兼容视觉端点,DSH_ATTACH_VLM_*)
- 外部文档解析服务(DSH_ATTACH_DOC_SERVER,PP-StructureV3/MinerU 等)
- 内容自适应:41-160 页按向量密度决策,纯文字手册直走 pdfjs 秒级引擎
管理与零拷贝
- 设置 → 附件缓存:逐条删除/全部清空
- 工作区零拷贝:>512KB 文本文件按名+大小解析同源路径,不上传字节
v0.5.0 — 文档卡片 · 索引卡 · /attach 全文命令
首个发布版本(对应仓库早期提交)。
特性
- PDF 文字层提取(pymupdf4llm ≤40 页高保真 / pdfjs 兜底)+ 扫描件 OCR(tesseract.js 置信度门控)
- Codex 式文档卡片挂载:输入框保持干净,发送瞬间合并进消息
- 长文档转存工作区 .dsh-attachments + 索引卡 + 聚合 INDEX.md,永不静默截断
- 上下文自适应并入上限(token-meter contextPressure 投影)
- /attach list|full 命令(next-step 全文并入上下文)