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
@@ -1621,6 +1621,7 @@ export const ar: TranslationResources = {
vimHint: "تنطبق على ملفات المصدر في الويب وسطح المكتب.",
},
hostSections: {
projects: "المشاريع",
connections: "اتصالات",
agents: "Agents",
workspaces: "Workspaces",
@@ -2121,24 +2122,23 @@ export const ar: TranslationResources = {
},
},
project: {
noEditableTarget: "ليس لدينا نسخة قابلة للتحرير من هذا المشروع على أي مضيف متصل.",
noEditableTarget: "هذا المشروع غير متاح للتحرير على هذا المضيف.",
backToProjects: "العودة إلى المشاريع",
switchHost: "تبديل المضيف",
rename: {
renamedToast: "تمت إعادة تسمية المشروع",
errorFallback: "تعذرت إعادة تسمية المشروع",
renameLabel: "إعادة تسمية المشروع",
resetLabel: "إعادة تعيين اسم المشروع إلى الافتراضي",
projectNameLabel: "اسم المشروع",
saveLabel: "احفظ اسم المشروع",
cancelLabel: "إلغاء إعادة التسمية",
reset: "إعادة ضبط",
edit: {
title: "تعديل المشروع",
name: "الاسم",
nameLabel: "اسم المشروع",
icon: "الأيقونة",
chooseImage: "اختيار صورة",
useAutomatic: "استخدام التلقائي",
imageUrl: "رابط صورة أو موقع",
save: "حفظ التغييرات",
savedToast: "تم تحديث المشروع",
},
readFailures: {
invalidTitle: "تعذر تحليل paseo.json",
invalidDescription: "قم بإصلاح الملف على القرص، ثم أعد تحميله.",
missingTitle: "هذا المضيف ليس لديه هذا المشروع",
missingWithHosts: "قم بالتبديل إلى مضيف آخر أعلاه، أو أعد التحميل.",
missingSingleHost: "المضيف المحدد ليس لديه سجل لهذا المشروع.",
transportTitle: "تعذر تحميل paseo.json",
transportFallback: "المضيف لم يستجب.",