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 更新。