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 -13
View File
@@ -1655,6 +1655,7 @@ export const ru: TranslationResources = {
vimHint: "Применяется к исходным файлам в веб- и настольной версии.",
},
hostSections: {
projects: "Проекты",
connections: "Соединения",
agents: "Agents",
workspaces: "Workspaces",
@@ -2161,25 +2162,23 @@ export const ru: TranslationResources = {
},
},
project: {
noEditableTarget:
"У нас нет редактируемой копии этого проекта ни на одном подключенном хосте.",
noEditableTarget: "Этот проект нельзя редактировать на этом хосте.",
backToProjects: "Вернуться к проектам",
switchHost: "Сменить хост",
rename: {
renamedToast: "Проект переименован",
errorFallback: "Не удалось переименовать проект",
renameLabel: "Переименовать проект",
resetLabel: "Сбросить имя проекта по умолчанию",
projectNameLabel: "Название проекта",
saveLabel: "Сохранить название проекта",
cancelLabel: "Отменить переименование",
reset: "Перезагрузить",
edit: {
title: "Изменить проект",
name: "Название",
nameLabel: "Название проекта",
icon: "Значок",
chooseImage: "Выбрать изображение",
useAutomatic: "Использовать автоматический",
imageUrl: "URL изображения или сайта",
save: "Сохранить изменения",
savedToast: "Проект обновлён",
},
readFailures: {
invalidTitle: "paseo.json не удалось разобрать",
invalidDescription: "Исправьте файл на диске, затем перезагрузите.",
missingTitle: "У этого хоста нет этого проекта",
missingWithHosts: "Переключитесь на другой хост выше или перезагрузите компьютер.",
missingSingleHost: "У выбранного хоста нет записей об этом проекте.",
transportTitle: "Не удалось загрузить paseo.json.",
transportFallback: "Хозяин не ответил.",