feat(ui): expose desktop session actions in header

Add a dedicated desktop header menu for the active session while keeping recent-session switching available when the sidebar is closed. Match inline rename behavior with the sidebar and expose rename, copy ID, share, export, archive, and delete actions with localized feedback.

Automatically copy newly created share links, keep share/unshare state synchronized across live and global stores, and normalize stale upstream unshare responses so the UI immediately reflects successful unsharing.

Require Markdown exports to load every available message page before formatting the conversation. Abort incomplete root exports, retain explicit child-session skip warnings, and guard complete-history pagination against failures and cursor cycles.
This commit is contained in:
Bohdan Triapitsyn
2026-07-31 21:02:23 +03:00
parent aae889b904
commit a6fb7193dc
20 changed files with 564 additions and 72 deletions
+6 -1
View File
@@ -476,6 +476,10 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.project.actions.edit': '편집',
'sessions.sidebar.project.actions.newDraftSession': '새 드래프트 세션',
'sessions.sidebar.session.menu.rename': '이름 변경',
'sessions.sidebar.session.menu.copyId': '세션 ID 복사',
'sessions.sidebar.session.copyId.success': '세션 ID가 복사되었습니다',
'sessions.sidebar.session.copyId.error': '세션 ID를 복사하지 못했습니다',
'header.sessionActions.openAria': '세션 작업 열기',
'sessions.sidebar.session.rename.save': '세션 이름 저장',
'sessions.sidebar.session.rename.cancel': '세션 이름 변경 취소',
'sessions.sidebar.session.menu.unpin': '세션 고정 해제',
@@ -498,6 +502,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.session.menu.label': '세션 메뉴',
'sessions.sidebar.session.untitled': '제목 없는 세션',
'sessions.sidebar.session.export.nothingToExport': '내보낼 내용 없음',
'sessions.sidebar.session.export.failedLoadHistory': '전체 세션 기록을 불러오지 못했습니다',
'sessions.sidebar.session.export.success': '세션 내보냄',
'sessions.sidebar.session.export.failedRevealPath': '경로 표시 실패',
'sessions.sidebar.session.export.untitledSubagent': '제목 없는 서브 에이전트',
@@ -553,7 +558,7 @@ export const dict: Record<I18nKey, string> = {
'sessions.sidebar.dialogs.sessionDelete.descriptionManyWithDate': '이 작업은 {dateLabel}의 세션 {count}개를 영구 삭제합니다.',
'sessions.sidebar.dialogs.sessionList.more': '+{count}개 더 보기',
'sessions.sidebar.session.share.successTitle': '세션 공유됨',
'sessions.sidebar.session.share.successDescription': '메뉴에서 링크를 복사할 수 있습니다.',
'sessions.sidebar.session.share.successDescription': '공유 링크가 클립보드에 복사되었습니다.',
'sessions.sidebar.session.share.error': '세션을 공유할 수 없음',
'sessions.sidebar.session.share.copyUrlError': 'URL 복사 실패',
'sessions.sidebar.session.unshare.success': '세션 공유 해제됨',