news 2026/9/21 15:31:06

Voyager 1.6.0 发布解读:Safari 原生能力接入、Vim 输入模式扩展与稳定性全面升级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Voyager 1.6.0 发布解读:Safari 原生能力接入、Vim 输入模式扩展与稳定性全面升级
  • AI 应用
  • 前端

【免费下载链接】voyager

Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用于任意网站,如 DeepSeek Harness。

项目地址:https://gitcode.com/gh_mirrors/ge/voyager
点击查看免费下载

导读:本文基于 Voyager 增强套件的 1.6.0 版本更新日志,系统梳理该版本带来的六大新功能与一系列关键修复,并结合仓库源码(Swift 原生桥接、内容脚本、导出与文件夹模块)逐项还原其实现原理。读完本文,你将掌握 Safari 版迁移到新宿主 App「Voyager」的完整步骤,理解 Vim 输入模式、文件夹专属搜索、可折叠代码块、导出附件标注等能力的底层机制,并了解水印去除、用量指示等修复背后的设计取舍。

版本背景与适用环境

Voyager 1.6.0 是面向 Gemini、AI Studio、Claude 与 ChatGPT 的浏览器增强扩展的一次里程碑式更新。它同时覆盖三端:

  • Chromium 系(Chrome / Edge / Firefox):通过 WebExtension 形式分发,构建配置见 vite.config.chrome.ts、vite.config.firefox.ts;
  • Safari / macOS 直装版:由 Xcode 工程 Voyager 打包宿主 App 与扩展,构建脚本为build:safari(见 package.json);
  • 原生能力层:位于Voyager/Extension/目录下的 Swift 服务(Google Drive、iCloud、通知)与Voyager/App/下的宿主 App 代码。

版本号管理统一由 package.json 与 manifest.json 中的version字段驱动,更新日志文件存放在 src/pages/content/changelog/notes/ 目录下,通过 changelog/index.ts 中的import.meta.glob动态加载并在升级后弹窗展示。

一、Safari 接入 macOS 原生能力,宿主 App 更名为 Voyager

1.6.0 最核心的变化发生在 Safari 直装版:WebExtension 首次接通原生 Google Drive 与 iCloud 云同步、macOS 系统通知,并通过 Sparkle 建立后续自动更新通道。同时宿主 App 由「Gemini Voyager」更名为「Voyager」。

1.1 升级前必读:一次性迁移指南

由于 macOS 按 App 名称识别程序,直接安装新版会与旧 App「Gemini Voyager」并存,可能出现扩展重复或行为混乱。老用户必须在更新前按迁移指南操作一次。迁移的核心事实是:App 的 Bundle ID 没有改变,因此文件夹、灵感库、云同步和所有设置都会保留,这次迁移只是替换 App 本体、不碰数据(见 docs/guide/safari-migration.md)。

迁移步骤:

  1. 完全退出 Safari⌘Q,不是只关窗口);
  2. 打开「访达 → 应用程序」,把旧的「Gemini Voyager.app」拖到废纸篓;
  3. 打开新下载的 DMG,把其中的「Voyager.app」拖进「应用程序」;
  4. 重新打开 Safari →「设置 → 扩展」,勾选「Voyager Extension」。

需要注意两个「不要做」:不要同时保留两个 App(两个扩展会互相打架);不要在 Safari 的「扩展」里点旧扩展的「卸载」(会指回旧 App),直接拖旧 App 进废纸篓即可。迁移完成后,后续 Safari 版本即可通过内置的 Sparkle 自动更新,无需再手动更换 App。

1.2 原生 Google Drive 同步的源码级实现

Safari 版云同步由 Voyager/Extension/GoogleDriveService.swift 实现,其设计要点如下:

  • OAuth 登录:使用 GoogleSignIn SDK,通过GIDClientID(读取自宿主 App 的 Info.plist)配置签名,withAccessToken依次尝试当前用户、restorePreviousSignIn恢复会话,并在每次请求前refreshTokensIfNeeded刷新令牌;
  • 最小权限范围scope固定为https://www.googleapis.com/auth/drive.file,即仅访问本应用创建的文件,而非用户全部 Drive;
  • 备份目录解析ensureBackupFolder用一个NSLock加「in-flight」标志把并发调用合并为一次目录解析,避免多个同步请求同时去创建备份文件夹;目录身份通过appProperties中的标记键值对(VoyagerGoogleDriveFolderIdentity)识别,并能自动迁移旧版遗留目录、甚至从旧的gemini-voyager-folders.json同步文件反查所在目录(recoverBackupFolderFromSyncFile);
  • HTTP 封装performRequest统一构造 Bearer Token 请求,读取Retry-After响应头,并对 404(文件不存在)与授权失败(VoyagerGoogleDriveHTTPFailureMapper.isAuthorizationFailure)做分级处理。

1.3 iCloud 同步与弹窗删除备份

iCloud 桥接由 Voyager/Extension/ICloudSyncService.swift 实现:

  • 数据存入iCloud.com.yourCompany.Gemini-Voyager容器的私有数据库,记录类型为VoyagerSyncFile,负载以CKAsset(临时 JSON 文件)形式挂载;
  • 写入采用「先 fetch 后 save」策略:先按 recordID 查询,若不存在(.unknownItem)则新建记录,否则复用原记录;写入使用.ifServerRecordUnchanged保存策略并开启原子操作,避免覆盖云端并发修改;
  • 新增的deleteBackup能力支持从弹窗删除 iCloud 备份而不影响本机数据——它通过游标分页收集所有VoyagerSyncFile记录 ID,再以CKModifyRecordsOperation(recordIDsToDelete:)原子批量删除,返回实际删除条数;
  • 构造函数会清理voyager-icloud-前缀的孤儿临时文件,避免上次写入失败残留垃圾。

1.4 macOS 回复完成通知

原生通知链路在 Voyager/Extension/NativeNotificationService.swift 中:由于 Safari 的.appex能调度通知但其响应can launch: false,无法可靠处理点击,因此该服务在检查/请求授权(.alert, .sound)后,通过NSWorkspace.shared.open把一个包含目标 URL 的VoyagerAppLinkhandoff URL 交给宿主 App,由宿主 App 负责在用户点击通知时打开对应对话。宿主 App 侧还提供 Voyager/App/NativeDiagnosticsService.swift 对扩展启用状态、通知、iCloud、Google Drive、Sparkle 更新状态做一键诊断。

二、Vim 输入模式扩展到 Claude 和 ChatGPT

此前 Vim 风格键盘编辑仅限 Gemini 页面,1.6.0 将其扩展到 Claude 与 ChatGPT 的消息输入框。这一能力由 src/core/services/KeyboardShortcutService.ts 统一承载——它按站点适配键位与 DOM,将j/k移动光标、dd删除行等 Vim 语义映射到各平台输入框,配合 src/features/folder 等模块对站点差异的处理思路,保证同一套键位在不同对话界面上的行为一致。切换站点后无需重新学习键位,适合在多平台间高频切换的重度键盘用户。

三、长代码块可折叠

过长的代码块现在可以通过按钮一键折叠,滚动浏览长对话时不再被大段代码占满屏幕。结合 src/features/export/services/DOMContentExtractor.ts 对代码块(hasCode)的提取逻辑可以看出,渲染层对代码块结构有明确的识别与标记,折叠按钮叠加在其上,不影响原有复制、格式化等能力。

四、文件夹专属搜索:f:前缀

在搜索框输入f:(或folder:)前缀,即可只匹配文件夹名称,并出现徽标提示当前处于文件夹搜索模式。该功能由 src/pages/content/folder 模块实现,配套的 src/pages/content/folder/tests/folderSearch.test.ts 通过构造带嵌套文件夹(如Research → PapersRecipes)与对话条目的 harness,验证了搜索命中、名称渲染(.gv-folder-name)与对话条目(.gv-conversation-title)互不干扰等行为。它解决了大文件夹库中「记得文件夹名、记不得对话名」的检索痛点。

五、导出标注上传的非图片文件

导出对话时,非图片文件会按文件名列出,避免丢失这部分上下文。从 src/features/export/services/DOMContentExtractor.ts 的ExtractedContent结构可见,每条消息新增了attachments: ExportAttachment[]字段,由extractUserAttachments提取:

  • HTML 导出:渲染为<div class="gv-export-attachment">的文档图标 + 文件名条目;
  • 文本/Markdown 导出:以📎 文件名形式逐行追加到消息文本;
  • 文件名经escapeHtml转义,避免特殊字符破坏导出结构。

这意味着导出的记录不仅是 AI 回复,还包括你「喂」给对话的输入材料清单,回看、归档与二次引用时信息更完整。

六、新版说明展示方式可选

升级后「What's New」的呈现方式可在两种模式间选择:自动弹出新版说明,或只显示NEW徽标、需要时再打开。该逻辑在 src/pages/content/changelog/index.ts 中实现:

  • 模式存储在StorageKeys.CHANGELOG_NOTIFY_MODEreadNotifyMode读取后,startChangelog在 badge 模式下跳过自动弹窗;
  • showChangelogModal依次执行「已读版本检查 → 动态加载对应版本的 md → 按语言抽取章节(extractLocalizedContent,支持<!-- lang:xx -->标记)→ marked 渲染 Markdown → DOMPurify 白名单净化」流水线;
  • 首次安装会被静默标记为已读(新版说明对全新用户没有意义),升级用户才会看到弹窗;「已读版本」在显示前写入CHANGELOG_DISMISSED_VERSION,保证即使不点「Got it」也不会重复弹出;
  • 净化环节通过自定义ALLOWED_URI_REGEXP放行chrome-extension:/moz-extension:协议,确保内嵌截图在扩展运行时 URL 下可正常显示,同时仍拦截javascript:等危险协议(有 changelog.test.ts 中的多语言抽取与净化策略测试背书);
  • 另有「强制弹窗版本」机制(FORCE_POPUP_VERSIONS):对维护者要求人人必读的版本,即使选择 badge 模式也会弹窗,并启用 15 秒读门(FORCE_POPUP_READ_GATE_SECONDS),倒计时结束前关闭按钮不可用。

七、关键修复与技术细节

7.1 更智能、覆盖更广的水印去除

水印去除功能本轮大幅增强:支持 Gemini 最新的水印变体和更多 logo 尺寸(含小图、缩小的大图),更多临界情况也能成功去除,且仍只在真正检测到水印时才处理;不再影响 Notebook(NotebookLM)页面;Safari 恢复下载全尺寸无水印图;去除失败时回退到正常下载。其行为开关由 src/core/utils/watermarkSettings.ts 管理:

  • 两个独立开关:download(下载时拦截去水印,即「🍌 路径」)与preview(聊天界面预览也去水印,更重、有短暂闪烁);
  • 兼容旧版单一键geminiWatermarkRemoverEnabled的迁移逻辑:任一新键存在则新键优先(缺失的新键回退默认值true),否则旧键同时控制两者,全新安装默认两者全开,需要更轻量的用户可在弹窗中改为仅下载模式。

7.2 更可靠的用量指示

在 Chrome / Edge 等 Chromium 浏览器上稳定工作:不再因过时数据跳到错误的更低数值,刷新后保留重置倒计时,无数据时显示可点击的加载入口。这背后是 src/pages/content 中 usage-observer 类脚本(如 public/usage-observer.js、public/claude-usage-observer.js)对页面数据的缓存、失效与重载策略的完善。

7.3 更稳的文件夹

  • 文件夹分类在 Gemini 侧边栏滚动(虚拟化)后不再丢失——赋值数据与渲染视图解耦,滚动仅重建视图而不触碰持久化数据;
  • 点击文件夹里的对话可靠打开正确的对话;
  • 重命名改用 Gemini 原生对话框并保持同步,不再依赖自绘输入框,避免与站点内建 UI 冲突;
  • 高并发下导入不再出错——导入路径有并发保护,相关实现与测试见 src/features/folder/services 与 src/features/folder/services/tests/FolderImportExportService.test.ts。

7.4 草稿绑定所属对话

未发送的草稿会留在输入它的那个对话里,切换对话不会被覆盖。草稿现在按「对话身份」做键控存储,与 src/core/utils/conversationIdentity.ts 提供的对话标识能力对齐,从根本上消除了多会话间串写问题。

7.5 新手引导不再误退出

引导过程中点击页面不再中断流程,只有明确关闭或按Esc才结束。引导模块见 src/features/onboarding,其对焦点与点击事件的判定更严格,避免引导被误触「跳过」。

7.6 高亮改为按需开启

从未使用过 Highlight 的用户现在默认关闭该功能(已有高亮保持开启、数据不变)。这是一次典型的 opt-in 收敛:为新用户减少默认开启的 DOM 侵入,降低与站点更新的冲突面,而存量用户数据不受影响。高亮相关设置默认值定义在 src/core/services/SettingsBackupService.ts 的BACKUPABLE_SYNC_SETTINGS_DEFAULTS中。

7.7 性能与其它

  • 功能启动更快、长对话下内存占用降低;
  • 弹窗设置即时可滚动;
  • Mermaid 全屏关闭后清理干净;
  • 时间线预览不再滑出视野;
  • 导出正确处理懒加载消息;
  • 插件校验拦截远程与脚本协议 URL——插件 manifest 校验路径 src/features/plugins/manifest/validate.ts 拒绝javascript:等危险 scheme;
  • 多账户隔离更稳。

八、升级建议与验证途径

  1. Safari 用户:先读完 docs/guide/safari-migration.md 并按步骤迁移,再安装新版,避免双 App 并存;
  2. Chromium / Firefox 用户:更新后可在扩展弹窗中选择新版说明的展示方式(自动弹窗或NEW徽标),并按需在弹窗设置中调整水印去除的下载/预览开关;
  3. 开发者验证:本仓库的 src/pages/content/changelog/tests/changelog.test.ts 直接读取1.6.0.md,断言各语言章节的引言块(Tolkien 名句)被完整保留,说明更新日志的多语言管道有自动化测试保障;文件夹搜索、导出、水印设置等均有对应测试可运行(bun test)。

本文全部事实依据来自仓库源码与文档,包括 1.6.0.md、docs/guide/safari-migration.md 及上述各源码/测试文件;仓库当前版本为 1.9.0(见 package.json),文中所述 1.6.0 行为均以该版本仓库中的历史实现为准。

  • AI 应用
  • 前端

【免费下载链接】voyager

Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用于任意网站,如 DeepSeek Harness。

项目地址:https://gitcode.com/gh_mirrors/ge/voyager
点击查看免费下载

相关推荐

上一篇:ConvNeXt模型可视化指南:如何深度解析特征图与注意力热图
下一篇:Flask-RESTplus服务器示例:生产环境部署与性能优化实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 15:28:08

Luxon 升级指南:从 1.x / 2.x 迁移到 3.0 的破坏性变更全解析

Luxon 升级指南&#xff1a;从 1.x / 2.x 迁移到 3.0 的破坏性变更全解析 【免费下载链接】luxon ⏱ A library for working with dates and times in JS 项目地址: https://gitcode.com/gh_mirrors/lu/luxon Luxon 是专为 JavaScript 设计的日期与时间处理库&#xff0…

作者头像 李华
网站建设 2026/9/21 15:25:06

AI前端面试核心:TypeScript+流式传输工程实践

1. 这不是鸡汤&#xff0c;是9月AI前端面试现场的真实战报“最后提醒一次&#xff0c;9月的AI前端面试不用太老实”——这句话我上周在三个不同公司的技术终面里都听到了。不是HR说的&#xff0c;是CTO、前端架构师、甚至一位刚从大模型团队轮岗回来的资深工程师&#xff0c;面…

作者头像 李华
网站建设 2026/9/21 15:24:45

PCS层链路故障排查:从Local Fault到Wireshark抓包实战

1. 从一个让人抓狂的链路故障说起机房里最让人头疼的问题&#xff0c;往往不是配置写错&#xff0c;而是链路时通时断、端口反复 up/down&#xff0c;日志里刷出一行Local Fault&#xff0c;然后就没有然后了。你查光模块、换跳线、重启设备&#xff0c;折腾半天&#xff0c;问…

作者头像 李华