资讯详情

Voyager Activity View:把注意力引导到仍在推进中的 Gemini 会话(时间轴排序、优先级窗口与多文件夹去重)

📅 2026/9/21 14:02:07 | 华诺云谱 👁 阅读
Voyager Activity View:把注意力引导到仍在推进中的 Gemini 会话(时间轴排序、优先级窗口与多文件夹去重)
Voyager Activity View:把注意力引导到仍在推进中的 Gemini 会话时间轴排序、优先级窗口与多文件夹去重【免费下载链接】voyagerEnhancement 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/voyagerActivity 视图是 Voyager 扩展在 Gemini 侧边栏内提供的一种时间轴视角点击Folders旁边的铃铛图标即可把文件夹树临时切换为“按真实聊天活动时间排序”的会话列表让仍在推进的工作浮到最前。本文以 docs/en/guide/activity-view.md阿拉伯语版见 docs/ar/guide/activity-view.md为主线结合仓库中 activityView.ts、FolderTreeView.ts 与配套测试讲清它的分组规则、底层算法、自动刷新机制与使用建议读完即可上手使用并理解其实现原理。Activity 是什么叠在文件夹之上的时间轴文件夹回答的问题是“这条会话属于哪里”。但随着归档越来越大更频繁出现的问题是“现在该看什么”。Voyager 的 Activity 视图正是为回答后一个问题而设计它是一个只读的、注意力优先的时间投影见 activityView.ts 中buildConversationActivityGroups的文档注释“Build a read-only, attention-first projection over folder data”覆盖在既有文件夹数据之上。点击Folders旁边的铃铛bell图标文件夹树会被一组按活动时间分组排序的会话替换切换是临时且无破坏性的它不会修改文件夹结构、不会移动会话、也不会改变 Star 状态再次点击铃铛即可回到完整的文件夹树。该视图的设计灵感来自 OpenAI Codex / ChatGPT Desktop 的侧边栏Voyager 沿用了“把仍活跃的会话浮到最前”的思路并将其适配为 Gemini 文件夹之上的时间轴视图。从源码看铃铛按钮的挂载点位于文件夹头部操作区gv-folder-header-actions见 FolderTreeView.ts视图模式通过本地存储键FOLDERS_VIEW_MODE持久化folders与activity二选一由toggleFolderViewMode()负责切换并调用onRefresh()重新渲染见 FolderTreeView.ts。Priority 组跟随最近三小时的真实活动Activity 视图最上方是Priority优先级组它收录最近三小时内产生过新轮次new turn的会话。这里的判定依据是真实的会话活动时间而不是你打开或浏览会话的时间——源码中窗口常量即三小时毫秒数/** Conversations stay in Priority for three hours after their latest real turn. */ export const ACTIVITY_PRIORITY_WINDOW_MS 3 * 60 * 60 * 1000;见 activityView.ts分组判定的关键条件见 activityView.tsif (isFiniteTimestamp(item.lastTurnAt) item.lastTurnAt now - ACTIVITY_PRIORITY_WINDOW_MS) { groupId priority; } else if (isFiniteTimestamp(item.lastTurnAt) item.lastTurnAt todayStart) { groupId today; }需要注意的边界行为独占性位于 Priority 的会话不会同时出现在 Today。每条会话只会被分配到恰好一个分组“Each chat is assigned to exactly one group”因此不会在同一视图里重复出现自动回落当某个会话的 3 小时活动窗口到期后Activity 会自动把它移回 Today 或相应的日期分组无需手动刷新页面。这背后是一个精确的定时器详见下文“自动刷新机制”Star 与 Priority 相互独立Star 是独立的人工标记。给会话加 Star 不会把它送进 Priority从 Priority 中的活跃会话上移除 Star 也不会把它踢出 Priority。在分组算法里starred只影响显示样式gv-starred类不影响分组见 FolderTreeView.ts。lastTurnAt的写入链路可在 FolderStore.ts 找到markConversationLastTurnAt(conversationId, timestamp)它会在检测到新会话轮次时把时间戳同步到该会话的所有文件夹引用上。短窗口设计今天与最近四个日历日Priority 之下依次是Today今天、Yesterday昨天以及更早几天以星期几为标题的日期分组。整个视图覆盖今天 此前 4 个日历日让列表始终贴近当前工作分组 id 类型在源码中显式定义为priority | today | yesterday | day-2 | day-3 | day-4见 activityView.ts日期偏移量ActivityRecentDayOffset 2 | 3 | 4各分组的“一天起点”按本地时区计算startOfLocalDay()把时间归零到当天的 0 点date.setHours(0, 0, 0, 0)getLocalDayStartDaysAgo()再向前推 N 天见 activityView.ts更早的会话、以及没有活动时间戳的历史遗留条目legacy entries不会出现在这个视图中——但它们既没有被隐藏也没有被删除。再次点击铃铛回到文件夹树就能在原位置找到它们分组标题文案通过formatActivityGroupHeading()生成Priority/Today/Yesterday 取翻译键日期组用toLocaleDateString(..., { weekday: long })渲染为本地化的星期名见 FolderTreeView.ts。排序方面组内条目按lastTurnAt降序新的在前时间相同则按标题做 locale 感知的自然排序localeCompare(..., { numeric: true, sensitivity: base })见 activityView.ts。一行一条会话多文件夹引用的合并与去重同一会话可以同时属于多个文件夹。Activity 会把所有文件夹引用合并为一行标题下方保留所属文件夹名把鼠标悬停在文件夹信息上可看到完整的路径列表。实现上合并发生在buildConversationActivityGroups的累加阶段activityView.ts会话 id 先经normalizeConversationId()归一化去除空白、转小写、去掉可选的c_前缀见 activityView.ts从而把同一会话在不同文件夹中的引用识别为同一条每个文件夹引用都会作为folderContext追加进该会话的folderContexts数组按完整路径去重并保留叶子文件夹名 完整路径两份信息starred采用“任一引用被标星则整行标星”existing.starred || conversation.starred true的合并策略lastTurnAt取所有引用中的最大值最新一次真实轮次并同步更新sourceFolderId用于点击后跳转到正确的文件夹上下文。渲染时FolderTreeView.ts行内的文件夹摘要由formatActivityFolderSummary()生成默认最多显示 2 个文件夹名多出的以N形式折叠完整路径通过aria-label与悬浮 tooltip 暴露。这也避免了同一条会话在 Priority 或 Today 里占用多个槽位同时保留其所属项目上下文。三种信号各司其职Activity 视图与文件夹、Star 一起构成三种互补的信号原文档用一张表说清了各自的分工信号来源回答的问题文件夹Folders你手动组织的项目与主题这条会话属于哪里Activity最近一次真实的会话轮次哪些工作最近在推进Star人工标记哪些会话应该保持突出三者互不干扰文件夹负责归档检索Activity 在你每次回到 Gemini 时帮你缩小待评估的选项集合Star 则保留长期关注的标记。源码原理buildConversationActivityGroups的完整分组流程buildConversationActivityGroups(data, options)activityView.ts是整个 Activity 视图的纯函数核心调用方为FolderTreeView.populateActivityList()FolderTreeView.ts。其流程可分四步建立索引用foldersById映射所有文件夹并通过getFolderPath()沿parentId逐层向上回溯拼出每个文件夹的完整路径如Folder tests / Food diary同时带环检测避免死循环activityView.ts累加合并遍历folderContents中每个文件夹的会话列表按归一化会话 id 归并到byConversationIdMap见上文合并逻辑过滤与分组按优先级窗口、今日起点、昨日起点、第 2/3/4 天起点依次判定分组同时支持外部传入matches回调用于搜索过滤与“仅当前用户”过滤不满足条件的条目直接跳过排序输出分组内按compareActivityItems排序空分组不输出最终返回priority → today → yesterday → day-2 → day-3 → day-4的有序分组数组。matches回调由populateActivityList注入FolderTreeView.ts同时承担两类过滤当前用户过滤filterConversationsByCurrentUser基于 URL 中的/u/id/路径判断会话归属用户无法判定的会话如/app/...视为当前用户保留搜索过滤支持普通关键字匹配标题或文件夹路径与f:前缀的“仅搜文件夹”模式parseFolderSearchCriteria见 FolderTreeView.ts。自动刷新Priority 窗口到期的免手动机制文档承诺“无需刷新页面”其实现是scheduleActivityPriorityRefresh()FolderTreeView.ts渲染 Activity 列表后找出 Priority 组内lastTurnAt ACTIVITY_PRIORITY_WINDOW_MS最早到期的时间点计算到该时间点的延迟Math.min(MAX_TIMEOUT_MS, ...)上限 2_147_483_647ms 以规避浏览器定时器限制设定一次性setTimeout到期后若视图仍处于 activity 模式且未被销毁则调用onRefresh()触发整树重建该会话便自动落入 Today 或对应日期组。配套测试folderActivityView.test.ts中有两条用例直接验证了这一行为automatically returns an expired Priority conversation to Today把lastTurnAt设为距窗口到期仅剩 1 秒推进 1002ms 后断言 Priority 组消失、会话出现在 Today 组folderActivityView.test.tsdoes not spin refreshes for an imported timestamp beyond the browser timer limit对导入的未来时间戳超过浏览器定时器上限不会反复触发刷新同文件 L225-L241。行内交互跳转、Star 与重命名Activity 列表中的每行createActivityConversationElementFolderTreeView.ts都具备完整的行内交互单击打开普通左键点击拦截默认跳转通过navigateToConversationById(sourceFolderId, conversationId)在正确的文件夹上下文内导航带修饰键Ctrl/Cmd/Shift/Alt或非左键的点击则保留原生行为Star 跨文件夹同步行内的星标按钮调用setConversationStarAcrossFolders(conversationId, starred)FolderStore.ts一次操作同步该会话在所有文件夹引用中的 Star 状态——这与合并行“一行一条会话”的理念一致双击重命名 / 右键菜单双击标题或右键均可触发原生重命名时间标签当天内的会话显示HH:mm本地时间更早的显示Mon d日期time datetime属性提供 ISO 时间戳FolderTreeView.ts 与 L673-L686。行内不显示会话图标测试断言gv-conversation-icon为空仅保留标题、文件夹上下文、时间与星标让行更加紧凑。首次使用的引导Coachmark为帮助用户发现这一功能仓库在 activityCoachmark.ts 中内置了一次性引导Coachmark仅在gemini.google.com域名下、文件夹功能开启且非浮动模式时出现loadActivityCoachmarkState见 activityCoachmark.ts文案强调“聚焦仍在推进中的会话Priority、今天与最近几天——不会把任何会话移出它的文件夹”引导内提供“使用 Activity 视图”开关通过setActivityViewEnabled()直接写入FOLDERS_VIEW_MODE存储键调试手段控制台派发gv:debug:folderActivityCoachmark事件或调用window.__gvFolderActivityCoachmark()可强制重放。测试验证行为即契约src/pages/content/folder/__tests__/folderActivityView.test.ts完整固化了本文描述的所有关键行为可作为理解该功能的“可执行文档”铃铛按钮的aria-pressed状态、激活态与点击切换含持久化到browser.storage.localPriority 的独占性同一会话只出现在一个分组跨文件夹引用被合并为一行gv-folder-activity-item数量验证无活动时间的 legacy 会话不出现多文件夹上下文显示叶子名Folder tests · Food diary与 aria-label 完整路径并存新轮次到来时所有文件夹引用同步更新lastTurnAt并落盘markConversationLastTurnAt的联动验证。使用建议从 Priority 出发再回文件夹树结合原文档的收尾建议与上述机制推荐的工作流是回到 Gemini 时先从Priority中取仍有“动量”最近 3 小时内有新轮次的会话继续推进处理完进行中的工作后再浏览Today / Yesterday覆盖当天与近两天的其余动态需要更早内容时点铃铛切回完整文件夹树按项目归档定位——因为 Activity 只展示今天起算的 5 个日历日更老的内容始终安静地留在文件夹里。这套“时间轴 文件夹树”的组合正是 Voyager 对“注意力管理”这一问题的答案让仍在动的会话浮在最前同时绝不破坏你亲手建立的归档结构。相关实现与测试分别位于 activityView.ts、FolderTreeView.ts、FolderStore.ts 与 folderActivityView.test.ts阿拉伯语文档见 docs/ar/guide/activity-view.md。【免费下载链接】voyagerEnhancement 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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。