diff --git a/emrg/server/evolution_prompt.md b/emrg/server/evolution_prompt.md index 9bde286..13495cc 100644 --- a/emrg/server/evolution_prompt.md +++ b/emrg/server/evolution_prompt.md @@ -389,6 +389,7 @@ When reading rants, follow these rules: > - GUI per-session chat-view containers (#634 GUI 多会话 rant 2026-08-10T15:07:19 P3 slice 2:每会话一个 `.session-view` 容器 + display 切换(浏览器 tab 效果)——`#chat-view` 变绝对定位包装(overflow:hidden),`.session-view` = inset:0 滚动容器(display:none 除非 `.active`);app.js `ensureSessionView(sid)`(wrapper 内按 dataset.sid 查找/建容器 + 幂等 registerContainer,不依赖 getElementById——测试沙箱对未知 id 返新 mock 且 mock .id 不入 attributes)`activateSessionView(sid)`(去旧加新 .active + scrollToBottom,导出供测试);`switchSession`/`newSession` 改为激活容器(**不再 Chat.clear()**——切走保留滚动/草稿/工具卡片/流式现场);`deleteSession` unregister+移除被删容器;`/clear`+`/rewind` 定向 `Chat.clear(state.sessionId)`(无 sid 只清激活容器,后台容器保留);`updateEmptyState` 查**激活会话**容器(wrapper 恒含 session-view 子节点不能数 wrapper);chat.js `chatContainer(sid)` 回退链=已注册容器→激活会话容器(无 sid 事件落激活会话,P4 过渡)→默认 #chat-view;CSS `#chat-view > *:not(.session-view)` 防滚动条内缩到 760px 中栏 + 媒体查询 padding 移入 .session-view;+3 测试 renderer.smoke 40→43 + mock innerHTML setter 忠实化("" 清 children,Chat.clear 依赖);GUI 150→153 三文档同步;680 pytest 全绿;P3 剩余=事件路由终态,P4-P6 待续) ✅ > - GUI disconnected per-sid isolation (#636 GUI 多会话 rant 2026-08-10T15:07:19 P3 finalize:disconnected 事件按 sid 隔离——sidState 条目加 `disconnected` 标记 + 注册容器 `.disconnected` 类(`Chat.hasContainer(sid)` 守卫,防 chatContainer 回退链误标激活容器);**全局横幅/红点仅激活会话(或无 sid 单会话过渡期)断连显示**,后台会话断连不打扰全局 UI(rant 验收"断一条不影响其他会话");`status` connected 清全部断线标记 + 容器类;switchSession 切入断线会话提示 i18n `app.sessionDisconnected`(G89 输入条仍可用);CSS `.session-view.disconnected` 视觉(dim + hatch);+3 测试 renderer.smoke 43→46、GUI 153→156 三文档同步;680 pytest 全绿;P3 完成) ✅ > - GUI open-sessions state + gui_state.json (#637 GUI 多会话 rant 2026-08-10T15:07:19 P4 slice 1 写路径:新 `emrg/gui/gui-state.js`(纯 Node)——`guiStatePath`(~/.emrg/gui_state.json)+ `sanitizeOpenSessions`(跳过缺 sid/projectPath 条目、lastActive 倒序、上限 20,读写共用)+ `saveGuiState`(.tmp+rename 原子写,镜像 #569);main.js `openSessions: Map` 簿记 + touchOpenSession/markSessionActive/防抖 1s 写盘 + 退出冲刷;**switchSession 不再关闭旧会话连接**(多会话保持,浏览器 tab 语义——关闭走新 `emrg:closeSession` IPC:断开+移除+持久化**保留磁盘数据**,与 delete_session 区分);`emrg:getOpenSessions` IPC(跨项目打开列表,slice 2 侧边栏数据源);sendMessage 标记激活 + 事件桥 done/delta 刷新 lastActive(conn-manager onOpen 钩子加 projectPath 参);deleteSession/newSession 同步簿记;+7 测试 gui-state.test.js;GUI 153→163(#636 并入后 renderer.smoke 46 + 7 gui-state,计数冲突解到实测 163)三文档同步;680 pytest 全绿;P4 剩余=slice 2 sidebar + 启动恢复) ✅ +> - GUI open-sessions sidebar + gui_state restore (#639 GUI 多会话 rant 2026-08-10T15:07:19 P4 slice 2 读路径/侧边栏:main.js `restoreOpenSessions`(init 读 gui_state.json → 重开有效条目 cap 20 + resume 重订阅 → 失效跳过 + 重写盘 → activeSid 恢复/回退最近有效 → 窗口标题同步)+ `broadcastOpenSessions`(打开/激活/关闭/删除/新建每次变更推 `open_sessions` 事件给 renderer)+ init 返回 `open_sessions` + `active_sid`(renderer 直接采用恢复激活会话,免 switchSession IPC 往返);sidebar.js `renderOpenSessions`(侧边栏顶部跨项目打开会话区:项目名/会话标题、lastActive 倒序、激活高亮、点击切换、右键关闭保留数据/重命名/删除)+ highlight 扩展覆盖;app.js `state.openSessions` + `open_sessions` 事件 + `closeOpenSession`(断开+释放容器+保留磁盘数据;关激活会话 → 切最近打开会话否则新建)+ showOpenSessionsMenu;index.html `#open-sessions` + i18n zh/en + CSS;+4 测试 renderer.smoke 46→50 + mock 升级(querySelectorAll DFS 类选择器 + classList.toggle 忠实 force);GUI 163→167 三文档同步;680 pytest 全绿;P4 完成,P5-P6 待续) ✅ #### 2.2 Latest GitHub code changes