diff --git a/.sisyphus/notepads/tr-polish/decisions.md b/.sisyphus/notepads/tr-polish/decisions.md
deleted file mode 100644
index d8e4f6fec70..00000000000
--- a/.sisyphus/notepads/tr-polish/decisions.md
+++ /dev/null
@@ -1 +0,0 @@
-Fixed typecheck error by reverting key name from 'session.new.worktree.startup' back to 'session.new.workspace.startup' in packages/console/app/src/i18n/tr.ts.
diff --git a/.sisyphus/notepads/tr-polish/learnings.md b/.sisyphus/notepads/tr-polish/learnings.md
deleted file mode 100644
index 086b4858d02..00000000000
--- a/.sisyphus/notepads/tr-polish/learnings.md
+++ /dev/null
@@ -1 +0,0 @@
-Applied minor linguistic polishes to Turkish translations in packages/console/app/src/i18n/tr.ts. PR created at https://github.com/anomalyco/opencode/pull/15468
diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css
index 6727bb22f0c..c23a16ee143 100644
--- a/packages/ui/src/components/message-part.css
+++ b/packages/ui/src/components/message-part.css
@@ -46,12 +46,18 @@
overflow: hidden;
background: var(--surface-weak);
border: 1px solid var(--border-weak-base);
- transition: border-color 0.15s ease;
+ transition:
+ border-color 0.15s ease,
+ opacity 0.3s ease;
&:hover {
border-color: var(--border-strong-base);
}
+ &[data-queued] {
+ opacity: 0.6;
+ }
+
&[data-type="image"] {
width: 48px;
height: 48px;
@@ -101,6 +107,11 @@
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);
@@ -113,6 +124,14 @@
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;
@@ -149,6 +168,7 @@
align-items: center;
justify-content: flex-end;
overflow: hidden;
+ gap: 6px;
}
[data-slot="user-message-meta-tail"] {
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 02a99f9dd17..39a2b4c236a 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -92,6 +92,7 @@ export interface MessageProps {
parts: PartType[]
showAssistantCopyPartID?: string | null
interrupted?: boolean
+ queued?: boolean
showReasoningSummaries?: boolean
}
@@ -500,6 +501,7 @@ export function Message(props: MessageProps) {
message={userMessage() as UserMessage}
parts={props.parts}
interrupted={props.interrupted}
+ queued={props.queued}
/>
)}
@@ -679,7 +681,12 @@ function ContextToolGroup(props: { parts: ToolPart[]; busy?: boolean }) {
)
}
-export function UserMessageDisplay(props: { message: UserMessage; parts: PartType[]; interrupted?: boolean }) {
+export function UserMessageDisplay(props: {
+ message: UserMessage
+ parts: PartType[]
+ interrupted?: boolean
+ queued?: boolean
+}) {
const data = useData()
const dialog = useDialog()
const i18n = useI18n()
@@ -759,6 +766,7 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
{
if (file.mime.startsWith("image/") && file.url) {
openImagePreview(file.url, file.filename)
@@ -787,9 +795,14 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
<>
-
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index e329b117007..c441bcf61e3 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -192,11 +192,31 @@ export function SessionTurn(
(item): item is AssistantMessage => item.role === "assistant" && typeof item.time.completed !== "number",
)
})
+
+ const pendingUser = createMemo(() => {
+ const item = pending()
+ if (!item?.parentID) return
+ const messages = allMessages() ?? emptyMessages
+ const result = Binary.search(messages, item.parentID, (m) => m.id)
+ const msg = result.found ? messages[result.index] : messages.find((m) => m.id === item.parentID)
+ if (!msg || msg.role !== "user") return
+ return msg
+ })
+
const active = createMemo(() => {
const msg = message()
+ const parent = pendingUser()
+ if (!msg || !parent) return false
+ return parent.id === msg.id
+ })
+
+ const queued = createMemo(() => {
+ const id = message()?.id
+ if (!id) return false
+ if (!pendingUser()) return false
const item = pending()
- if (!msg || !item) return false
- return item.parentID === msg.id
+ if (!item) return false
+ return id > item.id
})
const parts = createMemo(() => {
@@ -334,6 +354,7 @@ 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
if (assistantTailVisible() === "text") return false
@@ -364,7 +385,7 @@ export function SessionTurn(
class={props.classes?.container}
>
-
+
{(part) => (
diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts
index afd046d7e10..3579eff5a8a 100644
--- a/packages/ui/src/i18n/ar.ts
+++ b/packages/ui/src/i18n/ar.ts
@@ -126,6 +126,7 @@ export const dict = {
"ui.message.copyResponse": "نسخ الرد",
"ui.message.copied": "تم النسخ!",
"ui.message.interrupted": "تمت المقاطعة",
+ "ui.message.queued": "في الانتظار",
"ui.message.attachment.alt": "مرفق",
"ui.patch.action.deleted": "محذوف",
diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts
index 9b7a1d1d4d9..76028878f9c 100644
--- a/packages/ui/src/i18n/br.ts
+++ b/packages/ui/src/i18n/br.ts
@@ -126,6 +126,7 @@ export const dict = {
"ui.message.copyResponse": "Copiar resposta",
"ui.message.copied": "Copiado!",
"ui.message.interrupted": "Interrompido",
+ "ui.message.queued": "Na fila",
"ui.message.attachment.alt": "anexo",
"ui.patch.action.deleted": "Excluído",
diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts
index 7d31289e102..9bc22933612 100644
--- a/packages/ui/src/i18n/bs.ts
+++ b/packages/ui/src/i18n/bs.ts
@@ -130,6 +130,7 @@ export const dict = {
"ui.message.copyResponse": "Kopiraj odgovor",
"ui.message.copied": "Kopirano!",
"ui.message.interrupted": "Prekinuto",
+ "ui.message.queued": "U redu",
"ui.message.attachment.alt": "prilog",
"ui.patch.action.deleted": "Obrisano",
diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts
index 3cd0328a10e..1bb4758568e 100644
--- a/packages/ui/src/i18n/da.ts
+++ b/packages/ui/src/i18n/da.ts
@@ -125,6 +125,7 @@ export const dict = {
"ui.message.copyResponse": "Kopier svar",
"ui.message.copied": "Kopieret!",
"ui.message.interrupted": "Afbrudt",
+ "ui.message.queued": "I kø",
"ui.message.attachment.alt": "vedhæftning",
"ui.patch.action.deleted": "Slettet",
diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts
index 384ebd33824..951833c3091 100644
--- a/packages/ui/src/i18n/de.ts
+++ b/packages/ui/src/i18n/de.ts
@@ -131,6 +131,7 @@ export const dict = {
"ui.message.copyResponse": "Antwort kopieren",
"ui.message.copied": "Kopiert!",
"ui.message.interrupted": "Unterbrochen",
+ "ui.message.queued": "In Warteschlange",
"ui.message.attachment.alt": "Anhang",
"ui.patch.action.deleted": "Gelöscht",
diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts
index a78474dafcd..9c9ae6e27a5 100644
--- a/packages/ui/src/i18n/en.ts
+++ b/packages/ui/src/i18n/en.ts
@@ -127,6 +127,7 @@ export const dict: Record = {
"ui.message.copyResponse": "Copy response",
"ui.message.copied": "Copied",
"ui.message.interrupted": "Interrupted",
+ "ui.message.queued": "Queued",
"ui.message.attachment.alt": "attachment",
"ui.patch.action.deleted": "Deleted",
diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts
index c5b7d60cef3..6fb6eea5117 100644
--- a/packages/ui/src/i18n/es.ts
+++ b/packages/ui/src/i18n/es.ts
@@ -126,6 +126,7 @@ export const dict = {
"ui.message.copyResponse": "Copiar respuesta",
"ui.message.copied": "¡Copiado!",
"ui.message.interrupted": "Interrumpido",
+ "ui.message.queued": "En cola",
"ui.message.attachment.alt": "adjunto",
"ui.patch.action.deleted": "Eliminado",
diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts
index de1005ec300..3a77a3f5c63 100644
--- a/packages/ui/src/i18n/fr.ts
+++ b/packages/ui/src/i18n/fr.ts
@@ -126,6 +126,7 @@ export const dict = {
"ui.message.copyResponse": "Copier la réponse",
"ui.message.copied": "Copié !",
"ui.message.interrupted": "Interrompu",
+ "ui.message.queued": "En file",
"ui.message.attachment.alt": "pièce jointe",
"ui.patch.action.deleted": "Supprimé",
diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts
index e9e1fff2f86..9dfb03f76b1 100644
--- a/packages/ui/src/i18n/ja.ts
+++ b/packages/ui/src/i18n/ja.ts
@@ -125,6 +125,7 @@ export const dict = {
"ui.message.copyResponse": "応答をコピー",
"ui.message.copied": "コピーしました!",
"ui.message.interrupted": "中断",
+ "ui.message.queued": "待機中",
"ui.message.attachment.alt": "添付ファイル",
"ui.patch.action.deleted": "削除済み",
diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts
index 0280cc24ec6..84d261ac89f 100644
--- a/packages/ui/src/i18n/ko.ts
+++ b/packages/ui/src/i18n/ko.ts
@@ -126,6 +126,7 @@ export const dict = {
"ui.message.copyResponse": "응답 복사",
"ui.message.copied": "복사됨!",
"ui.message.interrupted": "중단됨",
+ "ui.message.queued": "대기 중",
"ui.message.attachment.alt": "첨부 파일",
"ui.patch.action.deleted": "삭제됨",
diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts
index ca7db5d758e..dd1822beee4 100644
--- a/packages/ui/src/i18n/no.ts
+++ b/packages/ui/src/i18n/no.ts
@@ -129,6 +129,7 @@ export const dict: Record = {
"ui.message.copyResponse": "Kopier svar",
"ui.message.copied": "Kopiert!",
"ui.message.interrupted": "Avbrutt",
+ "ui.message.queued": "I kø",
"ui.message.attachment.alt": "vedlegg",
"ui.patch.action.deleted": "Slettet",
diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts
index ccc46a7f150..fcfedb2ef98 100644
--- a/packages/ui/src/i18n/pl.ts
+++ b/packages/ui/src/i18n/pl.ts
@@ -125,6 +125,7 @@ export const dict = {
"ui.message.copyResponse": "Kopiuj odpowiedź",
"ui.message.copied": "Skopiowano!",
"ui.message.interrupted": "Przerwano",
+ "ui.message.queued": "W kolejce",
"ui.message.attachment.alt": "załącznik",
"ui.patch.action.deleted": "Usunięto",
diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts
index 9e9d6722fba..713ff47d1e6 100644
--- a/packages/ui/src/i18n/ru.ts
+++ b/packages/ui/src/i18n/ru.ts
@@ -125,6 +125,7 @@ export const dict = {
"ui.message.copyResponse": "Копировать ответ",
"ui.message.copied": "Скопировано!",
"ui.message.interrupted": "Прервано",
+ "ui.message.queued": "В очереди",
"ui.message.attachment.alt": "вложение",
"ui.patch.action.deleted": "Удалено",
diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts
index c82acd22535..44761a279e1 100644
--- a/packages/ui/src/i18n/th.ts
+++ b/packages/ui/src/i18n/th.ts
@@ -127,6 +127,7 @@ export const dict = {
"ui.message.copyResponse": "คัดลอกคำตอบ",
"ui.message.copied": "คัดลอกแล้ว!",
"ui.message.interrupted": "ถูกขัดจังหวะ",
+ "ui.message.queued": "อยู่ในคิว",
"ui.message.attachment.alt": "ไฟล์แนบ",
"ui.patch.action.deleted": "ลบ",
diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts
index 766dcb852a8..5ec108d4aa4 100644
--- a/packages/ui/src/i18n/tr.ts
+++ b/packages/ui/src/i18n/tr.ts
@@ -122,6 +122,7 @@ export const dict = {
"ui.message.copyResponse": "Yanıtı kopyala",
"ui.message.copied": "Kopyalandı",
"ui.message.interrupted": "Kesildi",
+ "ui.message.queued": "Sırada",
"ui.message.attachment.alt": "ek",
"ui.patch.action.deleted": "Silindi",
diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts
index 98f1f037742..39226605b90 100644
--- a/packages/ui/src/i18n/zh.ts
+++ b/packages/ui/src/i18n/zh.ts
@@ -130,6 +130,7 @@ export const dict = {
"ui.message.copyResponse": "复制回复",
"ui.message.copied": "已复制!",
"ui.message.interrupted": "已中断",
+ "ui.message.queued": "排队中",
"ui.message.attachment.alt": "附件",
"ui.patch.action.deleted": "已删除",
diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts
index 6f1b1d380e6..068e222d65d 100644
--- a/packages/ui/src/i18n/zht.ts
+++ b/packages/ui/src/i18n/zht.ts
@@ -130,6 +130,7 @@ export const dict = {
"ui.message.copyResponse": "複製回覆",
"ui.message.copied": "已複製!",
"ui.message.interrupted": "已中斷",
+ "ui.message.queued": "排隊中",
"ui.message.attachment.alt": "附件",
"ui.patch.action.deleted": "已刪除",