emrg: GUI workspace panel P2 framework — resizable panel + tab bar + per-session tab state (rant 2026-08-11T12:20:35) - #664
Conversation
…per-session tab state (rant 2026-08-11T12:20:35)
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle
P2 framework slice of the workspace-panel rant: resizable panel (absolute resizer outside flex flow, .dragging transition suppression, width/collapse persisted separately), tab bar (Files/Artifacts static + opened-file tabs with dedupe/cap-8/close), per-session tab & artifact state (switchSession wiring), tool cards retained under Artifacts until P3.2 re-scopes registration. Verified: GUI 193/193 ✓ (incl. 5 new smoke tests), pytest 694 ✓, doc guard 3/3 ✓, import + --help ✓. CI test run green.
pm25coder
commented
Aug 11, 2026
I tested PR #664 end-to-end on branch head Verification results
Code review notes (non-blocking)
Everything else looks clean: the absolutely-positioned resizer stays out of the Nice work — the framework lands cleanly and gives the P3 viewer a solid foundation to plug into. |
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle
Reviewed P2 framework (resizable panel + tab bar + per-session tab state) in a local worktree:
- Tab bar (files/artifacts static tabs + open-file tabbar with dedup, 8-tab cap with oldest eviction, close button) + per-session state isolation (openedTabsBySid/artifactsBySid/activeTabBySid, switchSession wired into app.js session switch/new).
- Resizer: absolute-positioned handle outside flex flow (avoids WebContentsView bounds x offset), .dragging suppresses width transition, width/collapsed separately persisted (localStorage), clamp 240px–45% vw.
- Tool results now registered per-session (sid from event bridge), P1 cards retained in artifacts pane until P3.2.
- Verification: renderer smoke 72/72 (incl. 5 new P2 tests: tab render/switch, resizer drag + persistence, collapse/expand width restore, file-tab dedup/cap/close, per-session isolation), app-commands 22/22, build-config 5/5, i18n 15/15. Doc counts consistent (GUI 187→193). (daemon-client/integration env-dependent tests need .venv — not affected by this renderer-only PR.)
No issues found.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle (3rd)
Re-verified against branch head 9cac295: resizable panel (absolute resizer, .dragging transition suppression, width/collapse separate persistence), tab bar + per-session tab/artifact state, addToolResult(data, sid) wiring. Local: GUI 193/193 ✓ pytest 694 ✓ doc guard 3/3 ✓. CI test run green (31461002024). Merge conditions met (3 consecutive ✅ from different cycles).
Uh oh!
There was an error while loading. Please reload this page.
P2 slice 1 (framework) of the GUI workspace-panel rant (P1 data layer #661 merged).
P2.1 Panel structure
#result-tabbar, P3 viewer wires in)#result-resizerabsolutely positioned drag handle (out of the #app flex flow, R6-② — prevents WebContentsView bounds x offset); drag sets panel width,.draggingclass suppresses the width transition (R1-①)P2.2 Tab manager (per-session container mode, gap 5)
openFileTab/closeFileTab/activateTab— same-path dedupe, max 8 tabs (evicts oldest), closeable tabs, active highlightopenedTabsBySid/artifactsBySidstate maps;switchSession(sid)shows each session's own tabs (wired into app.js switchSession/newSession);addToolResult(data, sid)classifies artifact records per event sidi18n:
result.tabFiles/tabArtifacts/filesEmpty/resizezh/en.Tests: +5 renderer smoke (tab render/switch, resizer drag + persistence + .dragging lifecycle, collapse/width separation, tab dedupe/cap-8/close, per-session isolation); harness extended with element
dispatch(), window listener store, localStorage mock, new element IDs. GUI 188 → 193; pytest 694 ✓; doc guard 3/3 ✓ (README/README.cn/Agent).Not in this slice (next): WebContentsView framework (P2.3, parallel with P3.4 HTML preview), file browser tree (P3.1), artifact list re-scope (P3.2), viewer tabs (P3.3).