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
+31
View File
@@ -470,6 +470,7 @@ export const ja: TranslationResources = {
},
tabs: {
loading: "読み込み中...",
modified: "未保存の変更",
loadingAgentTitle: "エージェントタイトルを読み込み中",
emptyPane: "このペインにタブがありません。",
fallback: {
@@ -537,6 +538,11 @@ export const ja: TranslationResources = {
failedToReloadAgent: "エージェントの再読み込みに失敗しました",
},
confirmations: {
unsavedTitle: "未保存の変更",
unsavedMessage: "このタブには未保存の変更があります。閉じると下書きが破棄されます。",
closeWithoutSaving: "保存せずに閉じる",
closePaneTitle: "ペインを閉じますか?",
bulkUnsaved: "{{count}} 個のタブに未保存の変更があります。閉じると下書きが破棄されます。",
close: "閉じる",
cancel: "キャンセル",
archive: "アーカイブ",
@@ -1463,6 +1469,25 @@ export const ja: 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: "変更",
@@ -1558,12 +1583,18 @@ export const ja: TranslationResources = {
sections: {
general: "一般",
appearance: "外観",
editor: "エディター",
shortcuts: "ショートカット",
integrations: "連携",
permissions: "権限",
diagnostics: "診断",
about: "アプリ情報",
},
editor: {
title: "エディター",
vimKeybindings: "Vim キーバインド",
vimHint: "Web とデスクトップのソースファイルに適用されます。",
},
hostSections: {
connections: "接続",
agents: "エージェント",