Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[Feature]: 标签页浏览器式语义增强——打开新会话应开新标签页,而非替换当前页

Abierto
#3,519 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
48/100
Tipo de issue
Nueva funcionalidad
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
typescript
Área
desktop, frontend

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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 条会话同时常驻的内存与标题加载开销:建议标题懒加载,避免一次性渲染全部标签

Lenguaje dominante
Rust
Estrellas
2.3k
Forks
236
Merge medio
7 h 37 min
PR fusionados (30 d)
244

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de GCWing/OpenBitFun

Todos los issues de GCWing/OpenBitFun

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.