emrg: GUI open-sessions state + gui_state.json persistence — P4 slice 1 (GUI multi-session rant P4) - #637
Conversation
… 1 (GUI multi-session rant P4)
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 20260810-174555 (author). P4 slice 1: open-sessions state + gui_state.json persistence; 160 GUI (153+7) + 680 pytest green.
|
Tested this PR end-to-end on Windows — P4 slice 1 (open-sessions state + gui_state.json persistence) verified. One merge-blocking issue: CONFLICTING (doc-count positional). |
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 20260810-175341
Rebased on master (was CONFLICTING after #636's doc-count bump): resolved Agent.md/README.md/README.cn.md to true counts 163 = 43 dc + 17 cm + 22 app-commands + 46 renderer smoke + 15 i18n + 7 integration + 3 commands + 3 build-config + 7 gui-state (merged HEAD e6cd99b).
Verified locally on the resolved head: GUI suite 163/163 (7 new gui-state tests: guiStatePath, invalid-entry filtering, lastActive desc + cap-20, missing-lastActive ordering, atomic write + dir auto-create, overwrite, persist-side cap), 680 pytest green, doc-count guard passes, node --check clean.
Code review: gui-state.js is pure-Node atomic persistence mirroring install-info.json (#569 .tmp + rename); main.js openSessions Map bookkeeping with touchOpenSession/markSessionActive + 1s debounced persist; switchSession no longer closes the old connection (multi-session keep-open, browser-tab semantics); emrg:closeSession disconnects + persists but keeps disk data (correctly distinct from delete_session); emrg:getOpenSessions is the sidebar data source for slice 2; onOpen hook now passes projectPath. Matches the rant P4 write-path plan.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle 20260810-175450
Re-verified on head e6cd99b (rebase on master after #636 merge): GUI suite 163/163 (43 dc + 17 cm + 22 app-commands + 46 renderer smoke + 15 i18n + 7 integration + 3 commands + 3 build-config + 7 gui-state), 680 pytest green, doc-count guard passes (163 synced in Agent.md/README/README.cn). P4 slice 1: open-sessions state + gui_state.json persistence — solid.
|
Rebased branch (e6cd99b) re-verified — my conflict resolution applied exactly as predicted. |
…ce 1 entries (#638) Co-authored-by: EMRG Evolution <emrg@argszero.dev>
Summary
P4 slice 1 of the GUI multi-session rant (2026-08-10T15:07:19): the WRITE path for the open-sessions model — keep session connections open across switches (browser-tab semantics), persist them to
gui_state.json, and expose close/get IPC for the sidebar (slice 2).Changes
emrg/gui/gui-state.js (new, pure Node) — gui_state.json persistence:
guiStatePath(homeDir)—~/.emrg/gui_state.jsonsanitizeOpenSessions(list, cap=20)— drops invalid entries (missing sid/projectPath), sorts by lastActive desc, caps at 20 (shared write/restore rule)saveGuiState(homeDir, state)— atomic write (.tmp + rename, mirroring install-info.json emrg: fix flaky install-info.json read — guarded parse + atomic write #569)emrg/gui/main.js
openSessions: Map<sid, {projectName, projectPath, lastActive}>bookkeeping withtouchOpenSession/markSessionActive/schedulePersistGuiState(1s debounce) /persistGuiStateNow(capped via sanitize)switchSessionno longer closes the old session connection — multi-session keep-open (close now viaemrg:closeSession); marks active + persistsemrg:closeSessionIPC: disconnect + remove + persist, keeps disk data (distinct from delete_session)emrg:getOpenSessionsIPC: cross-project open list (sidebar data source for slice 2)sendMessagemarks session active; done/delta events refresh lastActive via the event bridge (onOpen hook now passes projectPath)deleteSession/newSessionupdate the open-sessions bookkeeping; flush persist on app quitemrg/gui/conn-manager.js —
onOpenhook now receivesprojectPath(3rd arg) so main.js can track per-session project paths.emrg/gui/preload.js — expose
closeSession/getOpenSessions.test/gui-state.test.js (new) — 7 tests: path, invalid-entry filtering, lastActive desc + cap 20, missing-lastActive ordering, atomic write + dir auto-create, overwrite, persist-side cap.
Verification
node --checkclean on all touched JSP4 remaining (slice 2): sidebar open-sessions list (跨项目), restore on boot from gui_state.json, activate/close/rename context menu, cap-20 restore, window-title sync.