diff --git a/packages/app/src/context/command.tsx b/packages/app/src/context/command.tsx
index 03bd6318dab..00d0511a22d 100644
--- a/packages/app/src/context/command.tsx
+++ b/packages/app/src/context/command.tsx
@@ -4,6 +4,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context"
import { useDialog } from "@opencode-ai/ui/context/dialog"
import { useLanguage } from "@/context/language"
import { useSettings } from "@/context/settings"
+import { isEditableTarget } from "@/utils/dom"
import { Persist, persisted } from "@/utils/persist"
const IS_MAC = typeof navigator === "object" && /(Mac|iPod|iPhone|iPad)/.test(navigator.platform)
@@ -177,14 +178,6 @@ export function formatKeybind(config: string): string {
return IS_MAC ? parts.join("") : parts.join("+")
}
-function isEditableTarget(target: EventTarget | null) {
- if (!(target instanceof HTMLElement)) return false
- if (target.isContentEditable) return true
- if (target.closest("[contenteditable='true']")) return true
- if (target.closest("input, textarea, select")) return true
- return false
-}
-
export const { use: useCommand, provider: CommandProvider } = createSimpleContext({
name: "Command",
init: () => {
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx
index 5749291157e..c21776184bb 100644
--- a/packages/app/src/context/global-sync.tsx
+++ b/packages/app/src/context/global-sync.tsx
@@ -358,7 +358,6 @@ function createGlobalSync() {
.update({ config })
.then(bootstrap)
.then(() => {
- queue.refresh()
setGlobalStore("reload", undefined)
queue.refresh()
})
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index 5199e5a26be..130cc3a5cee 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -8,7 +8,7 @@ import { usePlatform } from "./platform"
import { Project } from "@opencode-ai/sdk/v2"
import { Persist, persisted, removePersisted } from "@/utils/persist"
import { decode64 } from "@/utils/base64"
-import { same } from "@/utils/same"
+import { same } from "@opencode-ai/util/array"
import { createScrollPersistence, type SessionScroll } from "./layout-scroll"
import { createPathHelpers } from "./file/path"
diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts
index 16f2fbf4925..633e2e79ee1 100644
--- a/packages/app/src/i18n/ar.ts
+++ b/packages/app/src/i18n/ar.ts
@@ -506,6 +506,10 @@ export const dict = {
"common.close": "إغلاق",
"common.edit": "تحرير",
"common.loadMore": "تحميل المزيد",
+ "common.changelog": "التغييرات",
+ "common.noReleasesFound": "لم يتم العثور على إصدارات",
+ "changelog.tag.latest": "الأحدث",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "تبديل القائمة",
"sidebar.nav.projectsAndSessions": "المشاريع والجلسات",
@@ -734,6 +738,11 @@ export const dict = {
"workspace.reset.archived.one": "ستتم أرشفة جلسة واحدة.",
"workspace.reset.archived.many": "ستتم أرشفة {{count}} جلسات.",
"workspace.reset.note": "سيؤدي هذا إلى إعادة تعيين مساحة العمل لتتطابق مع الفرع الافتراضي.",
+ "settings.archive.title": "الجلسات المؤرشفة",
+ "settings.archive.description": "استعادة الجلسات المؤرشفة لجعلها مرئية في الشريط الجانبي.",
+ "settings.archive.none": "لا توجد جلسات مؤرشفة.",
+ "settings.archive.scope.all": "جميع المشاريع",
+ "settings.archive.scope.current": "المشروع الحالي",
"common.open": "فتح",
"dialog.releaseNotes.action.getStarted": "البدء",
"dialog.releaseNotes.action.next": "التالي",
@@ -748,4 +757,4 @@ export const dict = {
"common.time.daysAgo.short": "قبل {{count}} ي",
"settings.providers.connected.environmentDescription": "متصل من متغيرات البيئة الخاصة بك",
"settings.providers.custom.description": "أضف مزود متوافق مع OpenAI بواسطة عنوان URL الأساسي.",
-}
+}
\ No newline at end of file
diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts
index 26cf433e0e3..dc006d0038d 100644
--- a/packages/app/src/i18n/br.ts
+++ b/packages/app/src/i18n/br.ts
@@ -512,6 +512,9 @@ export const dict = {
"common.close": "Fechar",
"common.edit": "Editar",
"common.loadMore": "Carregar mais",
+ "common.changelog": "Novidades",
+ "common.noReleasesFound": "Nenhuma release encontrada",
+ "changelog.tag.latest": "Mais recente",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Alternar menu",
"sidebar.nav.projectsAndSessions": "Projetos e sessões",
@@ -742,6 +745,11 @@ export const dict = {
"workspace.reset.archived.one": "1 sessão será arquivada.",
"workspace.reset.archived.many": "{{count}} sessões serão arquivadas.",
"workspace.reset.note": "Isso redefinirá o espaço de trabalho para corresponder ao branch padrão.",
+ "settings.archive.title": "Sessões arquivadas",
+ "settings.archive.description": "Restaure sessões arquivadas para torná-las visíveis na barra lateral.",
+ "settings.archive.none": "Nenhuma sessão arquivada.",
+ "settings.archive.scope.all": "Todos os projetos",
+ "settings.archive.scope.current": "Projeto atual",
"common.open": "Abrir",
"dialog.releaseNotes.action.getStarted": "Começar",
"dialog.releaseNotes.action.next": "Próximo",
diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts
index 6c8198bd715..7a2e0b91567 100644
--- a/packages/app/src/i18n/bs.ts
+++ b/packages/app/src/i18n/bs.ts
@@ -572,6 +572,9 @@ export const dict = {
"common.close": "Zatvori",
"common.edit": "Uredi",
"common.loadMore": "Učitaj još",
+ "common.changelog": "Novosti",
+ "common.noReleasesFound": "Nema pronađenih verzija",
+ "changelog.tag.latest": "Najnovije",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Prikaži/sakrij meni",
@@ -819,6 +822,11 @@ export const dict = {
"workspace.reset.archived.one": "1 sesija će biti arhivirana.",
"workspace.reset.archived.many": "Biće arhivirano {{count}} sesija.",
"workspace.reset.note": "Ovo će resetovati radni prostor da odgovara podrazumijevanoj grani.",
+ "settings.archive.title": "Arhivirane sesije",
+ "settings.archive.description": "Vrati arhivirane sesije da bi bile vidljive u bočnoj traci.",
+ "settings.archive.none": "Nema arhiviranih sesija.",
+ "settings.archive.scope.all": "Svi projekti",
+ "settings.archive.scope.current": "Trenutni projekt",
"common.open": "Otvori",
"dialog.releaseNotes.action.getStarted": "Započni",
"dialog.releaseNotes.action.next": "Sljedeće",
diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts
index 11da681760a..887ab993fda 100644
--- a/packages/app/src/i18n/da.ts
+++ b/packages/app/src/i18n/da.ts
@@ -568,6 +568,9 @@ export const dict = {
"common.close": "Luk",
"common.edit": "Rediger",
"common.loadMore": "Indlæs flere",
+ "common.changelog": "Nyheder",
+ "common.noReleasesFound": "Ingen versioner fundet",
+ "changelog.tag.latest": "Seneste",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Skift menu",
@@ -813,6 +816,11 @@ export const dict = {
"workspace.reset.archived.one": "1 session vil blive arkiveret.",
"workspace.reset.archived.many": "{{count}} sessioner vil blive arkiveret.",
"workspace.reset.note": "Dette vil nulstille arbejdsområdet til at matche hovedgrenen.",
+ "settings.archive.title": "Arkiverede sessioner",
+ "settings.archive.description": "Gendan arkiverede sessioner for at gøre dem synlige i sidebjælken.",
+ "settings.archive.none": "Ingen arkiverede sessioner.",
+ "settings.archive.scope.all": "Alle projekter",
+ "settings.archive.scope.current": "Nuværende projekt",
"common.open": "Åbn",
"dialog.releaseNotes.action.getStarted": "Kom i gang",
"dialog.releaseNotes.action.next": "Næste",
diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts
index 51b9ec35315..1d1f058e70d 100644
--- a/packages/app/src/i18n/de.ts
+++ b/packages/app/src/i18n/de.ts
@@ -520,6 +520,10 @@ export const dict = {
"common.close": "Schließen",
"common.edit": "Bearbeiten",
"common.loadMore": "Mehr laden",
+ "common.changelog": "Neuerungen",
+ "common.noReleasesFound": "Keine Versionen gefunden",
+ "changelog.tag.latest": "Neueste",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Menü umschalten",
"sidebar.nav.projectsAndSessions": "Projekte und Sitzungen",
@@ -751,6 +755,12 @@ export const dict = {
"workspace.reset.archived.one": "1 Sitzung wird archiviert.",
"workspace.reset.archived.many": "{{count}} Sitzungen werden archiviert.",
"workspace.reset.note": "Dadurch wird der Arbeitsbereich auf den Standard-Branch zurückgesetzt.",
+
+ "settings.archive.title": "Archivierte Sitzungen",
+ "settings.archive.description": "Archivierte Sitzungen wiederherstellen, um sie in der Seitenleiste anzuzeigen.",
+ "settings.archive.none": "Keine archivierten Sitzungen.",
+ "settings.archive.scope.all": "Alle Projekte",
+ "settings.archive.scope.current": "Aktuelles Projekt",
"common.open": "Öffnen",
"dialog.releaseNotes.action.getStarted": "Loslegen",
"dialog.releaseNotes.action.next": "Weiter",
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 7e95fd739df..10d6a0cc2ac 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -585,16 +585,19 @@ export const dict = {
"common.rename": "Rename",
"common.reset": "Reset",
"common.archive": "Archive",
+ "common.unarchive": "Unarchive",
"common.delete": "Delete",
"common.close": "Close",
"common.edit": "Edit",
"common.loadMore": "Load more",
- "common.key.esc": "ESC",
-
+ "common.changelog": "Changelog",
+ "common.noReleasesFound": "No releases found",
"common.time.justNow": "Just now",
"common.time.minutesAgo.short": "{{count}}m ago",
"common.time.hoursAgo.short": "{{count}}h ago",
"common.time.daysAgo.short": "{{count}}d ago",
+ "changelog.tag.latest": "Latest",
+ "common.key.esc": "ESC",
"sidebar.menu.toggle": "Toggle menu",
"sidebar.nav.projectsAndSessions": "Projects and sessions",
@@ -613,6 +616,7 @@ export const dict = {
"settings.section.desktop": "Desktop",
"settings.section.server": "Server",
+ "settings.section.data": "Data",
"settings.tab.general": "General",
"settings.tab.shortcuts": "Shortcuts",
"settings.desktop.section.wsl": "WSL",
@@ -844,4 +848,10 @@ export const dict = {
"workspace.reset.archived.one": "1 session will be archived.",
"workspace.reset.archived.many": "{{count}} sessions will be archived.",
"workspace.reset.note": "This will reset the workspace to match the default branch.",
+
+ "settings.archive.title": "Archived Sessions",
+ "settings.archive.description": "Restore archived sessions to make them visible in the sidebar.",
+ "settings.archive.none": "No archived sessions.",
+ "settings.archive.scope.all": "All projects",
+ "settings.archive.scope.current": "Current project",
}
diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts
index 2665a808508..d4426ee21a4 100644
--- a/packages/app/src/i18n/es.ts
+++ b/packages/app/src/i18n/es.ts
@@ -575,6 +575,10 @@ export const dict = {
"common.close": "Cerrar",
"common.edit": "Editar",
"common.loadMore": "Cargar más",
+ "common.changelog": "Novedades",
+ "common.noReleasesFound": "No se encontraron versiones",
+ "changelog.tag.latest": "Último",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Alternar menú",
@@ -825,6 +829,12 @@ export const dict = {
"workspace.reset.archived.one": "1 sesión será archivada.",
"workspace.reset.archived.many": "{{count}} sesiones serán archivadas.",
"workspace.reset.note": "Esto restablecerá el espacio de trabajo para coincidir con la rama predeterminada.",
+
+ "settings.archive.title": "Sesiones archivadas",
+ "settings.archive.description": "Restaura las sesiones archivadas para hacerlas visibles en la barra lateral.",
+ "settings.archive.none": "No hay sesiones archivadas.",
+ "settings.archive.scope.all": "Todos los proyectos",
+ "settings.archive.scope.current": "Proyecto actual",
"common.open": "Abrir",
"dialog.releaseNotes.action.getStarted": "Comenzar",
"dialog.releaseNotes.action.next": "Siguiente",
diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts
index 1e67db19333..35a0062b208 100644
--- a/packages/app/src/i18n/fr.ts
+++ b/packages/app/src/i18n/fr.ts
@@ -516,6 +516,10 @@ export const dict = {
"common.close": "Fermer",
"common.edit": "Modifier",
"common.loadMore": "Charger plus",
+ "common.changelog": "Nouveautés",
+ "common.noReleasesFound": "Aucune version trouvée",
+ "changelog.tag.latest": "Dernier",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Basculer le menu",
"sidebar.nav.projectsAndSessions": "Projets et sessions",
@@ -749,6 +753,11 @@ export const dict = {
"workspace.reset.archived.one": "1 session sera archivée.",
"workspace.reset.archived.many": "{{count}} sessions seront archivées.",
"workspace.reset.note": "Cela réinitialisera l'espace de travail pour correspondre à la branche par défaut.",
+ "settings.archive.title": "Sessions archivées",
+ "settings.archive.description": "Restaurez les sessions archivées pour les rendre visibles dans la barre latérale.",
+ "settings.archive.none": "Aucune session archivée.",
+ "settings.archive.scope.all": "Tous les Projets",
+ "settings.archive.scope.current": "Projet actuel",
"common.open": "Ouvrir",
"dialog.releaseNotes.action.getStarted": "Commencer",
"dialog.releaseNotes.action.next": "Suivant",
diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts
index ecd38d33249..affe16917cf 100644
--- a/packages/app/src/i18n/ja.ts
+++ b/packages/app/src/i18n/ja.ts
@@ -510,6 +510,10 @@ export const dict = {
"common.close": "閉じる",
"common.edit": "編集",
"common.loadMore": "さらに読み込む",
+ "common.changelog": "更新履歴",
+ "common.noReleasesFound": "バージョンが見つかりません",
+ "changelog.tag.latest": "最新",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "メニューを切り替え",
"sidebar.nav.projectsAndSessions": "プロジェクトとセッション",
@@ -738,6 +742,12 @@ export const dict = {
"workspace.reset.archived.one": "1つのセッションがアーカイブされます。",
"workspace.reset.archived.many": "{{count}}個のセッションがアーカイブされます。",
"workspace.reset.note": "これにより、ワークスペースはデフォルトブランチと一致するようにリセットされます。",
+
+ "settings.archive.title": "アーカイブされたセッション",
+ "settings.archive.description": "アーカイブされたセッションを復元してサイドバーに表示します。",
+ "settings.archive.none": "アーカイブされたセッションはありません。",
+ "settings.archive.scope.all": "すべてのプロジェクト",
+ "settings.archive.scope.current": "現在のプロジェクト",
"common.open": "開く",
"dialog.releaseNotes.action.getStarted": "始める",
"dialog.releaseNotes.action.next": "次へ",
diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts
index 8f54b8abdc7..89feceaeb60 100644
--- a/packages/app/src/i18n/ko.ts
+++ b/packages/app/src/i18n/ko.ts
@@ -511,6 +511,10 @@ export const dict = {
"common.close": "닫기",
"common.edit": "편집",
"common.loadMore": "더 불러오기",
+ "common.changelog": "새로운 기능",
+ "common.noReleasesFound": "버전을 찾을 수 없음",
+ "changelog.tag.latest": "최신",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "메뉴 토글",
"sidebar.nav.projectsAndSessions": "프로젝트 및 세션",
@@ -738,6 +742,12 @@ export const dict = {
"workspace.reset.archived.one": "1개의 세션이 보관됩니다.",
"workspace.reset.archived.many": "{{count}}개의 세션이 보관됩니다.",
"workspace.reset.note": "이 작업은 작업 공간을 기본 브랜치와 일치하도록 재설정합니다.",
+
+ "settings.archive.title": "보관된 세션",
+ "settings.archive.description": "보관된 세션을 복원하여 사이드바에 표시합니다.",
+ "settings.archive.none": "보관된 세션이 없습니다.",
+ "settings.archive.scope.all": "모든 프로젝트",
+ "settings.archive.scope.current": "현재 프로젝트",
"common.open": "열기",
"dialog.releaseNotes.action.getStarted": "시작하기",
"dialog.releaseNotes.action.next": "다음",
diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts
index 0c94046eb06..2f51a9ab30c 100644
--- a/packages/app/src/i18n/no.ts
+++ b/packages/app/src/i18n/no.ts
@@ -575,6 +575,9 @@ export const dict = {
"common.close": "Lukk",
"common.edit": "Rediger",
"common.loadMore": "Last flere",
+ "common.changelog": "Nyheter",
+ "common.noReleasesFound": "Ingen versjoner funnet",
+ "changelog.tag.latest": "Siste",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Veksle meny",
@@ -821,6 +824,12 @@ export const dict = {
"workspace.reset.archived.one": "1 sesjon vil bli arkivert.",
"workspace.reset.archived.many": "{{count}} sesjoner vil bli arkivert.",
"workspace.reset.note": "Dette vil tilbakestille arbeidsområdet til å samsvare med standardgrenen.",
+
+ "settings.archive.title": "Arkiverte økter",
+ "settings.archive.description": "Gjenopprett arkiverte økter for å gjøre dem synlige i sidefeltet.",
+ "settings.archive.none": "Ingen arkiverte økter.",
+ "settings.archive.scope.all": "Alle prosjekter",
+ "settings.archive.scope.current": "Nåværende prosjekt",
"common.open": "Åpne",
"dialog.releaseNotes.action.getStarted": "Kom i gang",
"dialog.releaseNotes.action.next": "Neste",
diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts
index 59c0513be62..daac443c2b1 100644
--- a/packages/app/src/i18n/pl.ts
+++ b/packages/app/src/i18n/pl.ts
@@ -511,6 +511,9 @@ export const dict = {
"common.close": "Zamknij",
"common.edit": "Edytuj",
"common.loadMore": "Załaduj więcej",
+ "common.changelog": "Nowości",
+ "common.noReleasesFound": "Nie znaleziono wersji",
+ "changelog.tag.latest": "Najnowszy",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Przełącz menu",
"sidebar.nav.projectsAndSessions": "Projekty i sesje",
@@ -740,6 +743,11 @@ export const dict = {
"workspace.reset.archived.one": "1 sesja zostanie zarchiwizowana.",
"workspace.reset.archived.many": "{{count}} sesji zostanie zarchiwizowanych.",
"workspace.reset.note": "To zresetuje przestrzeń roboczą, aby odpowiadała domyślnej gałęzi.",
+ "settings.archive.title": "Zarchiwizowane sesje",
+ "settings.archive.description": "Przywróć zarchiwizowane sesje, aby były widoczne na pasku bocznym.",
+ "settings.archive.none": "Brak zarchiwizowanych sesji.",
+ "settings.archive.scope.all": "Wszystkie projekty",
+ "settings.archive.scope.current": "Bieżący projekt",
"common.open": "Otwórz",
"dialog.releaseNotes.action.getStarted": "Rozpocznij",
"dialog.releaseNotes.action.next": "Dalej",
diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts
index 2071eaae7b9..13ee4ead9ea 100644
--- a/packages/app/src/i18n/ru.ts
+++ b/packages/app/src/i18n/ru.ts
@@ -573,6 +573,9 @@ export const dict = {
"common.close": "Закрыть",
"common.edit": "Редактировать",
"common.loadMore": "Загрузить ещё",
+ "common.changelog": "Что нового",
+ "common.noReleasesFound": "Версии не найдены",
+ "changelog.tag.latest": "Последний",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "Переключить меню",
@@ -821,6 +824,11 @@ export const dict = {
"workspace.reset.archived.one": "1 сессия будет архивирована.",
"workspace.reset.archived.many": "{{count}} сессий будет архивировано.",
"workspace.reset.note": "Рабочее пространство будет сброшено в соответствие с веткой по умолчанию.",
+ "settings.archive.title": "Архивированные сессии",
+ "settings.archive.description": "Восстановите архивированные сессии, чтобы они отображались на боковой панели.",
+ "settings.archive.none": "Нет архивированных сессий.",
+ "settings.archive.scope.all": "Все проекты",
+ "settings.archive.scope.current": "Текущий проект",
"common.open": "Открыть",
"dialog.releaseNotes.action.getStarted": "Начать",
"dialog.releaseNotes.action.next": "Далее",
diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts
index 9871555536f..7176d82aa77 100644
--- a/packages/app/src/i18n/th.ts
+++ b/packages/app/src/i18n/th.ts
@@ -567,6 +567,9 @@ export const dict = {
"common.close": "ปิด",
"common.edit": "แก้ไข",
"common.loadMore": "โหลดเพิ่มเติม",
+ "common.changelog": "อัปเดต",
+ "common.noReleasesFound": "ไม่พบเวอร์ชัน",
+ "changelog.tag.latest": "ล่าสุด",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "สลับเมนู",
@@ -811,6 +814,12 @@ export const dict = {
"workspace.reset.archived.one": "1 เซสชันจะถูกจัดเก็บ",
"workspace.reset.archived.many": "{{count}} เซสชันจะถูกจัดเก็บ",
"workspace.reset.note": "สิ่งนี้จะรีเซ็ตพื้นที่ทำงานให้ตรงกับสาขาเริ่มต้น",
+
+ "settings.archive.title": "เซสชันที่จัดเก็บ",
+ "settings.archive.description": "กู้คืนเซสชันที่จัดเก็บเพื่อให้แสดงในแถบด้านข้าง",
+ "settings.archive.none": "ไม่มีเซสชันที่จัดเก็บ",
+ "settings.archive.scope.all": "โปรเจกต์ทั้งหมด",
+ "settings.archive.scope.current": "โปรเจกต์ปัจจุบัน",
"common.open": "เปิด",
"dialog.releaseNotes.action.getStarted": "เริ่มต้น",
"dialog.releaseNotes.action.next": "ถัดไป",
diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts
index e72d4c0e3be..43be3def2f6 100644
--- a/packages/app/src/i18n/zh.ts
+++ b/packages/app/src/i18n/zh.ts
@@ -566,6 +566,10 @@ export const dict = {
"common.close": "关闭",
"common.edit": "编辑",
"common.loadMore": "加载更多",
+ "common.changelog": "更新日志",
+ "common.noReleasesFound": "未找到版本",
+ "changelog.tag.latest": "最新",
+
"common.key.esc": "ESC",
"sidebar.menu.toggle": "切换菜单",
@@ -809,6 +813,12 @@ export const dict = {
"workspace.reset.archived.one": "将归档 1 个会话。",
"workspace.reset.archived.many": "将归档 {{count}} 个会话。",
"workspace.reset.note": "这将把工作区重置为与默认分支一致。",
+
+ "settings.archive.title": "归档会话",
+ "settings.archive.description": "恢复归档会话以使其在侧边栏中可见。",
+ "settings.archive.none": "没有归档会话。",
+ "settings.archive.scope.all": "所有项目",
+ "settings.archive.scope.current": "当前项目",
"common.open": "打开",
"dialog.releaseNotes.action.getStarted": "开始",
"dialog.releaseNotes.action.next": "下一步",
diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts
index 70421dfe103..06954340989 100644
--- a/packages/app/src/i18n/zht.ts
+++ b/packages/app/src/i18n/zht.ts
@@ -563,6 +563,9 @@ export const dict = {
"common.close": "關閉",
"common.edit": "編輯",
"common.loadMore": "載入更多",
+ "common.changelog": "更新日誌",
+ "common.noReleasesFound": "未找到版本",
+ "changelog.tag.latest": "最新",
"common.key.esc": "ESC",
"sidebar.menu.toggle": "切換選單",
@@ -804,6 +807,12 @@ export const dict = {
"workspace.reset.archived.one": "將封存 1 個工作階段。",
"workspace.reset.archived.many": "將封存 {{count}} 個工作階段。",
"workspace.reset.note": "這將把工作區重設為與預設分支一致。",
+
+ "settings.archive.title": "封存工作階段",
+ "settings.archive.description": "恢復封存的工作階段以使其在側邊欄中可見。",
+ "settings.archive.none": "沒有封存的工作階段。",
+ "settings.archive.scope.all": "所有專案",
+ "settings.archive.scope.current": "目前專案",
"common.open": "打開",
"dialog.releaseNotes.action.getStarted": "開始",
"dialog.releaseNotes.action.next": "下一步",
diff --git a/packages/app/src/pages/directory-layout.tsx b/packages/app/src/pages/directory-layout.tsx
index 71b52180f2e..0424c3a8bc5 100644
--- a/packages/app/src/pages/directory-layout.tsx
+++ b/packages/app/src/pages/directory-layout.tsx
@@ -9,11 +9,13 @@ import { DataProvider } from "@opencode-ai/ui/context"
import { decode64 } from "@/utils/base64"
import { showToast } from "@opencode-ai/ui/toast"
import { useLanguage } from "@/context/language"
+import { usePlatform } from "@/context/platform"
function DirectoryDataProvider(props: ParentProps<{ directory: string }>) {
const params = useParams()
const navigate = useNavigate()
const sync = useSync()
+ const platform = usePlatform()
return (
) {
directory={props.directory}
onNavigateToSession={(sessionID: string) => navigate(`/${params.dir}/session/${sessionID}`)}
onSessionHref={(sessionID: string) => `/${params.dir}/session/${sessionID}`}
+ onOpenFilePath={async (input) => {
+ const file = input.path.replace(/^[\\/]+/, "")
+ const separator = props.directory.includes("\\") ? "\\" : "/"
+ const path = props.directory.endsWith(separator) ? props.directory + file : props.directory + separator + file
+
+ if (platform.platform === "desktop" && platform.openPath) {
+ await platform.openPath(path).catch((error) => {
+ const description = error instanceof Error ? error.message : String(error)
+ showToast({
+ variant: "error",
+ title: "Open failed",
+ description,
+ })
+ window.dispatchEvent(
+ new CustomEvent("opencode:open-file-path", {
+ detail: input,
+ }),
+ )
+ })
+ return
+ }
+
+ window.dispatchEvent(
+ new CustomEvent("opencode:open-file-path", {
+ detail: input,
+ }),
+ )
+ }}
>
{props.children}
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index cc322d74fc4..a3d5b0bc087 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -1936,45 +1936,34 @@ export default function Layout(props: ParentProps) {
when={workspacesEnabled()}
fallback={
<>
-
-
-
-
-
+
+
+ }
/>
>
}
>
<>
-
-
-
-
-
{
if (!panelProps.mobile) scrollContainerRef = el
}}
- class="size-full flex flex-col py-2 gap-4 overflow-y-auto no-scrollbar [overflow-anchor:none]"
+ class="size-full flex flex-col overflow-y-auto no-scrollbar [overflow-anchor:none]"
>
-
-
- {(directory) => (
-
- )}
-
-
+
+
+
+
+
+
+
+
+
+
+ {(directory) => (
+
+ )}
+
+
+
{
return (
mobile?: boolean
+ header?: JSX.Element
}): JSX.Element => {
const globalSync = useGlobalSync()
const language = useLanguage()
@@ -488,9 +489,14 @@ export const LocalWorkspace = (props: {
return (
props.ctx.setScrollContainerRef(el, props.mobile)}
- class="size-full flex flex-col py-2 overflow-y-auto no-scrollbar [overflow-anchor:none]"
+ class="size-full flex flex-col overflow-y-auto no-scrollbar [overflow-anchor:none]"
>
-
-
-
- )}
-
+ )}
+
+
+
)
},
})
@@ -1953,6 +2288,7 @@ ToolRegistry.register({
return []
})
+ const pending = createMemo(() => busy(props.status))
const subtitle = createMemo(() => {
const list = todos()
@@ -1961,14 +2297,19 @@ ToolRegistry.register({
})
return (
-