diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 8cf030eceb0..d8a5c8a9025 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,6 @@ ### What does this PR do? -Please provide a description of the issue (if there is one), the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the PR. +Please provide a description of the issue (if there is one), the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the pr. **If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED!** diff --git a/packages/app/src/components/file-tree.test.ts b/packages/app/src/components/file-tree.test.ts index 29e20b4807c..5da3532accd 100644 --- a/packages/app/src/components/file-tree.test.ts +++ b/packages/app/src/components/file-tree.test.ts @@ -29,6 +29,15 @@ beforeAll(async () => { mock.module("@opencode-ai/ui/file-icon", () => ({ FileIcon: () => null })) mock.module("@opencode-ai/ui/icon", () => ({ Icon: () => null })) mock.module("@opencode-ai/ui/tooltip", () => ({ Tooltip: (props: { children?: unknown }) => props.children })) + mock.module("@opencode-ai/ui/context-menu", () => ({ + ContextMenu: { + Trigger: (props: { as?: string; children?: unknown }) => props.children, + Portal: (props: { children?: unknown }) => props.children, + Content: (props: { children?: unknown }) => props.children, + Item: (props: { onSelect?: () => void; children?: unknown }) => props.children, + ItemLabel: (props: { children?: unknown }) => props.children, + }, + })) const mod = await import("./file-tree") shouldListRoot = mod.shouldListRoot shouldListExpanded = mod.shouldListExpanded diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx index d7b7299731c..876ec597e6d 100644 --- a/packages/app/src/components/file-tree.tsx +++ b/packages/app/src/components/file-tree.tsx @@ -1,6 +1,8 @@ import { useFile } from "@/context/file" +import { useLanguage } from "@/context/language" import { encodeFilePath } from "@/context/file/path" import { Collapsible } from "@opencode-ai/ui/collapsible" +import { ContextMenu } from "@opencode-ai/ui/context-menu" import { FileIcon } from "@opencode-ai/ui/file-icon" import { Icon } from "@opencode-ai/ui/icon" import { Tooltip } from "@opencode-ai/ui/tooltip" @@ -71,6 +73,7 @@ export default function FileTree(props: { draggable?: boolean tooltip?: boolean onFileClick?: (file: FileNode) => void + onFileMention?: (file: FileNode) => void _filter?: Filter _marks?: Set @@ -78,6 +81,7 @@ export default function FileTree(props: { _kinds?: ReadonlyMap }) { const file = useFile() + const language = useLanguage() const level = props.level ?? 0 const draggable = () => props.draggable ?? true const tooltip = () => props.tooltip ?? true @@ -415,13 +419,28 @@ export default function FileTree(props: { onOpenChange={(open) => (open ? file.tree.expand(node.path) : file.tree.collapse(node.path))} > - - -
- -
-
-
+ + + + +
+ +
+
+
+
+ + + + props.onFileMention!(node) : undefined} + > + {language.t("session.files.mention")} + + + + +
- - props.onFileClick?.(node)}> -
- - - + + + + props.onFileClick?.(node)}> +
+ + + + + + + props.onFileClick!(node) : undefined}> + {language.t("common.open")} + + + props.onFileMention!(node) : undefined}> + {language.t("session.files.mention")} + + + + + ) diff --git a/packages/app/src/components/session/session-sortable-tab.tsx b/packages/app/src/components/session/session-sortable-tab.tsx index 516f3c8edeb..06996d73c4b 100644 --- a/packages/app/src/components/session/session-sortable-tab.tsx +++ b/packages/app/src/components/session/session-sortable-tab.tsx @@ -5,6 +5,7 @@ import { FileIcon } from "@opencode-ai/ui/file-icon" import { IconButton } from "@opencode-ai/ui/icon-button" import { TooltipKeybind } from "@opencode-ai/ui/tooltip" import { Tabs } from "@opencode-ai/ui/tabs" +import { ContextMenu } from "@opencode-ai/ui/context-menu" import { getFilename } from "@opencode-ai/util/path" import { useFile } from "@/context/file" import { useLanguage } from "@/context/language" @@ -25,7 +26,13 @@ export function FileVisual(props: { path: string; active?: boolean }): JSX.Eleme ) } -export function SortableTab(props: { tab: string; onTabClose: (tab: string) => void }): JSX.Element { +export function SortableTab(props: { + tab: string + onTabClose: (tab: string) => void + onClick?: () => void + onCloseOthers?: (tab: string) => void + onMention?: (tab: string) => void +}): JSX.Element { const file = useFile() const language = useLanguage() const command = useCommand() @@ -35,28 +42,50 @@ export function SortableTab(props: { tab: string; onTabClose: (tab: string) => v // @ts-ignore
- - props.onTabClose(props.tab)} - aria-label={language.t("common.closeTab")} - /> - - } - hideCloseButton - onMiddleClick={() => props.onTabClose(props.tab)} - > - {(p) => } - + + + props.onTabClose(props.tab)} + aria-label={language.t("common.closeTab")} + /> + + } + hideCloseButton + onMiddleClick={() => props.onTabClose(props.tab)} + onClick={props.onClick} + > + {(p) => } + + + + props.onTabClose(props.tab)}> + {language.t("common.closeTab")} + + + props.onCloseOthers?.(props.tab)}> + {language.t("session.tab.closeOthers")} + + + + + props.onMention?.(props.tab)}> + {language.t("session.files.mention")} + + + + +
) diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index e3792a3c3cc..0169b71fb0e 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -431,6 +431,7 @@ export const dict = { "session.tab.session": "جلسة", "session.tab.review": "مراجعة", "session.tab.context": "سياق", + "session.tab.closeOthers": "إغلاق البقية", "session.panel.reviewAndFiles": "المراجعة والملفات", "session.review.filesChanged": "تم تغيير {{count}} ملفات", "session.review.change.one": "تغيير", @@ -441,6 +442,7 @@ export const dict = { "session.files.selectToOpen": "اختر ملفًا لفتحه", "session.files.all": "كل الملفات", "session.files.binaryContent": "ملف ثنائي (لا يمكن عرض المحتوى)", + "session.files.mention": "إشارة", "session.messages.renderEarlier": "عرض الرسائل السابقة", "session.messages.loadingEarlier": "جارٍ تحميل الرسائل السابقة...", "session.messages.loadEarlier": "تحميل الرسائل السابقة", @@ -495,6 +497,7 @@ export const dict = { "common.archive": "أرشفة", "common.delete": "حذف", "common.close": "إغلاق", + "common.open": "فتح", "common.edit": "تحرير", "common.loadMore": "تحميل المزيد", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index 07d6ce467ae..6fa1940e0e6 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -434,6 +434,7 @@ export const dict = { "session.tab.session": "Sessão", "session.tab.review": "Revisão", "session.tab.context": "Contexto", + "session.tab.closeOthers": "Fechar outras", "session.panel.reviewAndFiles": "Revisão e arquivos", "session.review.filesChanged": "{{count}} Arquivos Alterados", "session.review.change.one": "Alteração", @@ -444,6 +445,7 @@ export const dict = { "session.files.selectToOpen": "Selecione um arquivo para abrir", "session.files.all": "Todos os arquivos", "session.files.binaryContent": "Arquivo binário (conteúdo não pode ser exibido)", + "session.files.mention": "Mencionar", "session.messages.renderEarlier": "Renderizar mensagens anteriores", "session.messages.loadingEarlier": "Carregando mensagens anteriores...", "session.messages.loadEarlier": "Carregar mensagens anteriores", @@ -501,6 +503,7 @@ export const dict = { "common.archive": "Arquivar", "common.delete": "Excluir", "common.close": "Fechar", + "common.open": "Abrir", "common.edit": "Editar", "common.loadMore": "Carregar mais", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index 7d10da6ed87..b9536a13688 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -486,6 +486,7 @@ export const dict = { "session.tab.session": "Sesija", "session.tab.review": "Pregled", "session.tab.context": "Kontekst", + "session.tab.closeOthers": "Zatvori ostale", "session.panel.reviewAndFiles": "Pregled i datoteke", "session.review.filesChanged": "Izmijenjeno {{count}} datoteka", "session.review.change.one": "Izmjena", @@ -497,6 +498,7 @@ export const dict = { "session.files.selectToOpen": "Odaberi datoteku za otvaranje", "session.files.all": "Sve datoteke", "session.files.binaryContent": "Binarna datoteka (sadržaj se ne može prikazati)", + "session.files.mention": "Spomeni", "session.messages.renderEarlier": "Prikaži ranije poruke", "session.messages.loadingEarlier": "Učitavanje ranijih poruka...", @@ -561,6 +563,7 @@ export const dict = { "common.archive": "Arhiviraj", "common.delete": "Izbriši", "common.close": "Zatvori", + "common.open": "Otvori", "common.edit": "Uredi", "common.loadMore": "Učitaj još", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index ac5c4d494b1..d5273090cd5 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -483,6 +483,7 @@ export const dict = { "session.tab.session": "Session", "session.tab.review": "Gennemgang", "session.tab.context": "Kontekst", + "session.tab.closeOthers": "Luk andre", "session.panel.reviewAndFiles": "Gennemgang og filer", "session.review.filesChanged": "{{count}} Filer ændret", "session.review.change.one": "Ændring", @@ -493,6 +494,7 @@ export const dict = { "session.files.selectToOpen": "Vælg en fil at åbne", "session.files.all": "Alle filer", "session.files.binaryContent": "Binær fil (indhold kan ikke vises)", + "session.files.mention": "Nævn", "session.messages.renderEarlier": "Vis tidligere beskeder", "session.messages.loadingEarlier": "Indlæser tidligere beskeder...", "session.messages.loadEarlier": "Indlæs tidligere beskeder", @@ -557,6 +559,7 @@ export const dict = { "common.archive": "Arkivér", "common.delete": "Slet", "common.close": "Luk", + "common.open": "Åbn", "common.edit": "Rediger", "common.loadMore": "Indlæs flere", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index 99a95063107..daf43bfa51c 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -442,6 +442,7 @@ export const dict = { "session.tab.session": "Sitzung", "session.tab.review": "Überprüfung", "session.tab.context": "Kontext", + "session.tab.closeOthers": "Andere schließen", "session.panel.reviewAndFiles": "Überprüfung und Dateien", "session.review.filesChanged": "{{count}} Dateien geändert", "session.review.change.one": "Änderung", @@ -452,6 +453,7 @@ export const dict = { "session.files.selectToOpen": "Datei zum Öffnen auswählen", "session.files.all": "Alle Dateien", "session.files.binaryContent": "Binärdatei (Inhalt kann nicht angezeigt werden)", + "session.files.mention": "Erwähnen", "session.messages.renderEarlier": "Frühere Nachrichten rendern", "session.messages.loadingEarlier": "Lade frühere Nachrichten...", "session.messages.loadEarlier": "Frühere Nachrichten laden", @@ -509,6 +511,7 @@ export const dict = { "common.archive": "Archivieren", "common.delete": "Löschen", "common.close": "Schließen", + "common.open": "Öffnen", "common.edit": "Bearbeiten", "common.loadMore": "Mehr laden", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index c138c7b6145..de43eb35b4a 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -484,6 +484,7 @@ export const dict = { "session.tab.session": "Session", "session.tab.review": "Review", "session.tab.context": "Context", + "session.tab.closeOthers": "Close others", "session.panel.reviewAndFiles": "Review and files", "session.review.filesChanged": "{{count}} Files Changed", "session.review.change.one": "Change", @@ -495,6 +496,7 @@ export const dict = { "session.files.selectToOpen": "Select a file to open", "session.files.all": "All files", "session.files.binaryContent": "Binary file (content cannot be displayed)", + "session.files.mention": "Mention", "session.messages.renderEarlier": "Render earlier messages", "session.messages.loadingEarlier": "Loading earlier messages...", @@ -561,6 +563,7 @@ export const dict = { "common.archive": "Archive", "common.delete": "Delete", "common.close": "Close", + "common.open": "Open", "common.edit": "Edit", "common.loadMore": "Load more", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index 7a6c4974e09..59b2b4ab12b 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -487,6 +487,7 @@ export const dict = { "session.tab.session": "Sesión", "session.tab.review": "Revisión", "session.tab.context": "Contexto", + "session.tab.closeOthers": "Cerrar otras", "session.panel.reviewAndFiles": "Revisión y archivos", "session.review.filesChanged": "{{count}} Archivos Cambiados", "session.review.change.one": "Cambio", @@ -498,7 +499,7 @@ export const dict = { "session.files.selectToOpen": "Selecciona un archivo para abrir", "session.files.all": "Todos los archivos", "session.files.binaryContent": "Archivo binario (el contenido no puede ser mostrado)", - + "session.files.mention": "Mencionar", "session.messages.renderEarlier": "Renderizar mensajes anteriores", "session.messages.loadingEarlier": "Cargando mensajes anteriores...", "session.messages.loadEarlier": "Cargar mensajes anteriores", @@ -564,6 +565,7 @@ export const dict = { "common.archive": "Archivar", "common.delete": "Eliminar", "common.close": "Cerrar", + "common.open": "Abrir", "common.edit": "Editar", "common.loadMore": "Cargar más", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index fc3bf266794..0ad465d430d 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -440,6 +440,7 @@ export const dict = { "session.tab.session": "Session", "session.tab.review": "Revue", "session.tab.context": "Contexte", + "session.tab.closeOthers": "Fermer les autres", "session.panel.reviewAndFiles": "Revue et fichiers", "session.review.filesChanged": "{{count}} fichiers modifiés", "session.review.change.one": "Modification", @@ -450,6 +451,7 @@ export const dict = { "session.files.selectToOpen": "Sélectionnez un fichier à ouvrir", "session.files.all": "Tous les fichiers", "session.files.binaryContent": "Fichier binaire (le contenu ne peut pas être affiché)", + "session.files.mention": "Mentionner", "session.messages.renderEarlier": "Afficher les messages précédents", "session.messages.loadingEarlier": "Chargement des messages précédents...", "session.messages.loadEarlier": "Charger les messages précédents", @@ -507,6 +509,7 @@ export const dict = { "common.archive": "Archiver", "common.delete": "Supprimer", "common.close": "Fermer", + "common.open": "Ouvrir", "common.edit": "Modifier", "common.loadMore": "Charger plus", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index b597db02a58..5ff50ba8ed8 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -432,6 +432,7 @@ export const dict = { "session.tab.session": "セッション", "session.tab.review": "レビュー", "session.tab.context": "コンテキスト", + "session.tab.closeOthers": "他のタブを閉じる", "session.panel.reviewAndFiles": "レビューとファイル", "session.review.filesChanged": "{{count}} ファイル変更", "session.review.change.one": "変更", @@ -442,6 +443,7 @@ export const dict = { "session.files.selectToOpen": "開くファイルを選択", "session.files.all": "すべてのファイル", "session.files.binaryContent": "バイナリファイル(内容を表示できません)", + "session.files.mention": "メンション", "session.messages.renderEarlier": "以前のメッセージを表示", "session.messages.loadingEarlier": "以前のメッセージを読み込み中...", "session.messages.loadEarlier": "以前のメッセージを読み込む", @@ -499,6 +501,7 @@ export const dict = { "common.archive": "アーカイブ", "common.delete": "削除", "common.close": "閉じる", + "common.open": "開く", "common.edit": "編集", "common.loadMore": "さらに読み込む", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index 525bd035651..564dc78d137 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -434,6 +434,7 @@ export const dict = { "session.tab.session": "세션", "session.tab.review": "검토", "session.tab.context": "컨텍스트", + "session.tab.closeOthers": "다른 탭 닫기", "session.panel.reviewAndFiles": "검토 및 파일", "session.review.filesChanged": "{{count}}개 파일 변경됨", "session.review.change.one": "변경", @@ -444,6 +445,7 @@ export const dict = { "session.files.selectToOpen": "열 파일을 선택하세요", "session.files.all": "모든 파일", "session.files.binaryContent": "바이너리 파일 (내용을 표시할 수 없음)", + "session.files.mention": "멘션", "session.messages.renderEarlier": "이전 메시지 렌더링", "session.messages.loadingEarlier": "이전 메시지 로드 중...", "session.messages.loadEarlier": "이전 메시지 로드", @@ -500,6 +502,7 @@ export const dict = { "common.archive": "보관", "common.delete": "삭제", "common.close": "닫기", + "common.open": "열기", "common.edit": "편집", "common.loadMore": "더 불러오기", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 98e79e1896a..e2a9854c105 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -487,6 +487,7 @@ export const dict = { "session.tab.session": "Sesjon", "session.tab.review": "Gjennomgang", "session.tab.context": "Kontekst", + "session.tab.closeOthers": "Lukk andre", "session.panel.reviewAndFiles": "Gjennomgang og filer", "session.review.filesChanged": "{{count}} filer endret", "session.review.change.one": "Endring", @@ -498,7 +499,7 @@ export const dict = { "session.files.selectToOpen": "Velg en fil å åpne", "session.files.all": "Alle filer", "session.files.binaryContent": "Binær fil (innhold kan ikke vises)", - + "session.files.mention": "Nevn", "session.messages.renderEarlier": "Vis tidligere meldinger", "session.messages.loadingEarlier": "Laster inn tidligere meldinger...", "session.messages.loadEarlier": "Last inn tidligere meldinger", @@ -564,6 +565,7 @@ export const dict = { "common.archive": "Arkiver", "common.delete": "Slett", "common.close": "Lukk", + "common.open": "Åpne", "common.edit": "Rediger", "common.loadMore": "Last flere", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index 983c9c14ac1..08f8b9c0402 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -433,6 +433,7 @@ export const dict = { "session.tab.session": "Sesja", "session.tab.review": "Przegląd", "session.tab.context": "Kontekst", + "session.tab.closeOthers": "Zamknij pozostałe", "session.panel.reviewAndFiles": "Przegląd i pliki", "session.review.filesChanged": "Zmieniono {{count}} plików", "session.review.change.one": "Zmiana", @@ -443,6 +444,7 @@ export const dict = { "session.files.selectToOpen": "Wybierz plik do otwarcia", "session.files.all": "Wszystkie pliki", "session.files.binaryContent": "Plik binarny (zawartość nie może być wyświetlona)", + "session.files.mention": "Wspomnij", "session.messages.renderEarlier": "Renderuj wcześniejsze wiadomości", "session.messages.loadingEarlier": "Ładowanie wcześniejszych wiadomości...", "session.messages.loadEarlier": "Załaduj wcześniejsze wiadomości", @@ -500,6 +502,7 @@ export const dict = { "common.archive": "Archiwizuj", "common.delete": "Usuń", "common.close": "Zamknij", + "common.open": "Otwórz", "common.edit": "Edytuj", "common.loadMore": "Załaduj więcej", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index f2c87fe0f1e..6bf07ec2676 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -487,6 +487,7 @@ export const dict = { "session.tab.session": "Сессия", "session.tab.review": "Обзор", "session.tab.context": "Контекст", + "session.tab.closeOthers": "Закрыть остальные", "session.panel.reviewAndFiles": "Обзор и файлы", "session.review.filesChanged": "{{count}} файлов изменено", "session.review.change.one": "Изменение", @@ -497,6 +498,7 @@ export const dict = { "session.files.selectToOpen": "Выберите файл, чтобы открыть", "session.files.all": "Все файлы", "session.files.binaryContent": "Двоичный файл (содержимое не может быть отображено)", + "session.files.mention": "Упомянуть", "session.messages.renderEarlier": "Показать предыдущие сообщения", "session.messages.loadingEarlier": "Загрузка предыдущих сообщений...", "session.messages.loadEarlier": "Загрузить предыдущие сообщения", @@ -562,6 +564,7 @@ export const dict = { "common.archive": "Архивировать", "common.delete": "Удалить", "common.close": "Закрыть", + "common.open": "Открыть", "common.edit": "Редактировать", "common.loadMore": "Загрузить ещё", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index 689e8211896..4f24e4e21a4 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -482,6 +482,7 @@ export const dict = { "session.tab.session": "เซสชัน", "session.tab.review": "ตรวจสอบ", "session.tab.context": "บริบท", + "session.tab.closeOthers": "ปิดแท็บอื่นๆ", "session.panel.reviewAndFiles": "ตรวจสอบและไฟล์", "session.review.filesChanged": "{{count}} ไฟล์ที่เปลี่ยนแปลง", "session.review.change.one": "การเปลี่ยนแปลง", @@ -493,6 +494,7 @@ export const dict = { "session.files.selectToOpen": "เลือกไฟล์เพื่อเปิด", "session.files.all": "ไฟล์ทั้งหมด", "session.files.binaryContent": "ไฟล์ไบนารี (ไม่สามารถแสดงเนื้อหาได้)", + "session.files.mention": "กล่าวถึง", "session.messages.renderEarlier": "แสดงข้อความก่อนหน้า", "session.messages.loadingEarlier": "กำลังโหลดข้อความก่อนหน้า...", @@ -556,6 +558,7 @@ export const dict = { "common.archive": "จัดเก็บ", "common.delete": "ลบ", "common.close": "ปิด", + "common.open": "เปิด", "common.edit": "แก้ไข", "common.loadMore": "โหลดเพิ่มเติม", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 1b40013b60d..40140477893 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -484,6 +484,7 @@ export const dict = { "session.tab.session": "会话", "session.tab.review": "审查", "session.tab.context": "上下文", + "session.tab.closeOthers": "关闭其他", "session.panel.reviewAndFiles": "审查和文件", "session.review.filesChanged": "{{count}} 个文件变更", "session.review.change.one": "更改", @@ -494,6 +495,7 @@ export const dict = { "session.files.selectToOpen": "选择要打开的文件", "session.files.all": "所有文件", "session.files.binaryContent": "二进制文件(无法显示内容)", + "session.files.mention": "提及", "session.messages.renderEarlier": "显示更早的消息", "session.messages.loadingEarlier": "正在加载更早的消息...", "session.messages.loadEarlier": "加载更早的消息", @@ -554,6 +556,7 @@ export const dict = { "common.archive": "归档", "common.delete": "删除", "common.close": "关闭", + "common.open": "打开", "common.edit": "编辑", "common.loadMore": "加载更多", "common.key.esc": "ESC", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index 34aec01b9cb..6204ade2a25 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -480,6 +480,7 @@ export const dict = { "session.tab.session": "工作階段", "session.tab.review": "審查", "session.tab.context": "上下文", + "session.tab.closeOthers": "關閉其他", "session.panel.reviewAndFiles": "審查與檔案", "session.review.filesChanged": "{{count}} 個檔案變更", "session.review.change.one": "變更", @@ -490,6 +491,7 @@ export const dict = { "session.files.selectToOpen": "選取要開啟的檔案", "session.files.all": "所有檔案", "session.files.binaryContent": "二進位檔案(無法顯示內容)", + "session.files.mention": "提及", "session.messages.renderEarlier": "顯示更早的訊息", "session.messages.loadingEarlier": "正在載入更早的訊息...", "session.messages.loadEarlier": "載入更早的訊息", @@ -552,6 +554,7 @@ export const dict = { "common.archive": "封存", "common.delete": "刪除", "common.close": "關閉", + "common.open": "開啟", "common.edit": "編輯", "common.loadMore": "載入更多", diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 9453dd703c7..06a4cc81fb4 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -780,6 +780,40 @@ export default function Page() { prompt.context.add({ type: "file", path, selection, preview }) } + const mentionFile = (path: string) => { + const current = prompt.current() + const isDirty = prompt.dirty() + + const parts: typeof current = [] + const images: typeof current = [] + let pos = 0 + + for (const part of current) { + if (part.type === "image") { + images.push(part) + continue + } + if (isDirty) { + parts.push(part) + pos = part.end + } + } + + if (isDirty) { + parts.push({ type: "text", content: " ", start: pos, end: pos + 1 }) + pos += 1 + } + + const content = "@" + path + parts.push({ type: "file", path, content, start: pos, end: pos + content.length }) + pos += content.length + + parts.push({ type: "text", content: " ", start: pos, end: pos + 1 }) + pos += 1 + + prompt.set([...parts, ...images], pos) + } + const addCommentToContext = (input: { file: string selection: SelectedLineRange @@ -888,6 +922,18 @@ export default function Page() { .filter((tab) => tab !== "context" && tab !== "review"), ) + const closeOtherTabs = (currentTab: string) => { + const others = openedTabs().filter((tab) => tab !== currentTab) + for (const tab of others) { + tabs().close(tab) + } + } + + const mentionTab = (tab: string) => { + const path = file.pathFromTab(tab) + if (path) mentionFile(path) + } + const mobileChanges = createMemo(() => !isDesktop() && store.mobileTab === "changes") const reviewTab = createMemo(() => isDesktop() && !layout.fileTree.opened()) @@ -1749,6 +1795,9 @@ export default function Page() { kinds={kinds()} activeDiff={tree.activeDiff} focusReviewDiff={focusReviewDiff} + onFileMention={mentionFile} + onCloseOthers={closeOtherTabs} + onMention={mentionTab} />
diff --git a/packages/app/src/pages/session/session-side-panel.tsx b/packages/app/src/pages/session/session-side-panel.tsx index d9460cc1a76..250ecd48f20 100644 --- a/packages/app/src/pages/session/session-side-panel.tsx +++ b/packages/app/src/pages/session/session-side-panel.tsx @@ -67,6 +67,9 @@ export function SessionSidePanel(props: { kinds: Map activeDiff?: string focusReviewDiff: (path: string) => void + onFileMention?: (path: string) => void + onCloseOthers?: (tab: string) => void + onMention?: (tab: string) => void }) { return ( @@ -138,7 +141,7 @@ export function SessionSidePanel(props: { - {(tab) => } + {(tab) => props.openTab(tab)} onCloseOthers={props.onCloseOthers} onMention={props.onMention} />} @@ -281,6 +284,7 @@ export function SessionSidePanel(props: { draggable={false} active={props.activeDiff} onFileClick={(node) => props.focusReviewDiff(node.path)} + onFileMention={props.onFileMention ? (node) => props.onFileMention!(node.path) : undefined} /> @@ -297,6 +301,7 @@ export function SessionSidePanel(props: { modified={props.diffFiles} kinds={props.kinds} onFileClick={(node) => props.openTab(props.file.tab(node.path))} + onFileMention={props.onFileMention ? (node) => props.onFileMention!(node.path) : undefined} />