diff --git a/.changeset/close-other-tabs.md b/.changeset/close-other-tabs.md new file mode 100644 index 00000000000..a35c8e3ca6b --- /dev/null +++ b/.changeset/close-other-tabs.md @@ -0,0 +1,5 @@ +--- +"kilo-code": minor +--- + +Support closing other Agent Manager tabs from the tab context menu. diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts index 22b81da3b39..cd5f714e31c 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "جلسة للقراءة فقط", "agentManager.session.noSessions": "لا توجد جلسات مفتوحة", "agentManager.tab.close": "إغلاق", + "agentManager.tab.closeOthers": "إغلاق الآخرين", "agentManager.tab.closeTab": "إغلاق علامة التبويب", "agentManager.tab.forkSession": "تفريع الجلسة", "agentManager.tab.terminal": "الطرفية", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts index aec59b1bcf0..43508c5489e 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Sessão somente leitura", "agentManager.session.noSessions": "Nenhuma sessão aberta", "agentManager.tab.close": "Fechar", + "agentManager.tab.closeOthers": "Fechar outras", "agentManager.tab.closeTab": "Fechar aba", "agentManager.tab.forkSession": "Bifurcar sessão", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts index d3b3ca7953b..02cd467db9e 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Sesija samo za čitanje", "agentManager.session.noSessions": "Nema otvorenih sesija", "agentManager.tab.close": "Zatvori", + "agentManager.tab.closeOthers": "Zatvori ostale", "agentManager.tab.closeTab": "Zatvori karticu", "agentManager.tab.forkSession": "Razdvoji sesiju", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts index 194ad09be4a..086d759380a 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Skrivebeskyttet session", "agentManager.session.noSessions": "Ingen åbne sessioner", "agentManager.tab.close": "Luk", + "agentManager.tab.closeOthers": "Luk andre", "agentManager.tab.closeTab": "Luk fane", "agentManager.tab.forkSession": "Forgren session", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts index f6643237ba9..872f5d43ff4 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Schreibgeschützte Sitzung", "agentManager.session.noSessions": "Keine Sitzungen geöffnet", "agentManager.tab.close": "Schließen", + "agentManager.tab.closeOthers": "Andere schließen", "agentManager.tab.closeTab": "Tab schließen", "agentManager.tab.forkSession": "Sitzung verzweigen", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts index cc94798638a..3249785b6ae 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts @@ -50,6 +50,7 @@ export const dict = { "agentManager.session.noSessions": "No sessions open", "agentManager.tab.close": "Close", + "agentManager.tab.closeOthers": "Close Others", "agentManager.tab.closeTab": "Close tab", "agentManager.tab.forkSession": "Fork Session", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts index bfddc7036fd..e36b18c1622 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Sesión de solo lectura", "agentManager.session.noSessions": "No hay sesiones abiertas", "agentManager.tab.close": "Cerrar", + "agentManager.tab.closeOthers": "Cerrar otras", "agentManager.tab.closeTab": "Cerrar pestaña", "agentManager.tab.forkSession": "Bifurcar sesión", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts index 435308590a4..6781bcf4c05 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Session en lecture seule", "agentManager.session.noSessions": "Aucune session ouverte", "agentManager.tab.close": "Fermer", + "agentManager.tab.closeOthers": "Fermer les autres", "agentManager.tab.closeTab": "Fermer l'onglet", "agentManager.tab.forkSession": "Dupliquer la session", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts index 24e5636bb09..b2a02e4e4a5 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts @@ -50,6 +50,7 @@ export const dict = { "agentManager.session.noSessions": "Nessuna sessione aperta", "agentManager.tab.close": "Chiudi", + "agentManager.tab.closeOthers": "Chiudi le altre", "agentManager.tab.closeTab": "Chiudi scheda", "agentManager.tab.forkSession": "Forka sessione", "agentManager.tab.terminal": "Terminale", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts index 4d37c64e2e3..cff88a4bb15 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "読み取り専用セッション", "agentManager.session.noSessions": "開いているセッションがありません", "agentManager.tab.close": "閉じる", + "agentManager.tab.closeOthers": "他を閉じる", "agentManager.tab.closeTab": "タブを閉じる", "agentManager.tab.forkSession": "セッションをフォーク", "agentManager.tab.terminal": "ターミナル", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts index f7d7e9a2d92..f25dc1818e9 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "읽기 전용 세션", "agentManager.session.noSessions": "열린 세션 없음", "agentManager.tab.close": "닫기", + "agentManager.tab.closeOthers": "다른 탭 닫기", "agentManager.tab.closeTab": "탭 닫기", "agentManager.tab.forkSession": "세션 포크", "agentManager.tab.terminal": "터미널", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts index 713c7349005..e351a332782 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts @@ -50,6 +50,7 @@ export const dict = { "agentManager.session.noSessions": "Geen open sessies", "agentManager.tab.close": "Sluiten", + "agentManager.tab.closeOthers": "Andere sluiten", "agentManager.tab.closeTab": "Tabblad sluiten", "agentManager.tab.forkSession": "Sessie forken", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts index a412c141caa..4ae4cf01c44 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Skrivebeskyttet økt", "agentManager.session.noSessions": "Ingen åpne økter", "agentManager.tab.close": "Lukk", + "agentManager.tab.closeOthers": "Lukk andre", "agentManager.tab.closeTab": "Lukk fane", "agentManager.tab.forkSession": "Forgrein økt", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts index f985f44198b..342a3f4e1d7 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Sesja tylko do odczytu", "agentManager.session.noSessions": "Brak otwartych sesji", "agentManager.tab.close": "Zamknij", + "agentManager.tab.closeOthers": "Zamknij pozostałe", "agentManager.tab.closeTab": "Zamknij kartę", "agentManager.tab.forkSession": "Rozgałęź sesję", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts index 4b5a8c9ee37..8954a0e01b7 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "Сессия только для чтения", "agentManager.session.noSessions": "Нет открытых сессий", "agentManager.tab.close": "Закрыть", + "agentManager.tab.closeOthers": "Закрыть остальные", "agentManager.tab.closeTab": "Закрыть вкладку", "agentManager.tab.forkSession": "Ответвить сессию", "agentManager.tab.terminal": "Терминал", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts index 26e20065593..3badc096bad 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "เซสชันอ่านอย่างเดียว", "agentManager.session.noSessions": "ไม่มีเซสชันที่เปิดอยู่", "agentManager.tab.close": "ปิด", + "agentManager.tab.closeOthers": "ปิดแท็บอื่น", "agentManager.tab.closeTab": "ปิดแท็บ", "agentManager.tab.forkSession": "แยกเซสชัน", "agentManager.tab.terminal": "เทอร์มินัล", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts index 4ac533f5f4b..24d5e641149 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts @@ -50,6 +50,7 @@ export const dict = { "agentManager.session.noSessions": "Açık oturum yok", "agentManager.tab.close": "Kapat", + "agentManager.tab.closeOthers": "Diğerlerini kapat", "agentManager.tab.closeTab": "Sekmeyi kapat", "agentManager.tab.forkSession": "Oturumu Fork'la", "agentManager.tab.terminal": "Terminal", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts index f34fcafe5ce..5a853526233 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts @@ -50,6 +50,7 @@ export const dict = { "agentManager.session.noSessions": "Немає відкритих сесій", "agentManager.tab.close": "Закрити", + "agentManager.tab.closeOthers": "Закрити інші", "agentManager.tab.closeTab": "Закрити вкладку", "agentManager.tab.forkSession": "Розгалужити сесію", "agentManager.tab.terminal": "Термінал", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts index fc4460778d5..70801afdcc3 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "只读会话", "agentManager.session.noSessions": "没有打开的会话", "agentManager.tab.close": "关闭", + "agentManager.tab.closeOthers": "关闭其他标签页", "agentManager.tab.closeTab": "关闭标签页", "agentManager.tab.forkSession": "复制会话", "agentManager.tab.terminal": "终端", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts index 96e306580ae..3435eb35dbe 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts @@ -46,6 +46,7 @@ export const dict = { "agentManager.session.readonly": "唯讀工作階段", "agentManager.session.noSessions": "沒有開啟的工作階段", "agentManager.tab.close": "關閉", + "agentManager.tab.closeOthers": "關閉其他分頁", "agentManager.tab.closeTab": "關閉分頁", "agentManager.tab.forkSession": "複製工作階段", "agentManager.tab.terminal": "終端機", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/sortable-tab.tsx b/packages/kilo-vscode/webview-ui/agent-manager/sortable-tab.tsx index 6d5a8393377..e47feb4ce03 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/sortable-tab.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/sortable-tab.tsx @@ -52,6 +52,7 @@ export const SortableTab: Component<{ onSelect: () => void onMiddleClick: (e: MouseEvent) => void onClose: () => void + onCloseOthers: () => void onFork?: () => void }> = (props) => { const { t } = useLanguage() @@ -130,6 +131,10 @@ export const SortableTab: Component<{ + + + {t("agentManager.tab.closeOthers")} + diff --git a/packages/kilo-vscode/webview-ui/agent-manager/tab-rendering.tsx b/packages/kilo-vscode/webview-ui/agent-manager/tab-rendering.tsx index 9271a274d7c..04f5f6b219e 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/tab-rendering.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/tab-rendering.tsx @@ -74,6 +74,7 @@ export function renderTab(id: string, deps: TabRenderDeps): JSX.Element { onSelect: deps.activateTerminal, onMiddleClick: deps.terminalMiddleClick, onClose: deps.closeTerminal, + onCloseOthers: (target) => closeOthers(target, deps), }) } if (id === deps.REVIEW_TAB_ID) return renderReviewTab(deps) @@ -141,11 +142,32 @@ function renderSessionTab(s: SessionInfo, deps: TabRenderDeps): JSX.Element { }} onMiddleClick={(e: MouseEvent) => deps.sessionMiddleClick(s.id, e)} onClose={() => deps.sessionClose(s.id)} + onCloseOthers={() => closeOthers(s.id, deps)} onFork={pending ? undefined : () => deps.sessionFork(s.id)} /> ) } +function closeOthers(target: string, deps: TabRenderDeps) { + for (const id of deps.tabIds()) { + if (id === target) continue + if (isTerminalTabId(id)) { + deps.closeTerminal(id) + continue + } + if (id === deps.REVIEW_TAB_ID) { + deps.closeReview() + continue + } + deps.sessionClose(id) + } + if (isTerminalTabId(target)) { + deps.activateTerminal(target) + return + } + deps.selectSessionTab(target, deps.isPending(target)) +} + // Terminal-specific renderers (layer + add button) live in `./terminal/render.tsx` // and are re-exported for convenience so AgentManagerApp.tsx has a single // import point for tab rendering. diff --git a/packages/kilo-vscode/webview-ui/agent-manager/terminal/SortableTerminalTab.tsx b/packages/kilo-vscode/webview-ui/agent-manager/terminal/SortableTerminalTab.tsx index 1c6c9164b89..6357374df9e 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/terminal/SortableTerminalTab.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/terminal/SortableTerminalTab.tsx @@ -33,6 +33,7 @@ export const SortableTerminalTab: Component<{ onSelect: () => void onMiddleClick: (e: MouseEvent) => void onClose: (e: MouseEvent) => void + onCloseOthers: () => void }> = (props) => { const { t } = useLanguage() const sortable = createSortable(props.id) @@ -99,6 +100,10 @@ export const SortableTerminalTab: Component<{ + + + {t("agentManager.tab.closeOthers")} + diff --git a/packages/kilo-vscode/webview-ui/agent-manager/terminal/render.tsx b/packages/kilo-vscode/webview-ui/agent-manager/terminal/render.tsx index 2fe5e2c44a0..9c40371e22d 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/terminal/render.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/terminal/render.tsx @@ -22,6 +22,7 @@ export interface TerminalTabRenderDeps { onSelect: (id: string) => void onMiddleClick: (id: string, e: MouseEvent) => void onClose: (id: string) => void + onCloseOthers: (id: string) => void } /** Render the terminal entry inside the agent-manager tab bar ``. */ @@ -43,6 +44,7 @@ export function renderTerminalTab(deps: TerminalTabRenderDeps): JSX.Element { e.stopPropagation() deps.onClose(deps.id) }} + onCloseOthers={() => deps.onCloseOthers(deps.id)} /> ) }