Repository navigation
Releases: wszhoho/dsh-file-attachment
Releases · wszhoho/dsh-file-attachment
Release list
v0.7.2
v0.7.2
变更
- 聊天区文件图标升级为真实类型图标:文件引用芯片与文件卡片改用宿主共享组件库
@deepseek-ai/dsh-client-ui-primitives的FileTypeIcon(按扩展名渲染,与 dsh 内置附件展示同款),替换原先的通用自绘图标;宿主模块不可用时自动降级回原图标。 - 文件芯片防超宽:长文件名不再撑破消息气泡——芯片最大宽度限制为容器宽度,文件名超出部分显示省略号,悬停仍显示完整路径。
- 芯片垂直对齐修复:图标与文件名在同一水平线居中,芯片与气泡文字垂直居中对齐,消除错位。
v0.7.1
v0.7.1
新增
- 视觉模型配置校验:兜底 VLM 的 Base URL / API Key / 模型名称三项任一缺失时,
describe_image工具与/describe路由统一提示「请正确配置视觉模型(设置→文件附件填写 Base URL、API Key 与模型名称)」,不再静默回退默认端点后报晦涩的连接错误。 - 设置页保存前连通性检验:点「保存」先以表单参数调
POST /dsh-file-attachment/test(最小文本请求,30 秒超时),检验通过才写入配置;失败时配置保持原样,原因红字内联显示在按钮旁。检验期间显示「正在检验视觉模型,请稍候…」。三项全空视为不使用 VLM 兜底(只用文件上传功能),跳过检验直接保存。
变更
normalizeVlm不再对 baseURL / model 回退默认值(空即未配置,可被检测);Base URL 与模型名的原默认值仅作设置页输入框 placeholder 示例。
v0.7.0
v0.7.0
新增
- 附件去重(文件名 + 大小):上传前客户端先调
POST /dsh-file-attachment/precheck查重,命中直接复用已有文件路径、零字节上传(@路径与芯片指向旧文件)。/save侧对绕过预检的直连上传做同名同大小兜底后检,并发竞态下后到者自动收敛为先者路径。索引持久化于.dsh-file-attachment/.index.json(懒加载、原子落盘、损坏自动备份重建),旧文件被手动删除后条目自动失效。精度说明:同名同大小即判重(元数据级),同名同大小但内容不同的文件会被复用——已确认可接受。
变更
- 落盘不再按日期分子目录:由
.dsh-file-attachment/<YYYY-MM-DD>/<文件名>改为平铺.dsh-file-attachment/<文件名>;同名不同内容以-N序号共存。历史日期子目录不迁移,旧@路径引用保持有效。
v0.6.4
v0.6.4
性能
- 上传链路改为原始字节流直传:
/save协议由「JSON + base64」改为「元数据走查询参数(name/sessionId URL 编码)+ 请求体即文件字节流」。客户端saveFileToHost直接提交 File/Blob,由浏览器原生分块流式上传,删除手写bytesToBase64;大文件上传明显更快、界面不再因整文件转码卡顿。服务端流式落盘:先以独占方式写临时文件,边收边计数,超过 50MB 立即中断并清理残留(返回 413),完成后原子占用最终文件名。 - 附件条缩略图改由 canvas 生成:输入框内联预览不再把整张原图的 base64 常驻内存,而是绘制 ≤256px 缩略图(PNG 保透明、其余输出 JPEG),解码失败自动回退类型图标;GIF 显示首帧静态图属预期。
修复
- 同名并发保存不再互相覆盖:落盘由「先探测存在再写入」改为
open('wx')独占创建 +EEXIST递增序号重试,消除竞态——同一天重复拖入同一文件稳定得到a.png/a-1.png/a-2.png,原件绝不被顶掉。 describe_image错误提示中文化:文件不存在 / 无读取权限 / 指向目录 / 空文件等情况给出明确中文提示(如「图片文件不存在:<路径>」),不再向模型抛出 Node 原始报错(ENOENT: no such file or directory…)。describe_image增加大小前置拦截:识别前先stat,非普通文件、空文件、超过 20MB 的图片在读取之前直接拒绝,避免超大文件整体读入内存转 base64。
变更
- 内部重构:图片与文档两条入口共用的 chip 插入逻辑收敛为单一函数,消除约百行逐字重复代码,行为不变。
v0.6.3
v0.6.3
变更
- 图片落盘前最大分辨率上限 640 → 900:上传/粘贴图片在落盘前的等比缩小阈值由「宽或高任一边 >640」调整为「>900」——两边都不超过 900 时原样保留,更大的图也只缩到 900,聊天预览与放大查看时更清晰。GIF 仍原样保动画、PNG 仍保透明、其余格式缩放后按 JPEG 输出,处理逻辑不变。
v0.6.2
修复
- 模型切换后门控仍按旧模型判定:
agent.options只是创建时的快照,不会随model/selection更新(实际选择是经 waterfall listener 注入请求的可变 selection)。上一版evaluate()只读 options,导致会话默认多模态模型时 deny 了describe_image,切到纯文本模型后仍按旧值维持隐藏。现evaluate(agent, sel?)按三级优先级取权威路由:durablemodel/selection事件的 data >session.requestHeader().config(最近一次请求的实际路由)>agent.options(仅创建兜底);并新增[dsh-file-attachment] vision-gate: <model> cap=<…> deny=[…]诊断日志,能力判定过程可直接在运行日志核对。
v0.6.1
修复
- 纯文本模型不再出现
read_image报错:0.6.0 的门控只隐藏了多模态会话的describe_image,但纯文本会话里 host 原生read_image仍然可见——模型误调它必然抛「model does not declare image input」错。现改为对称双向门控:明确声明不含image输入的会话同时对该 agentrestrict({ deny: ['read_image'] })(该工具对其毫无用处),仅留describe_image作 VLM 兜底;支持图片的会话仍隐藏describe_image;能力未知(catalog absent / 查询失败)时两边都不动。deny 集随模型切换原子互换,disposer 幂等管理。设置页提示文案同步更新。
v0.6.0
新增
- describe_image 多模态能力门控:会话开始(
agent/created)与模型切换(session 事件model/selection)时,经llm.resolveModelInfo()读取所选模型的inputModalities;声明支持image输入的会话通过agent.ctx.tools.restrict({ deny: ['describe_image'] })仅对该 agent 隐藏该工具(模型改用原生read_image直接看图,不再中转 VLM),纯文本或能力未知的会话保留该工具作 VLM 兜底。隐藏为 scoped 操作,不影响其他会话;disposer 幂等管理,agent 销毁随 scoped world 回退。设置页提示文案同步更新。