Cordy for Chrome

更新日志·测试版

本页同步产品仓库中的更新日志,不代表下载版本或公开发布记录。 阅读产品文档。

v2.4.5最新源码条目2026-09-10

聊天输入

  • 生成过程中输入框保持可输入:按 Enter 默认把消息排入队列(单槽,重复排队即替换),回答结束后自动发送;输入框上方的排队条可「立即发送」(打断当前回答后发出)或「移除」。发送按钮在生成中拆为「排队」与「停止」两个控件。
  • /summarize-tabs 等带 @ 引用的发送在读取页面内容期间显示等待态并锁定发送按钮与输入框;单个标签页正文读取加 4 秒超时,超时后降级为仅元数据。
  • 新增 /solo [on|off] 命令(别名 /single-turn)切换当前对话标签页的单轮模式,与工具栏图标同步;修复带 @ 引用 chip 时 /clear/solo 等系统命令被当作普通消息发送给模型的问题。

稳定性

  • 引入轮次边界原语:排队发送严格等到上一轮完成落库后才派发,工具审批续跑与重新生成同样计入;发送/停止消息携带序号,迟到的停止不再误杀新一轮回答。
  • 被动同步窗口(未发起本轮的侧栏)的停止按钮现在会真正停止后台生成。

性能

  • 标签页 → 历史列表改为虚拟滚动,搜索输入不再因上千行重渲染而卡顿;历史查询与书签网格/标签视图的搜索均加 200 毫秒防抖。
v2.4.42026-09-10

侧栏导航

  • 固定主导航入口顺序并高亮当前页面;激活入口在图标右侧显示页面名称,聊天历史继续归属于聊天。
  • 恢复紧凑的图标、按钮和间距。激活动画仅显露文字,图标与按钮不再放大缩小;适配键盘操作、RTL 和减少动态效果设置。
  • 使用连续矢量轮廓连接激活入口与页内工具区,修复放大后的圆角接缝,确保 hover 背景位于边框下方。
  • 修复页面切换时已关闭提示浮层因锚点隐藏而短暂撑宽页面的问题,保留正常提示的关闭动画。
  • 将「当前/历史/稍后/收藏」四个子导航图标放在页内工具区右侧,以选中下划线区分层级;侧栏统计使用数字与对应图标。

主题与字体

  • Sidepanel 和 Dashboard 设置页均提供外观设置,可分别选择浅色、深色主题并跟随系统切换;设置即时保存并跨页面同步。
  • 提供经典浅色、暖纸、Catppuccin Latte、经典深色、Ember、Catppuccin Mocha、Nord、Dracula 八款主题。
  • 提供系统默认、霞鹜新晰黑、霞鹜文楷和悠哉字体(Frex Sans)四种字体选项;内置字体离线加载并附带完整许可证。
  • 界面与正文使用所选字体,代码保持等宽,保留现有字号、行距和导航尺寸;新标签页壁纸继续独立设置。
  • 增加 ? 外观说明及仅恢复外观的默认设置操作;补齐 12 种语言和窄屏布局,并支持备份恢复主题与字体选择。
v2.4.32026-09-08

2026-09-09 重新发布:补齐首次发布中遗漏的数据清理与界面任务。

🔖 数据清理与界面补齐

  • 数据管理保留书签:全部清理和选择性清理均不再删除任何书签数据或 Chrome 书签;移除书签清理选项及后台能力。书签管理中的具体条目操作继续可用,API 密钥仍单独选择是否删除。
  • 修复危险操作按钮的文字颜色;没有聊天记录时仍可打开应用数据清理入口。修复 API 密钥删除选项未正确传递到服务的问题;确认文案与隐私说明明确书签保留范围。
  • 侧栏全局图标与「当前/历史/稍后/收藏」改为两行,四个标签等分宽度,解决窄侧栏中末项被截断的问题。
  • 书签侧栏将右侧工具收为「刷新、视图、更多」,在菜单内选择树/标签/网格及对应排序或折叠操作,保持触发按钮位置稳定。
  • 命令面板使用 Cordy 的浅色、深色及系统主题颜色,在搜索行显示本地 logo;修复 Escape 关闭后松键事件传到宿主网页的问题。
  • 为概览、搜索、AI 管理、浏览历史、稍后读、书签管理和设置补齐页面标题,保留收藏、翻译与对话历史标题。

🎛️ AI 配置

  • 设置页改为可搜索的服务商目录与单个配置编辑区,「功能模型」独立为标签页;保留密钥安全存储、失焦保存、连接检测和自定义模型配置。
  • 移除重复的 AI 标题和引导文字,在密钥、连接检测、API 地址与模型选择等位置增加 ? 帮助按钮;支持键盘关闭和焦点恢复,补齐 12 种语言及窄屏 RTL 布局。

💬 回答版本与对话分支

  • 支持生成、预览和切换回答版本,保留原有历史链;从某条回答继续或编辑提问时,创建上下文隔离的独立对话分支。
  • 回答版本覆盖前台、后台保存与流恢复;生成时可停止,未完成的候选回答不会自动替换当前版本,搜索可定位非当前回答。
  • 首次打开使用云端模型的聊天面板时主动展示隐私同意提示;尚未发送消息时,确认按钮显示「同意」。

🌐 翻译与本地 AI

  • 翻译工作台记住运行方式、源语言、目标语言及上次选择的云端和浏览器本地模型,关闭页面或切换本地/云端后仍保留设置。
  • 云端翻译不再按输入长度设置输出上限,避免推理模型因额度过小而截断;分段失败会显示原因与段落编号,并写入后台日志。
  • Gemma 翻译根据已加载模型的上下文窗口和实际提示词长度计算生成上限,解除此前固定 1,024 token 的限制。

⌨️ 交互与稳定性

  • 命令面板、划词菜单和浮动卡片的键盘事件与宿主页隔离,避免输入时触发网站快捷键;修复模型选择器弹出搜索框的键盘输入。
  • 修复命令菜单关闭期间点击穿透到下层按钮,以及键盘选择与鼠标悬停同时产生高亮的问题。
  • 快捷键监听在扩展后台启动时同步注册;无法打开命令面板时,在设置页解释页面类型或站点权限原因,快捷键帮助使用本地化名称。
  • 修复划词结果中嵌套标记的清理、浮动卡片定位与窄屏适配,以及拖动、调整大小和键盘焦点交互。
  • 升级至 AI SDK 7.0.93、Vitest 5 及相关依赖,适配流式错误报告并补充回归验证。
v2.4.22026-09-04

自 v2.4.1 起 95 commits · 706 files · +80,691 / −13,948。三条主线: 🎛️ 统一模型选择器(ModelPicker)与 provider 状态真源化 · 🛡️ 对 2026-08-17 现代化升级方案的 100+ 条缺陷逐条收口(含多条安全 / 数据丢失级修复)· 📦 装机包 50 MB → 32 MB,React 彻底移出 service worker。

⚠️ 破坏性变更minimum_chrome_version 从 142 抬到 148(Chrome 内置 Prompt API 在 148 才整体落地),Chrome 142–147 将无法安装本版本

⚠️ 用户可感知的行为变更:自动清理默认从「自动删」改为「仅提示」并新增开关; 「删除所有数据」现在真的会删掉书签镜像 / 收纳标签页 / 日志 / AI 设置,API 密钥单独勾选; 书签删除(健康页 / 侧栏)一律连 Chrome 一起删;死链检测在未授权站点时一个请求都不发; 撤销站点访问后,页面内残留的内容脚本再也无法调用云端 AI / TTS / 读取正文; 翻译槽位不再提供 Ollama / LM Studio 等本地网关。

🎛️ 统一模型选择器与 Provider

  • 统一 ModelPicker:Dashboard 四个文本 slot、Sidepanel 设置、翻译工作台与聊天 composer 统一使用一个双层面板选择器;provider/source 状态、目录错误/重试、本地浏览器与 local-native 模型共用同一数据边界(useModelPickerData),12 语种文案齐备。旧 model-selector.tsx 与 TTS fallback 删除。设计与验证范围见 docs/reviews/2026-09-02-model-picker-unification.md
  • Provider 状态一致性:内置与自定义 provider 卡片复用 SourceStatusBadge 与同一状态解析器;探活互斥改为集合,过期 checking 不再永久锁死 Detect;幽灵密钥问题优先于短期健康缓存;写入 key 后立即失效健康缓存。内置 provider 改用 vendored 品牌 logo。
  • 价格口径统一为 USD/1M tokensModelInfo.pricing(USD/1K + unit)改为 ModelInfo.pricePerMTokens,选择器里的单价不再差 1000 倍;contextWindow 为 0 时归一;anthropic / google / xai 改为真实鉴权发现。旧 modelCache 行整行判为失效并重新拉取——升级后首次打开模型列表,价格会短暂缺失,直到目录刷新完成
  • AI 设置目录三态 + 修订哨兵:provider-keyed 目录 idle / loading / ready 三态,快照与迁移共用一套校验;唯一 slot 写入器杜绝并发写互踩。
  • local-native:端点变更即重置发现结果,网络类失败保留已知模型列表。

🌐 翻译

  • 同语言直通:源 = 目标(含 auto 检测撞上目标)时恒等直通,不再让 Chrome Translator 拒绝创建、也不再让云端 / 本地模型为恒等改写白白计费;zh-CN ↔ zh-TW 明确排除在直通之外。
  • 语言撞车自动交换 + ⇄ 交换按钮;原生 <select> 换 base-ui Select;原文 / 译文改为可拖拽分屏(宽屏左右、窄屏上下,比例持久化,双击复位)。
  • 翻译工作台切到 ModelPicker,槽位真源化、写入互斥、本地网关 fail-closed;目标语言不再写死 zh-CN,zh-CN / zh-TW 不再被砍成同一个 zh;单块失败不再拖垮整篇,译文不再被静默截断,任务不再变成孤儿。

🔖 书签与收纳

  • 当前页收藏指示:per-tab badge 呈现收藏态(SPA 路由也能判定),侧栏当前页条带一键收藏 / 撤销 / 多重命中 / 仅本地 / 孤儿降级全状态机;localBookmarks 新增 normalizedUrl 派生索引(Dexie v5 自动回填)。
  • 侧栏书签树:headless-tree + 虚拟化,展开态按稳定键持久化,键盘导航与 RTL 镜像。
  • 收纳启动页提速:预载改为路由 chunk 就绪后空闲串行执行,favicon 改走本地 _favicon 端点(零网络、离线可用),展开态持久化、收纳后新卡定位高亮;e2e 断言收藏页零非扩展源请求。
  • 全量同步只重建 Chrome 镜像且整体落进一个事务;同步历史不再无限增长;收纳 / 恢复不再静默丢链接;JSON 导入不再把嵌套文件夹打平到根;收纳后关不关标签页由用户说了算;书签与聊天同步不再互相踩,跨根跳转不再静默无效。

💬 对话面板

  • 用户消息原样渲染(不再被 Markdown 折行 / 吞掉 <think> 字样);/clear 原地重置而非跳到最右端;斜杠命令菜单补齐候选项。
  • 追问和重新生成不再对着一个看不见的页面编摘要;删中段消息不再断链,备份带上根层分支选择;「在聊天中继续」改走 canonical 写路径,回复不再永远看不见;只有附件的发送不再整轮消失;Enter 提交的是自己那个会话的表单;@-mention 弹窗说发了多少就真发了多少。
  • 模型终于看得见自己调过什么工具(transport 层补齐 tool-call / tool-result 回填);内联 AI 卡片不再永远转圈,停止按钮在 SW 重建后仍然管用。
  • 面板开关状态改用原生 sidePanel.onOpened / onClosed,不再推断。

🧠 本地 AI 与 TTS

  • 移除 @browser-ai/transformers-js,Chrome 内置 AI 四个全局改用 @types/dom-chromium-ai 自实现 provider;修好 local-native 三处硬缺陷;Chrome AI 初始化覆盖全部四个 API。
  • 本地对话装载期发出进度帧,看门狗不再把冷启动当成死流。
  • Kokoro 朗读修复:voice pack 字节数校验写错(511 vs 实际 510 行),此前每一次 Kokoro 朗读都被拒;没有句号的长文本不再念到一半就没了;声音终于停得下来(内容侧按钮 + 后台侧孤儿 run);云 TTS 不再永久转圈。

🛡️ 安全与隐私

  • 撤销站点访问后,页面内孤儿内容脚本再也发不动云端 AI(新增 requireHostAccess 门,覆盖划词工具条 / 内联 AI / 正文读取 / 内容侧 TTS)。
  • 内容脚本不能再把进行中的对话读走;工具读到的 URL 也脱敏了,不只是 @-mention;主密钥丢失时如实报错,不再静默铸一把新的。
  • 破坏性操作 token 的 docstring 不再自称「双重防护」,内联 payload 有了真上限;死链检测不再向未授权站点发请求。

🗄️ 存储与数据

  • 自动清理装上护栏:默认「仅提示」、可关闭、delete 模式删完会告诉用户;此前它以 origin 级用量(含数 GB 本地模型权重)作为停止判据,会把整个聊天历史删空。
  • 「删除所有数据」覆盖 5 个存储域与 exportAllData 对称;/clean 不再无声清站点数据,命令失败终于看得见。
  • 日志:redactSensitive 补 Error 分支救回 318 个调用点的错误信息,导出的日志带上错误消息;历史搜索保留最新命中并如实说明截断。

📦 性能与包体

  • ORT 换 jspi 变体(−9 MB),shiki 改 19 语种 + 2 主题白名单(再 −9 MB):装机包 50 MB → 32 MB;删掉零引用的 jsep.mjs
  • React 与 zustand React 版从 service worker 依赖图彻底摘出(5 个 store 改走 vanilla);SW 甩掉 73 KB 死 provider 与三个远端 URL;45 KB 模型窗口表移出侧栏首屏。
  • 构建期 modulepreload 策略首次真正接入 Vite,只守护必须保持懒加载的 chunk,并由 post-build 静态闭包不变量测试兜底。

🎨 UI 与 i18n

  • 内容脚本字号配置终于生效;阿拉伯语方向传得进 base-ui;壁纸点了有反应;@tab 空查询有结果;toast 不再白底。
  • 双 i18n 运行时收敛为一套;内部英文错误串不再直接渲染给用户;送审文档与设置页不再描述不存在的功能。
  • 拆掉 Tailwind v3 插件与两处对抗框架的写法。

🧰 工程、闸门与依赖

  • 闸门:体积预算真的评估刚构建的产物;chrome 边界换成 oxlint 原生规则;静默失败棘轮能看见注释-only 的 catch;oxfmt 格式化接进闸门;exhaustive-deps 清零并打开成 error,react-compiler 立 --max-warnings 棘轮;覆盖率棘轮等三关接进 CI,check:docs 补进发版路径;17 个 colocated spec 纳入类型检查;纯逻辑用例改跑 node 环境。
  • 删掉从未混淆过的「混淆构建」;三套 analyze 工具收敛成一条;.gitattributes 钉死 LF;显式配置供应链发布延迟策略。
  • 依赖:两批共 32 包升级(shiki 4、oxlint 1.79 拆分 react-compiler 插件、oxfmt 0.63 等);两份逐字相同的 EventEmitter 收敛。
  • 文档:《2026-08-17 现代化升级方案》与逐条执行台账、剩余 86 条复核、书签三专项方案、模型选择器统一方案与三轮评审归档在 docs/reviews/
v2.4.12026-08-13

一轮六阶段的测试加固:用例 1,668 → 2,847,新增 55 条真实浏览器 E2E, 覆盖率 41.8% → 59.2%(旧口径报的 56% 是虚高的,见下)。期间修复约 40 个缺陷, 其中三条属于数据丢失级别。

⚠️ 四处用户可感知的行为变更(详见各节):书签「一键清理」不再删除只是联系不上的 链接;「删除书签」现在会同时从 Chrome 删除并同步到你所有设备;命令面板取数需要 真实的用户手势;OPEN_URL 会拒绝白名单之外的地址。

🌐 正式支持 12 种语言:补齐约 5,500 条此前回退为英文的翻译,并把界面 布局改为逻辑方向属性,阿拉伯语下真正的 RTL 布局。

🚨 数据安全(三条不可逆缺陷)

  • 离线时「一键清理」会删光整个书签库。 关掉 WiFi 跑书签健康检查,扫描结果里的 timeout / error(联系不上)与 dead(服务器明确回 4xx/5xx)被一视同仁地 交给清理弹窗并默认全选——扫描 → 清理 → 确认,四次点击,书签全没,界面只显示一条 绿色的「已清理 N 项」。现在只有确认死亡的链接进得了清理弹窗;联系不上的仍在 表格里可见,也仍可逐条手动删除。
  • 备份恢复整体失效。 导入校验要求 message.id 是 string,而它的真实主键是 number,于是任何含聊天记录的备份都无法恢复——而这个功能存在的意义恰恰是 用户已经丢了数据的时候。
  • 书签清理弹窗此前从不预勾选,修好后又会删光每组重复项的全部副本。 两个缺陷 叠在一起:预勾选写在受控 Dialog 不会触发的回调里,所以确认按钮永远是灰的;而 findDuplicates 返回的是每组全部副本,一旦预勾选修好,默认全选就等于把每个 重复 URL 删得一条不剩。现在遵循与集合去重一致的「保留首次出现」规则。

🛡️ 安全

  • 书签、浏览历史、标签页此前可被任意已授权站点的脚本静默读取。 命令面板的六条取数消息(GET_ALL_TABS / SEARCH_BOOKMARKS / SEARCH_HISTORY_FOR_PALETTE / GET_COMMAND_PALETTE_COMMANDS / AI_QUICK_ASK / FILL_SIDEPANEL_INPUT)的合法发送方是内容脚本,因此够不着扩展页鉴权门——而此前 没有任何「面板是否真被用户打开过」的校验。一个脚本无需用户按任何键,就能读取当前 窗口全部标签页的标题与网址、搜索用户书签、逐关键词探测浏览历史,并让用户自己的 大模型回答注入的问题。 面板只能由 Chrome 快捷键经后台打开——那是不可伪造的手势信号——所以后台现在在那一刻 按标签页签发短时通行证,六条路由统一经它把守。会话存在 chrome.storage.session 而非进程内 Map(SW 空闲约 30 秒即被回收,否则面板开着就会被自己的门拒掉), TTL 是绝对而非滑动的(滑动会让被攻陷的页面靠定时发请求把一次手势永久续下去)。
  • 撤销站点访问后,孤儿内容脚本仍能继续拉取书签与历史。 Chrome 只停止未来的注入, 不会杀掉页面上已注入的实例。host 权限现在是通行证的前提条件、按请求校验。
  • prompt injection 逃逸。 标记转义只做了两次字面量替换,于是大小写变体、内部空白、 附加属性、零宽字符全部穿透——任意网页(或一个书签/历史标题)写一句 </UNTRUSTED_BROWSER_CONTEXT> 就能提前关闭不可信区,后续文本在模型看来位于该区之外。
  • OPEN_URL 可打开任意地址。 它在 MessageRouter 之前被处理,既不过发送方授权也不过 payload 校验,被攻陷的内容脚本可让扩展打开 chrome:// 内部页、file://javascript:
  • SWITCH_TO_TAB 可聚焦任意窗口的任意标签页,并可用来探测标签页数量。 收敛为「与发送方同窗口」,且所有拒绝原因回同一条不可区分的错误。

🐛 修复

  • 切换模型后上下文预算塌回 10K,真实发送的历史被静默截断。
  • 后台 keep-alive alarm 永不停止。 SW 在有活跃流时被回收后,chrome.alarms 由浏览器 持有而存活,但判断是否需要保活的 runs map 是进程内的、随回收蒸发——于是一个 30 秒 周期的 alarm 永久唤醒 SW 并向所有标签页广播心跳。
  • 本地 TTS 重播会播出别的标签页的音频offscreen 生产者死亡后后台 run 永不释放
  • 流式回复以空白「成功」结束(200 空 body / 非兼容响应)、半截的 SSE 被静默截断云端错误体非 JSON 时错误横幅完全不显示
  • 本地 runtime 的七种可诊断失败态(服务没开 / URL 错 / 无模型 …)此前只有 dashboard 的检测按钮能看到,聊天里一律显示通用失败;现已接入。
  • 书签去重对含 ~ ( ) ! ' * 或编码空格的网址完全失效——剥离追踪参数会顺带把整个 query 重新编码,于是「带 utm」与「不带 utm」的同一页面产生不同的判重键。
  • 粘贴大段文本会冻结侧栏(Markdown 解析的正则回溯为 O(n²),258 KB 需 5.1 秒, 而它在每次按键时同步运行)。
  • 复制→粘贴导入会丢链接(标题含换行时被劈成两行)。
  • 时钟回拨会让两处 TTL 永不过期now - grantedAt 为负,而负数永远不 >= TTL), 其中一处守护的是删除全部数据的确认令牌。
  • 侧栏历史卡片的六个按钮、收藏页与侧栏的批量操作此前全部不可达(详见 2.4.0 段落之外的 新增修复);书签表格标签徽章的 React key 冲突;__proto__ 等合法主机名被静默错误分组。

✨ 新增

  • 「编辑已保存的标签页」终于可用。 这个入口自 v2.3 起就发布在三处界面上,点击只会 弹出「即将实现」;服务层甚至没有任何更新已保存标签页的函数。
  • 收藏与稍后读的批量操作可达(此前选择模式没有任何入口,整段批量代码都是死代码), 批量移动改用多条形态而不是拿第一条当载体。

🌐 国际化

  • 补齐约 5,500 条翻译,12 种语言不再混排英文。
  • 阿拉伯语下真正的 RTL:此前全仓没有任何一处设置 dir,HTML 入口写死 lang="zh-CN";现在方向跟随语言,界面改用逻辑方向属性(ms-/me-/start-/end-) 以便随方向翻转。
  • 书签清理弹窗(破坏性最强的确认弹窗)此前对中文用户全是英文;tabs-panel 的 44 处 提示、历史卡片写死的中文与 zh-CN 时间格式同样修正。

🧹 平台一致性

  • 移除 ConnectionTrackersetInterval 心跳(违反 MV3 铁律 3,且「沉默」本就不等于 「端口已死」);删除 183 行自述 PARKED 的死代码;清理书签 AI 退场遗留的死字段与 Dexie 索引。
  • 新增 Dexie v13 / v14:v9 曾把 &streamId 唯一索引建在既有数据的字段上, 只要某个库里存在重复值,升级就会中止且此后永久打不开(对话、设置、API key 全部 无法访问),而 Dexie 先建索引后跑回调,导致任何后续版本都来不及补救。v13 去重、 v14 重建唯一索引,卡住的库现在能被救回。

🧪 测试与工程

  • 新增 pnpm gate:八道关卡的本地合并闸门(类型 ×3 / lint / 文档 / 全量测试含覆盖率 / 构建 / 真实浏览器 E2E),约 5 分钟;--fast 约 20 秒。
  • 新增真实 MV3 E2E 底座(Playwright + 一次性 profile),55 条。MV3 铁律 1 与铁律 3 此前只靠注释纪律,现在有了自动化守卫。
  • 修复覆盖率闸门五个月来从未生效:配置用的是 Jest 的 thresholds.global 语法, vitest 将其当作 glob、匹配零个文件、不做任何断言(实测覆盖率为 0% 也照样退出 0)。 同时把占源码 47% 的 entrypoints/** 补进统计口径——旧数字系统性虚高 12–16 个百分点。
  • 新增大数据量 fixture 与 pnpm bench 性能基线;历史页两处热点优化(100k 行排序 47–53ms → 25–28ms;域名分组 14.0ms → 0.33ms),均以基线证明。