Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

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

オープン
#3,519 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
48/100
issue の種類
機能追加
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
typescript
領域
desktop, frontend

調査の方向性

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
平均マージ
7時間 37分
マージ済み PR(30日)
244

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

GCWing/OpenBitFun のほかの issue

GCWing/OpenBitFun の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。