feat(settings): add settings control center#1612
Conversation
📝 WalkthroughWalkthroughAdds 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. ChangesSettings Control Center, Navigation, MCP/Providers/Data UI, and Activity Tracking
Estimated code review effort Possibly related PRs
Suggested labels Suggested reviewers
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
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 winBoolean coercion here can mis-handle string payloads.
Boolean(nextValue)turns'false'intotrue. 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 winTranslate to Hebrew.
The translation for
settings-overviewis 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 winUse 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 winUse 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 winTranslate to Russian.
The translation for
settings-overviewis 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 winUse French translation for the new overview route label.
Line 23 is still English (
"Settings Overview"). Please localize it infr-FRto 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 winLocalize Danish route label instead of English placeholder.
Line 23 uses
"Settings Overview"in ada-DKlocale 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 winTranslate 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 winProvide Persian translations for the new route labels.
Both
settings-pluginsandsettings-overviewcontain 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 winProvide Japanese translations for the new route labels.
Both
settings-pluginsandsettings-overviewcontain 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 winLocalize 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 winTranslate 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 winComplete 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 = 0is treated as missing dataUsing
if (!value)marks a valid timestamp (0) as unavailable. This should only treatnullas 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 winProvide 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 winUpdate provider tab plan to match the implemented tab model.
Line 12 still includes
Limits, but this PR’s target behavior usesConnect / Models / Advancedwith 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 winAdd an accessible
alttext 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 winLocalize activity category labels instead of rendering raw category codes.
Showing raw
activity.categoryleaks 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/i18ninstead 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 winRemove stale
limitstab key from Provider Center translations.
provider.center.tabs.limitslooks 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 winClose in-memory SQLite handles in
finallyblocks.
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
📒 Files selected for processing (110)
docs/features/context-engineering-label/plan.mddocs/features/context-engineering-label/spec.mddocs/features/context-engineering-label/tasks.mddocs/features/data-sync-card-header/plan.mddocs/features/data-sync-card-header/spec.mddocs/features/data-sync-card-header/tasks.mddocs/features/mcp-footer-alignment/plan.mddocs/features/mcp-footer-alignment/spec.mddocs/features/mcp-footer-alignment/tasks.mddocs/features/mcp-settings-status-bar/plan.mddocs/features/mcp-settings-status-bar/spec.mddocs/features/mcp-settings-status-bar/tasks.mddocs/features/provider-detail-simplification/plan.mddocs/features/provider-detail-simplification/spec.mddocs/features/provider-detail-simplification/tasks.mddocs/features/remote-system-group/plan.mddocs/features/remote-system-group/spec.mddocs/features/remote-system-group/tasks.mddocs/features/settings-agent-capability-groups/plan.mddocs/features/settings-agent-capability-groups/spec.mddocs/features/settings-agent-capability-groups/tasks.mddocs/features/settings-control-center/plan.mddocs/features/settings-control-center/spec.mddocs/features/settings-control-center/tasks.mddocs/features/settings-overview-agent-card/plan.mddocs/features/settings-overview-agent-card/spec.mddocs/features/settings-overview-agent-card/tasks.mddocs/features/settings-overview-cards/plan.mddocs/features/settings-overview-cards/spec.mddocs/features/settings-overview-cards/tasks.mddocs/features/settings-overview-quickstart-dashboard/plan.mddocs/features/settings-overview-quickstart-dashboard/spec.mddocs/features/settings-overview-quickstart-dashboard/tasks.mddocs/features/shortcut-system-group/plan.mddocs/features/shortcut-system-group/spec.mddocs/features/shortcut-system-group/tasks.mddocs/issues/mcp-toggle-opens-detail/plan.mddocs/issues/mcp-toggle-opens-detail/spec.mddocs/issues/mcp-toggle-opens-detail/tasks.mdsrc/main/presenter/index.tssrc/main/presenter/sqlitePresenter/index.tssrc/main/presenter/sqlitePresenter/schemaCatalog.tssrc/main/presenter/sqlitePresenter/tables/settingsActivity.tssrc/main/routes/index.tssrc/renderer/api/SettingsClient.tssrc/renderer/settings/App.vuesrc/renderer/settings/components/AboutUsSettings.vuesrc/renderer/settings/components/CommonSettings.vuesrc/renderer/settings/components/DashboardSettings.vuesrc/renderer/settings/components/DataSettings.vuesrc/renderer/settings/components/DeepChatAgentsSettings.vuesrc/renderer/settings/components/DisplaySettings.vuesrc/renderer/settings/components/EnvironmentsSettings.vuesrc/renderer/settings/components/KnowledgeBaseSettings.vuesrc/renderer/settings/components/McpSettings.vuesrc/renderer/settings/components/ModelProviderSettings.vuesrc/renderer/settings/components/ModelProviderSettingsDetail.vuesrc/renderer/settings/components/NotificationsHooksSettings.vuesrc/renderer/settings/components/PluginsSettings.vuesrc/renderer/settings/components/PromptSetting.vuesrc/renderer/settings/components/ProviderModelManager.vuesrc/renderer/settings/components/RemoteSettings.vuesrc/renderer/settings/components/SettingsOverview.vuesrc/renderer/settings/components/ShortcutSettings.vuesrc/renderer/settings/components/control-center/SettingsPageShell.vuesrc/renderer/settings/components/control-center/SettingsSectionCard.vuesrc/renderer/settings/components/control-center/StatusMetricCard.vuesrc/renderer/settings/components/control-center/UsageNostalgiaCard.vuesrc/renderer/settings/components/skills/SkillsSettings.vuesrc/renderer/settings/main.tssrc/renderer/src/components/mcp-config/components/McpServerCard.vuesrc/renderer/src/components/mcp-config/components/McpServers.vuesrc/renderer/src/i18n/da-DK/routes.jsonsrc/renderer/src/i18n/da-DK/settings.jsonsrc/renderer/src/i18n/en-US/routes.jsonsrc/renderer/src/i18n/en-US/settings.jsonsrc/renderer/src/i18n/fa-IR/routes.jsonsrc/renderer/src/i18n/fa-IR/settings.jsonsrc/renderer/src/i18n/fr-FR/routes.jsonsrc/renderer/src/i18n/fr-FR/settings.jsonsrc/renderer/src/i18n/he-IL/routes.jsonsrc/renderer/src/i18n/he-IL/settings.jsonsrc/renderer/src/i18n/ja-JP/routes.jsonsrc/renderer/src/i18n/ja-JP/settings.jsonsrc/renderer/src/i18n/ko-KR/routes.jsonsrc/renderer/src/i18n/ko-KR/settings.jsonsrc/renderer/src/i18n/pt-BR/routes.jsonsrc/renderer/src/i18n/pt-BR/settings.jsonsrc/renderer/src/i18n/ru-RU/routes.jsonsrc/renderer/src/i18n/ru-RU/settings.jsonsrc/renderer/src/i18n/zh-CN/routes.jsonsrc/renderer/src/i18n/zh-CN/settings.jsonsrc/renderer/src/i18n/zh-HK/routes.jsonsrc/renderer/src/i18n/zh-HK/settings.jsonsrc/renderer/src/i18n/zh-TW/routes.jsonsrc/renderer/src/i18n/zh-TW/settings.jsonsrc/shared/contracts/routes.tssrc/shared/contracts/routes/settings.routes.tssrc/shared/contracts/routes/system.routes.tssrc/shared/settingsNavigation.tssrc/shared/types/presenters/legacy.presenters.d.tstest/e2e/specs/04-settings-navigation.smoke.spec.tstest/main/presenter/settingsActivityTable.test.tstest/main/shared/settingsNavigation.test.tstest/renderer/components/DataSettings.test.tstest/renderer/components/McpServerCard.test.tstest/renderer/components/McpServers.test.tstest/renderer/components/McpSettings.test.tstest/renderer/components/ModelProviderSettings.test.tstest/renderer/components/SettingsApp.test.ts
There was a problem hiding this comment.
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
📒 Files selected for processing (6)
docs/features/mcp-footer-alignment/plan.mddocs/features/mcp-footer-alignment/spec.mddocs/features/mcp-footer-alignment/tasks.mdsrc/renderer/settings/components/McpSettings.vuesrc/renderer/src/components/mcp-config/components/McpServers.vuetest/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
There was a problem hiding this comment.
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
📒 Files selected for processing (36)
docs/features/settings-control-center/plan.mddocs/features/settings-overview-cards/spec.mddocs/issues/pr-review-followups/plan.mddocs/issues/pr-review-followups/spec.mddocs/issues/pr-review-followups/tasks.mdsrc/main/presenter/sqlitePresenter/index.tssrc/main/routes/index.tssrc/renderer/settings/components/AboutUsSettings.vuesrc/renderer/settings/components/PluginsSettings.vuesrc/renderer/settings/components/SettingsOverview.vuesrc/renderer/settings/components/control-center/UsageNostalgiaCard.vuesrc/renderer/settings/components/skills/SkillsSettings.vuesrc/renderer/src/components/mcp-config/components/McpServers.vuesrc/renderer/src/i18n/da-DK/routes.jsonsrc/renderer/src/i18n/da-DK/settings.jsonsrc/renderer/src/i18n/en-US/settings.jsonsrc/renderer/src/i18n/fa-IR/routes.jsonsrc/renderer/src/i18n/fa-IR/settings.jsonsrc/renderer/src/i18n/fr-FR/routes.jsonsrc/renderer/src/i18n/fr-FR/settings.jsonsrc/renderer/src/i18n/he-IL/routes.jsonsrc/renderer/src/i18n/he-IL/settings.jsonsrc/renderer/src/i18n/ja-JP/routes.jsonsrc/renderer/src/i18n/ja-JP/settings.jsonsrc/renderer/src/i18n/ko-KR/routes.jsonsrc/renderer/src/i18n/ko-KR/settings.jsonsrc/renderer/src/i18n/pt-BR/routes.jsonsrc/renderer/src/i18n/pt-BR/settings.jsonsrc/renderer/src/i18n/ru-RU/routes.jsonsrc/renderer/src/i18n/ru-RU/settings.jsonsrc/renderer/src/i18n/zh-CN/settings.jsonsrc/renderer/src/i18n/zh-HK/routes.jsonsrc/renderer/src/i18n/zh-HK/settings.jsonsrc/renderer/src/i18n/zh-TW/routes.jsonsrc/renderer/src/i18n/zh-TW/settings.jsontest/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
Summary
UI Layout
Before:
After:
Validation
pnpm run formatpnpm run i18npnpm run lintpnpm run typecheck:webpnpm run typecheckbefore push.Summary by CodeRabbit
New Features
Improvements
Bug Fixes