Nova v3.0.0 与 Chat.nvim v1.9.0 双版本发布

同一天发布两个大版本更新,干脆写在一起。Nova 是 Android 端的 AI 聊天客户端,Chat.nvim 是 Neovim 内的 AI 编程助手。两个项目同步迭代,这次更新都围绕用户体验、安全性和稳定性展开。

Nova v3.0.0:从能用到好用

v3.0.0 是 Nova 迄今最大的一次更新,154 个提交,44 个新功能,62 个 Bug 修复。核心改动集中在三个方面:新功能、性能和模块化。

微信扫码登录

之前的微信登录依赖外部 URL 下载二维码,不稳定且存在隐私问题。这次改用 ZXing 库在本地生成二维码,扫码即连接,移除了手动凭据输入。同时支持通过 API 重新登录,流程比之前顺畅很多。

图片上传与分享

支持多图批量上传到会话工作目录,上传前可编辑路径,带进度条。新增 ShareActivity,从系统分享菜单直接发图到 Nova。上传路径设置统一到会话设置页面,不再用旧版弹窗。

离线语音输入

基于 Vosk 实现完全离线的语音识别,不需要网络。麦克风、发送、停止三个按钮合并成一个 ImageButton,聆听时显示声波动画。Vosk 模型在 CI 中自动下载,不提交到仓库。Android 11+ 的兼容问题也修了,加了 queries 声明。

国际化

完整的中英文双语支持。新增语言设置(系统/英文/中文),Java 代码全面改用 string resources,Vosk 的错误信息也做了国际化。

性能优化

这是本次更新最硬核的部分:

  • 内容指纹机制:基于 created:role:toolcallid:content 生成指纹,相同内容跳过 Markdown 重新绑定。指纹存储从 Map<Long,String> 改为 Set<String>,降低内存开销。
  • DiffUtil 增量更新:替代全量刷新,只更新变化的 item。
  • StableKey 锚点:防止刷新后滚动位置漂移。
  • 滚动暂停机制:用户滚动时暂停刷新,稳定底部对齐。

这三个改动组合起来,消息列表的滚动体验有质的提升。之前刷新会跳位置、卡占位消息的问题全部修复。

模块化重构

ChatActivity 之前承担了太多职责。这次把语音识别逻辑抽取为 ChatVoiceHelper,图片上传逻辑抽取为 ChatUploadHelper,ApiClient 内部类(ChatMessage、ToolCall、Provider)提取为顶级类。代码结构清晰了很多,后续维护和测试都更方便。

其他亮点

  • 会话列表支持搜索、左滑取消置顶、右滑置顶
  • 长按消息支持复制、选择文本、删除,弹窗显示在触点位置
  • 文本选择对话框用 Markwon 渲染 Markdown
  • 检查更新支持自动下载 APK 并安装,更新日志用 Markdown 渲染
  • GFM 表格前自动插入空行,行内代码高度修复,表格长文本 ZWSP 断行

Chat.nvim v1.9.0:API 补全与安全加固

Chat.nvim 这次更新重点是 HTTP API 的完善和安全策略的加强。

HTTP API 增强

新增了几个关键端点:

  • DELETE /session/{id}/messages/{index}:通过 API 删除指定消息
  • GET/PUT /session/:id/upload-dir:配置上传目录
  • POST /session/:id/upload:文件上传
  • bridge/unbridge:会话集成端点

这些 API 让 Nova 和其他客户端能更灵活地管理会话内容。

安全加固

安全方面做了系统性的检查:

  • 阻止所有工具访问 .git 目录
  • 上传路径检查 is_allowed_path,防止绕过 .git 限制
  • 验证上传目标在 allowed_path 范围内
  • 验证 upload_dir 为绝对路径且在会话 cwd 内
  • search_text 相对目录解析基于会话 cwd

核心思路:任何文件操作都不能越过 allowed_path 的边界。

Skills 系统

对技能命令做了安全约束:会话进行中时,阻止 clear、delete、model、provider、cwd、retry 等破坏性技能执行。修复了技能命令因 retry 循环卡在 in_progress 状态的问题。

会话管理改进

  • 首次 :Chat 不再进入旧会话,而是创建新会话
  • 跟踪 cleared_at 时间戳,优化会话排序
  • 通过 HTTP API 删除当前会话时自动切换 TUI 会话
  • headless 模式下 start() 不再自动创建会话
  • reasoning_content 消息即使没有文本内容也会保存

fetch_web 改进

新增 max_length 参数控制截断长度。对非 UTF-8 响应做清洗,防止 NonUTF8Body API 错误。UTF-8 安全截断,避免中文被截断到半个字符。

两个项目的协同

Nova 是 Chat.nvim 的 Android 前端,两者通过 HTTP API 通信。这次同步更新,Nova 新增的图片上传功能直接调用了 Chat.nvim 新增的上传 API,bridge 设置对应 Chat.nvim 的 bridge/unbridge 端点,会话管理的 cleared_at 字段在两端同步实现。

两端的安全策略也保持一致:Nova 的上传路径验证和 Chat.nvim 的 allowed_path 检查形成双重保障。

统计

下一步

Nova 接下来会继续打磨语音输入的准确度和多语言支持。Chat.nvim 侧会完善 bridge 集成生态,让更多工具能接入会话流程。

两个项目都已发布到 GitHub Release,Nova 的 APK 支持应用内自动更新,Chat.nvim 可通过 lazy.nvim 更新。