From c59653997ce117a5e9238ee571eddce6fb316999 Mon Sep 17 00:00:00 2001 From: Andre Brait Date: Mon, 5 Oct 2026 03:28:12 +0000 Subject: [PATCH 1/2] fix(ui): shorten message actions for mobile --- CHANGELOG.md | 2 +- components/MessageCopyActions.tsx | 2 +- lib/i18n/locales/en.json | 3 ++- lib/i18n/locales/ja.json | 1 + lib/i18n/locales/zh-CN.json | 1 + 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99cf728ec..85972d858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ All notable changes to **omp-web** (`@kahme247/ompweb`) are documented in this f - Create a workspace by cloning a Git repository: in the **Add workspace** dialog, enter an `https://` or ssh URL and choose **Clone here** to clone into a new folder under the selected directory, which then becomes the active workspace. Clone progress streams into the dialog; **Cancel clone** stops git and deletes the partial clone. git never prompts, so private repositories need a credential helper or ssh agent. - Add a manual refresh button to the sidebar's Provider Usage panel, with the same success feedback as workspace refresh. Manual refresh bypasses omp-web's usage cache and invalidates omp's cached reports before fetching fresh limits; automatic five-minute refresh remains unchanged. Manual refresh requires an omp that supports `usage invalidate`; an unsupported or failed refresh shows as unavailable instead of reporting success. - Add an off-by-default **Resume running sessions after a restart** setting in Settings → System & Updates. When omp-web restarts while agents are working, it restarts those sessions and prompts each with "Session interrupted and resumed. Continue as you would have done without the interruption." Work in progress at the moment of the restart, such as a running command, is lost. Do not also resume those sessions from a terminal while omp-web is down. -- Add **Copy** and **Copy as Markdown** below user messages and completed assistant replies, with keyboard access and touch-sized controls. Copy only message text, excluding thinking, tool output, and renderer controls; preserve full source for oversized raw-text messages. +- Add **Copy** and **Markdown** below user messages and completed assistant replies, with keyboard access and touch-sized controls. Copy only message text, excluding thinking, tool output, and renderer controls; preserve full source for oversized raw-text messages. Shorten the message fork action to **Fork** to leave more room on mobile. - Scope Ctrl+A / Cmd+A to the selected message, currently loaded chat, or active file contents instead of the whole page. Message selection includes collapsed extension previews and expanded details without toolbar labels. Newer pane focus takes precedence over retained child selections. Text fields and IME composition retain native behavior; browser-menu commands and embedded viewers remain browser-controlled. - Add an off-by-default **Scope native Select All (experimental)** switch in Settings → Interface & Behavior. The per-browser preference narrows whole-page selections from native menus while leaving keyboard scoping independent. Disable it if browser selection handles or menus behave unexpectedly; intentional whole-page selections can also be narrowed. - Play back a voice recording before transcribing or sending it. Pause keeps a left-side preview control; Stop opens a review deck with play, discard, and transcribe-and-send. diff --git a/components/MessageCopyActions.tsx b/components/MessageCopyActions.tsx index 45e2523e4..c007c9064 100644 --- a/components/MessageCopyActions.tsx +++ b/components/MessageCopyActions.tsx @@ -49,7 +49,7 @@ export function MessageCopyActions({ texts, bodyRef }: {
{[ { label: t("messageView.copyMessage"), text: t("messageView.copy"), copied: plain.copied, onClick: copyPlain, Icon: Copy }, - { label: t("messageView.copyMarkdown"), text: t("messageView.copyMarkdown"), copied: markdown.copied, onClick: () => markdown.copy(texts.join("\n\n")), Icon: FileText }, + { label: t("messageView.copyMarkdown"), text: t("messageView.markdown"), copied: markdown.copied, onClick: () => markdown.copy(texts.join("\n\n")), Icon: FileText }, ].map(({ label, text, copied, onClick, Icon }) => ( )} diff --git a/lib/i18n/locales/en.json b/lib/i18n/locales/en.json index d635d6b4a..e019716c2 100644 --- a/lib/i18n/locales/en.json +++ b/lib/i18n/locales/en.json @@ -1585,6 +1585,7 @@ "settingsConfig.ttsVoiceDesc": "Select the browser voice for text-to-speech reading.", "settingsConfig.defaultVoice": "Default system voice", "messageView.readAloud": "Read aloud", + "messageView.read": "Read", "messageView.stopSpeech": "Stop speaking", "settingsConfig.ttsNotSupported": "Not supported in this browser", "btw.panelTitle": "Side question", diff --git a/lib/i18n/locales/ja.json b/lib/i18n/locales/ja.json index b46236d54..2f874ef7b 100644 --- a/lib/i18n/locales/ja.json +++ b/lib/i18n/locales/ja.json @@ -1548,6 +1548,7 @@ "settingsConfig.ttsVoiceDesc": "テキスト読み上げに使用するブラウザの音声を選択します。", "settingsConfig.defaultVoice": "システムの既定の音声", "messageView.readAloud": "読み上げ", + "messageView.read": "読み上げ", "messageView.stopSpeech": "読み上げを停止", "settingsConfig.ttsNotSupported": "このブラウザではサポートされていません", "btw.panelTitle": "サイド質問", diff --git a/lib/i18n/locales/zh-CN.json b/lib/i18n/locales/zh-CN.json index 20dbb51b5..67ca8fc27 100644 --- a/lib/i18n/locales/zh-CN.json +++ b/lib/i18n/locales/zh-CN.json @@ -1548,6 +1548,7 @@ "settingsConfig.ttsVoiceDesc": "选择用于文本转语音朗读的浏览器声音。", "settingsConfig.defaultVoice": "系统默认声音", "messageView.readAloud": "朗读", + "messageView.read": "朗读", "messageView.stopSpeech": "停止朗读", "settingsConfig.ttsNotSupported": "当前浏览器不支持", "btw.panelTitle": "旁支问题",