diff --git a/.github/VOUCHED.td b/.github/VOUCHED.td index 412716a18dd8..4be318d51892 100644 --- a/.github/VOUCHED.td +++ b/.github/VOUCHED.td @@ -8,6 +8,7 @@ # - Denounce with minus prefix: -username or -platform:username. # - Optional details after a space following the handle. adamdotdevin +-agusbasari29 AI PR slop ariane-emory -florianleibert fwang diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx index cf993840dc8f..42ee4092f68c 100644 --- a/packages/app/src/components/settings-general.tsx +++ b/packages/app/src/components/settings-general.tsx @@ -267,18 +267,50 @@ export const SettingsGeneral: Component = () => { )} + + + ) + const FeedSection = () => ( +
+

{language.t("settings.general.section.feed")}

+ +
-
+
settings.general.setShowReasoningSummaries(checked)} />
+ + +
+ settings.general.setShellToolPartsExpanded(checked)} + /> +
+
+ + +
+ settings.general.setEditToolPartsExpanded(checked)} + /> +
+
) @@ -435,6 +467,8 @@ export const SettingsGeneral: Component = () => {
+ + diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx index d279a7f321bb..b43469b5c37c 100644 --- a/packages/app/src/context/settings.tsx +++ b/packages/app/src/context/settings.tsx @@ -23,6 +23,8 @@ export interface Settings { autoSave: boolean releaseNotes: boolean showReasoningSummaries: boolean + shellToolPartsExpanded: boolean + editToolPartsExpanded: boolean } updates: { startup: boolean @@ -44,6 +46,8 @@ const defaultSettings: Settings = { autoSave: true, releaseNotes: true, showReasoningSummaries: false, + shellToolPartsExpanded: true, + editToolPartsExpanded: false, }, updates: { startup: true, @@ -129,6 +133,20 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont setShowReasoningSummaries(value: boolean) { setStore("general", "showReasoningSummaries", value) }, + shellToolPartsExpanded: withFallback( + () => store.general?.shellToolPartsExpanded, + defaultSettings.general.shellToolPartsExpanded, + ), + setShellToolPartsExpanded(value: boolean) { + setStore("general", "shellToolPartsExpanded", value) + }, + editToolPartsExpanded: withFallback( + () => store.general?.editToolPartsExpanded, + defaultSettings.general.editToolPartsExpanded, + ), + setEditToolPartsExpanded(value: boolean) { + setStore("general", "editToolPartsExpanded", value) + }, }, updates: { startup: withFallback(() => store.updates?.startup, defaultSettings.updates.startup), diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index e860a7e5d564..91a16b3b8532 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -529,6 +529,7 @@ export const dict = { "settings.general.section.notifications": "إشعارات النظام", "settings.general.section.updates": "التحديثات", "settings.general.section.sounds": "المؤثرات الصوتية", + "settings.general.section.feed": "الخلاصة", "settings.general.section.display": "شاشة العرض", "settings.general.row.language.title": "اللغة", "settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode", @@ -538,6 +539,12 @@ export const dict = { "settings.general.row.theme.description": "تخصيص سمة OpenCode.", "settings.general.row.font.title": "الخط", "settings.general.row.font.description": "تخصيص الخط الأحادي المستخدم في كتل التعليمات البرمجية", + "settings.general.row.shellToolPartsExpanded.title": "توسيع أجزاء أداة shell", + "settings.general.row.shellToolPartsExpanded.description": + "إظهار أجزاء أداة shell موسعة بشكل افتراضي في الشريط الزمني", + "settings.general.row.editToolPartsExpanded.title": "توسيع أجزاء أداة edit", + "settings.general.row.editToolPartsExpanded.description": + "إظهار أجزاء أدوات edit و write و patch موسعة بشكل افتراضي في الشريط الزمني", "settings.general.row.wayland.title": "استخدام Wayland الأصلي", "settings.general.row.wayland.description": "تعطيل التراجع إلى X11 على Wayland. يتطلب إعادة التشغيل.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index e96a0195df8d..7682a12b6972 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -535,6 +535,7 @@ export const dict = { "settings.general.section.notifications": "Notificações do sistema", "settings.general.section.updates": "Atualizações", "settings.general.section.sounds": "Efeitos sonoros", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Tela", "settings.general.row.language.title": "Idioma", "settings.general.row.language.description": "Alterar o idioma de exibição do OpenCode", @@ -544,6 +545,12 @@ export const dict = { "settings.general.row.theme.description": "Personalize como o OpenCode é tematizado.", "settings.general.row.font.title": "Fonte", "settings.general.row.font.description": "Personalize a fonte monoespaçada usada em blocos de código", + "settings.general.row.shellToolPartsExpanded.title": "Expandir partes da ferramenta shell", + "settings.general.row.shellToolPartsExpanded.description": + "Mostrar partes da ferramenta shell expandidas por padrão na linha do tempo", + "settings.general.row.editToolPartsExpanded.title": "Expandir partes da ferramenta de edição", + "settings.general.row.editToolPartsExpanded.description": + "Mostrar partes das ferramentas de edição, escrita e patch expandidas por padrão na linha do tempo", "settings.general.row.wayland.title": "Usar Wayland nativo", "settings.general.row.wayland.description": "Desabilitar fallback X11 no Wayland. Requer reinicialização.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index 1852afcd14c2..d658926268e2 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -599,6 +599,7 @@ export const dict = { "settings.general.section.notifications": "Sistemske obavijesti", "settings.general.section.updates": "Ažuriranja", "settings.general.section.sounds": "Zvučni efekti", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Prikaz", "settings.general.row.language.title": "Jezik", @@ -610,6 +611,12 @@ export const dict = { "settings.general.row.font.title": "Font", "settings.general.row.font.description": "Prilagodi monospace font koji se koristi u blokovima koda", + "settings.general.row.shellToolPartsExpanded.title": "Proširi dijelove shell alata", + "settings.general.row.shellToolPartsExpanded.description": + "Prikaži dijelove shell alata podrazumijevano proširene na vremenskoj traci", + "settings.general.row.editToolPartsExpanded.title": "Proširi dijelove alata za uređivanje", + "settings.general.row.editToolPartsExpanded.description": + "Prikaži dijelove alata za uređivanje, pisanje i patch podrazumijevano proširene na vremenskoj traci", "settings.general.row.wayland.title": "Koristi nativni Wayland", "settings.general.row.wayland.description": "Onemogući X11 fallback na Waylandu. Zahtijeva restart.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index c5d2dc25f1fb..fabefcab7562 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -594,6 +594,7 @@ export const dict = { "settings.general.section.notifications": "Systemmeddelelser", "settings.general.section.updates": "Opdateringer", "settings.general.section.sounds": "Lydeffekter", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Skærm", "settings.general.row.language.title": "Sprog", @@ -605,6 +606,11 @@ export const dict = { "settings.general.row.font.title": "Skrifttype", "settings.general.row.font.description": "Tilpas mono-skrifttypen brugt i kodeblokke", + "settings.general.row.shellToolPartsExpanded.title": "Udvid shell-værktøjsdele", + "settings.general.row.shellToolPartsExpanded.description": "Vis shell-værktøjsdele udvidet som standard i tidslinjen", + "settings.general.row.editToolPartsExpanded.title": "Udvid edit-værktøjsdele", + "settings.general.row.editToolPartsExpanded.description": + "Vis edit-, write- og patch-værktøjsdele udvidet som standard i tidslinjen", "settings.general.row.wayland.title": "Brug native Wayland", "settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Kræver genstart.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index 34a80ee4c5f9..3a7bbe927727 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -544,6 +544,7 @@ export const dict = { "settings.general.section.notifications": "Systembenachrichtigungen", "settings.general.section.updates": "Updates", "settings.general.section.sounds": "Soundeffekte", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Anzeige", "settings.general.row.language.title": "Sprache", "settings.general.row.language.description": "Die Anzeigesprache für OpenCode ändern", @@ -553,6 +554,12 @@ export const dict = { "settings.general.row.theme.description": "Das Thema von OpenCode anpassen.", "settings.general.row.font.title": "Schriftart", "settings.general.row.font.description": "Die in Codeblöcken verwendete Monospace-Schriftart anpassen", + "settings.general.row.shellToolPartsExpanded.title": "Shell-Tool-Abschnitte ausklappen", + "settings.general.row.shellToolPartsExpanded.description": + "Shell-Tool-Abschnitte standardmäßig in der Timeline ausgeklappt anzeigen", + "settings.general.row.editToolPartsExpanded.title": "Edit-Tool-Abschnitte ausklappen", + "settings.general.row.editToolPartsExpanded.description": + "Edit-, Write- und Patch-Tool-Abschnitte standardmäßig in der Timeline ausgeklappt anzeigen", "settings.general.row.wayland.title": "Natives Wayland verwenden", "settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Erfordert Neustart.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index 7ba82066c785..0fa3777dde63 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -600,6 +600,7 @@ export const dict = { "settings.general.section.notifications": "System notifications", "settings.general.section.updates": "Updates", "settings.general.section.sounds": "Sound effects", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Display", "settings.general.row.language.title": "Language", @@ -612,6 +613,12 @@ export const dict = { "settings.general.row.font.description": "Customise the mono font used in code blocks", "settings.general.row.reasoningSummaries.title": "Show reasoning summaries", "settings.general.row.reasoningSummaries.description": "Display model reasoning summaries in the timeline", + "settings.general.row.shellToolPartsExpanded.title": "Expand shell tool parts", + "settings.general.row.shellToolPartsExpanded.description": + "Show shell tool parts expanded by default in the timeline", + "settings.general.row.editToolPartsExpanded.title": "Expand edit tool parts", + "settings.general.row.editToolPartsExpanded.description": + "Show edit, write, and patch tool parts expanded by default in the timeline", "settings.general.row.wayland.title": "Use native Wayland", "settings.general.row.wayland.description": "Disable X11 fallback on Wayland. Requires restart.", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index 28988bba1e14..b55d54c0ca55 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -602,6 +602,7 @@ export const dict = { "settings.general.section.notifications": "Notificaciones del sistema", "settings.general.section.updates": "Actualizaciones", "settings.general.section.sounds": "Efectos de sonido", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Pantalla", "settings.general.row.language.title": "Idioma", @@ -613,6 +614,12 @@ export const dict = { "settings.general.row.font.title": "Fuente", "settings.general.row.font.description": "Personaliza la fuente monoespaciada usada en bloques de código", + "settings.general.row.shellToolPartsExpanded.title": "Expandir partes de la herramienta shell", + "settings.general.row.shellToolPartsExpanded.description": + "Mostrar las partes de la herramienta shell expandidas por defecto en la línea de tiempo", + "settings.general.row.editToolPartsExpanded.title": "Expandir partes de la herramienta de edición", + "settings.general.row.editToolPartsExpanded.description": + "Mostrar las partes de las herramientas de edición, escritura y parcheado expandidas por defecto en la línea de tiempo", "settings.general.row.wayland.title": "Usar Wayland nativo", "settings.general.row.wayland.description": "Deshabilitar fallback a X11 en Wayland. Requiere reinicio.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index 643c5e821134..c961f060e1fd 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -543,6 +543,7 @@ export const dict = { "settings.general.section.notifications": "Notifications système", "settings.general.section.updates": "Mises à jour", "settings.general.section.sounds": "Effets sonores", + "settings.general.section.feed": "Flux", "settings.general.section.display": "Affichage", "settings.general.row.language.title": "Langue", "settings.general.row.language.description": "Changer la langue d'affichage pour OpenCode", @@ -552,6 +553,12 @@ export const dict = { "settings.general.row.theme.description": "Personnaliser le thème d'OpenCode.", "settings.general.row.font.title": "Police", "settings.general.row.font.description": "Personnaliser la police mono utilisée dans les blocs de code", + "settings.general.row.shellToolPartsExpanded.title": "Développer les parties de l'outil shell", + "settings.general.row.shellToolPartsExpanded.description": + "Afficher les parties de l'outil shell développées par défaut dans la chronologie", + "settings.general.row.editToolPartsExpanded.title": "Développer les parties de l'outil edit", + "settings.general.row.editToolPartsExpanded.description": + "Afficher les parties des outils edit, write et patch développées par défaut dans la chronologie", "settings.general.row.wayland.title": "Utiliser Wayland natif", "settings.general.row.wayland.description": "Désactiver le repli X11 sur Wayland. Nécessite un redémarrage.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index 5f6e92402525..7a62c9de2716 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -533,6 +533,7 @@ export const dict = { "settings.general.section.notifications": "システム通知", "settings.general.section.updates": "アップデート", "settings.general.section.sounds": "効果音", + "settings.general.section.feed": "フィード", "settings.general.section.display": "ディスプレイ", "settings.general.row.language.title": "言語", "settings.general.row.language.description": "OpenCodeの表示言語を変更します", @@ -542,6 +543,12 @@ export const dict = { "settings.general.row.theme.description": "OpenCodeのテーマをカスタマイズします。", "settings.general.row.font.title": "フォント", "settings.general.row.font.description": "コードブロックで使用する等幅フォントをカスタマイズします", + "settings.general.row.shellToolPartsExpanded.title": "shell ツールパーツを展開", + "settings.general.row.shellToolPartsExpanded.description": + "タイムラインで shell ツールパーツをデフォルトで展開して表示します", + "settings.general.row.editToolPartsExpanded.title": "edit ツールパーツを展開", + "settings.general.row.editToolPartsExpanded.description": + "タイムラインで edit、write、patch ツールパーツをデフォルトで展開して表示します", "settings.general.row.wayland.title": "ネイティブWaylandを使用", "settings.general.row.wayland.description": "WaylandでのX11フォールバックを無効にします。再起動が必要です。", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index d5a0b090b93d..8967c71cff7d 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -534,6 +534,7 @@ export const dict = { "settings.general.section.notifications": "시스템 알림", "settings.general.section.updates": "업데이트", "settings.general.section.sounds": "효과음", + "settings.general.section.feed": "피드", "settings.general.section.display": "디스플레이", "settings.general.row.language.title": "언어", "settings.general.row.language.description": "OpenCode 표시 언어 변경", @@ -543,6 +544,12 @@ export const dict = { "settings.general.row.theme.description": "OpenCode 테마 사용자 지정", "settings.general.row.font.title": "글꼴", "settings.general.row.font.description": "코드 블록에 사용되는 고정폭 글꼴 사용자 지정", + "settings.general.row.shellToolPartsExpanded.title": "shell 도구 파트 펼치기", + "settings.general.row.shellToolPartsExpanded.description": + "타임라인에서 기본적으로 shell 도구 파트를 펼친 상태로 표시합니다", + "settings.general.row.editToolPartsExpanded.title": "edit 도구 파트 펼치기", + "settings.general.row.editToolPartsExpanded.description": + "타임라인에서 기본적으로 edit, write, patch 도구 파트를 펼친 상태로 표시합니다", "settings.general.row.wayland.title": "네이티브 Wayland 사용", "settings.general.row.wayland.description": "Wayland에서 X11 폴백을 비활성화합니다. 다시 시작해야 합니다.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 10a8c1042fa0..8e1b1ce629dc 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -602,6 +602,7 @@ export const dict = { "settings.general.section.notifications": "Systemvarsler", "settings.general.section.updates": "Oppdateringer", "settings.general.section.sounds": "Lydeffekter", + "settings.general.section.feed": "Feed", "settings.general.section.display": "Skjerm", "settings.general.row.language.title": "Språk", @@ -613,6 +614,11 @@ export const dict = { "settings.general.row.font.title": "Skrift", "settings.general.row.font.description": "Tilpass mono-skriften som brukes i kodeblokker", + "settings.general.row.shellToolPartsExpanded.title": "Utvid shell-verktøydeler", + "settings.general.row.shellToolPartsExpanded.description": "Vis shell-verktøydeler utvidet som standard i tidslinjen", + "settings.general.row.editToolPartsExpanded.title": "Utvid edit-verktøydeler", + "settings.general.row.editToolPartsExpanded.description": + "Vis edit-, write- og patch-verktøydeler utvidet som standard i tidslinjen", "settings.general.row.wayland.title": "Bruk innebygd Wayland", "settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Krever omstart.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index 9038fd1ad2f9..9b924fd642ea 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -534,6 +534,7 @@ export const dict = { "settings.general.section.notifications": "Powiadomienia systemowe", "settings.general.section.updates": "Aktualizacje", "settings.general.section.sounds": "Efekty dźwiękowe", + "settings.general.section.feed": "Kanał", "settings.general.section.display": "Ekran", "settings.general.row.language.title": "Język", "settings.general.row.language.description": "Zmień język wyświetlania dla OpenCode", @@ -543,6 +544,12 @@ export const dict = { "settings.general.row.theme.description": "Dostosuj motyw OpenCode.", "settings.general.row.font.title": "Czcionka", "settings.general.row.font.description": "Dostosuj czcionkę mono używaną w blokach kodu", + "settings.general.row.shellToolPartsExpanded.title": "Rozwijaj elementy narzędzia shell", + "settings.general.row.shellToolPartsExpanded.description": + "Domyślnie pokazuj rozwinięte elementy narzędzia shell na osi czasu", + "settings.general.row.editToolPartsExpanded.title": "Rozwijaj elementy narzędzia edit", + "settings.general.row.editToolPartsExpanded.description": + "Domyślnie pokazuj rozwinięte elementy narzędzi edit, write i patch na osi czasu", "settings.general.row.wayland.title": "Użyj natywnego Wayland", "settings.general.row.wayland.description": "Wyłącz fallback X11 na Wayland. Wymaga restartu.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index 69fee5c89a4f..cf02285821e4 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -600,6 +600,7 @@ export const dict = { "settings.general.section.notifications": "Системные уведомления", "settings.general.section.updates": "Обновления", "settings.general.section.sounds": "Звуковые эффекты", + "settings.general.section.feed": "Лента", "settings.general.section.display": "Дисплей", "settings.general.row.language.title": "Язык", @@ -611,6 +612,12 @@ export const dict = { "settings.general.row.font.title": "Шрифт", "settings.general.row.font.description": "Настройте моноширинный шрифт для блоков кода", + "settings.general.row.shellToolPartsExpanded.title": "Разворачивать элементы инструмента shell", + "settings.general.row.shellToolPartsExpanded.description": + "Показывать элементы инструмента shell в ленте развернутыми по умолчанию", + "settings.general.row.editToolPartsExpanded.title": "Разворачивать элементы инструмента edit", + "settings.general.row.editToolPartsExpanded.description": + "Показывать элементы инструментов edit, write и patch в ленте развернутыми по умолчанию", "settings.general.row.wayland.title": "Использовать нативный Wayland", "settings.general.row.wayland.description": "Отключить X11 fallback на Wayland. Требуется перезапуск.", "settings.general.row.wayland.tooltip": diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index d66c8f6075b8..1b8abe953b77 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -594,6 +594,7 @@ export const dict = { "settings.general.section.notifications": "การแจ้งเตือนระบบ", "settings.general.section.updates": "การอัปเดต", "settings.general.section.sounds": "เสียงเอฟเฟกต์", + "settings.general.section.feed": "ฟีด", "settings.general.section.display": "การแสดงผล", "settings.general.row.language.title": "ภาษา", @@ -605,6 +606,11 @@ export const dict = { "settings.general.row.font.title": "ฟอนต์", "settings.general.row.font.description": "ปรับแต่งฟอนต์โมโนที่ใช้ในบล็อกโค้ด", + "settings.general.row.shellToolPartsExpanded.title": "ขยายส่วนเครื่องมือ shell", + "settings.general.row.shellToolPartsExpanded.description": "แสดงส่วนเครื่องมือ shell แบบขยายตามค่าเริ่มต้นในไทม์ไลน์", + "settings.general.row.editToolPartsExpanded.title": "ขยายส่วนเครื่องมือ edit", + "settings.general.row.editToolPartsExpanded.description": + "แสดงส่วนเครื่องมือ edit, write และ patch แบบขยายตามค่าเริ่มต้นในไทม์ไลน์", "settings.general.row.wayland.title": "ใช้ Wayland แบบเนทีฟ", "settings.general.row.wayland.description": "ปิดใช้งาน X11 fallback บน Wayland ต้องรีสตาร์ท", "settings.general.row.wayland.tooltip": "บน Linux ที่มีจอภาพรีเฟรชเรตแบบผสม Wayland แบบเนทีฟอาจเสถียรกว่า", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 46daeb701ff4..62c7bb9ff233 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -595,6 +595,7 @@ export const dict = { "settings.general.section.notifications": "系统通知", "settings.general.section.updates": "更新", "settings.general.section.sounds": "音效", + "settings.general.section.feed": "动态", "settings.general.section.display": "显示", "settings.general.row.language.title": "语言", "settings.general.row.language.description": "更改 OpenCode 的显示语言", @@ -604,6 +605,10 @@ export const dict = { "settings.general.row.theme.description": "自定义 OpenCode 的主题。", "settings.general.row.font.title": "字体", "settings.general.row.font.description": "自定义代码块使用的等宽字体", + "settings.general.row.shellToolPartsExpanded.title": "展开 shell 工具部分", + "settings.general.row.shellToolPartsExpanded.description": "默认在时间线中展开 shell 工具部分", + "settings.general.row.editToolPartsExpanded.title": "展开编辑工具部分", + "settings.general.row.editToolPartsExpanded.description": "默认在时间线中展开 edit、write 和 patch 工具部分", "settings.general.row.wayland.title": "使用原生 Wayland", "settings.general.row.wayland.description": "在 Wayland 上禁用 X11 回退。需要重启。", "settings.general.row.wayland.tooltip": "在混合刷新率显示器的 Linux 系统上,原生 Wayland 可能更稳定。", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index bbb00727b708..cb8f068f63b7 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -589,6 +589,7 @@ export const dict = { "settings.general.section.notifications": "系統通知", "settings.general.section.updates": "更新", "settings.general.section.sounds": "音效", + "settings.general.section.feed": "資訊流", "settings.general.section.display": "顯示", "settings.general.row.language.title": "語言", @@ -600,6 +601,10 @@ export const dict = { "settings.general.row.font.title": "字型", "settings.general.row.font.description": "自訂程式碼區塊使用的等寬字型", + "settings.general.row.shellToolPartsExpanded.title": "展開 shell 工具區塊", + "settings.general.row.shellToolPartsExpanded.description": "在時間軸中預設展開 shell 工具區塊", + "settings.general.row.editToolPartsExpanded.title": "展開 edit 工具區塊", + "settings.general.row.editToolPartsExpanded.description": "在時間軸中預設展開 edit、write 和 patch 工具區塊", "settings.general.row.wayland.title": "使用原生 Wayland", "settings.general.row.wayland.description": "在 Wayland 上停用 X11 後備模式。需要重新啟動。", "settings.general.row.wayland.tooltip": "在混合更新率螢幕的 Linux 系統上,原生 Wayland 可能更穩定。", diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index b13ccb474ac3..615d1a0bea4d 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -539,6 +539,8 @@ export function MessageTimeline(props: { messageID={message.id} lastUserMessageID={props.lastUserMessageID} showReasoningSummaries={settings.general.showReasoningSummaries()} + shellToolDefaultOpen={settings.general.shellToolPartsExpanded()} + editToolDefaultOpen={settings.general.editToolPartsExpanded()} classes={{ root: "min-w-0 w-full relative", content: "flex flex-col justify-between !overflow-visible", diff --git a/packages/opencode/src/pty/index.ts b/packages/opencode/src/pty/index.ts index 33083485b5f6..fdb46c817c9d 100644 --- a/packages/opencode/src/pty/index.ts +++ b/packages/opencode/src/pty/index.ts @@ -39,8 +39,9 @@ export namespace Pty { return next } - const token = (ws: Socket) => { - const data = ws.data + const token = (ws: unknown) => { + if (!ws || typeof ws !== "object") return ws + const data = (ws as { data?: unknown }).data if (data === undefined) return if (data === null) return if (typeof data !== "object") return data @@ -317,7 +318,7 @@ export namespace Pty { } } - export function connect(id: string, ws: Socket, cursor?: number) { + export function connect(id: string, ws: Socket, cursor?: number, identity?: unknown) { const session = state().get(id) if (!session) { ws.close() @@ -337,7 +338,7 @@ export namespace Pty { } owners.set(ws, id) - session.subscribers.set(ws, { id: socketId, token: token(ws) }) + session.subscribers.set(ws, { id: socketId, token: token(identity ?? ws) }) const cleanup = () => { session.subscribers.delete(ws) diff --git a/packages/opencode/src/server/routes/pty.ts b/packages/opencode/src/server/routes/pty.ts index 368c9612bf42..640cfa33361f 100644 --- a/packages/opencode/src/server/routes/pty.ts +++ b/packages/opencode/src/server/routes/pty.ts @@ -182,7 +182,7 @@ export const PtyRoutes = lazy(() => ws.close() return } - handler = Pty.connect(id, socket, cursor) + handler = Pty.connect(id, socket, cursor, ws) }, onMessage(event) { if (typeof event.data !== "string") return diff --git a/packages/opencode/test/pty/pty-output-isolation.test.ts b/packages/opencode/test/pty/pty-output-isolation.test.ts index 07e86ea97b67..2c9cc5d92660 100644 --- a/packages/opencode/test/pty/pty-output-isolation.test.ts +++ b/packages/opencode/test/pty/pty-output-isolation.test.ts @@ -98,6 +98,54 @@ describe("pty", () => { }) }) + test("does not leak when identity token is only on websocket wrapper", async () => { + await using dir = await tmpdir({ git: true }) + + await Instance.provide({ + directory: dir.path, + fn: async () => { + const a = await Pty.create({ command: "cat", title: "a" }) + try { + const outA: string[] = [] + const outB: string[] = [] + const text = (data: string | Uint8Array | ArrayBuffer) => { + if (typeof data === "string") return data + if (data instanceof ArrayBuffer) return Buffer.from(new Uint8Array(data)).toString("utf8") + return Buffer.from(data).toString("utf8") + } + + const raw: Parameters[1] = { + readyState: 1, + send: (data) => { + outA.push(text(data)) + }, + close: () => { + // no-op + }, + } + + const wrap = { data: { events: { connection: "a" } } } + + Pty.connect(a.id, raw, undefined, wrap) + outA.length = 0 + + // Simulate Bun reusing the raw socket object before the next onOpen, + // while the connection token only exists on the wrapper socket. + raw.send = (data) => { + outB.push(text(data)) + } + + Pty.write(a.id, "AAA\n") + await Bun.sleep(100) + + expect(outB.join("")).not.toContain("AAA") + } finally { + await Pty.remove(a.id) + } + }, + }) + }) + test("does not leak output when socket data mutates in-place", async () => { await using dir = await tmpdir({ git: true }) diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css index 07a718141a9b..ce76d8e18877 100644 --- a/packages/ui/src/components/message-part.css +++ b/packages/ui/src/components/message-part.css @@ -332,14 +332,6 @@ } } -[data-slot="collapsible-content"]:has([data-component="edit-content"]), -[data-slot="collapsible-content"]:has([data-component="write-content"]) { - border: 1px solid var(--border-weak-base); - border-radius: 6px; - background: transparent; - overflow: hidden; -} - [data-component="bash-output"] { width: 100%; border: 1px solid var(--border-weak-base); @@ -399,11 +391,6 @@ } } -[data-slot="collapsible-content"]:has([data-component="edit-content"]) [data-component="edit-content"], -[data-slot="collapsible-content"]:has([data-component="write-content"]) [data-component="write-content"] { - border-top: none; -} - [data-component="edit-trigger"], [data-component="write-trigger"] { display: flex; @@ -492,9 +479,8 @@ [data-component="edit-content"] { border-radius: inherit; border-top: 1px solid var(--border-weaker-base); - max-height: 420px; overflow-x: hidden; - overflow-y: auto; + overflow-y: visible; scrollbar-width: none; -ms-overflow-style: none; @@ -512,9 +498,8 @@ [data-component="write-content"] { border-radius: inherit; border-top: 1px solid var(--border-weaker-base); - max-height: 240px; overflow-x: hidden; - overflow-y: auto; + overflow-y: visible; [data-component="code"] { padding-bottom: 0 !important; @@ -1212,11 +1197,18 @@ } } +[data-component="edit-tool"], +[data-component="write-tool"], [data-component="apply-patch-tool"] { > [data-component="collapsible"].tool-collapsible { gap: 0px; } + > [data-component="collapsible"] > [data-slot="collapsible-content"] { + border: none; + background: transparent; + } + > [data-component="collapsible"] > [data-slot="collapsible-trigger"][aria-expanded="true"] { position: sticky; top: var(--sticky-accordion-top, 0px); @@ -1298,7 +1290,7 @@ [data-component="apply-patch-file-diff"] { border-radius: inherit; overflow-x: hidden; - overflow-y: auto; + overflow-y: visible; scrollbar-width: none; -ms-overflow-style: none; diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 828ddbe87d8e..adba42ce9306 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -276,12 +276,24 @@ function renderable(part: PartType, showReasoningSummaries = true) { return !!PART_MAPPING[part.type] } +function toolDefaultOpen(tool: string, shell = false, edit = false) { + if (tool === "bash") return shell + if (tool === "edit" || tool === "write" || tool === "apply_patch") return edit +} + +function partDefaultOpen(part: PartType, shell = false, edit = false) { + if (part.type !== "tool") return + return toolDefaultOpen(part.tool, shell, edit) +} + export function AssistantParts(props: { messages: AssistantMessage[] showAssistantCopyPartID?: string | null turnDurationMs?: number working?: boolean showReasoningSummaries?: boolean + shellToolDefaultOpen?: boolean + editToolDefaultOpen?: boolean }) { const data = useData() const emptyParts: PartType[] = [] @@ -372,6 +384,7 @@ export function AssistantParts(props: { message={entry().message} showAssistantCopyPartID={props.showAssistantCopyPartID} turnDurationMs={props.turnDurationMs} + defaultOpen={partDefaultOpen(entry().part, props.shellToolDefaultOpen, props.editToolDefaultOpen)} /> )} @@ -900,6 +913,42 @@ export const ToolRegistry = { render: getTool, } +function ToolFileAccordion(props: { path: string; actions?: JSX.Element; children: JSX.Element }) { + const value = createMemo(() => props.path || "tool-file") + + return ( + + + + +
+
+ +
+ + {`\u202A${getDirectory(props.path)}\u202C`} + + {getFilename(props.path)} +
+
+
+ {props.actions} + +
+
+
+
+ {props.children} +
+
+ ) +} + PART_MAPPING["tool"] = function ToolPartDisplay(props) { const data = useData() const i18n = useI18n() @@ -1479,57 +1528,67 @@ ToolRegistry.register({ const i18n = useI18n() const diffComponent = useDiffComponent() const diagnostics = createMemo(() => getDiagnostics(props.metadata.diagnostics, props.input.filePath)) + const path = createMemo(() => props.metadata?.filediff?.file || props.input.filePath || "") const filename = () => getFilename(props.input.filePath ?? "") const pending = () => props.status === "pending" || props.status === "running" return ( - -
-
- - - +
+ +
+
+ + + + + + + {filename()} - - - {filename()} +
+ +
+ {getDirectory(props.input.filePath!)} +
+
+
+
+ +
- -
- {getDirectory(props.input.filePath!)} -
-
-
-
- - -
-
- } - > - -
- -
-
- - + } + > + + {(diff) => } + } + > +
+ +
+ + + + +
) }, }) @@ -1540,51 +1599,56 @@ ToolRegistry.register({ const i18n = useI18n() const codeComponent = useCodeComponent() const diagnostics = createMemo(() => getDiagnostics(props.metadata.diagnostics, props.input.filePath)) + const path = createMemo(() => props.input.filePath || "") const filename = () => getFilename(props.input.filePath ?? "") const pending = () => props.status === "pending" || props.status === "running" return ( - -
-
- - - +
+ +
+
+ + + + + + + {filename()} - - - {filename()} +
+ +
+ {getDirectory(props.input.filePath!)} +
- -
- {getDirectory(props.input.filePath!)} -
-
+
{/* */}
-
{/* */}
-
- } - > - -
- -
-
- - + } + > + + +
+ +
+
+
+ + +
) }, }) @@ -1731,45 +1795,73 @@ ToolRegistry.register({ } > {(file) => ( - -
-
- - - +
+ +
+
+ + + + + + + {getFilename(file().relativePath)} - +
+ +
+ {getDirectory(file().relativePath)} +
+
+
+
- {getFilename(file().relativePath)} +
- -
- {getDirectory(file().relativePath)} -
-
-
- - - + } + > + + + + {i18n.t("ui.patch.action.created")} + + + + + {i18n.t("ui.patch.action.deleted")} + + + + + {i18n.t("ui.patch.action.moved")} + + + + + + + } + > +
+
-
- } - > -
- -
- + + +
)} ) diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index 8e8a3f3875d4..0eceb754c81f 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -140,6 +140,8 @@ export function SessionTurn( messageID: string lastUserMessageID?: string showReasoningSummaries?: boolean + shellToolDefaultOpen?: boolean + editToolDefaultOpen?: boolean onUserInteracted?: () => void classes?: { root?: string @@ -369,6 +371,8 @@ export function SessionTurn( turnDurationMs={turnDurationMs()} working={working()} showReasoningSummaries={showReasoningSummaries()} + shellToolDefaultOpen={props.shellToolDefaultOpen} + editToolDefaultOpen={props.editToolDefaultOpen} />
diff --git a/packages/web/src/content/docs/tui.mdx b/packages/web/src/content/docs/tui.mdx index 085eb6169f83..1e48d42ccb1e 100644 --- a/packages/web/src/content/docs/tui.mdx +++ b/packages/web/src/content/docs/tui.mdx @@ -235,7 +235,7 @@ Share current session. [Learn more](/docs/share). List available themes. ```bash frame="none" -/theme +/themes ``` **Keybind:** `ctrl+x t`