From 64dd8e3a2b0ca2c568494bbb26ba936c840070bb Mon Sep 17 00:00:00 2001 From: Sylwester Liljegren Date: Fri, 10 Jul 2026 02:11:42 +0200 Subject: [PATCH] fix(vscode): address CI failure and review feedback on chat search - Wrap StoryProviders in TranscriptSearchProvider - fixes the failing Visual Regression check (5 stories threw because TaskHeader/MessageList call useTranscriptSearch() unconditionally with no fallback context). - Reset the whole search widget when the current session changes so stale query/matches don't linger across a session switch. - Search error rows via the same unwrapped error.data.message shown by ErrorDisplay, instead of the internal, never-rendered error.name. - Reorder bash tool search text to description -> command -> output, matching the actual DOM order in shell-rolling-results.tsx, so occurrence numbering lines up with what gets highlighted. - Surface invalid regular expressions explicitly instead of leaving them indistinguishable from "no matches". - Track both legs of the chained highlight rAF so cleanup can cancel either one, preventing a stray callback from touching state after unmount. - Widen Escape/Enter handling to the whole search widget, not just the text input. - Add an aria-label to the search input and type the search provider's children as ParentComponent instead of any. New chat.search.invalidRegex i18n key added across all 20 locales. --- .../src/components/chat/MessageList.tsx | 82 +++++++++++++++---- .../src/components/chat/TranscriptSearch.tsx | 9 +- .../src/context/transcript-search.tsx | 12 ++- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/br.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/bs.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/da.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/de.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/en.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/es.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/fr.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/it.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/ja.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/ko.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/nl.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/no.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/pl.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/ru.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/th.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/tr.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/uk.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/zh.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/zht.ts | 1 + .../webview-ui/src/stories/StoryProviders.tsx | 13 +-- .../webview-ui/src/styles/task-header.css | 7 ++ 25 files changed, 119 insertions(+), 24 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/MessageList.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/MessageList.tsx index 36d5361e41..4c7307e958 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/MessageList.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/MessageList.tsx @@ -46,11 +46,13 @@ import { partitionRows, retainTurn, transcriptRows, + type TranscriptErrorRow, type TranscriptHold, type TranscriptRow, } from "../../context/transcript-rows" import { useTranscriptSearch, type SearchMatch } from "../../context/transcript-search" import { applyTranscriptHighlights, clearTranscriptHighlights } from "./transcript-search-highlight" +import { unwrapError } from "../../utils/errorUtils" import type { Part, QuestionRequest, SuggestionRequest } from "../../types/messages" interface MessageListProps { @@ -141,7 +143,7 @@ export const MessageList: Component = (props) => { const search = useTranscriptSearch() function rowText(row: TranscriptRow): string { - if (row.type === "error") return row.error.name + if (row.type === "error") return errorText(row.error) if (row.type === "diff") return "" const chunks: string[] = [] for (const part of row.parts) { @@ -163,6 +165,15 @@ export const MessageList: Component = (props) => { return chunks.join("\n") } + // Matches what ErrorDisplay.tsx actually shows in its default card body — + // the unwrapped `error.data.message`, not the internal `error.name` code, + // which is never rendered as visible text. + function errorText(error: TranscriptErrorRow["error"]): string { + const msg = error.data?.message + if (typeof msg !== "string") return "" + return unwrapError(msg) + } + // Extracts only the text kilo-ui's tool renderers actually put on screen — // matched field-by-field rather than reading `state.title` generically. // The bash/shell renderer never shows `state.title` (its header is a @@ -183,8 +194,12 @@ export const MessageList: Component = (props) => { const command = input?.command ?? metadata?.command const description = input?.description ?? metadata?.description const chunks: string[] = [] - if (command) chunks.push(command) + // DOM order: description renders as the header subtitle (above the + // command box), command renders below it, output last — keep this in + // sync with shell-rolling-results.tsx so occurrence numbering lines up + // with what's actually highlighted on screen. if (description) chunks.push(description) + if (command) chunks.push(command) if (state.output) chunks.push(state.output) return chunks } @@ -205,27 +220,39 @@ export const MessageList: Component = (props) => { } } - const matches = createMemo(() => { + const pattern = createMemo(() => { const q = search.query() - if (!search.active() || !q) return [] - const pattern = buildPattern(q, search.matchCase(), search.wholeWord(), search.regex()) - if (!pattern) return [] + if (!search.active() || !q) return undefined + return buildPattern(q, search.matchCase(), search.wholeWord(), search.regex()) + }) + + // An invalid regex (e.g. an unbalanced group) compiles to `undefined` from + // buildPattern, which otherwise looks identical to "no matches" — surface + // it explicitly so the widget can show a real error instead. + createEffect(() => { + const q = search.query() + search.setInvalid(search.active() && !!q && search.regex() && !pattern()) + }) + + const matches = createMemo(() => { + const p = pattern() + if (!p) return [] const list = rows() const result: SearchMatch[] = [] for (const row of list) { const text = rowText(row) - pattern.lastIndex = 0 + p.lastIndex = 0 let occurrence = 0 - let hit = pattern.exec(text) + let hit = p.exec(text) while (hit) { if (hit[0].length === 0) { - pattern.lastIndex += 1 - hit = pattern.exec(text) + p.lastIndex += 1 + hit = p.exec(text) continue } result.push({ key: row.key, messageId: row.message.id, occurrence }) occurrence += 1 - hit = pattern.exec(text) + hit = p.exec(text) } } return result @@ -250,6 +277,27 @@ export const MessageList: Component = (props) => { ), ) + // Closing/switching to a different session leaves stale query/matches + // bound to a transcript that's no longer displayed if left untouched — + // reset the whole widget whenever the current session changes. `defer: + // true` skips the initial run so mounting doesn't immediately "reset" a + // session that was never open in this search widget. + createEffect( + on( + () => session.currentSessionID(), + () => { + search.setActive(false) + search.setQuery("") + search.setMatchCase(false) + search.setWholeWord(false) + search.setRegex(false) + search.setIndex(0) + search.setCount(0) + }, + { defer: true }, + ), + ) + const activeKey = createMemo(() => { const m = matches() const idx = search.index() @@ -263,6 +311,7 @@ export const MessageList: Component = (props) => { // the current occurrence so navigation can judge whether it needs to // scroll at all (several occurrences can share one message). let highlightFrame: number | undefined + let highlightFrameInner: number | undefined let pendingCenter = false const paintHighlights = () => { const el = scrollEl() @@ -270,9 +319,8 @@ export const MessageList: Component = (props) => { clearTranscriptHighlights() return } - const pattern = buildPattern(search.query(), search.matchCase(), search.wholeWord(), search.regex()) const active = activeMatch() - const range = applyTranscriptHighlights(el, pattern, active && { key: active.key, occurrence: active.occurrence }) + const range = applyTranscriptHighlights(el, pattern(), active && { key: active.key, occurrence: active.occurrence }) if (!pendingCenter) return pendingCenter = false if (!range) return @@ -298,11 +346,16 @@ export const MessageList: Component = (props) => { // Two frames of margin so the virtualizer has settled the DOM for the new // scroll position before we scan it for the precise occurrence to center. + // Both frame ids are tracked so cleanup can cancel whichever leg of the + // chain hasn't fired yet — cancelling only the outer id left the inner, + // already-scheduled frame free to fire (and touch reactive state) after + // the component had already unmounted. const scheduleHighlight = () => { if (highlightFrame !== undefined) return highlightFrame = requestAnimationFrame(() => { - requestAnimationFrame(() => { + highlightFrameInner = requestAnimationFrame(() => { highlightFrame = undefined + highlightFrameInner = undefined paintHighlights() }) }) @@ -345,6 +398,7 @@ export const MessageList: Component = (props) => { onCleanup(() => { if (highlightFrame !== undefined) cancelAnimationFrame(highlightFrame) + if (highlightFrameInner !== undefined) cancelAnimationFrame(highlightFrameInner) clearTranscriptHighlights() }) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/TranscriptSearch.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/TranscriptSearch.tsx index 9cccc3735f..b8ccf1481d 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/TranscriptSearch.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/TranscriptSearch.tsx @@ -63,19 +63,19 @@ export const TranscriptSearch: Component = () => { return ( -
+
{ search.setQuery(e.currentTarget.value) search.setIndex(0) }} - onKeyDown={onKeyDown} />
@@ -113,7 +113,10 @@ export const TranscriptSearch: Component = () => {
- 0}> + + {language.t("chat.search.invalidRegex")} + + 0}> {search.index() + 1} / {search.count()} diff --git a/packages/kilo-vscode/webview-ui/src/context/transcript-search.tsx b/packages/kilo-vscode/webview-ui/src/context/transcript-search.tsx index 0ba72df9bd..c4483201ee 100644 --- a/packages/kilo-vscode/webview-ui/src/context/transcript-search.tsx +++ b/packages/kilo-vscode/webview-ui/src/context/transcript-search.tsx @@ -1,4 +1,4 @@ -import { createContext, useContext, createSignal, type Accessor, type Component } from "solid-js" +import { createContext, useContext, createSignal, type Accessor, type ParentComponent } from "solid-js" export interface SearchMatch { key: string @@ -27,11 +27,16 @@ interface TranscriptSearchContextValue { * off this instead of `index` so navigation always jumps to the match. */ jump: Accessor requestJump: () => void + /** True when "Use Regular Expression" is on and the current query fails to + * compile — lets the widget show an explicit error instead of looking + * indistinguishable from a plain "no matches". */ + invalid: Accessor + setInvalid: (value: boolean) => void } const TranscriptSearchContext = createContext() -export const TranscriptSearchProvider: Component<{ children: any }> = (props) => { +export const TranscriptSearchProvider: ParentComponent = (props) => { const [query, setQuery] = createSignal("") const [matchCase, setMatchCase] = createSignal(false) const [wholeWord, setWholeWord] = createSignal(false) @@ -40,6 +45,7 @@ export const TranscriptSearchProvider: Component<{ children: any }> = (props) => const [index, setIndex] = createSignal(0) const [count, setCount] = createSignal(0) const [jump, setJump] = createSignal(0) + const [invalid, setInvalid] = createSignal(false) return ( = (props) => setCount, jump, requestJump: () => setJump((n) => n + 1), + invalid, + setInvalid, }} > {props.children} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index 896232553e..3b1642295f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -1840,4 +1840,5 @@ export const dict = { "chat.search.previousMatch": "المطابقة السابقة", "chat.search.nextMatch": "المطابقة التالية", "chat.search.close": "إغلاق البحث", + "chat.search.invalidRegex": "تعبير عادي غير صالح", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index 8c14d9a3e3..0f5249f0fb 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -1889,4 +1889,5 @@ export const dict = { "chat.search.previousMatch": "Correspondência anterior", "chat.search.nextMatch": "Próxima correspondência", "chat.search.close": "Fechar pesquisa", + "chat.search.invalidRegex": "Expressão regular inválida", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 530ae5bc7a..5b95bed8b6 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -1881,4 +1881,5 @@ export const dict = { "chat.search.previousMatch": "Prethodno podudaranje", "chat.search.nextMatch": "Sljedeće podudaranje", "chat.search.close": "Zatvori pretragu", + "chat.search.invalidRegex": "Nevažeći regularni izraz", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index cbea8a99cd..6200eeb161 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -1873,4 +1873,5 @@ export const dict = { "chat.search.previousMatch": "Forrige match", "chat.search.nextMatch": "Næste match", "chat.search.close": "Luk søgning", + "chat.search.invalidRegex": "Ugyldigt regulært udtryk", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index e883bb0a34..c75d2defa3 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -1911,4 +1911,5 @@ export const dict = { "chat.search.previousMatch": "Vorheriger Treffer", "chat.search.nextMatch": "Nächster Treffer", "chat.search.close": "Suche schließen", + "chat.search.invalidRegex": "Ungültiger regulärer Ausdruck", } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 012f0d1a01..761e922602 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1868,4 +1868,5 @@ export const dict = { "chat.search.previousMatch": "Previous match", "chat.search.nextMatch": "Next match", "chat.search.close": "Close search", + "chat.search.invalidRegex": "Invalid regular expression", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 4545a12661..139cfc6430 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -1897,4 +1897,5 @@ export const dict = { "chat.search.previousMatch": "Coincidencia anterior", "chat.search.nextMatch": "Coincidencia siguiente", "chat.search.close": "Cerrar búsqueda", + "chat.search.invalidRegex": "Expresión regular no válida", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index f838e89f11..ae55951ed1 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -1921,4 +1921,5 @@ export const dict = { "chat.search.previousMatch": "Résultat précédent", "chat.search.nextMatch": "Résultat suivant", "chat.search.close": "Fermer la recherche", + "chat.search.invalidRegex": "Expression régulière non valide", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts index 4fce7d38b1..1d7bd5a426 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts @@ -1806,4 +1806,5 @@ export const dict = { "chat.search.previousMatch": "Risultato precedente", "chat.search.nextMatch": "Risultato successivo", "chat.search.close": "Chiudi ricerca", + "chat.search.invalidRegex": "Espressione regolare non valida", } as const diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 5ed5573295..85bcc1e271 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -1866,4 +1866,5 @@ export const dict = { "chat.search.previousMatch": "前の一致", "chat.search.nextMatch": "次の一致", "chat.search.close": "検索を閉じる", + "chat.search.invalidRegex": "正規表現が無効です", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 7a2dd78af9..6f01823d33 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -1848,4 +1848,5 @@ export const dict = { "chat.search.previousMatch": "이전 검색 결과", "chat.search.nextMatch": "다음 검색 결과", "chat.search.close": "검색 닫기", + "chat.search.invalidRegex": "정규식이 잘못되었습니다", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index e2f8481bae..241af0b2e9 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -1908,4 +1908,5 @@ export const dict = { "chat.search.previousMatch": "Vorige overeenkomst", "chat.search.nextMatch": "Volgende overeenkomst", "chat.search.close": "Zoeken sluiten", + "chat.search.invalidRegex": "Ongeldige reguliere expressie", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index db397fd7ca..7332135974 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -1866,4 +1866,5 @@ export const dict = { "chat.search.previousMatch": "Forrige treff", "chat.search.nextMatch": "Neste treff", "chat.search.close": "Lukk søk", + "chat.search.invalidRegex": "Ugyldig regulært uttrykk", } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 19f156f609..bc6504a7ac 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -1879,4 +1879,5 @@ export const dict = { "chat.search.previousMatch": "Poprzednie dopasowanie", "chat.search.nextMatch": "Następne dopasowanie", "chat.search.close": "Zamknij wyszukiwanie", + "chat.search.invalidRegex": "Nieprawidłowe wyrażenie regularne", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 331fe351d8..338e68bd4a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -1877,4 +1877,5 @@ export const dict = { "chat.search.previousMatch": "Предыдущее совпадение", "chat.search.nextMatch": "Следующее совпадение", "chat.search.close": "Закрыть поиск", + "chat.search.invalidRegex": "Недопустимое регулярное выражение", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 04f62dc14b..92d41b0047 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -1846,4 +1846,5 @@ export const dict = { "chat.search.previousMatch": "รายการที่ตรงกันก่อนหน้า", "chat.search.nextMatch": "รายการที่ตรงกันถัดไป", "chat.search.close": "ปิดการค้นหา", + "chat.search.invalidRegex": "นิพจน์ทั่วไปไม่ถูกต้อง", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 44caa3e470..eebbc62ac4 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -1895,4 +1895,5 @@ export const dict = { "chat.search.previousMatch": "Önceki eşleşme", "chat.search.nextMatch": "Sonraki eşleşme", "chat.search.close": "Aramayı kapat", + "chat.search.invalidRegex": "Geçersiz normal ifade", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index 8d8e9afb17..68e69c4dd3 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -1892,4 +1892,5 @@ export const dict = { "chat.search.previousMatch": "Попередній збіг", "chat.search.nextMatch": "Наступний збіг", "chat.search.close": "Закрити пошук", + "chat.search.invalidRegex": "Недійсний регулярний вираз", } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 88c4ed6766..4f2a77af44 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -1795,4 +1795,5 @@ export const dict = { "chat.search.previousMatch": "上一个匹配项", "chat.search.nextMatch": "下一个匹配项", "chat.search.close": "关闭搜索", + "chat.search.invalidRegex": "正则表达式无效", } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index 1c057e6ad3..4b1d84e10e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -1801,4 +1801,5 @@ export const dict = { "chat.search.previousMatch": "上一個相符項", "chat.search.nextMatch": "下一個相符項", "chat.search.close": "關閉搜尋", + "chat.search.invalidRegex": "規則運算式無效", } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx index 03dfa684a6..b694877ee4 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx @@ -35,6 +35,7 @@ import { LanguageContext } from "../context/language" import { IndexingProvider } from "../context/indexing" import { KiloEmbeddingModelsProvider } from "../context/kilo-embedding-models" import { MemoryProvider } from "../context/memory" +import { TranscriptSearchProvider } from "../context/transcript-search" import { dict as uiEn } from "@kilocode/kilo-ui/i18n/en" import { dict as appEn } from "../i18n/en" import { dict as amEn } from "../../agent-manager/i18n/en" @@ -453,11 +454,13 @@ export const StoryProviders: ParentComponent = (props) => { - {props.noPadding ? ( - props.children - ) : ( -
{props.children}
- )} + + {props.noPadding ? ( + props.children + ) : ( +
{props.children}
+ )} +
diff --git a/packages/kilo-vscode/webview-ui/src/styles/task-header.css b/packages/kilo-vscode/webview-ui/src/styles/task-header.css index d354e22275..e1a18622b5 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/task-header.css +++ b/packages/kilo-vscode/webview-ui/src/styles/task-header.css @@ -343,6 +343,13 @@ flex-shrink: 0; } +[data-slot="transcript-search-error"] { + font-size: var(--kilo-font-size-11); + color: var(--vscode-errorForeground, #f14c4c); + white-space: nowrap; + flex-shrink: 0; +} + [data-slot="transcript-search-nav"] { display: flex; align-items: center;