Skip to content

Releases: linkingoscar/dsh-attachment-formats

v0.6.4

Choose a tag to compare

@linkingoscar linkingoscar released this 15 Aug 11:00

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

Choose a tag to compare

@linkingoscar linkingoscar released this 15 Aug 10:27

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

Choose a tag to compare

@linkingoscar linkingoscar released this 15 Aug 09:20

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

Choose a tag to compare

@linkingoscar linkingoscar released this 15 Aug 08:56

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 · 自适应引擎 · 缓存管理

Choose a tag to compare

@linkingoscar linkingoscar released this 15 Aug 08:10

相对 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 全文命令

Choose a tag to compare

@linkingoscar linkingoscar released this 15 Aug 07:42

首个发布版本(对应仓库早期提交)。

特性

  • PDF 文字层提取(pymupdf4llm ≤40 页高保真 / pdfjs 兜底)+ 扫描件 OCR(tesseract.js 置信度门控)
  • Codex 式文档卡片挂载:输入框保持干净,发送瞬间合并进消息
  • 长文档转存工作区 .dsh-attachments + 索引卡 + 聚合 INDEX.md,永不静默截断
  • 上下文自适应并入上限(token-meter contextPressure 投影)
  • /attach list|full 命令(next-step 全文并入上下文)