- 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。
导读:本文基于 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)。
迁移步骤:
- 完全退出 Safari(
⌘Q,不是只关窗口); - 打开「访达 → 应用程序」,把旧的「Gemini Voyager.app」拖到废纸篓;
- 打开新下载的 DMG,把其中的「Voyager.app」拖进「应用程序」;
- 重新打开 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 → Papers、Recipes)与对话条目的 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_MODE,readNotifyMode读取后,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; - 多账户隔离更稳。
八、升级建议与验证途径
- Safari 用户:先读完 docs/guide/safari-migration.md 并按步骤迁移,再安装新版,避免双 App 并存;
- Chromium / Firefox 用户:更新后可在扩展弹窗中选择新版说明的展示方式(自动弹窗或
NEW徽标),并按需在弹窗设置中调整水印去除的下载/预览开关; - 开发者验证:本仓库的 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。
相关推荐
Higress 2.1.10 版本发布解读:AI 可观测性、模型路由与多云模型接入能力全面升级
Higress 2.1.10 版本发布解读:AI 可观测性、模型路由与多云模型接入能力全面升级 本篇技术文章以 Higress 官方 2.1.10 版本发布说明
API网关后端云原生LLM 网关人工智能MCP 服务Node.js v20.13.0 'Iron' (LTS) 发布解读:性能优化、API 稳定化与诊断能力升级
Node.js v20.13.0 'Iron' LTS 发布解读:性能优化、API 稳定化与诊断能力升级 本篇技术指南以 Node.js 官网博客中 v20.1
前端文档InfluxDB 2.7.12发布:时序数据库性能与稳定性全面升级
InfluxDB 2.7.12发布:时序数据库性能与稳定性全面升级 时序数据库在现代数据架构中扮演着越来越重要的角色,特别是在监控系统、物联网和实时分析场景中。
数据库时序数据库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考