feat: add chat-pinned workspace actions - #2106
Conversation
Split workspace dropdown behavior into explicit new-chat, move-chat, default-workspace, and sidebar-filter actions. Guard session workspace moves during active/pending streams on both client and backend, preserve workspace prefix compatibility, and add focused regression coverage plus operator handoff notes.
Claude Opus reviewModel: Claude Opus via Claude Code ( Code Review: PR #2106 — Chat-pinned workspacesVerdictAPPROVE WITH NON-BLOCKING CONCERNS — No blocking issues. The core change (workspace pinned per-session with explicit dropdown actions and a server-side 409 guard) is sound, well-tested, and backward-compatible. Several non-blocking items below should be considered before/after merge. Blocking IssuesNone. Non-blocking Issues1. 2. 3. 4.
5. 6. 7. 8. 9. Test Coverage
Rollout RecommendationSafe to ship behind normal release. Suggested order of operations:
Rollback is clean: no schema changes; per-session |
|
Thanks @Casey-Mo — substantial workspace-pinning slice that materially improves the chat-vs-workspace mental model. Reviewed the diff, want to make sure the UX shape is right before the code review takes too much time. Read on the change
UX gate — screenshots needed before deep code reviewSince this is a substantive UI shape change (new dropdown layout, new confirm flows, new "pinned" affordance), screenshots in the PR body before I sink Opus time into the 476-LOC diff. Specifically: Workspace dropdown — 1280px desktop and 390px mobile:
Cross-chat behavior — 1280px:
Show sessions affordance — 1280px:
What I'll do next once screenshots land
LabelsAdding |
|
Closing: this change was intended for local deployment only, not upstream submission. |
Summary
/api/session/updateprotection so workspace moves are rejected during active/pending streams while model-only updates remain allowed[Workspace::v1]prompt contextVerification
python -m pytest tests/test_workspace_selector_actions.py tests/test_workspace_system_message.py tests/test_workspace_display_prefix.py tests/test_issue1913_workspace_prefix_sentinel.py tests/test_profile_default_workspace_823.py tests/test_workspace_blank_page_fix.py tests/test_issue1464_workspace_dropdown_filter.py tests/test_workspace_panel_session_list.py tests/test_default_workspace_fallback.py tests/test_empty_session_no_disk_write.py tests/test_issue2066_stale_sidebar_spinner.py -q66 passed90 passed, 0 failedpull --ff-only+ stash pop +git diff --checkHermesWebUI/0.51.45-dirtyduring smokeManual smoke covered
Session is still streaming; wait for the current turn to finish before moving workspace.