feat: add host-local custom project icons (#2335)

* feat(projects): add local icons and colors

* refactor(projects): simplify appearance handling

* fix(projects): serialize appearance saves

* test(app): update project appearance expectations

* test: fix project appearance CI expectations

* refactor(projects): organize appearance code

* fix(server): adopt main's reconcile model in project appearance updates

* fix(projects): preserve host-local appearance targets

* fix(desktop): restore Linux development startup

Ubuntu can block Electron's unprivileged user-namespace fallback while the npm-installed sandbox helper is not SUID. Disable the Chromium process sandbox only in the Linux development runner so packaged desktop policy remains unchanged.

* feat(projects): add custom project icons

Keep URL acquisition in the client so the host daemon only validates uploaded bytes. Project name and icon changes share one adaptive edit sheet.

* refactor(settings): scope projects by host

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
This commit is contained in:
nikuscs
2026-08-01 01:34:42 +08:00
committed by GitHub
co-authored by Mohamed Boudra
parent 706ae3d9bb
commit 800bd2bef1
67 changed files with 2158 additions and 912 deletions
+12 -12
View File
@@ -1602,6 +1602,7 @@ export const zhCN: TranslationResources = {
vimHint: "适用于网页和桌面端的源文件。",
},
hostSections: {
projects: "项目",
connections: "连接",
agents: "Agents",
workspaces: "Workspaces",
@@ -2095,24 +2096,23 @@ export const zhCN: TranslationResources = {
},
},
project: {
noEditableTarget: "任何已连接 Host 上都没有这个 Project 的可编辑副本。",
noEditableTarget: "此项目无法在这个 Host 上编辑。",
backToProjects: "返回 Projects",
switchHost: "切换 Host",
rename: {
renamedToast: "Project 已重命名",
errorFallback: "无法重命名 Project",
renameLabel: "重命名 Project",
resetLabel: "将 Project 名称重置为默认值",
projectNameLabel: "Project 名称",
saveLabel: "保存 Project 名称",
cancelLabel: "取消重命名",
reset: "重置",
edit: {
title: "编辑 Project",
name: "名称",
nameLabel: "Project 名称",
icon: "图标",
chooseImage: "选择图片",
useAutomatic: "使用自动",
imageUrl: "图片或网站 URL",
save: "保存更改",
savedToast: "Project 已更新",
},
readFailures: {
invalidTitle: "无法解析 paseo.json",
invalidDescription: "修复磁盘上的文件,然后重新加载。",
missingTitle: "这个 Host 没有这个 Project",
missingWithHosts: "切换到上方其他 Host,或重新加载。",
missingSingleHost: "所选 Host 没有这个 Project 的记录。",
transportTitle: "无法加载 paseo.json",
transportFallback: "Host 没有响应。",