想要的效果(一句话)
侧栏里折叠了会话列表的项目 也能一眼看出:这个项目下有几个在跑 (包含定时任务的运行),跑完有提示,并且能区分「全部结束」和「还有在跑」;点一下就能进到对应的会话 / 定时任务运行。这是个设计讨论,想先听你们的意见,同意方向我再开工。
现状(我都核对过代码)
我的提案(推荐 A)
A1. 项目行左侧加一个「状态位」 (保留文件夹图标形状,在它右下叠一个状态点/环,不用图标换色来表达状态,避免和 hover / 选中语义打架)
状态
表现
说明
运行中
warning 点 + 数字徽标
数字=该项目当前运行中的会话数,含定时任务运行;aria-label 给全量语义(如「2 个会话 · 1 个定时任务运行中」)
需要你介入
紫点(沿用 permission 语义)优先于 运行中点
权限/提问/Plan 待批准;数字仍只统计运行中
全部结束
绿色 ✓,短驻留
例如 10–15 秒,或被「查看过这个项目」清掉;提示「3 个会话已完成」
部分结束
warning 点 + 数字继续显示,冒一条瞬时提示
「1 个已完成,仍有 2 个在跑」,或在数字旁临时加 ✓1
有失败
红色 ⚠(沿用 failed)
与完成提示同一条通道
A2. 折叠态与展开态都显示状态位 (折叠时才是刚需),折叠只影响是否列出会话。
A3. 项目行尾加一个独立的小入口 (不改动「点击行=展开/收起」的既有语义):点开一个小浮层,分两节列出「运行中」与「刚刚结束 / 失败」,每条一键直达 —— 会话就切到对话,定时任务运行就跳到定时任务页并选中该任务与该次运行(#1298 已经有选中恢复)。浮层支持键盘、Esc、点外部关闭。
A4. 定时任务运行不建「临时会话」。 你原想法里的「临时会话看完即隐藏」我不建议做,原因具体:#1298 刚刻意把自动化转写从会话列表收回,临时会话会重新把它注入列表、和 reuse 模式(运行复用同一段会话)纠缠,还会带来「看过了但状态怎么算」的一致性问题。改成:
A5. 读/清除语义 :沿用现有「会话 outcome 徽标 + 读过即清」的模式:项目级提示在你查看该项目(或点开浮层)后清除,不常驻。
A6. 无障碍与主题 :状态不单靠颜色(数字 + aria-label + 不同形状);动画沿用有界呼吸并遵守 prefers-reduced-motion;亮/暗主题都用语义 token;浮层键盘可达。
可选 A7 :同一套聚合镜像到托盘菜单与 macOS dock 角标(#402 已有托盘入口)。建议另开 PR,不塞进第一版。
替代方案
想请你们定的几件事
数字口径 :定时任务运行是否合并进同一个数字,还是分开显示?(我建议分开:2 · 1 定时)
结束提示驻留 :短驻留(10–15 秒)还是常驻到查看为止?(我建议短驻留 + 查看即清,和现有 outcome 徽标一致)
折叠态进入运行列表的交互 :行尾独立按钮(我建议)还是长按/右键菜单?
定时任务完成是否复用原生通知 + 提示音 (现在提示音只在「需要你介入」时响)?默认开还是让用户设?
是否同时做托盘 / dock 角标镜像 ,还是留后续 PR?
和 feat(sidebar): align every row's leading edge, group pinned projects, and sweep running titles #1160 的顺序 :等它落地后叠在它的「单一前导字形」模型上(我建议),还是先按当前结构做、事后再对齐?这两条路我都能配合。
实现草图(工作量可控,供评估)
数据 :渲染层已有 runningSessions + 会话→项目归属 + latestSessionOutcomes;定时任务运行需要一个新的输入,建议 main 在 scheduled-runner 开始/结束时向渲染层发一条 scheduled.run.changed { taskId, runId, status, title } (最小、实时),渲染层不额外轮询 scheduled.listRuns。
UI :Sidebar.tsx 项目行状态位 + 行尾入口 + 浮层组件;样式落在 sessions.css / sidebar-threads.css(与 feat(sidebar): align every row's leading edge, group pinned projects, and sweep running titles #1160 同文件,需要协调顺序)。
i18n :预计 6–8 个新键 ×9 语言。
测试 :渲染测试(折叠态数字、完成提示、权限优先、定时任务计数分开)、源契约测试(状态位与浮层入口)、E2E 计划场景(含定时任务运行的项目:折叠→数字→结束→绿点,覆盖「全部结束」与「部分结束」两种)+ 真机截图。
契约 :component-spec §3 Sidebar(状态表)+ §20A(定时任务与侧栏的入口关系)+ E2E 场景,中英双语;是否加 ADR 看你们对本特性的定位。
如果你认可这个方向 ,告诉我走 A 还是 B(以及上面几个选择题的答案),我就开工出 PR:实现 + 双语契约 + 测试 + 真机截图一起交。@vastsa
想要的效果(一句话)
侧栏里折叠了会话列表的项目也能一眼看出:这个项目下有几个在跑(包含定时任务的运行),跑完有提示,并且能区分「全部结束」和「还有在跑」;点一下就能进到对应的会话 / 定时任务运行。这是个设计讨论,想先听你们的意见,同意方向我再开工。
现状(我都核对过代码)
apps/desktop/src/lib/sidebar-session-status.ts的sidebarSessionStatus()返回running | permission | selected | completed | failed,样式在apps/desktop/src/styles/sessions.css的.thread-item-status(运行中=warning 点、需要批准=紫点、完成=绿勾、失败=红叹号),动画的有界实现见 fix(sidebar): 限制运行状态呼吸动画,避免持续出帧 #1070 / fix(desktop): bound idle status indicator animations #1402。.sidebar-session-group-body.project.collapsed+aria-hidden把会话整个藏掉,于是「这个项目里还有 3 个在跑」这类信息完全消失。现在唯一用到「项目里有人在跑」的地方是删除项目的二次确认(Sidebar.tsx里entry.sessions.some(... runningSessions ...))。listableSessions),运行状态只在定时任务页里看;scheduled.finishRun之后渲染层拿不到任何事件,也没有对应通知。runningSessions、latestSessionOutcomes(会话级 outcome 徽标,读过通知即清除)、待批准的原生通知 + 提示音管线(stores/runtime/notification-runtime.ts)、NotificationCenter、托盘已有的「运行中/未读」入口(feat(tray): 托盘菜单支持运行中/未读/置顶会话快捷入口,并共享行额度 #402)、以及定时任务页现有的「任务 + 运行记录 + 打开会话/返回行」(feat(scheduled): 定时任务页改造为「任务 + 运行记录」主从视图(#1291 阶段一) #1298)。Sidebar.tsx、sidebar-session-status.ts、sessions.css、sidebar-threads.css)。我的提案(推荐 A)
A1. 项目行左侧加一个「状态位」(保留文件夹图标形状,在它右下叠一个状态点/环,不用图标换色来表达状态,避免和 hover / 选中语义打架)
aria-label给全量语义(如「2 个会话 · 1 个定时任务运行中」)permission语义)优先于运行中点✓1failed)A2. 折叠态与展开态都显示状态位(折叠时才是刚需),折叠只影响是否列出会话。
A3. 项目行尾加一个独立的小入口(不改动「点击行=展开/收起」的既有语义):点开一个小浮层,分两节列出「运行中」与「刚刚结束 / 失败」,每条一键直达 —— 会话就切到对话,定时任务运行就跳到定时任务页并选中该任务与该次运行(#1298 已经有选中恢复)。浮层支持键盘、Esc、点外部关闭。
A4. 定时任务运行不建「临时会话」。 你原想法里的「临时会话看完即隐藏」我不建议做,原因具体:#1298 刚刻意把自动化转写从会话列表收回,临时会话会重新把它注入列表、和
reuse模式(运行复用同一段会话)纠缠,还会带来「看过了但状态怎么算」的一致性问题。改成:2 会话 · 1 定时;A5. 读/清除语义:沿用现有「会话 outcome 徽标 + 读过即清」的模式:项目级提示在你查看该项目(或点开浮层)后清除,不常驻。
A6. 无障碍与主题:状态不单靠颜色(数字 +
aria-label+ 不同形状);动画沿用有界呼吸并遵守prefers-reduced-motion;亮/暗主题都用语义 token;浮层键盘可达。可选 A7:同一套聚合镜像到托盘菜单与 macOS dock 角标(#402 已有托盘入口)。建议另开 PR,不塞进第一版。
替代方案
想请你们定的几件事
2 · 1 定时)实现草图(工作量可控,供评估)
runningSessions+ 会话→项目归属 +latestSessionOutcomes;定时任务运行需要一个新的输入,建议 main 在scheduled-runner开始/结束时向渲染层发一条scheduled.run.changed { taskId, runId, status, title }(最小、实时),渲染层不额外轮询scheduled.listRuns。Sidebar.tsx项目行状态位 + 行尾入口 + 浮层组件;样式落在sessions.css/sidebar-threads.css(与 feat(sidebar): align every row's leading edge, group pinned projects, and sweep running titles #1160 同文件,需要协调顺序)。如果你认可这个方向,告诉我走 A 还是 B(以及上面几个选择题的答案),我就开工出 PR:实现 + 双语契约 + 测试 + 真机截图一起交。@vastsa