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": "已刪除",