Skip to content

feat(settings): add settings control center#1612

Merged
zerob13 merged 7 commits into
devfrom
feat/new-settings-layout
May 12, 2026
Merged

feat(settings): add settings control center#1612
zerob13 merged 7 commits into
devfrom
feat/new-settings-layout

Conversation

@zerob13
Copy link
Copy Markdown
Collaborator

@zerob13 zerob13 commented May 12, 2026

Summary

  • Add a settings overview control center with provider, MCP, DeepChat Agent, quick-start, usage, and recent setting-change sections.
  • Rework settings navigation groups, provider detail tabs, MCP settings layout, and data settings panel density.
  • Add settings activity persistence/routes plus focused renderer/main tests for the updated settings surfaces.

UI Layout

Before:

Settings
├─ Overview: Providers / MCP / Knowledge / Backup
├─ Large Quick start panel
├─ Needs attention panel
└─ Recent changes

MCP Center
├─ Large metric cards: Running / Built-in / Custom / NPM registry
├─ Search + All / Running / Stopped / Built-in / Custom filters
└─ Server grid

Provider Detail
├─ Connect / Models / Limits / Advanced
└─ Provider rows with Connected badges

After:

Settings
├─ Overview: Providers / MCP / DeepChat Agents / Quick start
├─ Usage dashboard
├─ Token usage + Memories
└─ Recent setting changes

MCP Center
├─ Header actions: MCP market / Add / Enable
├─ Search + All / Running / Stopped filters
├─ Server grid
└─ Bottom status bar: totals + NPM source

Provider Detail
├─ Connect / Models / Advanced
└─ Cleaner provider rows and flat model list

Validation

  • pnpm run format
  • pnpm run i18n
  • pnpm run lint
  • pnpm run typecheck:web
  • Focused Vitest coverage for Settings overview/app, provider detail, MCP settings/cards/servers, data settings, and settings activity table.
  • Commit hook ran full pnpm run typecheck before push.
image image image image image

Summary by CodeRabbit

  • New Features

    • Settings Overview page: metrics, quick start card, usage dashboard, and recent settings activity feed
    • Recent activity list and persistent settings activity tracking
  • Improvements

    • Grouped/ reorganized settings navigation and unified settings page layout
    • Provider detail simplified into tabs; MCP footer/status bar and filters refined
    • Settings overview metric now shows DeepChat Agents; Quick start/nostalgia layout updated
    • Data & Privacy: distinct danger-zone reset actions
  • Bug Fixes

    • MCP server toggle no longer opens server detail unintentionally

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 12, 2026

📝 Walkthrough

Walkthrough

Adds grouped Settings control-center UI (SettingsOverview, SettingsPageShell, control-center components), SQLite-backed settings-activity persistence and route, runtime recording from many settings routes, renderer client list API, broad settings-page refactors, i18n updates, tests, and documentation.

Changes

Settings Control Center, Navigation, MCP/Providers/Data UI, and Activity Tracking

Layer / File(s) Summary
Contracts and renderer client
src/shared/contracts/routes/settings.routes.ts, src/renderer/api/SettingsClient.ts, src/shared/contracts/routes.ts
Adds Zod schemas/types and settings.activity.list route; exports activity types; adds listRecentActivity on SettingsClient and registers route in catalog.
SQLite presenter table & APIs
src/main/presenter/sqlitePresenter/tables/settingsActivity.ts, src/main/presenter/sqlitePresenter/index.ts, src/main/presenter/sqlitePresenter/schemaCatalog.ts
Implements SettingsActivityTable with record/prune/list, adds table to schema catalog, instantiates and wires table in SQLitePresenter, and exposes recordSettingsActivity / listSettingsActivity.
Main runtime recording and routes
src/main/routes/index.ts, src/main/presenter/index.ts
Extends runtime to accept optional sqlitePresenter with no-op fallback; records settings/provider/skill/MCP/sync activity during dispatch; settings activity list route reads from presenter.
Renderer routing, App, and overview
src/shared/settingsNavigation.ts, src/renderer/settings/App.vue, src/renderer/settings/main.ts, src/renderer/settings/components/SettingsOverview.vue
Switches to grouped route items, adds settings-overview, maps dashboard -> overview usage, updates App navigation to grouped sections, and implements SettingsOverview with activity table and usage dashboard embedding.
Settings shell & control-center components
src/renderer/settings/components/control-center/*
Adds SettingsPageShell, SettingsSectionCard, StatusMetricCard, UsageNostalgiaCard used across many settings pages.
Settings page refactors (MCP, Provider, Data, Prompt, Shortcut, Skills, etc.)
src/renderer/settings/components/*, src/renderer/src/components/mcp-config/*
Rewraps many pages with SettingsPageShell, refactors MCP servers list/detail (McpServers/McpServerCard), provider detail tabs, data danger-zone reset buttons, prompt import/export actions, shortcut recording flow, skills UI, and related tests.
i18n, tests, and documentation
src/renderer/src/i18n/*, test/**/*, docs/**/*
Adds/updates i18n keys across locales for controlCenter/provider/mcp/data; adds tests for settings activity table and renderer components; adds many feature/spec/tasks docs and E2E screenshot smoke test updates.

Estimated code review effort
🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested labels
codex

Suggested reviewers

  • deepinfect

Poem

A rabbit hopped through grouped settings bright,
Shelled each page in comfy, patterned light.
It logged each click in rows of SQLite,
Overview hums and locales sing polite.
Hop, review, land — a small release delight! 🐇✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/new-settings-layout

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/renderer/settings/components/skills/SkillsSettings.vue (1)

270-273: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Boolean coercion here can mis-handle string payloads.

Boolean(nextValue) turns 'false' into true. Normalize explicitly when a string is received.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/settings/components/skills/SkillsSettings.vue` around lines 270
- 273, The current handleDraftSuggestionsToggle uses Boolean(nextValue) which
treats the string "false" as true; change the normalization to explicitly handle
string payloads (e.g., if typeof nextValue === 'string' then normalized =
nextValue === 'true' else normalized = Boolean(nextValue')) so
draftSuggestionsEnabled.value and the call to
configPresenter.setSkillDraftSuggestionsEnabled receive the correct boolean;
update the logic inside handleDraftSuggestionsToggle (referencing
draftSuggestionsEnabled and configPresenter.setSkillDraftSuggestionsEnabled)
accordingly.
🟡 Minor comments (17)
src/renderer/src/i18n/he-IL/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Translate to Hebrew.

The translation for settings-overview is in English, but this is the Hebrew locale file. All other entries are properly translated to Hebrew.

🌐 Suggested Hebrew translation
-  "settings-overview": "Settings Overview"
+  "settings-overview": "סקירת הגדרות"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/he-IL/routes.json` at line 23, Replace the English
value for the key "settings-overview" in routes.json with a Hebrew translation;
locate the "settings-overview" entry and change "Settings Overview" to a Hebrew
string such as "סקירת ההגדרות" so the he-IL locale file contains a proper Hebrew
translation.
src/renderer/src/i18n/zh-HK/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use Traditional Chinese for Hong Kong locale.

The translation uses Simplified Chinese characters ("设置概览"), but the zh-HK locale (Hong Kong) should use Traditional Chinese.

🌐 Suggested Traditional Chinese translation
-  "settings-overview": "设置概览"
+  "settings-overview": "設置概覽"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/zh-HK/routes.json` at line 23, The value for the
"settings-overview" key in routes.json is written in Simplified Chinese
("设置概览"); update it to Traditional Chinese for the zh-HK locale (e.g. "設定概覽") so
the "settings-overview" translation uses Hong Kong Traditional characters.
src/renderer/src/i18n/zh-TW/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use Traditional Chinese for Taiwan locale.

The translation uses Simplified Chinese characters ("设置概览"), but the zh-TW locale (Taiwan) should use Traditional Chinese. Other entries in this file correctly use Traditional characters.

🌐 Suggested Traditional Chinese translation
-  "settings-overview": "设置概览"
+  "settings-overview": "設置概覽"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/zh-TW/routes.json` at line 23, Replace the Simplified
Chinese value for the "settings-overview" key with the correct Traditional
Chinese wording for the zh-TW locale; specifically change the value "设置概览" to
the Traditional Chinese equivalent "設定概覽" for the "settings-overview" entry so
it matches the rest of the file's zh-TW translations.
src/renderer/src/i18n/ru-RU/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Translate to Russian.

The translation for settings-overview is in English, but this is the Russian locale file. All other entries are properly translated to Russian.

🌐 Suggested Russian translation
-  "settings-overview": "Settings Overview"
+  "settings-overview": "Обзор настроек"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/ru-RU/routes.json` at line 23, The "settings-overview"
translation is still in English; replace its value with a proper Russian
translation (e.g., "Обзор настроек") so the "settings-overview" key in the ru-RU
locale is localized to Russian.
src/renderer/src/i18n/fr-FR/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use French translation for the new overview route label.

Line 23 is still English ("Settings Overview"). Please localize it in fr-FR to keep route labels consistent.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/fr-FR/routes.json` at line 23, The "settings-overview"
route label in the fr-FR locale is still in English; update the value for the
"settings-overview" key in src/renderer/src/i18n/fr-FR/routes.json to a proper
French translation (e.g., "Aperçu des paramètres" or preferred French phrasing)
so the fr-FR routes file contains the localized label.
src/renderer/src/i18n/da-DK/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Localize Danish route label instead of English placeholder.

Line 23 uses "Settings Overview" in a da-DK locale file. Please replace with a Danish translation to avoid mixed-language navigation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/da-DK/routes.json` at line 23, The "settings-overview"
route label in the da-DK locale file is still in English; update the value for
the "settings-overview" key in src/renderer/src/i18n/da-DK/routes.json to a
proper Danish translation such as "Oversigt over indstillinger" so the Danish
locale contains a localized route label.
src/renderer/src/i18n/pt-BR/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Translate the new route label in pt-BR.

Line 23 keeps the English text ("Settings Overview"). Please provide a Portuguese translation for consistent UX.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/pt-BR/routes.json` at line 23, Update the pt-BR
translation for the "settings-overview" route key by replacing the English
string "Settings Overview" with the Portuguese translation "Visão geral das
configurações" in src/renderer/src/i18n/pt-BR/routes.json so the key
"settings-overview" returns the localized text.
src/renderer/src/i18n/fa-IR/routes.json-22-23 (1)

22-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Provide Persian translations for the new route labels.

Both settings-plugins and settings-overview contain English text in the Persian locale file. All other entries in this file have proper Persian translations. Persian users will see English labels for these routes instead of localized text.

🌐 Suggested Persian translations
-  "settings-plugins": "Plugins",
-  "settings-overview": "Settings Overview"
+  "settings-plugins": "افزونه‌ها",
+  "settings-overview": "نمای کلی تنظیمات"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/fa-IR/routes.json` around lines 22 - 23, Replace the
English values for the i18n keys "settings-plugins" and "settings-overview" with
Persian translations so the fa-IR locale shows localized labels; update the
value for "settings-plugins" to "افزونه‌ها" and the value for
"settings-overview" to "نمای کلی تنظیمات" in the routes.json entry for these
keys.
src/renderer/src/i18n/ja-JP/routes.json-22-23 (1)

22-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Provide Japanese translations for the new route labels.

Both settings-plugins and settings-overview contain English text in the Japanese locale file. All other entries in this file have proper Japanese translations. Japanese users will see English labels for these routes instead of localized text.

🌐 Suggested Japanese translations
-  "settings-plugins": "Plugins",
-  "settings-overview": "Settings Overview"
+  "settings-plugins": "プラグイン",
+  "settings-overview": "設定概要"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/ja-JP/routes.json` around lines 22 - 23, Replace the
English values for the JSON keys "settings-plugins" and "settings-overview" in
the Japanese locale (routes.json) with proper Japanese translations; change
"settings-plugins" value to "プラグイン" and "settings-overview" value to "設定の概要" (or
"設定概要" if you prefer a shorter label) so Japanese users see localized route
labels.
src/renderer/src/i18n/fa-IR/settings.json-254-259 (1)

254-259: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Localize newly added fa-IR strings instead of shipping English fallback text.

These new entries are still in English (e.g., data.privacy*, provider.center.*, mcp.center.*, controlCenter.*), which breaks language consistency for Persian users in major settings flows.

Also applies to: 885-903, 1204-1220, 1963-2035

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/fa-IR/settings.json` around lines 254 - 259, The new
fa-IR entries are still in English; replace the English fallback strings with
Persian translations for the keys shown (privacyTitle, privacyDescription,
dangerZone.title, dangerZone.description) and similarly localize the other
reported blocks (data.privacy*, provider.center.*, mcp.center.*,
controlCenter.*) referenced in the comment ranges (885-903, 1204-1220,
1963-2035); update the JSON values with appropriate Persian text, preserving the
same key names and JSON structure, and ensure encoding/escaping remains valid
for fa-IR.
src/renderer/src/i18n/fr-FR/settings.json-254-259 (1)

254-259: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Translate new fr-FR settings keys before merge.

Multiple newly introduced strings are still English in the French locale (data.privacy*, provider.center.*, mcp.center.*, controlCenter.*), causing mixed-language UI on core settings pages.

Also applies to: 885-903, 1204-1220, 1963-2035

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/fr-FR/settings.json` around lines 254 - 259, The French
locale still contains English strings for the newly added settings keys—update
the translations for the keys privacyTitle, privacyDescription,
dangerZone.title, and dangerZone.description (and the other mentioned groups:
data.privacy*, provider.center.*, mcp.center.*, controlCenter.*) so the UI is
fully French; replace the English text with proper French equivalents for each
key in src/renderer/src/i18n/fr-FR/settings.json (e.g., translate "Data &
Privacy", "Manage backup, sync, privacy mode, maintenance, and dangerous
operations.", "Danger Zone", and "Reset chat, knowledge, or all data. This
cannot be undone.") and do the same for the other ranges referenced so no new
keys remain in English.
src/renderer/src/i18n/he-IL/settings.json-254-259 (1)

254-259: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Complete he-IL translations for newly added settings-center copy.

The new additions (data.privacy*, provider.center.*, mcp.center.*, controlCenter.*) are largely English, which creates inconsistent RTL/locale experience in key settings surfaces.

Also applies to: 885-903, 1204-1220, 1963-2035

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/he-IL/settings.json` around lines 254 - 259, The new
settings-center strings are still in English; update the Hebrew locale entries
so the keys under data.privacy* (e.g., "privacyTitle", "privacyDescription",
"dangerZone.title", "dangerZone.description") and the group of keys for
provider.center.*, mcp.center.*, and controlCenter.* are fully translated into
idiomatic he-IL (RTL) Hebrew; locate these keys in
src/renderer/src/i18n/he-IL/settings.json and replace the English text with
proper Hebrew translations while preserving the JSON keys and punctuation/escape
sequences.
src/renderer/settings/components/control-center/UsageNostalgiaCard.vue-217-220 (1)

217-220: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

recordingStartedAt = 0 is treated as missing data

Using if (!value) marks a valid timestamp (0) as unavailable. This should only treat null as missing.

Suggested fix
 function getDaysWithDeepChat(value: number | null): number | null {
-  if (!value) {
+  if (value === null) {
     return null
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/settings/components/control-center/UsageNostalgiaCard.vue`
around lines 217 - 220, In getDaysWithDeepChat change the falsy check so a valid
timestamp 0 is not treated as missing: replace the `if (!value)` guard with an
explicit null check (e.g., `if (value === null)`), ensuring the function only
returns null for actual null inputs while preserving normal behavior for 0 and
other numbers.
src/renderer/src/i18n/ko-KR/routes.json-23-23 (1)

23-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Provide Korean translation for the new route key.

The value "Settings Overview" is in English, but this is the Korean locale file (ko-KR). All other entries in this file use proper Korean translations. Please replace with the appropriate Korean translation.

🌐 Suggested translation

Based on the pattern of other entries, consider:

-  "settings-overview": "Settings Overview"
+  "settings-overview": "설정 개요"

(Note: Please verify with a native Korean speaker for the most appropriate translation.)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/ko-KR/routes.json` at line 23, Replace the English
value for the locale key "settings-overview" in the ko-KR routes.json with a
proper Korean translation (e.g., "설정 개요") so the Korean locale file contains
Korean text consistent with other entries; update the value for the
"settings-overview" key accordingly.
docs/features/settings-control-center/plan.md-12-12 (1)

12-12: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update provider tab plan to match the implemented tab model.

Line 12 still includes Limits, but this PR’s target behavior uses Connect / Models / Advanced with Limits removed. Please align the plan text to avoid implementation drift in follow-up work.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/features/settings-control-center/plan.md` at line 12, The plan text in
docs/features/settings-control-center/plan.md still lists a "Limits" tab which
is outdated; update the provider tab plan text to match the implemented tab
model by removing "Limits" and describing the tabs as "Connect / Models /
Advanced" (or "Connection, Models, Advanced" to match existing phrasing) so the
document aligns with the implemented behavior.
src/renderer/settings/components/AboutUsSettings.vue-8-8 (1)

8-8: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add an accessible alt text to the logo image.

Line 8 renders an image without alt, so screen readers have no label for this content.

♿ Suggested fix
-      <img src="@/assets/logo.png" class="h-10 w-10" />
+      <img src="@/assets/logo.png" class="h-10 w-10" :alt="t('about.title')" />
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/settings/components/AboutUsSettings.vue` at line 8, The <img> in
AboutUsSettings.vue is missing an alt attribute which makes the logo
inaccessible to screen readers; update the <img src="@/assets/logo.png"
class="h-10 w-10" /> element to include a descriptive alt (e.g., alt="App logo"
or a localized string) so screen readers can announce it, or use alt="" if the
image is purely decorative; ensure you edit the img element in
AboutUsSettings.vue to add that alt attribute.
src/renderer/settings/components/SettingsOverview.vue-129-131 (1)

129-131: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Localize activity category labels instead of rendering raw category codes.

Showing raw activity.category leaks internal codes to UI and breaks localization consistency.

As per coding guidelines, "All user-facing strings must use vue-i18n keys from src/renderer/src/i18n instead of hardcoded text".

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/settings/components/SettingsOverview.vue` around lines 129 -
131, Replace the raw category code being displayed in SettingsOverview.vue
(currently {{ activity.category }} inside <Badge>) with a localized label:
create a small mapper (e.g., computed property or method named getActivityLabel
or activityLabel) that maps activity.category codes to vue-i18n keys defined in
src/renderer/src/i18n, then call $t(mappedKey) (or useI18n().t) in the template
instead of the raw value; ensure every category code has a corresponding i18n
key and fallback to a generic key for unknown codes.
🧹 Nitpick comments (2)
src/renderer/src/i18n/en-US/settings.json (1)

960-965: ⚡ Quick win

Remove stale limits tab key from Provider Center translations.

provider.center.tabs.limits looks obsolete after merging Limits into Advanced. Keeping it increases dead i18n surface and locale drift.

Suggested diff
       "tabs": {
         "connection": "Connect",
         "models": "Models",
-        "limits": "Limits",
         "advanced": "Advanced"
       }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/renderer/src/i18n/en-US/settings.json` around lines 960 - 965, Remove the
stale translation key "limits" under the "tabs" object
(provider.center.tabs.limits) since Limits was merged into Advanced; delete the
"limits": "Limits" entry from the JSON and search for any runtime references to
provider.center.tabs.limits and replace them with provider.center.tabs.advanced
or remove the usage so no dead i18n key remains.
test/main/presenter/settingsActivityTable.test.ts (1)

27-53: ⚡ Quick win

Close in-memory SQLite handles in finally blocks.

db.close() currently runs only on the happy path. If an assertion fails earlier, the handle can remain open and pollute subsequent test execution.

🧪 Suggested hardening
   it('lists newest records first and caps list requests at 200', () => {
     const db = new DatabaseCtor(':memory:')
-    const table = new SettingsActivityTableCtor(db)
-    table.createTable()
+    try {
+      const table = new SettingsActivityTableCtor(db)
+      table.createTable()
 
-    for (let index = 0; index < 210; index += 1) {
-      table.record({
-        category: 'provider',
-        action: 'updated',
-        targetType: 'provider',
-        targetId: `provider-${index}`,
-        targetLabel: `Provider ${index}`,
-        routeName: 'settings-provider',
-        summaryKey: 'settings.controlCenter.activity.providerUpdated',
-        summaryParams: {
-          name: `Provider ${index}`
-        }
-      })
-    }
+      for (let index = 0; index < 210; index += 1) {
+        table.record({
+          category: 'provider',
+          action: 'updated',
+          targetType: 'provider',
+          targetId: `provider-${index}`,
+          targetLabel: `Provider ${index}`,
+          routeName: 'settings-provider',
+          summaryKey: 'settings.controlCenter.activity.providerUpdated',
+          summaryParams: {
+            name: `Provider ${index}`
+          }
+        })
+      }
 
-    const records = table.list(500)
+      const records = table.list(500)
 
-    expect(records).toHaveLength(200)
-    expect(records[0]?.targetLabel).toBe('Provider 209')
-    expect(records.at(-1)?.targetLabel).toBe('Provider 10')
-    db.close()
+      expect(records).toHaveLength(200)
+      expect(records[0]?.targetLabel).toBe('Provider 209')
+      expect(records.at(-1)?.targetLabel).toBe('Provider 10')
+    } finally {
+      db.close()
+    }
   })
 
   it('retains only the newest 2000 rows', () => {
     const db = new DatabaseCtor(':memory:')
-    const table = new SettingsActivityTableCtor(db)
-    table.createTable()
+    try {
+      const table = new SettingsActivityTableCtor(db)
+      table.createTable()
 
-    for (let index = 0; index < 2005; index += 1) {
-      table.record({
-        category: 'mcp',
-        action: 'updated',
-        targetType: 'mcp-server',
-        targetId: `server-${index}`,
-        targetLabel: `Server ${index}`,
-        routeName: 'settings-mcp',
-        summaryKey: 'settings.controlCenter.activity.mcpServerUpdated',
-        summaryParams: {
-          name: `Server ${index}`
-        }
-      })
-    }
+      for (let index = 0; index < 2005; index += 1) {
+        table.record({
+          category: 'mcp',
+          action: 'updated',
+          targetType: 'mcp-server',
+          targetId: `server-${index}`,
+          targetLabel: `Server ${index}`,
+          routeName: 'settings-mcp',
+          summaryKey: 'settings.controlCenter.activity.mcpServerUpdated',
+          summaryParams: {
+            name: `Server ${index}`
+          }
+        })
+      }
 
-    const count = db.prepare('SELECT COUNT(*) as count FROM settings_activity').get() as {
-      count: number
-    }
+      const count = db.prepare('SELECT COUNT(*) as count FROM settings_activity').get() as {
+        count: number
+      }
 
-    expect(count.count).toBe(2000)
-    db.close()
+      expect(count.count).toBe(2000)
+    } finally {
+      db.close()
+    }
   })

Also applies to: 55-81

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/main/presenter/settingsActivityTable.test.ts` around lines 27 - 53, The
test opens an in-memory SQLite handle with new DatabaseCtor(':memory:') and only
calls db.close() on the happy path; wrap the test body that uses DatabaseCtor
and SettingsActivityTableCtor (where you call table.createTable(),
table.record(...), table.list(...), and assertions) in a try/finally and move
db.close() into the finally block so the DB handle is always closed even if an
assertion throws; apply the same try/finally pattern to the other test that uses
DatabaseCtor/SettingsActivityTableCtor around lines 55-81.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/features/settings-overview-quickstart-dashboard/spec.md`:
- Around line 9-12: The two specs disagree about the top-row "Last backup time"
card—reconcile them into a single source of truth by updating either the
settings-overview-quickstart-dashboard spec or the settings-overview-cards spec
so both contain the same acceptance criteria: explicitly state whether the "Last
backup time" data card is present in the top row, whether the Quick start card
is the fourth card, and whether the Quick start card itself is clickable vs.
only its individual items; make the change in the spec that represents the
authoritative behavior and mirror that change in the other spec and any related
acceptance tests or references to avoid divergence.

In `@src/main/presenter/sqlitePresenter/index.ts`:
- Around line 268-281: The activity logging call (settingsActivityTable?.record)
is on the main success path of repairSchema() and can throw, turning a
successful DatabaseRepairService(this.db, this.dbPath).repair() into a failure;
wrap the call to settingsActivityTable.record(...) in a try/catch (or otherwise
swallow non-fatal errors) so any exception from settingsActivityTable.record or
its internals does not propagate and you still return the repair report from
repairSchema(); reference the DatabaseRepairService.repair() result, the
settingsActivityTable?.record invocation, and ensure any caught error is handled
(e.g., logged as a warning) but not rethrown.

In `@src/main/routes/index.ts`:
- Around line 1836-1841: The route handlers (e.g., the case for
skillsInstallFromFolderRoute.name that calls
runtime.skillPresenter.installFromFolder) currently call
recordSkillSettingsActivity unconditionally; update each handler (including the
similarly structured cases at the other ranges) to call
recordSkillSettingsActivity only after confirming the presenter operation
succeeded by checking the returned result (e.g., result.success flag or absence
of an error field) and only then parse/return the output; if the presenter
indicates failure, skip recording activity and return the failure result as-is
so history remains correct.

In `@src/renderer/settings/components/PluginsSettings.vue`:
- Around line 9-11: The refresh Button currently renders an icon-only control
(Button with `@click`="loadPlugins" and Icon icon="lucide:refresh-cw") with no
accessible name; add an explicit accessible label (e.g., aria-label or
:aria-label bound to a localized string like "Refresh plugins") and optionally a
title attribute so screen readers and hover users can identify the action,
ensuring it remains disabled when loading (keep the existing
:disabled="loading") and still invokes loadPlugins on click.

In `@src/renderer/settings/components/SettingsOverview.vue`:
- Around line 319-323: The recent-activity fetch can throw and break mount; wrap
the await settingsClient.listRecentActivity(200) call in a try/catch inside the
setup/mount flow (around where activities.value is assigned) and on error set
activities.value = [] (or a safe default), log the error, then continue to await
nextTick and perform the existing usageDashboardRef scroll logic that checks
route.query.section === 'usage' so the overview still mounts even if the IPC/DB
call fails.

In `@src/renderer/src/i18n/da-DK/settings.json`:
- Around line 187-192: The new Danish locale entries are still in
English/Chinese; update the values for keys like "privacyTitle",
"privacyDescription", and the nested "dangerZone.title"/"dangerZone.description"
(and the other ranges mentioned: provider.center.*, mcp.center.*,
controlCenter.*) with proper Danish translations so the UI is fully localized;
locate and replace the English/Chinese strings in
src/renderer/src/i18n/da-DK/settings.json (and the other listed ranges) with
concise Danish equivalents that preserve the original meaning and punctuation.

In `@src/renderer/src/i18n/ja-JP/settings.json`:
- Around line 254-258: The new Japanese locale strings are still in English;
update the ja-JP translations for the keys privacyTitle, privacyDescription,
dangerZone.title, and dangerZone.description (and any other newly added English
strings noted around the other ranges) so the Settings Control Center and
MCP/Provider/Data sections display Japanese; locate these keys in
src/renderer/src/i18n/ja-JP/settings.json (e.g., "privacyTitle",
"privacyDescription", "dangerZone.title", "dangerZone.description") and replace
the English text with appropriate Japanese translations consistent with existing
style and terminology.

In `@src/renderer/src/i18n/ko-KR/settings.json`:
- Around line 254-259: The Korean locale file contains untranslated English
strings; translate the keys shown (privacyTitle, privacyDescription,
dangerZone.title, dangerZone.description) into natural Korean and likewise scan
and translate other untranslated keys referenced (data, provider.center,
mcp.center, controlCenter and the blocks around the other ranges noted) so the
settings UI is fully Korean; update the corresponding values in
src/renderer/src/i18n/ko-KR/settings.json replacing the English text with proper
Korean translations while keeping the JSON keys unchanged and preserving
punctuation and placeholders.

In `@src/renderer/src/i18n/pt-BR/settings.json`:
- Around line 254-259: The Portuguese locale file still contains English strings
for new settings keys; update the pt-BR translations for the settings keys
(e.g., "privacyTitle", "privacyDescription", "dangerZone" and the missing/new
keys "data", "provider.center", "mcp.center", "controlCenter") to proper
Brazilian Portuguese equivalents in src/renderer/src/i18n/pt-BR/settings.json
(also fix the other ranges referenced around lines 885-903, 1204-1220,
1963-2035) so all core settings pages show consistent pt-BR text; locate the
keys by name in the JSON and replace the English values with their Portuguese
translations.

In `@src/renderer/src/i18n/ru-RU/settings.json`:
- Around line 254-259: Several new locale keys remain in English; locate the
keys "data", "provider.center", "mcp.center", and "controlCenter" in the ru-RU
settings JSON (and any other English-valued keys in the same file) and replace
their English strings with proper Russian translations, preserving key names and
JSON structure; review other blocks flagged (the other similar English blocks in
this file) and ensure all UI-facing strings are translated consistently into
Russian, then run a quick locale lint/preview to verify no mixed-language UI
remains.

In `@src/renderer/src/i18n/zh-HK/settings.json`:
- Around line 254-258: The zh-HK localization contains mixed Simplified Chinese
and English in keys like "privacyTitle", "privacyDescription", and
"dangerZone.title"/"dangerZone.description" — update these values to consistent
Traditional Chinese phrasing; replace "Data & Privacy" and any
Simplified/English segments with proper Traditional Chinese equivalents and
ensure the "dangerZone.description" uses Traditional characters and tone; also
scan and normalize the other affected ranges (lines referenced: 885-903,
1206-1220, 1963-2035) to the same Traditional Chinese style so all entries in
this file consistently use zh-HK wording.

In `@src/renderer/src/i18n/zh-TW/settings.json`:
- Around line 254-259: The zh-TW translations contain mixed Simplified Chinese
and English for keys like "privacyTitle", "privacyDescription", "dangerZone" and
sections referenced as provider.center, mcp.center, and controlCenter; update
these string values to proper Traditional Chinese equivalents (replace
Simplified/English wording with correct Traditional Chinese characters and
localized phrasing) so the zh-TW locale is consistent; apply the same
normalization to the other new zh-TW additions mentioned (the other changed
blocks) ensuring all new keys use Traditional Chinese wording.

---

Outside diff comments:
In `@src/renderer/settings/components/skills/SkillsSettings.vue`:
- Around line 270-273: The current handleDraftSuggestionsToggle uses
Boolean(nextValue) which treats the string "false" as true; change the
normalization to explicitly handle string payloads (e.g., if typeof nextValue
=== 'string' then normalized = nextValue === 'true' else normalized =
Boolean(nextValue')) so draftSuggestionsEnabled.value and the call to
configPresenter.setSkillDraftSuggestionsEnabled receive the correct boolean;
update the logic inside handleDraftSuggestionsToggle (referencing
draftSuggestionsEnabled and configPresenter.setSkillDraftSuggestionsEnabled)
accordingly.

---

Minor comments:
In `@docs/features/settings-control-center/plan.md`:
- Line 12: The plan text in docs/features/settings-control-center/plan.md still
lists a "Limits" tab which is outdated; update the provider tab plan text to
match the implemented tab model by removing "Limits" and describing the tabs as
"Connect / Models / Advanced" (or "Connection, Models, Advanced" to match
existing phrasing) so the document aligns with the implemented behavior.

In `@src/renderer/settings/components/AboutUsSettings.vue`:
- Line 8: The <img> in AboutUsSettings.vue is missing an alt attribute which
makes the logo inaccessible to screen readers; update the <img
src="@/assets/logo.png" class="h-10 w-10" /> element to include a descriptive
alt (e.g., alt="App logo" or a localized string) so screen readers can announce
it, or use alt="" if the image is purely decorative; ensure you edit the img
element in AboutUsSettings.vue to add that alt attribute.

In `@src/renderer/settings/components/control-center/UsageNostalgiaCard.vue`:
- Around line 217-220: In getDaysWithDeepChat change the falsy check so a valid
timestamp 0 is not treated as missing: replace the `if (!value)` guard with an
explicit null check (e.g., `if (value === null)`), ensuring the function only
returns null for actual null inputs while preserving normal behavior for 0 and
other numbers.

In `@src/renderer/settings/components/SettingsOverview.vue`:
- Around line 129-131: Replace the raw category code being displayed in
SettingsOverview.vue (currently {{ activity.category }} inside <Badge>) with a
localized label: create a small mapper (e.g., computed property or method named
getActivityLabel or activityLabel) that maps activity.category codes to vue-i18n
keys defined in src/renderer/src/i18n, then call $t(mappedKey) (or useI18n().t)
in the template instead of the raw value; ensure every category code has a
corresponding i18n key and fallback to a generic key for unknown codes.

In `@src/renderer/src/i18n/da-DK/routes.json`:
- Line 23: The "settings-overview" route label in the da-DK locale file is still
in English; update the value for the "settings-overview" key in
src/renderer/src/i18n/da-DK/routes.json to a proper Danish translation such as
"Oversigt over indstillinger" so the Danish locale contains a localized route
label.

In `@src/renderer/src/i18n/fa-IR/routes.json`:
- Around line 22-23: Replace the English values for the i18n keys
"settings-plugins" and "settings-overview" with Persian translations so the
fa-IR locale shows localized labels; update the value for "settings-plugins" to
"افزونه‌ها" and the value for "settings-overview" to "نمای کلی تنظیمات" in the
routes.json entry for these keys.

In `@src/renderer/src/i18n/fa-IR/settings.json`:
- Around line 254-259: The new fa-IR entries are still in English; replace the
English fallback strings with Persian translations for the keys shown
(privacyTitle, privacyDescription, dangerZone.title, dangerZone.description) and
similarly localize the other reported blocks (data.privacy*, provider.center.*,
mcp.center.*, controlCenter.*) referenced in the comment ranges (885-903,
1204-1220, 1963-2035); update the JSON values with appropriate Persian text,
preserving the same key names and JSON structure, and ensure encoding/escaping
remains valid for fa-IR.

In `@src/renderer/src/i18n/fr-FR/routes.json`:
- Line 23: The "settings-overview" route label in the fr-FR locale is still in
English; update the value for the "settings-overview" key in
src/renderer/src/i18n/fr-FR/routes.json to a proper French translation (e.g.,
"Aperçu des paramètres" or preferred French phrasing) so the fr-FR routes file
contains the localized label.

In `@src/renderer/src/i18n/fr-FR/settings.json`:
- Around line 254-259: The French locale still contains English strings for the
newly added settings keys—update the translations for the keys privacyTitle,
privacyDescription, dangerZone.title, and dangerZone.description (and the other
mentioned groups: data.privacy*, provider.center.*, mcp.center.*,
controlCenter.*) so the UI is fully French; replace the English text with proper
French equivalents for each key in src/renderer/src/i18n/fr-FR/settings.json
(e.g., translate "Data & Privacy", "Manage backup, sync, privacy mode,
maintenance, and dangerous operations.", "Danger Zone", and "Reset chat,
knowledge, or all data. This cannot be undone.") and do the same for the other
ranges referenced so no new keys remain in English.

In `@src/renderer/src/i18n/he-IL/routes.json`:
- Line 23: Replace the English value for the key "settings-overview" in
routes.json with a Hebrew translation; locate the "settings-overview" entry and
change "Settings Overview" to a Hebrew string such as "סקירת ההגדרות" so the
he-IL locale file contains a proper Hebrew translation.

In `@src/renderer/src/i18n/he-IL/settings.json`:
- Around line 254-259: The new settings-center strings are still in English;
update the Hebrew locale entries so the keys under data.privacy* (e.g.,
"privacyTitle", "privacyDescription", "dangerZone.title",
"dangerZone.description") and the group of keys for provider.center.*,
mcp.center.*, and controlCenter.* are fully translated into idiomatic he-IL
(RTL) Hebrew; locate these keys in src/renderer/src/i18n/he-IL/settings.json and
replace the English text with proper Hebrew translations while preserving the
JSON keys and punctuation/escape sequences.

In `@src/renderer/src/i18n/ja-JP/routes.json`:
- Around line 22-23: Replace the English values for the JSON keys
"settings-plugins" and "settings-overview" in the Japanese locale (routes.json)
with proper Japanese translations; change "settings-plugins" value to "プラグイン"
and "settings-overview" value to "設定の概要" (or "設定概要" if you prefer a shorter
label) so Japanese users see localized route labels.

In `@src/renderer/src/i18n/ko-KR/routes.json`:
- Line 23: Replace the English value for the locale key "settings-overview" in
the ko-KR routes.json with a proper Korean translation (e.g., "설정 개요") so the
Korean locale file contains Korean text consistent with other entries; update
the value for the "settings-overview" key accordingly.

In `@src/renderer/src/i18n/pt-BR/routes.json`:
- Line 23: Update the pt-BR translation for the "settings-overview" route key by
replacing the English string "Settings Overview" with the Portuguese translation
"Visão geral das configurações" in src/renderer/src/i18n/pt-BR/routes.json so
the key "settings-overview" returns the localized text.

In `@src/renderer/src/i18n/ru-RU/routes.json`:
- Line 23: The "settings-overview" translation is still in English; replace its
value with a proper Russian translation (e.g., "Обзор настроек") so the
"settings-overview" key in the ru-RU locale is localized to Russian.

In `@src/renderer/src/i18n/zh-HK/routes.json`:
- Line 23: The value for the "settings-overview" key in routes.json is written
in Simplified Chinese ("设置概览"); update it to Traditional Chinese for the zh-HK
locale (e.g. "設定概覽") so the "settings-overview" translation uses Hong Kong
Traditional characters.

In `@src/renderer/src/i18n/zh-TW/routes.json`:
- Line 23: Replace the Simplified Chinese value for the "settings-overview" key
with the correct Traditional Chinese wording for the zh-TW locale; specifically
change the value "设置概览" to the Traditional Chinese equivalent "設定概覽" for the
"settings-overview" entry so it matches the rest of the file's zh-TW
translations.

---

Nitpick comments:
In `@src/renderer/src/i18n/en-US/settings.json`:
- Around line 960-965: Remove the stale translation key "limits" under the
"tabs" object (provider.center.tabs.limits) since Limits was merged into
Advanced; delete the "limits": "Limits" entry from the JSON and search for any
runtime references to provider.center.tabs.limits and replace them with
provider.center.tabs.advanced or remove the usage so no dead i18n key remains.

In `@test/main/presenter/settingsActivityTable.test.ts`:
- Around line 27-53: The test opens an in-memory SQLite handle with new
DatabaseCtor(':memory:') and only calls db.close() on the happy path; wrap the
test body that uses DatabaseCtor and SettingsActivityTableCtor (where you call
table.createTable(), table.record(...), table.list(...), and assertions) in a
try/finally and move db.close() into the finally block so the DB handle is
always closed even if an assertion throws; apply the same try/finally pattern to
the other test that uses DatabaseCtor/SettingsActivityTableCtor around lines
55-81.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: aabedb17-35aa-44ab-a59d-63db427943ed

📥 Commits

Reviewing files that changed from the base of the PR and between 3657159 and 46e1732.

📒 Files selected for processing (110)
  • docs/features/context-engineering-label/plan.md
  • docs/features/context-engineering-label/spec.md
  • docs/features/context-engineering-label/tasks.md
  • docs/features/data-sync-card-header/plan.md
  • docs/features/data-sync-card-header/spec.md
  • docs/features/data-sync-card-header/tasks.md
  • docs/features/mcp-footer-alignment/plan.md
  • docs/features/mcp-footer-alignment/spec.md
  • docs/features/mcp-footer-alignment/tasks.md
  • docs/features/mcp-settings-status-bar/plan.md
  • docs/features/mcp-settings-status-bar/spec.md
  • docs/features/mcp-settings-status-bar/tasks.md
  • docs/features/provider-detail-simplification/plan.md
  • docs/features/provider-detail-simplification/spec.md
  • docs/features/provider-detail-simplification/tasks.md
  • docs/features/remote-system-group/plan.md
  • docs/features/remote-system-group/spec.md
  • docs/features/remote-system-group/tasks.md
  • docs/features/settings-agent-capability-groups/plan.md
  • docs/features/settings-agent-capability-groups/spec.md
  • docs/features/settings-agent-capability-groups/tasks.md
  • docs/features/settings-control-center/plan.md
  • docs/features/settings-control-center/spec.md
  • docs/features/settings-control-center/tasks.md
  • docs/features/settings-overview-agent-card/plan.md
  • docs/features/settings-overview-agent-card/spec.md
  • docs/features/settings-overview-agent-card/tasks.md
  • docs/features/settings-overview-cards/plan.md
  • docs/features/settings-overview-cards/spec.md
  • docs/features/settings-overview-cards/tasks.md
  • docs/features/settings-overview-quickstart-dashboard/plan.md
  • docs/features/settings-overview-quickstart-dashboard/spec.md
  • docs/features/settings-overview-quickstart-dashboard/tasks.md
  • docs/features/shortcut-system-group/plan.md
  • docs/features/shortcut-system-group/spec.md
  • docs/features/shortcut-system-group/tasks.md
  • docs/issues/mcp-toggle-opens-detail/plan.md
  • docs/issues/mcp-toggle-opens-detail/spec.md
  • docs/issues/mcp-toggle-opens-detail/tasks.md
  • src/main/presenter/index.ts
  • src/main/presenter/sqlitePresenter/index.ts
  • src/main/presenter/sqlitePresenter/schemaCatalog.ts
  • src/main/presenter/sqlitePresenter/tables/settingsActivity.ts
  • src/main/routes/index.ts
  • src/renderer/api/SettingsClient.ts
  • src/renderer/settings/App.vue
  • src/renderer/settings/components/AboutUsSettings.vue
  • src/renderer/settings/components/CommonSettings.vue
  • src/renderer/settings/components/DashboardSettings.vue
  • src/renderer/settings/components/DataSettings.vue
  • src/renderer/settings/components/DeepChatAgentsSettings.vue
  • src/renderer/settings/components/DisplaySettings.vue
  • src/renderer/settings/components/EnvironmentsSettings.vue
  • src/renderer/settings/components/KnowledgeBaseSettings.vue
  • src/renderer/settings/components/McpSettings.vue
  • src/renderer/settings/components/ModelProviderSettings.vue
  • src/renderer/settings/components/ModelProviderSettingsDetail.vue
  • src/renderer/settings/components/NotificationsHooksSettings.vue
  • src/renderer/settings/components/PluginsSettings.vue
  • src/renderer/settings/components/PromptSetting.vue
  • src/renderer/settings/components/ProviderModelManager.vue
  • src/renderer/settings/components/RemoteSettings.vue
  • src/renderer/settings/components/SettingsOverview.vue
  • src/renderer/settings/components/ShortcutSettings.vue
  • src/renderer/settings/components/control-center/SettingsPageShell.vue
  • src/renderer/settings/components/control-center/SettingsSectionCard.vue
  • src/renderer/settings/components/control-center/StatusMetricCard.vue
  • src/renderer/settings/components/control-center/UsageNostalgiaCard.vue
  • src/renderer/settings/components/skills/SkillsSettings.vue
  • src/renderer/settings/main.ts
  • src/renderer/src/components/mcp-config/components/McpServerCard.vue
  • src/renderer/src/components/mcp-config/components/McpServers.vue
  • src/renderer/src/i18n/da-DK/routes.json
  • src/renderer/src/i18n/da-DK/settings.json
  • src/renderer/src/i18n/en-US/routes.json
  • src/renderer/src/i18n/en-US/settings.json
  • src/renderer/src/i18n/fa-IR/routes.json
  • src/renderer/src/i18n/fa-IR/settings.json
  • src/renderer/src/i18n/fr-FR/routes.json
  • src/renderer/src/i18n/fr-FR/settings.json
  • src/renderer/src/i18n/he-IL/routes.json
  • src/renderer/src/i18n/he-IL/settings.json
  • src/renderer/src/i18n/ja-JP/routes.json
  • src/renderer/src/i18n/ja-JP/settings.json
  • src/renderer/src/i18n/ko-KR/routes.json
  • src/renderer/src/i18n/ko-KR/settings.json
  • src/renderer/src/i18n/pt-BR/routes.json
  • src/renderer/src/i18n/pt-BR/settings.json
  • src/renderer/src/i18n/ru-RU/routes.json
  • src/renderer/src/i18n/ru-RU/settings.json
  • src/renderer/src/i18n/zh-CN/routes.json
  • src/renderer/src/i18n/zh-CN/settings.json
  • src/renderer/src/i18n/zh-HK/routes.json
  • src/renderer/src/i18n/zh-HK/settings.json
  • src/renderer/src/i18n/zh-TW/routes.json
  • src/renderer/src/i18n/zh-TW/settings.json
  • src/shared/contracts/routes.ts
  • src/shared/contracts/routes/settings.routes.ts
  • src/shared/contracts/routes/system.routes.ts
  • src/shared/settingsNavigation.ts
  • src/shared/types/presenters/legacy.presenters.d.ts
  • test/e2e/specs/04-settings-navigation.smoke.spec.ts
  • test/main/presenter/settingsActivityTable.test.ts
  • test/main/shared/settingsNavigation.test.ts
  • test/renderer/components/DataSettings.test.ts
  • test/renderer/components/McpServerCard.test.ts
  • test/renderer/components/McpServers.test.ts
  • test/renderer/components/McpSettings.test.ts
  • test/renderer/components/ModelProviderSettings.test.ts
  • test/renderer/components/SettingsApp.test.ts

Comment thread docs/features/settings-overview-quickstart-dashboard/spec.md
Comment thread src/main/presenter/sqlitePresenter/index.ts
Comment thread src/main/routes/index.ts
Comment thread src/renderer/settings/components/PluginsSettings.vue Outdated
Comment thread src/renderer/settings/components/SettingsOverview.vue Outdated
Comment thread src/renderer/src/i18n/ko-KR/settings.json
Comment thread src/renderer/src/i18n/pt-BR/settings.json
Comment thread src/renderer/src/i18n/ru-RU/settings.json
Comment thread src/renderer/src/i18n/zh-HK/settings.json
Comment thread src/renderer/src/i18n/zh-TW/settings.json
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/renderer/src/components/mcp-config/components/McpServers.vue`:
- Line 60: Rename the constant mcpFilters to use SCREAMING_SNAKE_CASE (e.g.,
MCP_FILTERS) and update all references to it (including the place currently
using mcpFilters in the template/logic) so the identifier change is consistent
across the component; ensure the const declaration (mcpFilters) and any usages
(such as the selection/filter logic that reads it) are updated to MCP_FILTERS.
- Around line 367-373: The handler in the Sheet component uses
selectedDetailServerName incorrectly by assigning directly to the ref instead of
its value; update the `@update`:open callback to set
selectedDetailServerName.value = '' when open is false (and ensure any other
direct uses/assignments of selectedDetailServerName in this file use .value);
locate the Sheet block and the ref declared as selectedDetailServerName (and
related selectedDetailServer) to make the fix.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1846c607-ddb3-4e0f-a917-2122065c1a80

📥 Commits

Reviewing files that changed from the base of the PR and between 46e1732 and c390c7d.

📒 Files selected for processing (6)
  • docs/features/mcp-footer-alignment/plan.md
  • docs/features/mcp-footer-alignment/spec.md
  • docs/features/mcp-footer-alignment/tasks.md
  • src/renderer/settings/components/McpSettings.vue
  • src/renderer/src/components/mcp-config/components/McpServers.vue
  • test/renderer/components/McpSettings.test.ts
✅ Files skipped from review due to trivial changes (3)
  • docs/features/mcp-footer-alignment/tasks.md
  • docs/features/mcp-footer-alignment/plan.md
  • docs/features/mcp-footer-alignment/spec.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • test/renderer/components/McpSettings.test.ts
  • src/renderer/settings/components/McpSettings.vue

Comment thread src/renderer/src/components/mcp-config/components/McpServers.vue Outdated
Comment thread src/renderer/src/components/mcp-config/components/McpServers.vue Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/features/settings-control-center/plan.md`:
- Line 11: Update the plan text for SettingsOverview to reflect shipped behavior
by removing the outdated “needs attention” panel mention and replacing it with
the current sections: usage/token/memories, recent setting changes, embedded
usage dashboard, passive status cards, and quick tasks; update any sentence that
currently reads "needs attention" to explicitly list "usage/token/memories" and
"recent setting changes" so the doc matches the implemented UX for the
SettingsOverview component.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 636c05fc-4d84-4870-a1a8-6711e3421377

📥 Commits

Reviewing files that changed from the base of the PR and between 10aface and 011b5a2.

📒 Files selected for processing (36)
  • docs/features/settings-control-center/plan.md
  • docs/features/settings-overview-cards/spec.md
  • docs/issues/pr-review-followups/plan.md
  • docs/issues/pr-review-followups/spec.md
  • docs/issues/pr-review-followups/tasks.md
  • src/main/presenter/sqlitePresenter/index.ts
  • src/main/routes/index.ts
  • src/renderer/settings/components/AboutUsSettings.vue
  • src/renderer/settings/components/PluginsSettings.vue
  • src/renderer/settings/components/SettingsOverview.vue
  • src/renderer/settings/components/control-center/UsageNostalgiaCard.vue
  • src/renderer/settings/components/skills/SkillsSettings.vue
  • src/renderer/src/components/mcp-config/components/McpServers.vue
  • src/renderer/src/i18n/da-DK/routes.json
  • src/renderer/src/i18n/da-DK/settings.json
  • src/renderer/src/i18n/en-US/settings.json
  • src/renderer/src/i18n/fa-IR/routes.json
  • src/renderer/src/i18n/fa-IR/settings.json
  • src/renderer/src/i18n/fr-FR/routes.json
  • src/renderer/src/i18n/fr-FR/settings.json
  • src/renderer/src/i18n/he-IL/routes.json
  • src/renderer/src/i18n/he-IL/settings.json
  • src/renderer/src/i18n/ja-JP/routes.json
  • src/renderer/src/i18n/ja-JP/settings.json
  • src/renderer/src/i18n/ko-KR/routes.json
  • src/renderer/src/i18n/ko-KR/settings.json
  • src/renderer/src/i18n/pt-BR/routes.json
  • src/renderer/src/i18n/pt-BR/settings.json
  • src/renderer/src/i18n/ru-RU/routes.json
  • src/renderer/src/i18n/ru-RU/settings.json
  • src/renderer/src/i18n/zh-CN/settings.json
  • src/renderer/src/i18n/zh-HK/routes.json
  • src/renderer/src/i18n/zh-HK/settings.json
  • src/renderer/src/i18n/zh-TW/routes.json
  • src/renderer/src/i18n/zh-TW/settings.json
  • test/main/presenter/settingsActivityTable.test.ts
✅ Files skipped from review due to trivial changes (18)
  • docs/issues/pr-review-followups/tasks.md
  • src/renderer/src/i18n/zh-TW/routes.json
  • docs/issues/pr-review-followups/plan.md
  • src/renderer/src/i18n/ko-KR/routes.json
  • src/renderer/src/i18n/he-IL/routes.json
  • src/renderer/src/i18n/ru-RU/routes.json
  • src/renderer/src/i18n/zh-HK/routes.json
  • docs/features/settings-overview-cards/spec.md
  • src/renderer/src/i18n/ja-JP/settings.json
  • src/renderer/src/i18n/pt-BR/routes.json
  • src/renderer/src/i18n/fa-IR/routes.json
  • src/renderer/src/i18n/da-DK/routes.json
  • src/renderer/src/i18n/fa-IR/settings.json
  • src/renderer/src/i18n/he-IL/settings.json
  • src/renderer/src/i18n/ko-KR/settings.json
  • src/renderer/src/i18n/zh-TW/settings.json
  • src/renderer/src/i18n/pt-BR/settings.json
  • src/renderer/src/i18n/en-US/settings.json
🚧 Files skipped from review as they are similar to previous changes (15)
  • src/renderer/settings/components/PluginsSettings.vue
  • src/renderer/src/i18n/ja-JP/routes.json
  • src/renderer/settings/components/AboutUsSettings.vue
  • src/renderer/src/i18n/fr-FR/settings.json
  • src/renderer/settings/components/skills/SkillsSettings.vue
  • src/renderer/src/i18n/ru-RU/settings.json
  • test/main/presenter/settingsActivityTable.test.ts
  • src/renderer/settings/components/control-center/UsageNostalgiaCard.vue
  • src/renderer/src/i18n/zh-HK/settings.json
  • src/renderer/src/i18n/da-DK/settings.json
  • src/main/presenter/sqlitePresenter/index.ts
  • src/renderer/src/i18n/zh-CN/settings.json
  • src/renderer/src/components/mcp-config/components/McpServers.vue
  • src/renderer/settings/components/SettingsOverview.vue
  • src/main/routes/index.ts

Comment thread docs/features/settings-control-center/plan.md
@zerob13 zerob13 merged commit 5e56c47 into dev May 12, 2026
3 checks passed
@zhangmo8 zhangmo8 deleted the feat/new-settings-layout branch May 12, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant