From 5f0d91bbb32737bc125eb001b47b6216ad7feb30 Mon Sep 17 00:00:00 2001 From: Autumn-27 <53844290+Autumn-27@users.noreply.github.com> Date: Sat, 29 Aug 2026 09:08:10 -0400 Subject: [PATCH] =?UTF-8?q?fix(web):=20=E6=89=8B=E6=9C=BA=E7=AB=AF?= =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E8=AF=A6=E6=83=85=E6=8A=98=E5=8F=A0=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=88=97=E8=A1=A8=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E8=AE=B0=E5=BD=95=E8=A2=AB=E6=8C=A4=E5=8E=8B=E7=9C=8B?= =?UTF-8?q?=E4=B8=8D=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 小屏下会话列表固定占 10~15rem,会话记录只剩标题和输入框。改为 ). const [store, setStore] = React.useState({}); // Worker sessions derived from exploration intents (paged past the old 300 cap). @@ -1130,6 +1135,13 @@ export function SessionsTab({ taskId }: { taskId: string }) { const isSystem = active.role === "system"; const activeKey = keyForSession(active); const activeState = store[activeKey]; + // 折叠态(手机端)标题栏要替代整张列表:显示当前会话名 + 其它会话的未读合计, + // 否则收起后既不知道自己在看哪个会话,也看不到别处有新消息。 + const activeDisplayTitle = (active.role === "worker" ? sessionMeta.get(active.id)?.title : "") || active.title; + const hiddenUnread = React.useMemo( + () => Object.entries(store).reduce((sum, [key, s]) => (key === activeKey ? sum : sum + s.unread), 0), + [store, activeKey], + ); // Keep the SSE dispatcher's notion of the active session current, and lazily load // + clear unread whenever the active session changes. @@ -1350,12 +1362,44 @@ export function SessionsTab({ taskId }: { taskId: string }) { return ( -
+ {/* 高度预留:页面头部(标题行 + 目标 + Tabs ≈ 7.5rem)+ 内容内边距。手机端 p-4、 + 桌面端 lg:p-6,且桌面还要留出滚动余量,所以两档分别预留 10rem / 13rem —— 手机端 + 沿用 13rem 会白白吃掉 3rem 的记录高度。 */} +
{/* Left: session list */} -
+
-
-
会话列表
+
+ {!MOCK && ( )}
- + div]:block!", + !listOpen && "max-lg:hidden", + )} + >
{(["mainagent", "planner", "system", "worker"] as const).map((role) => { const items = grouped[role]; @@ -1421,7 +1472,10 @@ export function SessionsTab({ taskId }: { taskId: string }) { displayTitle={meta?.title ?? s.title} hasPending={hasPendingForSession(s)} unread={store[keyForSession(s)]?.unread} - onClick={() => setActiveId(s.id)} + onClick={() => { + setActiveId(s.id); + setListOpen(false); // 手机端选完即收起,把高度还给会话记录 + }} controlling={controllingIntent === s.intent_id} deleted={meta?.deleted} onPause={() => void controlWorker(s, "pause")} @@ -1459,7 +1513,7 @@ export function SessionsTab({ taskId }: { taskId: string }) { {/* Right: transcript */}
-
+
{(() => { const isWorker = active.role === "worker"; const meta = isWorker ? sessionMeta.get(active.id) : undefined; @@ -1518,8 +1572,24 @@ export function SessionsTab({ taskId }: { taskId: string }) {
{tokenTotal.any && ( + {/* 手机端用短标签(入/缓/出):长标签会把这一行撑成两行,进一步压缩记录区。 */} - + + + + 输入 {activeTokens.input_tokens.toLocaleString()} · 输出{" "}