ZER-404 W1: 三栏只读会话工作台骨架 - #30
Conversation
Replace ProTable sessions list and detail pages with a read-only three-column SessionWorkbenchPage using Ant Design X Conversations for the sidebar, status bar + transcript placeholder in the main panel, and metadata/alerts/events tabs in the inspector. Co-authored-by: ZeroPointSix <ZeroPointSix@users.noreply.github.com>
- 左栏新增 New chat 禁用占位(会话创建 W6 开放) - 中栏状态条补齐 Profile / workdir 字段 - 底部只读条内嵌 SSE 连接态:新增 StreamStatusContext,复用 AdminLayout 同一 SSE,不新建连接 - 新增 useMediaQuery,≤1100px 左右栏折叠为 Drawer,390 下顶栏不溢出 - 版本号 0.2.3 → 0.3.0 - 重新构建并提交 web/app.js 与 web/styles.css 产物
追加提交
|
Review:ZER-404 W1 三栏只读会话工作台过了一遍 PR 描述、4 个 commit、18 个改动文件、CI 结果以及相关源文件( 方向和拆包认可。 CI: 以下是建议合并前回一轮的问题。 🔴 需要确认1. 事件 Tab 可能被 SSE 静默清空后不再恢复
queryClient.setQueriesData<SessionTimelineItem[]>(
{ queryKey: ['sessionTimeline'] },
[],
)把所有会话的 timeline 缓存清成空数组,然后依赖 但 useEffect(() => {
if (!sessionQuery.data) return;
queryClient.setQueryData<SessionTimelineItem[]>(
['sessionTimeline', sessionId],
(current = []) => (current.length ? current : initialTimeline(sessionQuery.data!)),
);
}, [queryClient, sessionId, sessionQuery.data]);如果重拉回来的快照内容没有变化,React Query 的 structural sharing 会返回同一个对象引用 → effect 不重跑 → 事件 Tab 停在「暂无事件」,直到用户切走再切回会话。 旧的 建议二选一:
2. return [...sessions].sort((a, b) =>
String(b.updated_at || b.created_at).localeCompare(
String(a.updated_at || a.created_at),
),
);只要后端同时出现 关键在于:这个函数原本只喂 ProTable 展示,本 PR 之后它被提升成了路由决策依据 —— 🟡 建议改3. 构建产物入库
pnpm build && git diff --exit-code web/app.js web/styles.css4. 样式里定义了 <Typography.Text type="secondary">
目录 <Typography.Text code>{session.workdir || '-'}</Typography.Text>
</Typography.Text>实际效果是长 workdir 不会被截断,会把状态条撑开。 5.
6. 只读边界目前是「软」的 底部 🔒 条是纯文案,只读性靠「没画入口」保证。Review Contract 写的是「守住只读硬边界」,措辞与实现之间有落差。W1 骨架阶段可以接受,但建议要么对齐措辞,要么用下面第 7 条的断言测试把它固化。 7. 新增约 1400 行 UI,0 个测试文件 18 个改动文件里没有任何
这样第 6 点的「硬边界」才真正有机制保障,W4 接入活动流时也不会不小心把写入口带进来。 🟢 小问题
结论Approve with comments 的量级:没有阻断性缺陷,CI 全绿,只读边界在 UI 层守住了,W1 验收标准基本达成。 但第 1 条(timeline 被清空)和第 2 条(时间字符串排序)都是会在生产里静默出错、且很难从截图验收中发现的问题,建议这一轮先修掉;第 3、7 条可以放进 W2。 |
ZeroPointSix
left a comment
There was a problem hiding this comment.
Context fact card
Target
- Repository:
ZeroPointSix/openab-plus - PR:#30
ZER-404 W1: 三栏只读会话工作台骨架 - Reviewed head:
4d94cb98a966c9d50987897baf1a346bcd97be61 - Target branch:
main - 当前
main:a03d9de5dd1853bf9efcce6e999374d8f2ab09ef - 目标:确认 W1 工作台改造是否可合并,以及上一轮 review 修复是否完整
Verified facts
- 最新
4d94cb9已正确处理上一轮两个主要问题:- SSE 诊断帧不再清空全部
sessionTimeline缓存;cursor_reset/ streamerror只触发 session 数据重拉,和后端 SSE 事件名一致。 sortSessions已改为Date.parse()数值排序,并新增跨时区测试。
- SSE 诊断帧不再清空全部
- 同一提交还补了 workdir ellipsis、
New chatTooltip、AlertItem类型收窄;这些修改方向都没问题。 - 生成产物漂移目前已经由
.github/workflows/admin-web.yml的pnpm build+git diff --exit-code -- web/index.html web/app.js web/styles.css覆盖,上一轮对此的担心可以关闭。
CI / validation
- 当前 head
4d94cb9能看到的 check 只有Review Contract / validate,结果为成功。 Admin Web最近一次成功属于旧 head(例如0f331c7),不是当前4d94cb9。因此不能把旧的lint / test / build / embedded assets结果当成当前 head 的最终 CI 证据。- 我尝试在独立本地执行环境重新 clone/rerun,但该环境当前无法解析
github.com(DNS),所以本次没有额外声称“本地重跑通过”。
阻断问题
1. 当前 PR 已与 main 冲突,必须先 rebase
当前 main 已在本 PR 建立后前进到 a03d9de(合入 #28),而本 PR 的 merge base 仍是 b177f5b。当前比较结果:
- PR:ahead 5 commits
- PR:behind
main39 commits - GitHub:
mergeable = false - GitHub:
mergeable_state = dirty - PR 已有
needs-rebase标签
所以当前状态不能合并。并且不是纯机械 rebase:main 在这 39 个 commit 中也修改了 web/src/pages/SessionDetailPage.tsx、web/src/components/SessionTable.tsx、web/src/types.ts 和生成的 web/app.js;而本 PR 正好删除/重命名/替换这些文件,需要人工保留双方语义。
2. rebase 时必须保住 #28 已进入 main 的 session metadata,否则会功能回退
当前 main 的 SessionSnapshot 已新增:
reasoning_effort?: string;
metadata_source?: 'acp' | 'configured';而当前 main 的 SessionDetailPage 已把它们展示为:
Thinking→session.reasoning_effort元数据来源→ ACP 运行时 / 配置值 / 未报告
本 PR 的 SessionInspector 是“承接原 SessionDetailPage”的替代实现,但 reviewed head 4d94cb9 的 types.ts 和 Inspector 仍基于旧 base,没有这两个字段,也没有对应展示。
rebase 解决冲突时不能简单选择 PR 一侧。 请把 reasoning_effort / metadata_source 保留进最终 SessionSnapshot,并把 Thinking / 元数据来源 迁移到新的 Inspector(至少保证当前 main 已有的信息不因工作台替换而消失)。RecentSessionsTable 与当前 main 的 SessionTable 之间的细小展示差异也建议顺手按当前 main 取新语义。
3. rebase 后需要当前 head 的新一轮 Admin Web CI
解决冲突并更新 head 后,请确认新的 Admin Web workflow 在新 SHA上跑完:type-check、vitest、profile schema smoke、build、generated assets diff、Gateway embedding 全部通过。当前旧 SHA 的绿灯不足以覆盖 rebase 后结果。
非阻断建议
Tooltip > span > disabled Button已解决鼠标 hover 提示,但 wrapper 本身没有tabIndex/ 可访问描述;键盘用户仍较难发现“为什么禁用”。W1 可不阻断,后续可补。- 工作台新增 UI 仍缺直接的组件/只读边界回归测试;这可以按 PR 里的 W2/E2E follow-up 处理,不要求本轮为了它扩大范围。
Review 结论
当前暂不建议合并。 主体设计和上一轮代码修复我认可;现在真正需要处理的是:
- rebase 到当前
main并解决冲突; - 保留 #28 已进入 main 的
reasoning_effort/metadata_source展示能力; - 在 rebased head 上重新拿到完整
Admin WebCI 绿灯。
这三项完成后,我预期 W1 本身可以进入可合并状态。
Summary
将
/sessions与/sessions/:id从 ProTable 运维表形态替换为 Factory/Cursor 风格的三栏只读会话工作台(W1 骨架,无后端依赖)。改动点
SessionWorkbenchPage作为/sessions与/sessions/:id的统一入口Conversations按 Agent 分组展示会话,支持搜索/状态/平台筛选,数据来自现有GET /api/v1/sessionsSessionDetailPage迁移)@ant-design/x@1.0.5(兼容现有 antd 5.x)SessionsPage/SessionDetailPage及 ProTable 列表路径OverviewPage仍保留 compactSessionTable(最近 8 条),点击「查看」进入工作台只读边界
本地验证
/sessions有数据时自动选中最新会话并跳转/sessions/:id未完成项(后续包)
Review Contract
Goal
把 Admin
/sessions主路径从 ProTable 运维表改为只读三栏会话工作台,让用户进站即可按 Agent 浏览与观测会话,并守住只读硬边界。Non-goals
Accepted Residual Risks
/sessions无选中 ID 时会自动跳转到最新会话,深链到列表根路径的行为与旧版不同;可接受,因 W1 目标是工作台心智。@ant-design/x。Acceptance Criteria
/sessions与/sessions/:id进入三栏工作台,非 ProTablepnpm lint/pnpm test/pnpm build通过Follow-ups
@ant-design/x2.x 迁移