diff --git a/emrg/server/evolution_prompt.md b/emrg/server/evolution_prompt.md index 3ce0e1b8..19686fc1 100644 --- a/emrg/server/evolution_prompt.md +++ b/emrg/server/evolution_prompt.md @@ -385,6 +385,7 @@ When reading rants, follow these rules: > - ConnManager daemon restart recovery (#627 GUI 多会话 rant 2026-08-10T15:07:19 P2 slice 4:短窗口内**所有**打开会话连接同时断 → 判定 daemon 重启 → `recoverAll()` 全量恢复——close 全部 → 按 `open()` 序列(引导→skipStart→resume_session 重订阅)逐会话重开,单会话失败跳过不阻塞其余;单条断 → 不触发全量恢复(留给后续片独立退避);`_restartDetected()` 检查 `_disconnects`(sid→最近断连时间戳)全部落在 `restartWindowMs`(默认 1000ms 可配)窗口内;`_recovering` 守卫防 close→disconnect→recoverAll 递归;+3 测试 conn-manager 5→8(全断自动恢复/单断负态/recoverAll 重开重订阅含 stale 连接排除)、GUI 121→127(合并 #626 后 124→127 文档计数冲突化解)三文档同步;680 pytest 全绿;P2 剩余=main.js rewire + single-conn backoff,P3-P6 待续) ✅ > - GUI main.js ConnManager rewire (#629 GUI 多会话 rant 2026-08-10T15:07:19 P2 收官:main.js 全量改走 ConnManager——conn-manager `ensureDaemon()` 保留 daemon 级连接(ping/list_sessions/set_model/github_* 等非会话命令),会话连接 skipStart 不 spawn;`open({resume:false})` 供新会话(daemon 隐式订阅),失败关半开连接不泄漏,断连残留 stale 关闭重开;`onOpen`/`onRecovered` 钩子(事件桥含 recoverAll 重开路径 + 恢复后 sessions/pong/status 刷新);`close()` 标 `_intentionalClose` 抑制断线横幅 + 不触发重启判定;**单连接独立退避**(N 会话单条断 → 退避重开该会话);daemon_client G65 自有流锁移入实例(own done/timeout/session-busy/own cancelled/断连释放);main.js 删全局 client/ownStream/deltaBuf,IPC 全走 activeConn/requireConn/openSession,sendMessage 自动 open,switchSession 切走关旧连接,cancel 发激活连接,事件桥附带 sid;+15 测试(dc 37→43、cm 8→17)GUI 127→142 三文档同步;680 pytest 全绿;P2 完成) ✅ > - GUI renderer per-session chat isolation (#630 GUI 多会话 rant 2026-08-10T15:07:19 P3 slice 0:renderer 会话级聊天状态隔离——chat.js `sessionState` Map(sid→{groupNodes,toolRows,doneRids},sid=null 旧版单会话桶零回归)+ 全部 handler 可选 sid(handleDelta/handleDone/handleToolStart/handleToolEnd/clearTyping/clear/addSystemMessage/addUserMessage/createAssistantNode)+ 容器路由 API `registerContainer(sid,el)`/`unregisterContainer(sid)`/`chatContainer(sid)`(未注册回退默认 #chat-view,P4 openSessions 用)+ `groupNodesFor`/`toolRowsFor` 访问器;app.js handleEvent 透传 `evt.sid`(#629 事件桥附带),disconnected 按 sid 隔离分组清理+工具行失败标记;+4 测试 renderer.smoke 32→36(两会话同 rid 隔离/done 只清本会话/clearTyping 作用域/容器路由回退);GUI 142→146 三文档同步(#629 合并计数冲突解到 146);680 pytest 全绿;P3 剩余=chat-view 容器 + sessionsBySid + 事件按 sid 路由,P4-P6 待续) ✅ +> - GUI renderer sessionsBySid state table (#632 GUI 多会话 rant 2026-08-10T15:07:19 P3 slice 1:renderer 会话级状态表——`state.sessionsBySid: Map` + `sidState(sid)` get-or-create;`state.busy`/`ownStreamRequestId`/`mode` defineProperty getter/setter 委托**激活会话条目**(既有调用点零改动);handleEvent done/cancelled/disconnected/error 释放**事件 sid 条目**锁(后台会话广播 done/取消/断连不误清激活会话,仅激活会话事件同步输入条 UI);switchSession 不再清 marker(每会话自持 busy/rid,P4 切回继续生成符合验收);+4 测试 renderer.smoke 36→40(激活条目路由/切会话指针移动/bg done 隔离/无 sid 回退激活);GUI 146→150 三文档同步;680 pytest 全绿;P3 剩余=chat-view 容器 + 事件路由终态,P4-P6 待续) ✅ #### 2.2 Latest GitHub code changes