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 201d63660a3..5a0317a4e42 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -420,6 +420,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": "تغيير", @@ -430,6 +431,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": "تحميل الرسائل السابقة", @@ -487,6 +489,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 b7f2d74857f..dfcd3930ca9 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -421,6 +421,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", @@ -431,6 +432,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", @@ -491,6 +493,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 05eca1628e5..7dedfb4134c 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -447,6 +447,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", @@ -458,6 +459,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...", @@ -517,6 +519,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 8ea4907c1b6..ab149116290 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -422,6 +422,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", @@ -432,6 +433,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", @@ -491,6 +493,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 a4884a1033d..8453b15c906 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -464,6 +464,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", @@ -474,6 +475,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", @@ -534,6 +536,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", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index b0ffa70f84d..18612444eaf 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 50d9060703e..eeb22f7f940 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -424,6 +424,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", @@ -434,6 +435,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", @@ -494,6 +496,7 @@ export const dict = { "common.archive": "Archivar", "common.delete": "Eliminar", "common.close": "Cerrar", + "common.open": "Abrir", "common.edit": "Editar", "common.loadMore": "Cargar más", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index 7ad39f34063..30297eef0fc 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -429,6 +429,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", @@ -439,6 +440,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", @@ -499,6 +501,7 @@ export const dict = { "common.archive": "Archiver", "common.delete": "Supprimer", "common.close": "Fermer", + "common.open": "Ouvrir", "common.edit": "Modifier", "common.loadMore": "Charger plus", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index a39bfbaf331..854c4d42542 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -416,6 +416,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": "変更", @@ -426,6 +427,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": "以前のメッセージを読み込む", @@ -486,6 +488,7 @@ export const dict = { "common.archive": "アーカイブ", "common.delete": "削除", "common.close": "閉じる", + "common.open": "開く", "common.edit": "編集", "common.loadMore": "さらに読み込む", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index b5927b21076..7408e3d78d6 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -423,6 +423,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": "변경", @@ -433,6 +434,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": "이전 메시지 로드", @@ -492,6 +494,7 @@ export const dict = { "common.archive": "보관", "common.delete": "삭제", "common.close": "닫기", + "common.open": "열기", "common.edit": "편집", "common.loadMore": "더 불러오기", diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 7d8cdd27f3d..7e0a61426e2 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -424,6 +424,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", @@ -434,6 +435,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", @@ -494,6 +496,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 76a47ea26f8..c95a1faf978 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -423,6 +423,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", @@ -433,6 +434,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", @@ -493,6 +495,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 e83ce37618c..d6a51408194 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -425,6 +425,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": "Изменение", @@ -435,6 +436,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/th.ts b/packages/app/src/i18n/th.ts index 2be19d15b17..347b6e33b32 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -425,6 +425,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": "การเปลี่ยนแปลง", @@ -436,6 +437,7 @@ export const dict = { "session.files.selectToOpen": "เลือกไฟล์เพื่อเปิด", "session.files.all": "ไฟล์ทั้งหมด", "session.files.binaryContent": "ไฟล์ไบนารี (ไม่สามารถแสดงเนื้อหาได้)", + "session.files.mention": "กล่าวถึง", "session.messages.renderEarlier": "แสดงข้อความก่อนหน้า", "session.messages.loadingEarlier": "กำลังโหลดข้อความก่อนหน้า...", @@ -494,6 +496,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 a48f9e54941..aecddd74b2e 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -460,6 +460,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": "更改", @@ -470,6 +471,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": "加载更早的消息", @@ -527,6 +529,7 @@ export const dict = { "common.archive": "归档", "common.delete": "删除", "common.close": "关闭", + "common.open": "打开", "common.edit": "编辑", "common.loadMore": "加载更多", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index 60363fc99ef..5213fc11d5f 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -457,6 +457,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": "變更", @@ -467,6 +468,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": "載入更早的訊息", @@ -524,6 +526,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} />