Repository navigation
v1.1.2
这次一共做了两大块:
一、去轮询,全改 SSE 推送
问题:前端同时跑 15s session 轮询 + 5s action history 轮询 + SSE 长连接,三者并存,每次轮询全量替换数据导致明显 UI 闪动。
改法:
- 后端 ingest/service.ts:每次 ingestSessions() 完成后与上次快照做 diff,有变化通过 EventEmitter 发出 session_changed / action_changed 事件;同时加了文件 mtime+size 缓存,未变化的 session
文件直接跳过,减少无效 parse - 后端 routes/stream.ts:SSE 连接时订阅上面的 EventEmitter,有 session 变化推 session_updated 事件,有 action 变化推 action_history_updated 事件(按 watchSessionId 过滤);断开时 off 清理,无内存泄漏
- 前端 App.tsx:删掉两个 setInterval,改为监听 SSE 的 session_updated / action_history_updated 事件做精准 patch;重连时通过 staleness 检测(2s 阈值)补取一次快照
- 前端 store/app-store.ts:新增 patchSession(更新/插入单条 session,保持 updatedAt 排序)、removeSessionFromList、setActionHistoryFromSse(直接更新,不触发 loading 状态)
二、前端 UI 优化
Scroll 处理:
- SessionListPanel:新增完整 ViewportSnapshot 模式,anchor-based 滚动位置恢复,workspace 切换重置到顶部
- TerminalMessagePanel:替换 scrollIntoView(会跳整页)为精确 viewport 内 scrollTop 计算,session 切换归顶,新 terminal 到达时 stickToBottom
- DebugStreamPanel:默认 stickToBottom 跟随最新事件,scope 切换强制跳底,用户向上滚动后不强制拉回
视觉效果:
- Loading spinner:CSS @Keyframes spin,出现在各 panel h2 旁
- 选中卡片左侧竖线:box-shadow: inset 3px 0 0 var(--accent),无布局抖动
- Payload 可读性:字号 0.88rem / 行高 1.6 / JSON 语法着色(key 蓝 / string 绿 / number 红粉)
- DebugStreamPanel 可折叠 payload:默认折叠 + 渐隐遮罩,点击展开完整 JSON,所有信息保留
- Session 卡片 meta 行:显示 action count + 运行时长,running session 实时 1s 计时
- focus-visible:全局键盘导航 outline
- Mobile tab:≤840px 下 tab 按钮均匀填满宽度
三、杂项修复
- wait -n → wait,修复 macOS bash 3.2 不支持 -n 的启动报错