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': 'セッションの共有を解除しました',