fix(extension): side panel polish — floating memory card, empty-state hint, analytics toggle colour, history filter, pinned new-tab button - #4808
Conversation
New conversations start with zero transcript events instead of a seeded assistant greeting. The hint 'Pick a tab and ask Kilo to inspect it.' now renders as a non-virtualized empty state inside the conversation region, disappears once a user message exists, and is never sent to the model as a prior assistant turn. Stored conversations whose first event is the legacy greeting are migrated on load.
History now lists only conversations with at least one user message. Empty conversations are removed from storage when they stop being open: closing an empty tab deletes it, load-time normalization drops stored empty non-open rows, and closing a tab evicts the per-conversation draft, context-usage, and session-cost atoms even when the replacement blank tab reuses the same conversation id.
The card is now a centred dialog overlay (role=dialog, aria-modal) at z-[25] — above panel chrome, below the settings and history overlays — instead of a flex sibling that consumed the conversation region's layout height. Dismissal stays button-only, matching the existing overlays; the note textarea receives focus when the draft form opens.
The switch track now uses the brand accent with a dark knob when on, so the on and off states are visually distinct.
The + button was the last flex child inside the horizontally scrolling tab strip and scrolled out of the panel viewport with many tabs open. It is now a shrink-0 sibling outside the strip, which keeps its own width reserved while the strip scrolls as before.
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (16 files)
Reviewed by claude-sonnet-5 · Input: 34 · Output: 11.1K · Cached: 820.2K Review guidance: REVIEW.md from base branch |
|
(bot) @kilocode-bot please review the current head b79d6f7. It merges main into the branch; the apps/extension diff is byte-identical to 92f412d, which you already reviewed with no findings. |
Verification:
|
| Diff | Bytes | sha256 |
|---|---|---|
28802f7ff..92f412d17 (merge-base of main/92f412d17 → reviewed commit) |
65490 | 313a8745…3dcfabd3 |
98118c752..b79d6f754 (merge-base of main/head → head) |
65490 | 313a8745…3dcfabd3 |
28802f7ff..b79d6f754 (original branch point → head, fixed base) |
65490 | 313a8745…3dcfabd3 |
3. Result: byte-identical. All three diffs have the same size and the same sha256, so the result holds under both the GitHub-style per-commit merge-base and a fixed common base.
Corroborating checks:
git rev-parse 92f412d17:apps/extension==git rev-parse b79d6f754:apps/extension→21940155ea7f53acc4587700ac907fe88439a094(identical trees).git diff 28802f7ff 98118c752 -- apps/extensionis empty →maincontributed noapps/extensionchanges between the two bases.git diff --name-only 92f412d17 b79d6f754touches onlyapps/mobile,apps/web,packages/*,services/*,dev/local,.github/workflows, lockfile/config — noapps/extensionpaths, so the merge introduced no conflict resolutions or edits there.
4. Conclusion: no new review is needed for apps/extension at b79d6f754 — the extension changes are identical to those already reviewed at 92f412d17 with no findings. The merge only pulled in unrelated main changes outside apps/extension.
|
Confirmed — the review at |
What this fixes
Five reported side-panel defects, each reproduced on the baseline (
28802f7ff) before fixing (Chrome + Playwright, artifacts in the run record):role="dialog"overlay with a backdrop.rgb(69,69,69)vs offrgb(51,51,51). The on state now uses the brand accent track with a dark knob.+button was the last child inside the horizontally scrolling tab strip (measured at x = 2087.53 in a 320px viewport). It is now a fixed-width sibling outside the strip, reachable at every scroll position.Simpler-shape decisions (from the accepted plan)
fixed inset-0 … role="dialog" aria-modal="true") atz-[25]: above all panel chrome (context popoverz-20, mode popoverz-10), below Settings/History (z-30), soManage memoriesstill opens Settings visibly above the card.user, zeroassistantmessages).getSortedStoredConversationHistoryvia the existingisStoredConversationEmpty, the single funnel every History consumer routes through.Switchextraction.flex-1 min-w-0 overflow-x-auto, button ashrink-0sibling. No sticky positioning or scroll shadows.Recorded consequence: an unsent in-memory draft in a closed empty tab is discarded (drafts were previously recoverable only by reopening from History — a path empty conversations no longer have; sent content is never affected).
Verification
pnpm format,pnpm --filter kilo-extension verify(typecheck, lint, 420 unit tests),build,build:firefox— green.e2e:chrome— 84 passed, 10 skipped, 0 failed.e2e:firefox— 33/33 workflows passed.No new dependencies, no manifest permission changes, no
DESIGN_TOKENSchanges.