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),仅供参考

相关新闻

TanStack Table 的 TableHookContexts 接口:三个作用域 React Context 与配套 Hooks 的完整解析

TanStack Table 的 TableHookContexts 接口:三个作用域 React Context 与配套 Hooks 的完整解析

TanStack Table 的 TableHookContexts 接口:三个作用域 React Context 与配套 Hooks 的完整解析 【免费下载链接】table 🤖 Headless UI for building powerful tables & datagrids for TS/JS - React-Table, Vue-Table, Solid-Table, Svelte-Table …

2026/9/22 16:02:18 阅读更多 →
AWX Project Schedules API 详解:rrule 格式规范与项目定时任务实战

AWX Project Schedules API 详解:rrule 格式规范与项目定时任务实战

AWX Project Schedules API 详解:rrule 格式规范与项目定时任务实战 【免费下载链接】awx AWX provides a web-based user interface, REST API, and task engine built on top of Ansible. It is one of the upstream projects for Red Hat Ansible Automation Pla…

2026/9/22 16:02:20 阅读更多 →
Cursor 接单做副业,模型通道改到 TaoToken 行不行?

Cursor 接单做副业,模型通道改到 TaoToken 行不行?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/22 16:01:27 阅读更多 →

最新新闻

拒绝配置卡壳 联系邮箱号码大全速查手册实战指南

拒绝配置卡壳 联系邮箱号码大全速查手册实战指南

拒绝配置卡壳 联系邮箱号码大全速查手册实战指南 配置环境就卡半天,这种痛苦谁懂?装个依赖报 404,改个端口号被防火墙拦截,或者最经典的——代码里硬编码了邮箱和电话,上线前发现漏改了一个测试账号,导致数据发给了老板。别急,今天不聊虚的,直接…

2026/9/22 16:02:04 阅读更多 →
kindle使用教程与一个人抽烟伤感图片对比选型

kindle使用教程与一个人抽烟伤感图片对比选型

面试被问原理卡壳?用Kindle源码解析性能优化 上周面试某大厂后端岗,面试官问:“如何优化一个高频读取的配置文件?”我愣了三秒,脑子里全是 read() 系统调用和页缓存,但结合不了业务场景。面试官眼神变了,我知道这轮悬了。…

2026/9/22 16:02:04 阅读更多 →
酷狗音乐2012源码拆解:3个关键点实现入门到精通

酷狗音乐2012源码拆解:3个关键点实现入门到精通

酷狗音乐2012源码拆解:3个关键点实现入门到精通 还在为官方文档冗长抓不住重点而头疼?别慌,今天直接带你拆解酷狗音乐2012版的核心逻辑。…

2026/9/22 16:02:04 阅读更多 →
yintu实战搭建:3步搞定项目架构,告别只会语法不会落地

yintu实战搭建:3步搞定项目架构,告别只会语法不会落地

yintu实战搭建:3步搞定项目架构,告别只会语法不会落地 刚学完Python语法,打开PyCharm脑子一片空白?别慌,这是90%新手的通病。 你会写 for…

2026/9/22 16:02:04 阅读更多 →
3步吃透herculean源码,搞定性能优化难题

3步吃透herculean源码,搞定性能优化难题

3步吃透herculean源码,搞定性能优化难题 官方文档翻了三遍还是云里雾里?别慌,这是每个开发者都遇到的坑。herculean 这个库在高性能计算场景下确实能打,但它的 API…

2026/9/22 16:02:04 阅读更多 →
襟川阳一入门到精通:版本升级API全变后的性能突围

襟川阳一入门到精通:版本升级API全变后的性能突围

襟川阳一入门到精通:版本升级API全变后的性能突围 版本升级后 API 全变了,代码跑不通、逻辑对不上,这是很多开发者在接手遗留系统时的噩梦。想要从混乱中理清脉络,实现 襟川阳一 相关的业务逻辑从 入门到精通…

2026/9/22 16:01:02 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →