Edit workspace files directly on web (#2270)

* feat(files): edit workspace files on web

Keep source buffers synchronized with host file changes and require an explicit overwrite or reload when revisions diverge.

* feat(panels): surface and protect modified tabs

Expose tooltip and modification state through the generic panel boundary so tabs can show stable metadata and guard every close route consistently.

* fix(tests): use portable fake timeout handle

* fix(files): harden editor conflict handling

Preserve modified panel state across tab eviction, use precise revisions for optimistic writes, coalesce concurrent file watchers, and localize the editor interface.

* fix(files): close editor concurrency gaps

Coalesce clean reloads, preserve subscriber identities and file permissions, suspend pending saves during close confirmation, and carry precise revisions through file reads.

* test(files): expect read revision metadata
This commit is contained in:
Mohamed Boudra
2026-07-21 04:41:19 +08:00
committed by GitHub
parent 9292f58896
commit 4bda2dfea9
69 changed files with 3678 additions and 241 deletions
+33
View File
@@ -466,6 +466,7 @@ export const ar: TranslationResources = {
},
tabs: {
loading: "تحميل...",
modified: "تغييرات غير محفوظة",
loadingAgentTitle: "جارٍ تحميل عنوان الوكيل",
emptyPane: "لا توجد علامات تبويب في هذا الجزء.",
fallback: {
@@ -532,6 +533,13 @@ export const ar: TranslationResources = {
failedToReloadAgent: "فشل في إعادة تحميل الوكيل",
},
confirmations: {
unsavedTitle: "تغييرات غير محفوظة",
unsavedMessage:
"تحتوي علامة التبويب هذه على تغييرات غير محفوظة. سيؤدي إغلاقها إلى تجاهل المسودة.",
closeWithoutSaving: "إغلاق بدون حفظ",
closePaneTitle: "إغلاق اللوحة؟",
bulkUnsaved:
"تحتوي {{count}} علامة تبويب على تغييرات غير محفوظة. سيؤدي الإغلاق إلى تجاهل المسودات.",
close: "يغلق",
cancel: "يلغي",
archive: "أرشيف",
@@ -1445,6 +1453,25 @@ export const ar: TranslationResources = {
binaryPreviewUnavailable: "المعاينة الثنائية غير متاحة",
failedToLoad: "فشل تحميل الملف",
failedToLoadPreview: "فشل تحميل معاينة الملف",
editor: {
fileSize: "حجم الملف {{size}}",
lines: "{{count}} سطر",
editorStatus: "حالة المحرر {{status}}",
unsavedChanges: "تغييرات غير محفوظة",
saving: "جارٍ الحفظ...",
saveFailed: "فشل الحفظ",
changedOnDisk: "تغيّر على القرص",
vimMode: "وضع Vim ‏{{mode}}",
cursor: "السطر {{line}}، العمود {{column}}",
preview: "معاينة",
source: "المصدر",
unavailableTitle: "الملف غير متاح على القرص",
conflictDescription: "تم الاحتفاظ بالمحتوى المحلي. اختر الإصدار الذي تريد إبقاءه.",
overwrite: "استبدال",
reload: "إعادة تحميل",
reloadTitle: "إعادة التحميل من القرص؟",
reloadMessage: "ستفقد تغييراتك المحلية.",
},
},
diff: {
changesLabel: "التغييرات",
@@ -1540,12 +1567,18 @@ export const ar: TranslationResources = {
sections: {
general: "عام",
appearance: "مظهر",
editor: "المحرر",
shortcuts: "الاختصارات",
integrations: "التكامل",
permissions: "الأذونات",
diagnostics: "التشخيص",
about: "عن",
},
editor: {
title: "المحرر",
vimKeybindings: "اختصارات Vim",
vimHint: "تنطبق على ملفات المصدر في الويب وسطح المكتب.",
},
hostSections: {
connections: "اتصالات",
agents: "Agents",