summaryrefslogtreecommitdiffhomepage
path: root/packages/ui/src
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-12 15:17:36 -0500
committerGitHub <[email protected]>2026-03-12 20:17:36 +0000
commit42a5af6c8f6998277cf69270ad12e2a64edac5d3 (patch)
treeeca5dff51dc694cce1e783425fc11b4bea1e6a12 /packages/ui/src
parentf0542fae7a917fabb9e943c3112a3d0b4b03302d (diff)
downloadopencode-42a5af6c8f6998277cf69270ad12e2a64edac5d3.tar.gz
opencode-42a5af6c8f6998277cf69270ad12e2a64edac5d3.zip
feat(app): follow-up behavior (#17233)
Diffstat (limited to 'packages/ui/src')
-rw-r--r--packages/ui/src/components/message-part.css17
-rw-r--r--packages/ui/src/components/message-part.tsx11
-rw-r--r--packages/ui/src/components/session-turn.tsx22
-rw-r--r--packages/ui/src/i18n/ar.ts2
-rw-r--r--packages/ui/src/i18n/br.ts2
-rw-r--r--packages/ui/src/i18n/bs.ts2
-rw-r--r--packages/ui/src/i18n/da.ts2
-rw-r--r--packages/ui/src/i18n/de.ts2
-rw-r--r--packages/ui/src/i18n/es.ts2
-rw-r--r--packages/ui/src/i18n/fr.ts2
-rw-r--r--packages/ui/src/i18n/ja.ts2
-rw-r--r--packages/ui/src/i18n/ko.ts2
-rw-r--r--packages/ui/src/i18n/no.ts4
-rw-r--r--packages/ui/src/i18n/pl.ts2
-rw-r--r--packages/ui/src/i18n/ru.ts2
-rw-r--r--packages/ui/src/i18n/th.ts2
-rw-r--r--packages/ui/src/i18n/tr.ts12
-rw-r--r--packages/ui/src/i18n/zh.ts2
-rw-r--r--packages/ui/src/i18n/zht.ts2
19 files changed, 46 insertions, 48 deletions
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index 1052a591c..3648d5079 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -54,10 +54,6 @@
border-color: var(--border-strong-base);
}
- &[data-queued] {
- opacity: 0.6;
- }
-
&[data-type="image"] {
width: 48px;
height: 48px;
@@ -111,11 +107,6 @@
border: 1px solid var(--border-weak-base);
padding: 8px 12px;
border-radius: 6px;
- transition: opacity 0.3s ease;
-
- &[data-queued] {
- opacity: 0.6;
- }
[data-highlight="file"] {
color: var(--syntax-property);
@@ -128,14 +119,6 @@
max-width: 100%;
}
- [data-slot="user-message-queued-indicator"] {
- margin-top: 6px;
- margin-right: 2px;
- font-size: var(--font-size-small);
- color: var(--text-weak);
- user-select: none;
- }
-
[data-slot="user-message-copy-wrapper"] {
min-height: 24px;
margin-top: 4px;
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 1a50ed48c..5a0f022ea 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -132,7 +132,6 @@ export interface MessageProps {
actions?: UserActions
showAssistantCopyPartID?: string | null
interrupted?: boolean
- queued?: boolean
showReasoningSummaries?: boolean
}
@@ -686,7 +685,6 @@ export function Message(props: MessageProps) {
parts={props.parts}
actions={props.actions}
interrupted={props.interrupted}
- queued={props.queued}
/>
)}
</Match>
@@ -883,7 +881,6 @@ export function UserMessageDisplay(props: {
parts: PartType[]
actions?: UserActions
interrupted?: boolean
- queued?: boolean
}) {
const data = useData()
const dialog = useDialog()
@@ -981,7 +978,6 @@ export function UserMessageDisplay(props: {
<div
data-slot="user-message-attachment"
data-type={file.mime.startsWith("image/") ? "image" : "file"}
- data-queued={props.queued ? "" : undefined}
onClick={() => {
if (file.mime.startsWith("image/") && file.url) {
openImagePreview(file.url, file.filename)
@@ -1010,14 +1006,9 @@ export function UserMessageDisplay(props: {
<Show when={text()}>
<>
<div data-slot="user-message-body">
- <div data-slot="user-message-text" data-queued={props.queued ? "" : undefined}>
+ <div data-slot="user-message-text">
<HighlightedText text={text()} references={inlineFiles()} agents={agents()} />
</div>
- <Show when={props.queued}>
- <div data-slot="user-message-queued-indicator">
- <TextShimmer text={i18n.t("ui.message.queued")} />
- </div>
- </Show>
</div>
<div data-slot="user-message-copy-wrapper" data-interrupted={props.interrupted ? "" : undefined}>
<Show when={metaHead() || metaTail()}>
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index fda02cab4..8783e8957 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -146,7 +146,6 @@ export function SessionTurn(
shellToolDefaultOpen?: boolean
editToolDefaultOpen?: boolean
active?: boolean
- queued?: boolean
status?: SessionStatus
onUserInteracted?: () => void
classes?: {
@@ -193,7 +192,7 @@ export function SessionTurn(
})
const pending = createMemo(() => {
- if (typeof props.active === "boolean" && typeof props.queued === "boolean") return
+ if (typeof props.active === "boolean") return
const messages = allMessages() ?? emptyMessages
return messages.findLast(
(item): item is AssistantMessage => item.role === "assistant" && typeof item.time.completed !== "number",
@@ -218,16 +217,6 @@ export function SessionTurn(
return parent.id === msg.id
})
- const queued = createMemo(() => {
- if (typeof props.queued === "boolean") return props.queued
- const id = message()?.id
- if (!id) return false
- if (!pendingUser()) return false
- const item = pending()
- if (!item) return false
- return id > item.id
- })
-
const parts = createMemo(() => {
const msg = message()
if (!msg) return emptyParts
@@ -367,7 +356,6 @@ export function SessionTurn(
)
const showThinking = createMemo(() => {
if (!working() || !!error()) return false
- if (queued()) return false
if (status().type === "retry") return false
if (showReasoningSummaries()) return assistantVisible() === 0
return true
@@ -396,13 +384,7 @@ export function SessionTurn(
class={props.classes?.container}
>
<div data-slot="session-turn-message-content" aria-live="off">
- <Message
- message={message()!}
- parts={parts()}
- actions={props.actions}
- interrupted={interrupted()}
- queued={queued()}
- />
+ <Message message={message()!} parts={parts()} actions={props.actions} interrupted={interrupted()} />
</div>
<Show when={compaction()}>
<div data-slot="session-turn-compaction">
diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts
index d75918aa7..475496df0 100644
--- a/packages/ui/src/i18n/ar.ts
+++ b/packages/ui/src/i18n/ar.ts
@@ -126,6 +126,8 @@ export const dict = {
"ui.message.collapse": "طي الرسالة",
"ui.message.copy": "نسخ",
"ui.message.copyMessage": "نسخ الرسالة",
+ "ui.message.forkMessage": "تشعب إلى جلسة جديدة",
+ "ui.message.revertMessage": "إعادة التعيين إلى هذه النقطة",
"ui.message.copyResponse": "نسخ الرد",
"ui.message.copied": "تم النسخ!",
"ui.message.interrupted": "تمت المقاطعة",
diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts
index 085184fcc..8e68d0fef 100644
--- a/packages/ui/src/i18n/br.ts
+++ b/packages/ui/src/i18n/br.ts
@@ -126,6 +126,8 @@ export const dict = {
"ui.message.collapse": "Recolher mensagem",
"ui.message.copy": "Copiar",
"ui.message.copyMessage": "Copiar mensagem",
+ "ui.message.forkMessage": "Bifurcar para nova sessão",
+ "ui.message.revertMessage": "Redefinir para este ponto",
"ui.message.copyResponse": "Copiar resposta",
"ui.message.copied": "Copiado!",
"ui.message.interrupted": "Interrompido",
diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts
index 28a292989..60fa9c789 100644
--- a/packages/ui/src/i18n/bs.ts
+++ b/packages/ui/src/i18n/bs.ts
@@ -130,6 +130,8 @@ export const dict = {
"ui.message.collapse": "Sažmi poruku",
"ui.message.copy": "Kopiraj",
"ui.message.copyMessage": "Kopiraj poruku",
+ "ui.message.forkMessage": "Forkaj u novu sesiju",
+ "ui.message.revertMessage": "Resetuj na ovu tačku",
"ui.message.copyResponse": "Kopiraj odgovor",
"ui.message.copied": "Kopirano!",
"ui.message.interrupted": "Prekinuto",
diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts
index 30ff4639a..74e06b99d 100644
--- a/packages/ui/src/i18n/da.ts
+++ b/packages/ui/src/i18n/da.ts
@@ -125,6 +125,8 @@ export const dict = {
"ui.message.collapse": "Skjul besked",
"ui.message.copy": "Kopier",
"ui.message.copyMessage": "Kopier besked",
+ "ui.message.forkMessage": "Forgren til ny session",
+ "ui.message.revertMessage": "Nulstil til dette punkt",
"ui.message.copyResponse": "Kopier svar",
"ui.message.copied": "Kopieret!",
"ui.message.interrupted": "Afbrudt",
diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts
index bbfcd0f68..296417597 100644
--- a/packages/ui/src/i18n/de.ts
+++ b/packages/ui/src/i18n/de.ts
@@ -131,6 +131,8 @@ export const dict = {
"ui.message.collapse": "Nachricht reduzieren",
"ui.message.copy": "Kopieren",
"ui.message.copyMessage": "Nachricht kopieren",
+ "ui.message.forkMessage": "In neue Sitzung abzweigen",
+ "ui.message.revertMessage": "Auf diesen Punkt zurücksetzen",
"ui.message.copyResponse": "Antwort kopieren",
"ui.message.copied": "Kopiert!",
"ui.message.interrupted": "Unterbrochen",
diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts
index 52f1506c0..6496c05db 100644
--- a/packages/ui/src/i18n/es.ts
+++ b/packages/ui/src/i18n/es.ts
@@ -126,6 +126,8 @@ export const dict = {
"ui.message.collapse": "Colapsar mensaje",
"ui.message.copy": "Copiar",
"ui.message.copyMessage": "Copiar mensaje",
+ "ui.message.forkMessage": "Bifurcar a nueva sesión",
+ "ui.message.revertMessage": "Restablecer a este punto",
"ui.message.copyResponse": "Copiar respuesta",
"ui.message.copied": "¡Copiado!",
"ui.message.interrupted": "Interrumpido",
diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts
index f42c13882..e278d0693 100644
--- a/packages/ui/src/i18n/fr.ts
+++ b/packages/ui/src/i18n/fr.ts
@@ -126,6 +126,8 @@ export const dict = {
"ui.message.collapse": "Réduire le message",
"ui.message.copy": "Copier",
"ui.message.copyMessage": "Copier le message",
+ "ui.message.forkMessage": "Bifurquer vers une nouvelle session",
+ "ui.message.revertMessage": "Réinitialiser à ce point",
"ui.message.copyResponse": "Copier la réponse",
"ui.message.copied": "Copié !",
"ui.message.interrupted": "Interrompu",
diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts
index 0c9e4da2b..b133a3282 100644
--- a/packages/ui/src/i18n/ja.ts
+++ b/packages/ui/src/i18n/ja.ts
@@ -125,6 +125,8 @@ export const dict = {
"ui.message.collapse": "メッセージを折りたたむ",
"ui.message.copy": "コピー",
"ui.message.copyMessage": "メッセージをコピー",
+ "ui.message.forkMessage": "新しいセッションにフォーク",
+ "ui.message.revertMessage": "この時点までリセット",
"ui.message.copyResponse": "応答をコピー",
"ui.message.copied": "コピーしました!",
"ui.message.interrupted": "中断",
diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts
index 74c2d4ec8..3e7af7140 100644
--- a/packages/ui/src/i18n/ko.ts
+++ b/packages/ui/src/i18n/ko.ts
@@ -126,6 +126,8 @@ export const dict = {
"ui.message.collapse": "메시지 접기",
"ui.message.copy": "복사",
"ui.message.copyMessage": "메시지 복사",
+ "ui.message.forkMessage": "새 세션으로 분기",
+ "ui.message.revertMessage": "이 시점으로 초기화",
"ui.message.copyResponse": "응답 복사",
"ui.message.copied": "복사됨!",
"ui.message.interrupted": "중단됨",
diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts
index 489f218ca..0c9fc82e5 100644
--- a/packages/ui/src/i18n/no.ts
+++ b/packages/ui/src/i18n/no.ts
@@ -105,7 +105,7 @@ export const dict: Record<Keys, string> = {
"ui.tool.todos.read": "Les gjøremål",
"ui.tool.questions": "Spørsmål",
"ui.tool.agent": "{{type}}-agent",
- "ui.tool.agent.default": "agent",
+ "ui.tool.agent.default": "Agent",
"ui.common.file.one": "fil",
"ui.common.file.other": "filer",
@@ -129,6 +129,8 @@ export const dict: Record<Keys, string> = {
"ui.message.collapse": "Skjul melding",
"ui.message.copy": "Kopier",
"ui.message.copyMessage": "Kopier melding",
+ "ui.message.forkMessage": "Forgren til ny sesjon",
+ "ui.message.revertMessage": "Tilbakestill til dette punktet",
"ui.message.copyResponse": "Kopier svar",
"ui.message.copied": "Kopiert!",
"ui.message.interrupted": "Avbrutt",
diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts
index 9b37a0fd6..e63622a83 100644
--- a/packages/ui/src/i18n/pl.ts
+++ b/packages/ui/src/i18n/pl.ts
@@ -125,6 +125,8 @@ export const dict = {
"ui.message.collapse": "Zwiń wiadomość",
"ui.message.copy": "Kopiuj",
"ui.message.copyMessage": "Kopiuj wiadomość",
+ "ui.message.forkMessage": "Rozwidlij do nowej sesji",
+ "ui.message.revertMessage": "Zresetuj do tego punktu",
"ui.message.copyResponse": "Kopiuj odpowiedź",
"ui.message.copied": "Skopiowano!",
"ui.message.interrupted": "Przerwano",
diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts
index 7157670c4..b8c7a4a1f 100644
--- a/packages/ui/src/i18n/ru.ts
+++ b/packages/ui/src/i18n/ru.ts
@@ -125,6 +125,8 @@ export const dict = {
"ui.message.collapse": "Свернуть сообщение",
"ui.message.copy": "Копировать",
"ui.message.copyMessage": "Копировать сообщение",
+ "ui.message.forkMessage": "Ответвить в новую сессию",
+ "ui.message.revertMessage": "Сбросить до этого момента",
"ui.message.copyResponse": "Копировать ответ",
"ui.message.copied": "Скопировано!",
"ui.message.interrupted": "Прервано",
diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts
index 553638cf4..88236b644 100644
--- a/packages/ui/src/i18n/th.ts
+++ b/packages/ui/src/i18n/th.ts
@@ -127,6 +127,8 @@ export const dict = {
"ui.message.collapse": "ย่อข้อความ",
"ui.message.copy": "คัดลอก",
"ui.message.copyMessage": "คัดลอกข้อความ",
+ "ui.message.forkMessage": "แตกแขนงไปยังเซสชันใหม่",
+ "ui.message.revertMessage": "รีเซ็ตไปยังจุดนี้",
"ui.message.copyResponse": "คัดลอกคำตอบ",
"ui.message.copied": "คัดลอกแล้ว!",
"ui.message.interrupted": "ถูกขัดจังหวะ",
diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts
index 5b4d71e4a..ff9de61b5 100644
--- a/packages/ui/src/i18n/tr.ts
+++ b/packages/ui/src/i18n/tr.ts
@@ -22,6 +22,16 @@ export const dict = {
"ui.sessionReview.largeDiff.meta": "Limit: {{limit}} değişen satır. Mevcut: {{current}} değişen satır.",
"ui.sessionReview.largeDiff.renderAnyway": "Yine de göster",
+ "ui.fileMedia.kind.image": "görsel",
+ "ui.fileMedia.kind.audio": "ses",
+ "ui.fileMedia.state.removed": "{{kind}} dosyası kaldırıldı.",
+ "ui.fileMedia.state.loading": "{{kind}} yükleniyor...",
+ "ui.fileMedia.state.error": "{{kind}} yüklenemedi.",
+ "ui.fileMedia.state.unavailable": "{{kind}} önizlemesi kullanılamıyor.",
+ "ui.fileMedia.binary.title": "İkili dosya",
+ "ui.fileMedia.binary.description.path": "{{path}} ikili dosyadır.",
+ "ui.fileMedia.binary.description.default": "İkili içerik",
+
"ui.lineComment.label.prefix": "Yorum: ",
"ui.lineComment.label.suffix": "",
"ui.lineComment.editorLabel.prefix": "Yorum yapılıyor: ",
@@ -122,6 +132,8 @@ export const dict = {
"ui.message.collapse": "Mesajı daralt",
"ui.message.copy": "Kopyala",
"ui.message.copyMessage": "Mesajı kopyala",
+ "ui.message.forkMessage": "Yeni oturuma dallandır",
+ "ui.message.revertMessage": "Bu noktaya sıfırla",
"ui.message.copyResponse": "Yanıtı kopyala",
"ui.message.copied": "Kopyalandı",
"ui.message.interrupted": "Kesildi",
diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts
index 638230544..aaf17eee8 100644
--- a/packages/ui/src/i18n/zh.ts
+++ b/packages/ui/src/i18n/zh.ts
@@ -130,6 +130,8 @@ export const dict = {
"ui.message.collapse": "收起消息",
"ui.message.copy": "复制",
"ui.message.copyMessage": "复制消息",
+ "ui.message.forkMessage": "分叉到新会话",
+ "ui.message.revertMessage": "重置到此点",
"ui.message.copyResponse": "复制回复",
"ui.message.copied": "已复制!",
"ui.message.interrupted": "已中断",
diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts
index f793ce345..b8a9fa799 100644
--- a/packages/ui/src/i18n/zht.ts
+++ b/packages/ui/src/i18n/zht.ts
@@ -130,6 +130,8 @@ export const dict = {
"ui.message.collapse": "收合訊息",
"ui.message.copy": "複製",
"ui.message.copyMessage": "複製訊息",
+ "ui.message.forkMessage": "分支到新工作階段",
+ "ui.message.revertMessage": "重設至此點",
"ui.message.copyResponse": "複製回覆",
"ui.message.copied": "已複製!",
"ui.message.interrupted": "已中斷",