[Feature]: 标签页浏览器式语义增强——打开新会话应开新标签页,而非替换当前页
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 48/100
- Issue 类型
- 功能
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- typescript
调研方向
Read src/web-ui/src/app/types.ts and sceneStore.ts, starting with getSessionSceneTabId, openSessionScene, and activateSessionScene. Trace the existing scene ID and reconciliation behavior, then check related tab and history tests. Done means opening different sessions creates separate tabs, reopening one focuses its tab, contextual navigation still activates an existing tab, and pinning, closing, and overflow behavior remain correct.
由索引模型根据 Issue 内容生成。
描述
Problem / opportunity
当前行为(已对照 1.0.7 源码定位)
会话标签页的 id 只由 [surfaceId, workspaceKey] 派生,不含 sessionId:
// src/web-ui/src/app/stores/../types.ts:53
export function getSessionSceneTabId(target: SessionSceneTarget): SceneTabId {
return session:${encodeURIComponent(JSON.stringify([target.surfaceId, target.workspaceKey]))};
}
因此同一个助理(同一 surface/工作区)下只有一个会话标签页槽位:从助理详情页打开另一条会话时,openSessionScene 拿到的是同一个 tab id,走 updateSessionScene 把该标签页的内容替换成新会话(sceneStore.ts:244)。标签页本身从未被关闭,所以:
1、「固定」救不了——pin 只影响排序与关闭豁免(orderPinnedTabsFirst 的注释明确写了 "without opening or protecting them"),不影响内容替换
2、想切回之前的会话,必须退出标签栏、进助理详情页重新选择
3、两个会话无法并排对照
界面本身就是浏览器外形(标签栏 + 顶部 chrome),用户对"新页面开新标签、旧标签不消失、任意标签可固定"是有既有的心智模型。标签栏的外形与交互(可固定、可关闭、可拖拽、有溢出菜单)都在暗示"每个标签是一个独立页面",但实际行为是"打开新会话会替换内容"。固定了也不会保住内容。而代码库里已经区分了两种导航语义:openSessionScene(显式打开)与 activateSessionScene(上下文跳转,且带守卫注释 "Contextual navigation may only activate the existing, unchanged session reference")。也就是说"显式打开才建新页"这个语义与现有模型是同向的,不需要新造概念。
Proposed behavior
1、从助理详情页、会话列表等显式入口打开一条会话时,总是新建一个标签页(与浏览器打开一个新网址一致),即使同一助理已有其它会话标签页打开
2、重复打开同一条会话时,聚焦它已有的标签页,不产生重复标签
3、会话标签页可任意单独固定/取消固定(现有 togglePinScene 即可,无需特殊规则);由于不再发生内容替换,pin 不再需要承担"保护内容"的隐含职责
4、上下文跳转(在某条会话内部跳到另一条会话)保持现状,仍只激活已有引用、不新建标签
5、标签数量多时走现有的溢出菜单(TabOverflowMenu),不改变溢出交互
Product surface
Desktop app
Details, examples, or constraints
改动落点
id 派生:types.ts:53 getSessionSceneTabId
两条入口:sceneStore.ts:244 openSessionScene(应建新页)与 activateSessionScene(保持守卫)
建议做法:在显式打开路径上把 sessionId 纳入 tab id(如 session:<surfaceId+workspaceKey>:),上下文路径不动
验收标准
1、助理 A 已打开会话 S1,从详情页打开会话 S2 → 出现两个标签页,S1 仍在
2、再次打开 S1 → 聚焦已有 S1 标签页,不产生重复标签
3、两个标签页都可单独固定/取消固定,固定状态互不影响
4、会话内部跳转到另一条会话(上下文跳转)→ 仍只激活/聚焦,不新建标签
5、打开 20+ 条会话后标签栏仍可用(溢出菜单正常),不卡顿
6、关闭标签页后,剩余标签页与会话内容无错乱
兼容性关注点
1、历史导航去重:pushHistory 对连续相同 id 去重。id 改为按会话唯一后,历史变成"每条标签页各自的导航历史",与浏览器 back/forward 语义一致
2、资源协调重映射:reconcileSessionScenes 在会话的 surface/workspace 变化时做 id 重映射;按会话派生 id 后映射关系更直接,不更复杂
3、上下文跳转守卫:activateSessionScene 中 session.sessionId !== target.sessionId 的校验依然成立且仍有意义(防止异步激活后张冠李戴),不受显式路径改动影响
4、拖拽传递:标签页拖拽(writeSessionTabDrag)按会话维度的 id 更准确
5、对端设备模式切换:resetForPeerSwitch 与 id 方案无关
风险
1、标签页数量无上限增长:重度用户可能积累大量标签页。建议一并确认是否需要上限提示或"最近关闭恢复";现有 TabOverflowMenu 已能承接溢出
2、N 条会话同时常驻的内存与标题加载开销:建议标题懒加载,避免一次性渲染全部标签
- 主要语言
- Rust
- 星标
- 2.3k
- 派生
- 236
- 平均合并
- 8 小时 1 分钟
- 30 天内合并 PR
- 228
环境准备
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
GCWing/OpenBitFun 的其他 Issue
-
[Feature]: 模型服务表单缺少「图像生成」分类入口 —— 后端已支持 default_models.image_generation可能已有人在做 @skyfireitdiy 于 9 天前认领。 未关闭
难度 2/5 半天 新手友好度 74/100
GCWing/OpenBitFun#3279 · 1 个 reaction ·
维护者通常 1 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 72/100
GCWing/OpenBitFun#2363 ·
维护者通常 1 天内回复
-
question
难度 1/5 1 小时以内 新手友好度 78/100
GCWing/OpenBitFun#2340 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 45/100
GCWing/OpenBitFun#3542 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 45/100
GCWing/OpenBitFun#3530 ·
维护者通常 1 天内回复
查看 GCWing/OpenBitFun 的全部 Issue
相似的 Issue
-
area/tools bug session-analysis
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 84/100
nix-community/fenix#262 ·
-
bug
难度 2/5 1-3 小时 新手友好度 67/100
GabrieleLozupone/kokon#41 ·
维护者通常 1 天内回复
-
Small glitch未关闭priority: medium
难度 2/5 1-3 小时 新手友好度 66/100
storytold/photocraft#9538 ·
维护者通常 1 天内回复
-
bug P2 rust
难度 2/5 1-3 小时 新手友好度 82/100
维护者通常 1 天内回复