Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 message actions to **Fork** and **Read** to leave more room on mobile; the speech tooltip and accessible label remain **Read aloud**.
- 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.
Expand Down
2 changes: 1 addition & 1 deletion components/MessageCopyActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export function MessageCopyActions({ texts, bodyRef }: {
<div className="message-copy-actions">
{[
{ 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 }) => (
<Tooltip key={label} content={label}>
<button type="button" className="message-copy-action" onClick={onClick} aria-label={label}>
Expand Down
2 changes: 1 addition & 1 deletion components/MessageView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -820,7 +820,7 @@ function AssistantMessageView({
style={isThisSpeaking ? { color: "var(--accent)", background: "var(--bg-hover)" } : undefined}
>
{isThisSpeaking ? <Square size={13} aria-hidden="true" /> : <Volume2 size={13} aria-hidden="true" />}
<span>{isThisSpeaking ? t("messageView.stopSpeech") : t("messageView.readAloud")}</span>
<span>{isThisSpeaking ? t("messageView.stopSpeech") : t("messageView.read")}</span>
</button>
</Tooltip>
)}
Expand Down
4 changes: 3 additions & 1 deletion lib/i18n/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,7 @@
"messageView.copy": "Copy",
"messageView.copyMessage": "Copy message",
"messageView.copyMarkdown": "Copy as Markdown",
"messageView.markdown": "Markdown",
"messageView.largeMessageReveal": "Large message ({size}). Show as plain text",
"messageView.creating": "Creating...",
"messageView.creatingSession": "Creating session...",
Expand All @@ -811,7 +812,7 @@
"messageView.loadingFullOutput": "loading…",
"messageView.loadingThinking": "Loading thinking...",
"messageView.modifiedFiles": "Modified files",
"messageView.newSession": "New session",
"messageView.newSession": "Fork",
"messageView.newSessionTitle": "Fork a new session from this point",
"messageView.noMessage": "(no message)",
"messageView.noOutput": "(no output)",
Expand Down Expand Up @@ -1584,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",
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/locales/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,7 @@
"messageView.copy": "コピー",
"messageView.copyMessage": "メッセージをコピー",
"messageView.copyMarkdown": "Markdownとしてコピー",
"messageView.markdown": "Markdown",
"messageView.largeMessageReveal": "大きなメッセージ({size})。プレーンテキストで表示",
"messageView.creating": "作成中...",
"messageView.creatingSession": "セッションを作成中...",
Expand Down Expand Up @@ -1547,6 +1548,7 @@
"settingsConfig.ttsVoiceDesc": "テキスト読み上げに使用するブラウザの音声を選択します。",
"settingsConfig.defaultVoice": "システムの既定の音声",
"messageView.readAloud": "読み上げ",
"messageView.read": "読み上げ",
"messageView.stopSpeech": "読み上げを停止",
"settingsConfig.ttsNotSupported": "このブラウザではサポートされていません",
"btw.panelTitle": "サイド質問",
Expand Down
2 changes: 2 additions & 0 deletions lib/i18n/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,7 @@
"messageView.copy": "复制",
"messageView.copyMessage": "复制消息",
"messageView.copyMarkdown": "复制为 Markdown",
"messageView.markdown": "Markdown",
"messageView.largeMessageReveal": "大消息({size})。以纯文本显示",
"messageView.creating": "创建中...",
"messageView.creatingSession": "正在创建会话...",
Expand Down Expand Up @@ -1547,6 +1548,7 @@
"settingsConfig.ttsVoiceDesc": "选择用于文本转语音朗读的浏览器声音。",
"settingsConfig.defaultVoice": "系统默认声音",
"messageView.readAloud": "朗读",
"messageView.read": "朗读",
"messageView.stopSpeech": "停止朗读",
"settingsConfig.ttsNotSupported": "当前浏览器不支持",
"btw.panelTitle": "旁支问题",
Expand Down
Loading