feat(profiles): split Claude Desktop into independent profile scope

This commit is contained in:
Jason
2026-07-04 23:18:20 +08:00
parent 3ec83578f6
commit 754af2cc31
11 changed files with 137 additions and 43 deletions
+3
View File
@@ -390,6 +390,9 @@ function App() {
await queryClient.invalidateQueries({ queryKey: ["skills"] });
await queryClient.invalidateQueries({ queryKey: ["proxyTakeoverStatus"] });
await queryClient.invalidateQueries({ queryKey: ["proxyStatus"] });
await queryClient.invalidateQueries({
queryKey: ["providers", "claude-desktop"],
});
});
useTauriEvent<SyncStatusUpdatedPayload | null | undefined>(
+4 -2
View File
@@ -8,19 +8,21 @@ import type { PerApp, Profile, ProfileScope } from "@/lib/api/profiles";
*/
export const APP_PROFILE_SCOPE: Partial<Record<AppId, ProfileScope>> = {
claude: "claude",
"claude-desktop": "claude",
"claude-desktop": "claude-desktop",
codex: "codex",
};
/** 分组显示名(产品名,不进 i18n;与后端托盘子菜单标签一致) */
export const PROFILE_SCOPE_LABELS: Record<ProfileScope, string> = {
claude: "Claude Code",
"claude-desktop": "Claude Desktop",
codex: "Codex",
};
/** 分组内的 payload 槽位 key(后端 ProfileScope::apps 的前端镜像) */
const SCOPE_SLOT_KEYS: Record<ProfileScope, (keyof PerApp<unknown>)[]> = {
claude: ["claude", "claude-desktop"],
claude: ["claude"],
"claude-desktop": ["claude-desktop"],
codex: ["codex"],
};
+4 -2
View File
@@ -1868,7 +1868,8 @@
},
"profiles": {
"switcherTooltip": {
"claude": "Projects: switch the Claude Code provider / MCP / Skills / memory files, plus the Claude Desktop provider, in one click",
"claude": "Projects: switch the Claude Code provider / MCP / Skills / memory files in one click",
"claude-desktop": "Projects: switch the Claude Desktop provider in one click",
"codex": "Projects: switch the Codex provider / MCP / Skills / memory files in one click"
},
"none": "No project",
@@ -1876,7 +1877,8 @@
"empty": "No projects yet",
"createFromCurrent": "New project",
"createDescription": {
"claude": "Save the current Claude Code provider, MCP, Skills and memory file (plus the Claude Desktop provider) as a project you can switch to later.",
"claude": "Save the current Claude Code provider, MCP, Skills and memory file as a project you can switch to later.",
"claude-desktop": "Save the current Claude Desktop provider as a project you can switch to later.",
"codex": "Save the current Codex provider, MCP, Skills and memory file configuration as a project you can switch to later."
},
"manage": "Manage projects…",
+4 -2
View File
@@ -1868,7 +1868,8 @@
},
"profiles": {
"switcherTooltip": {
"claude": "プロジェクト:Claude Code のプロバイダー / MCP / Skills / メモリファイル、および Claude Desktop のプロバイダーをワンクリックで切り替え",
"claude": "プロジェクト:Claude Code のプロバイダー / MCP / Skills / メモリファイルをワンクリックで切り替え",
"claude-desktop": "プロジェクト:Claude Desktop のプロバイダーをワンクリックで切り替え",
"codex": "プロジェクト:Codex のプロバイダー / MCP / Skills / メモリファイルをワンクリックで切り替え"
},
"none": "プロジェクトを使用しない",
@@ -1876,7 +1877,8 @@
"empty": "プロジェクトはまだありません",
"createFromCurrent": "新規プロジェクト",
"createDescription": {
"claude": "Claude Code の現在のプロバイダー、MCP、Skills、メモリファイル(および Claude Desktop のプロバイダー)をプロジェクトとして保存し、後からワンクリックで切り替えられます。",
"claude": "Claude Code の現在のプロバイダー、MCP、Skills、メモリファイルをプロジェクトとして保存し、後からワンクリックで切り替えられます。",
"claude-desktop": "Claude Desktop の現在のプロバイダーをプロジェクトとして保存し、後からワンクリックで切り替えられます。",
"codex": "Codex の現在のプロバイダー、MCP、Skills、メモリファイルの設定をプロジェクトとして保存し、後からワンクリックで切り替えられます。"
},
"manage": "プロジェクトを管理…",
+4 -2
View File
@@ -1840,7 +1840,8 @@
},
"profiles": {
"switcherTooltip": {
"claude": "專案:一鍵切換 Claude Code 的供應商 / MCP / Skills / 記憶檔案,及 Claude Desktop 的供應商",
"claude": "專案:一鍵切換 Claude Code 的供應商 / MCP / Skills / 記憶檔案",
"claude-desktop": "專案:一鍵切換 Claude Desktop 的供應商",
"codex": "專案:一鍵切換 Codex 的供應商 / MCP / Skills / 記憶檔案"
},
"none": "不使用專案",
@@ -1848,7 +1849,8 @@
"empty": "尚無專案",
"createFromCurrent": "新建專案",
"createDescription": {
"claude": "把 Claude Code 目前的供應商、MCP、Skills、記憶檔案(及 Claude Desktop 的供應商)儲存為一個專案,之後可一鍵切換。",
"claude": "把 Claude Code 目前的供應商、MCP、Skills、記憶檔案儲存為一個專案,之後可一鍵切換。",
"claude-desktop": "把 Claude Desktop 目前的供應商儲存為一個專案,之後可一鍵切換。",
"codex": "把 Codex 目前的供應商、MCP、Skills 和記憶檔案設定儲存為一個專案,之後可一鍵切換。"
},
"manage": "管理專案…",
+4 -2
View File
@@ -1868,7 +1868,8 @@
},
"profiles": {
"switcherTooltip": {
"claude": "项目:一键切换 Claude Code 的供应商 / MCP / Skills / 记忆文件,及 Claude Desktop 的供应商",
"claude": "项目:一键切换 Claude Code 的供应商 / MCP / Skills / 记忆文件",
"claude-desktop": "项目:一键切换 Claude Desktop 的供应商",
"codex": "项目:一键切换 Codex 的供应商 / MCP / Skills / 记忆文件"
},
"none": "不使用项目",
@@ -1876,7 +1877,8 @@
"empty": "暂无项目",
"createFromCurrent": "新建项目",
"createDescription": {
"claude": "把 Claude Code 当前的供应商、MCP、Skills、记忆文件(及 Claude Desktop 的供应商)保存为一个项目,之后可一键切换。",
"claude": "把 Claude Code 当前的供应商、MCP、Skills、记忆文件保存为一个项目,之后可一键切换。",
"claude-desktop": "把 Claude Desktop 当前的供应商保存为一个项目,之后可一键切换。",
"codex": "把 Codex 当前的供应商、MCP、Skills 和记忆文件配置保存为一个项目,之后可一键切换。"
},
"manage": "管理项目…",
+3 -3
View File
@@ -3,10 +3,10 @@ import { invoke } from "@tauri-apps/api/core";
/**
* Profile 操作的应用分组(与后端 services/profile.rs 的 ProfileScope 严格对应)
*
* 项目实体全应用共享,但快照/应用/当前指针按组进行;Claude Desktop 并入
* claude 组(它只有聊天侧供应商一个受管维度,Code 标签页天然跟随 Claude Code
* 项目实体全应用共享,但快照/应用/当前指针按组进行;Claude Code 与
* Claude Desktop 的供应商独立切换,因此各自有独立分组
*/
export type ProfileScope = "claude" | "codex";
export type ProfileScope = "claude" | "claude-desktop" | "codex";
/**
* 按 app 分槽的载荷容器(与后端 services/profile.rs 的 PerApp<T> 严格对应)