From 67b299f66e62a76967f58a0f2da371cc3e699261 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Fri, 28 Aug 2026 13:10:34 +0200 Subject: [PATCH 1/3] fix(agent-manager): correct activity indicators after recovery --- .changeset/fix-resumed-session-activity.md | 5 + .../fixtures/session-provider-activity.tsx | 97 ++++++++++++++++- .../webview-ui/agent-manager/WorktreeItem.tsx | 17 ++- .../src/components/chat/SessionTab.tsx | 100 +++++++++--------- .../webview-ui/src/context/session.tsx | 5 +- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/br.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/bs.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/da.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/de.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/en.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/es.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/fa.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/fr.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/it.ts | 6 ++ .../kilo-vscode/webview-ui/src/i18n/ja.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/ko.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/nl.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/no.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/pl.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/ru.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/th.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/tr.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/uk.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/zh.ts | 7 ++ .../kilo-vscode/webview-ui/src/i18n/zht.ts | 7 ++ .../webview-ui/src/utils/session-activity.ts | 4 + 27 files changed, 311 insertions(+), 63 deletions(-) create mode 100644 .changeset/fix-resumed-session-activity.md diff --git a/.changeset/fix-resumed-session-activity.md b/.changeset/fix-resumed-session-activity.md new file mode 100644 index 000000000000..a85d8700811b --- /dev/null +++ b/.changeset/fix-resumed-session-activity.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Clear stale failures when an agent resumes, keep optional review suggestions from triggering attention, and explain Agent Manager status icons on hover. Keep progress spinners separate from attention warnings during worktree operations. diff --git a/packages/kilo-vscode/tests/fixtures/session-provider-activity.tsx b/packages/kilo-vscode/tests/fixtures/session-provider-activity.tsx index dafc7c6b47b9..f99a698bad37 100644 --- a/packages/kilo-vscode/tests/fixtures/session-provider-activity.tsx +++ b/packages/kilo-vscode/tests/fixtures/session-provider-activity.tsx @@ -32,7 +32,8 @@ Object.assign(globalThis, { }) const { render } = await import("solid-js/web") -const { For } = await import("solid-js") +const { For, createSignal } = await import("solid-js") +const { WorktreeItem } = await import("../../webview-ui/agent-manager/WorktreeItem") const { DragDropProvider, SortableProvider } = await import("@thisbeyond/solid-dnd") const { renderTab } = await import("../../webview-ui/agent-manager/tab-rendering") const { VSCodeProvider } = await import("../../webview-ui/src/context/vscode") @@ -81,6 +82,8 @@ const language = { } const ref = { value: undefined as ReturnType | undefined } +const [operation, setOperation] = createSignal(false) +const [run, setRun] = createSignal(false) const Probe = () => { const session = useSession() ref.value = session @@ -105,6 +108,40 @@ const Probe = () => { {(id) => renderTab(id, deps)} + {}} + onDelete={() => {}} + onStartRename={() => {}} + onRenameInput={() => {}} + onCommitRename={() => {}} + onCancelRename={() => {}} + onRemoveStale={() => {}} + onCopyPath={() => {}} + onOpen={() => {}} + /> ) } @@ -145,12 +182,19 @@ const state = (id: string) => { assert(value) return value.activityFor(id) } +const card = (expected: string) => { + const icon = host.querySelector('[data-sidebar-id="worktree"] .am-wt-icon') + assert(icon) + assert.equal(icon.getAttribute("data-activity"), expected) + assert.equal(!!icon.querySelector('[data-component="spinner"]'), expected === "busy" || expected === "retry") +} const check = async (id: string, expected: string) => { await settle() step.value += 1 const value = ref.value assert(value) const actual = state(id) + if (id === "root") card(expected) const tab = host.querySelector(`[data-tab-id="${id}"] [data-activity]`) if (id === "root" || id === "background") assert(tab, `Missing rendered tab for ${id}`) if (tab && tab.getAttribute("data-activity") !== expected) { @@ -199,6 +243,14 @@ try { value.setCurrentSessionID("root") await check("root", "idle") await check("background", "idle") + for (const update of [setOperation, setRun]) { + update(true) + await settle() + card("busy") + update(false) + await settle() + card("idle") + } await emit({ type: "sessionStatus", sessionID: "background", status: "busy" }) await check("background", "busy") @@ -240,6 +292,12 @@ try { await check("root", "waiting") await check("task-child", "waiting") await check("task-grand", "waiting") + for (const update of [setOperation, setRun]) { + update(true) + await settle() + card("waiting") + update(false) + } await emit({ type: "permissionError", permissionID: "permission", stale: true }) await check("root", "idle") assert.equal(value.permissions().length, 0) @@ -290,7 +348,9 @@ try { type: "suggestionRequest", suggestion: { id: "suggestion", sessionID: "task-grand", text: "Try this", actions: [] }, }) - await check("root", "waiting") + await check("root", "idle") + await check("task-grand", "idle") + assert.equal(value.scopedSuggestions("root").length, 1) await emit({ type: "suggestionResolved", requestID: "suggestion" }) await check("root", "idle") assert.equal(value.suggestions().length, 0) @@ -307,11 +367,17 @@ try { await check("root", "idle") await emit({ type: "sessionTurnClosed", sessionID: "root", reason: "completed" }) + await emit({ + type: "suggestionRequest", + suggestion: { id: "review", sessionID: "root", text: "Review the changes", actions: [] }, + }) await check("root", "done") + assert.equal(value.suggestions().length, 1) await emit({ type: "sessionStatus", sessionID: "root", status: "busy" }) await check("root", "busy") await emit({ type: "sessionStatus", sessionID: "root", status: "idle" }) await check("root", "idle") + await emit({ type: "suggestionResolved", requestID: "review" }) await emit({ type: "sessionTurnClosed", sessionID: "root", reason: "completed" }) await check("root", "done") @@ -370,14 +436,39 @@ try { await check("root", "idle") await emit({ type: "sessionError", eventID: "root-error", error: { name: "ProviderError" } }) await check("root", "error") + for (const update of [setOperation, setRun]) { + update(true) + await settle() + card("error") + update(false) + } assert.equal(value.inUseFor("root"), false) await emit({ type: "sessionTurnClosed", sessionID: "root", reason: "completed" }) await check("root", "error") await emit({ type: "sessionStatus", sessionID: "root", status: "busy" }) await check("root", "busy") + for (const status of ["busy", "retry"] as const) { + await emit({ type: "sessionStatus", sessionID: "root", status }) + await emit({ + type: "sessionError", + sessionID: "root", + eventID: `root-${status}-error`, + error: { name: "ProviderError", message: "Request Entity Too Large" }, + }) + await check("root", "error") + await emit({ type: "sessionStatus", sessionID: "root", status }) + await check("root", status) + assert.equal(value.closeReason(), undefined) + assert(value.messages().some((message) => message.sessionErrorID === `root-${status}-error`)) + } + await emit({ type: "sessionTurnClosed", sessionID: "root", reason: "completed" }) await emit({ type: "sessionStatus", sessionID: "root", status: "idle" }) - await check("root", "idle") + await check("root", "done") + await emit({ type: "sessionStatus", sessionID: "root", status: "busy" }) + await emit({ type: "sessionError", sessionID: "root", eventID: "terminal-error", error: { name: "ProviderError" } }) + await emit({ type: "sessionStatus", sessionID: "root", status: "idle" }) + await check("root", "error") await emit({ type: "questionRequest", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/WorktreeItem.tsx b/packages/kilo-vscode/webview-ui/agent-manager/WorktreeItem.tsx index dcd77dfd8c5d..6a6f3e4e0295 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/WorktreeItem.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/WorktreeItem.tsx @@ -5,7 +5,6 @@ import { Component, For, Match, Show, Switch, createSignal } from "solid-js" import { Icon } from "@kilocode/kilo-ui/icon" import { IconButton } from "@kilocode/kilo-ui/icon-button" -import { Spinner } from "@kilocode/kilo-ui/spinner" import { Tooltip, TooltipKeybind } from "@kilocode/kilo-ui/tooltip" import { HoverCard } from "@kilocode/kilo-ui/hover-card" import { ContextMenu } from "@kilocode/kilo-ui/context-menu" @@ -13,7 +12,7 @@ import { Button } from "@kilocode/kilo-ui/button" import type { WorktreeState, WorktreeGitStats, SectionState, RunStatus } from "../src/types/messages" import type { PRStatus } from "../src/types/messages" import { ActivityIcon } from "../src/components/shared/ActivityIcon" -import { label, running, type Activity } from "../src/utils/session-activity" +import { description, label, running, strongest, type Activity } from "../src/utils/session-activity" import { colorCss } from "./section-colors" import { useLanguage } from "../src/context/language" import { formatRelativeDate } from "../src/utils/date" @@ -157,7 +156,7 @@ export const WorktreeItem: Component = (props) => { const { t } = useLanguage() const [hovered, setHovered] = createSignal(false) const [overClose, setOverClose] = createSignal(false) - const state = () => props.activity + const state = () => strongest([props.activity, props.busy || props.runStatus?.state === "running" ? "busy" : "idle"]) const blocked = () => props.busy || props.blocked || @@ -209,12 +208,7 @@ export const WorktreeItem: Component = (props) => { onClick={() => props.onClick()} >
- } - > - } /> - + } />
{/* Row 1: label + stale badge + stats/hover-actions overlay */} @@ -412,6 +406,11 @@ export const WorktreeItem: Component = (props) => { {props.navHint}
+ +
+
{t(label(state()))}
+
{t(description(state()))}
+
{t("agentManager.hoverCard.worktree")} diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/SessionTab.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/SessionTab.tsx index 6da998d87a35..461720070c4a 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/SessionTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/SessionTab.tsx @@ -2,7 +2,8 @@ import { IconButton } from "@kilocode/kilo-ui/icon-button" import { TooltipKeybind } from "@kilocode/kilo-ui/tooltip" import { Show, type Component, type JSX } from "solid-js" import { ActivityIcon } from "../shared/ActivityIcon" -import type { Activity } from "../../utils/session-activity" +import { description, type Activity } from "../../utils/session-activity" +import { useLanguage } from "../../context/language" export const SessionTab: Component<{ title: string @@ -22,56 +23,59 @@ export const SessionTab: Component<{ onMiddleClick?: (event: MouseEvent) => void onKeyDown?: JSX.EventHandlerUnion onClose: () => void -}> = (props) => ( -
-
+}> = (props) => { + const { t } = useLanguage() + return ( +
+
+ + + + + + + + {props.title} + + +
- - - - - - - {props.title} - + { + event.stopPropagation() + props.onClose() + }} + />
- - { - event.stopPropagation() - props.onClose() - }} - /> - -
-) + ) +} diff --git a/packages/kilo-vscode/webview-ui/src/context/session.tsx b/packages/kilo-vscode/webview-ui/src/context/session.tsx index 76d012d3cfc3..bda5daea5173 100644 --- a/packages/kilo-vscode/webview-ui/src/context/session.tsx +++ b/packages/kilo-vscode/webview-ui/src/context/session.tsx @@ -1518,9 +1518,8 @@ export const SessionProvider: ParentComponent = (props) => { ? { type: "offline", message: message ?? "" } : { type: newStatus } setStatusMap(sessionID, info) - // Track busy start time and discard the previous turn's terminal state. + if (newStatus === "busy" || newStatus === "retry") clearClose(sessionID) if (prev === "idle" && newStatus !== "idle") { - clearClose(sessionID) if (!busySinceMap[sessionID]) setBusySinceMap(sessionID, Date.now()) } if (newStatus === "idle") { @@ -1781,7 +1780,7 @@ export const SessionProvider: ParentComponent = (props) => { parents: lineage().parents, statuses: statusMap, outcomes: closeMap, - blocked: [...permissions(), ...questions().filter((item) => item.blocking !== false), ...suggestions()].map( + blocked: [...permissions(), ...questions().filter((item) => item.blocking !== false)].map( (item) => item.sessionID, ), submitting: Object.keys(submissionMap), diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index e39386872384..5c755fb131b0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -58,6 +58,13 @@ export const dict = { "command.provider.connect": "اتصال بموفر", + "session.activity.waiting": "في انتظار إجابة أو موافقة.", + "session.activity.error": "حدث خطأ أو فُقد الاتصال.", + "session.activity.retry": "إعادة المحاولة تلقائيًا.", + "session.activity.busy": "قيد التنفيذ.", + "session.activity.done": "اكتمل الدور.", + "session.activity.idle": "غير قيد التشغيل.", + "command.session.new": "جلسة جديدة", "command.session.show.changes": "إظهار التغييرات", "command.review.toggle": "تبديل المراجعة", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index 47a30ce65976..9c7dc30c9f02 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Conectar provedor", + "session.activity.waiting": "Aguardando uma resposta ou aprovação.", + "session.activity.error": "Erro ou conexão perdida.", + "session.activity.retry": "Tentando novamente automaticamente.", + "session.activity.busy": "Em andamento.", + "session.activity.done": "Turno concluído.", + "session.activity.idle": "Não está em execução.", + "command.session.new": "Nova sessão", "command.session.show.changes": "Mostrar alterações", "command.review.toggle": "Alternar revisão", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 8083ef5be537..58d8ffae764c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Poveži provajdera", + "session.activity.waiting": "Čeka se odgovor ili odobrenje.", + "session.activity.error": "Greška ili prekinuta veza.", + "session.activity.retry": "Automatski novi pokušaj.", + "session.activity.busy": "U toku.", + "session.activity.done": "Potez završen.", + "session.activity.idle": "Ne radi.", + "command.session.new": "Nova sesija", "command.session.show.changes": "Prikaži promjene", "command.review.toggle": "Prikaži/sakrij pregled", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index ab2cf15a19e0..2c2727c9c5e0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Tilslut udbyder", + "session.activity.waiting": "Venter på et svar eller en godkendelse.", + "session.activity.error": "Fejl eller mistet forbindelse.", + "session.activity.retry": "Prøver automatisk igen.", + "session.activity.busy": "I gang.", + "session.activity.done": "Tur afsluttet.", + "session.activity.idle": "Kører ikke.", + "command.session.new": "Ny session", "command.session.show.changes": "Vis ændringer", "command.review.toggle": "Skift gennemgang", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 50394047b199..dde65030267c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -65,6 +65,13 @@ export const dict = { "command.provider.connect": "Anbieter verbinden", + "session.activity.waiting": "Warten auf eine Antwort oder Genehmigung.", + "session.activity.error": "Fehler oder Verbindung verloren.", + "session.activity.retry": "Automatischer erneuter Versuch.", + "session.activity.busy": "In Bearbeitung.", + "session.activity.done": "Turn abgeschlossen.", + "session.activity.idle": "Nicht aktiv.", + "command.session.new": "Neue Sitzung", "command.session.show.changes": "Änderungen anzeigen", "command.review.toggle": "Überprüfung umschalten", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 21eda8c0555b..30971b74b3b1 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -58,6 +58,13 @@ export const dict = { "command.provider.connect": "Connect provider", + "session.activity.waiting": "Waiting for an answer or approval.", + "session.activity.error": "Error or connection lost.", + "session.activity.retry": "Retrying automatically.", + "session.activity.busy": "In progress.", + "session.activity.done": "Turn completed.", + "session.activity.idle": "Not running.", + "command.session.new": "New session", "command.session.show.changes": "Show Changes", "command.review.toggle": "Toggle review", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 4f803a6b0a9e..f0b20dde5669 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Conectar proveedor", + "session.activity.waiting": "Esperando una respuesta o aprobación.", + "session.activity.error": "Error o conexión perdida.", + "session.activity.retry": "Reintentando automáticamente.", + "session.activity.busy": "En curso.", + "session.activity.done": "Turno completado.", + "session.activity.idle": "No está en ejecución.", + "command.session.new": "Nueva sesión", "command.session.show.changes": "Mostrar cambios", "command.review.toggle": "Alternar revisión", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fa.ts b/packages/kilo-vscode/webview-ui/src/i18n/fa.ts index 41a374d8760d..a0c072e23ec2 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fa.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fa.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "اتصال به ارائه‌دهنده", + "session.activity.waiting": "در انتظار پاسخ یا تأیید.", + "session.activity.error": "خطا یا قطع اتصال.", + "session.activity.retry": "تلاش مجدد خودکار.", + "session.activity.busy": "در حال انجام.", + "session.activity.done": "نوبت به پایان رسید.", + "session.activity.idle": "در حال اجرا نیست.", + "command.session.new": "جلسه جدید", "command.session.show.changes": "نمایش تغییرات", "command.review.toggle": "نمایش/پنهان کردن بررسی", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index d2bab363ee02..360f2a817116 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Connecter un fournisseur", + "session.activity.waiting": "En attente d’une réponse ou d’une approbation.", + "session.activity.error": "Erreur ou connexion perdue.", + "session.activity.retry": "Nouvelle tentative automatique.", + "session.activity.busy": "En cours.", + "session.activity.done": "Tour terminé.", + "session.activity.idle": "Inactif.", + "command.session.new": "Nouvelle session", "command.session.show.changes": "Afficher les modifications", "command.review.toggle": "Basculer la revue", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts index baef1ed87d1a..4290b7907ac9 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts @@ -57,6 +57,12 @@ export const dict = { ...anacondaDesktopDict, ...cloudProviderDict, "command.provider.connect": "Connetti provider", + "session.activity.waiting": "In attesa di una risposta o approvazione.", + "session.activity.error": "Errore o connessione persa.", + "session.activity.retry": "Nuovo tentativo automatico.", + "session.activity.busy": "In corso.", + "session.activity.done": "Turno completato.", + "session.activity.idle": "Non in esecuzione.", "command.session.new": "Nuova sessione", "command.session.show.changes": "Mostra modifiche", "command.review.toggle": "Mostra/nascondi revisione", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 1e6d6f119a00..23a9c6f3c9bf 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "プロバイダーに接続", + "session.activity.waiting": "回答または承認を待っています。", + "session.activity.error": "エラーまたは接続切断。", + "session.activity.retry": "自動的に再試行中。", + "session.activity.busy": "進行中。", + "session.activity.done": "ターン完了。", + "session.activity.idle": "実行されていません。", + "command.session.new": "新しいセッション", "command.session.show.changes": "変更を表示", "command.review.toggle": "レビューの切り替え", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index b1c962a4420e..4a2469ef9567 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -63,6 +63,13 @@ export const dict = { "command.provider.connect": "공급자 연결", + "session.activity.waiting": "답변 또는 승인을 기다리는 중입니다.", + "session.activity.error": "오류 또는 연결 끊김.", + "session.activity.retry": "자동으로 재시도하는 중입니다.", + "session.activity.busy": "진행 중입니다.", + "session.activity.done": "턴이 완료되었습니다.", + "session.activity.idle": "실행 중이 아닙니다.", + "command.session.new": "새 세션", "command.session.show.changes": "변경 사항 보기", "command.review.toggle": "검토 토글", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 699bb11f4c12..c3c56786f9af 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Provider verbinden", + "session.activity.waiting": "Wachten op een antwoord of goedkeuring.", + "session.activity.error": "Fout of verbinding verbroken.", + "session.activity.retry": "Automatisch opnieuw proberen.", + "session.activity.busy": "In uitvoering.", + "session.activity.done": "Beurt voltooid.", + "session.activity.idle": "Niet actief.", + "command.session.new": "Nieuwe sessie", "command.session.show.changes": "Wijzigingen tonen", "command.review.toggle": "Review in-/uitschakelen", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 70ee0091cd58..13f85c70a078 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -62,6 +62,13 @@ export const dict = { "command.provider.connect": "Koble til leverandør", + "session.activity.waiting": "Venter på et svar eller en godkjenning.", + "session.activity.error": "Feil eller tilkobling brutt.", + "session.activity.retry": "Prøver automatisk på nytt.", + "session.activity.busy": "Pågår.", + "session.activity.done": "Runde fullført.", + "session.activity.idle": "Kjører ikke.", + "command.session.new": "Ny sesjon", "command.session.show.changes": "Vis endringer", "command.review.toggle": "Veksle gjennomgang", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index b47f539caeb9..bd78d7ab88cd 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Połącz dostawcę", + "session.activity.waiting": "Oczekiwanie na odpowiedź lub zatwierdzenie.", + "session.activity.error": "Błąd lub utrata połączenia.", + "session.activity.retry": "Automatyczne ponawianie próby.", + "session.activity.busy": "W toku.", + "session.activity.done": "Tura zakończona.", + "session.activity.idle": "Nie działa.", + "command.session.new": "Nowa sesja", "command.session.show.changes": "Pokaż zmiany", "command.review.toggle": "Przełącz przegląd", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 54b4ce1b8f86..eee67021d6f0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Подключить провайдера", + "session.activity.waiting": "Ожидается ответ или подтверждение.", + "session.activity.error": "Ошибка или потеря соединения.", + "session.activity.retry": "Автоматический повтор.", + "session.activity.busy": "Выполняется.", + "session.activity.done": "Ход завершён.", + "session.activity.idle": "Агент не запущен.", + "command.session.new": "Новая сессия", "command.session.show.changes": "Показать изменения", "command.review.toggle": "Переключить обзор", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 2899cd345edd..5edb3ab702a1 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -58,6 +58,13 @@ export const dict = { "command.provider.connect": "เชื่อมต่อผู้ให้บริการ", + "session.activity.waiting": "กำลังรอคำตอบหรือการอนุมัติ", + "session.activity.error": "เกิดข้อผิดพลาดหรือการเชื่อมต่อขาดหาย", + "session.activity.retry": "กำลังลองใหม่โดยอัตโนมัติ", + "session.activity.busy": "กำลังดำเนินการ", + "session.activity.done": "จบรอบการทำงานแล้ว", + "session.activity.idle": "ไม่ได้ทำงานอยู่", + "command.session.new": "เซสชันใหม่", "command.session.show.changes": "แสดงการเปลี่ยนแปลง", "command.review.toggle": "สลับการตรวจสอบ", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 314bb7322b9c..17a779bbcba1 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Sağlayıcı bağla", + "session.activity.waiting": "Yanıt veya onay bekleniyor.", + "session.activity.error": "Hata veya bağlantı kaybı.", + "session.activity.retry": "Otomatik olarak yeniden deneniyor.", + "session.activity.busy": "Devam ediyor.", + "session.activity.done": "Tur tamamlandı.", + "session.activity.idle": "Çalışmıyor.", + "command.session.new": "Yeni oturum", "command.session.show.changes": "Değişiklikleri Göster", "command.review.toggle": "İncelemeyi aç/kapat", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index 471751da841b..d67bf47307d4 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -59,6 +59,13 @@ export const dict = { "command.provider.connect": "Підключити провайдера", + "session.activity.waiting": "Очікується відповідь або підтвердження.", + "session.activity.error": "Помилка або втрата з'єднання.", + "session.activity.retry": "Автоматична повторна спроба.", + "session.activity.busy": "Виконується.", + "session.activity.done": "Хід завершено.", + "session.activity.idle": "Не запущено.", + "command.session.new": "Нова сесія", "command.session.show.changes": "Показати зміни", "command.review.toggle": "Перемкнути огляд", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index d069dfe961d4..43431b62bf19 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -60,6 +60,13 @@ export const dict = { "command.provider.connect": "连接提供商", + "session.activity.waiting": "正在等待回复或批准。", + "session.activity.error": "错误或连接已断开。", + "session.activity.retry": "正在自动重试。", + "session.activity.busy": "进行中。", + "session.activity.done": "回合已完成。", + "session.activity.idle": "未运行。", + "command.session.new": "新建会话", "command.session.show.changes": "显示更改", "command.review.toggle": "切换审查", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index d87cb9de2df4..1365a7236357 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -60,6 +60,13 @@ export const dict = { "command.provider.connect": "連接供應商", + "session.activity.waiting": "正在等待回覆或核准。", + "session.activity.error": "錯誤或連線已中斷。", + "session.activity.retry": "正在自動重試。", + "session.activity.busy": "進行中。", + "session.activity.done": "回合已完成。", + "session.activity.idle": "未執行。", + "command.session.new": "新增工作階段", "command.session.show.changes": "顯示變更", "command.review.toggle": "切換審查", diff --git a/packages/kilo-vscode/webview-ui/src/utils/session-activity.ts b/packages/kilo-vscode/webview-ui/src/utils/session-activity.ts index 0cf0837a64e1..2bd717b53a80 100644 --- a/packages/kilo-vscode/webview-ui/src/utils/session-activity.ts +++ b/packages/kilo-vscode/webview-ui/src/utils/session-activity.ts @@ -84,3 +84,7 @@ const LABELS: Record = { export function label(state: Activity): string { return LABELS[state] } + +export function description(state: Activity): string { + return `session.activity.${state}` +} From d65caf82d0cf2f069ab8e7ff89422e1b48f1a66f Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Fri, 28 Aug 2026 13:23:38 +0200 Subject: [PATCH 2/3] fix(agent-manager): remove unused worktree spinner style --- .../kilo-vscode/webview-ui/agent-manager/agent-manager.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css b/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css index fae341978dd0..3b6cdeff7937 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css +++ b/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css @@ -804,11 +804,6 @@ html[data-theme="kilo-vscode"] white-space: normal; } -.am-worktree-spinner { - width: 16px; - height: 16px; -} - /* Per-worktree git stats (diff lines + commits missing from origin) */ .am-worktree-stats { From dc208291e436ef42d950848cf9964060be781895 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Fri, 28 Aug 2026 13:38:27 +0200 Subject: [PATCH 3/3] fix(agent-manager): preserve shared activity spinner sizing --- packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts | 1 + .../kilo-vscode/webview-ui/agent-manager/agent-manager.css | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts index e8d570ce4fd5..0ef9cca0827f 100644 --- a/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-manager-arch.test.ts @@ -70,6 +70,7 @@ const TSX_FILES = [ path.join(ROOT, "webview-ui/diff-virtual/DiffVirtualApp.tsx"), // Shared components that consume agent-manager CSS classes (e.g. am-dropdown, // am-branch-item) used by both the agent manager and the diff viewer. + path.join(ROOT, "webview-ui/src/components/shared/ActivityIcon.tsx"), path.join(ROOT, "webview-ui/src/components/shared/BranchSelect.tsx"), path.join(ROOT, "webview-ui/src/components/chat/TabDnd.tsx"), path.join(ROOT, "webview-ui/diff-viewer/BaseBranchPicker.tsx"), diff --git a/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css b/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css index 3b6cdeff7937..fae341978dd0 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css +++ b/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css @@ -804,6 +804,11 @@ html[data-theme="kilo-vscode"] white-space: normal; } +.am-worktree-spinner { + width: 16px; + height: 16px; +} + /* Per-worktree git stats (diff lines + commits missing from origin) */ .am-worktree-stats {