feat(desktop): two-way cloud sync with mobile and web

Rewrites the desktop mirror as services/sync/SyncEngine: a persistent
outbox, per-account server-clock keyset cursors with paging, pulls that never
overwrite unsent local edits, deletions both ways through sync_tombstones and
per-row failure isolation. It now covers history titles and favorites,
dictionary, every meeting's memos and documents, memo tags, user commands and
dictation/meeting templates, and registers the desktop as a device that the
phone can disconnect.

Fixes shipped defects: the first pull after sign-in fetched nothing, only
the first meeting's children were pushed, team meetings leaked into the
personal database and lost team_id on re-push, and Realtime never connected
because Electron's Node 20 has no global WebSocket (ws is now the transport).
Anonymous local-mode records are imported into the first account that signs
in. The settings sync section is translated and shows pending/rejected
changes; synced screens reload on app:dataChanged.
This commit is contained in:
Yun Chan 2026-09-27 14:04:49 +09:00
parent b5c9ff9f31
commit 0a4f5aee64
49 changed files with 3940 additions and 1033 deletions

View file

@ -1910,5 +1910,29 @@
"settings.captionRefine.desc": "확정된 자막을 로컬 AI가 앞뒤 문맥에 맞게 띄어쓰기·문장부호·잘못 들은 단어를 고칩니다.",
"settings.captionModel": "실시간 자막 모델",
"settings.captionModel.same": "받아쓰기와 같게",
"settings.captionModel.desc": "실시간 자막만 다른 모델로 인식합니다. 받아쓰기 모델과 함께 GPU 메모리에 올라갑니다."
"settings.captionModel.desc": "실시간 자막만 다른 모델로 인식합니다. 받아쓰기 모델과 함께 GPU 메모리에 올라갑니다.",
"history.favorite": "즐겨찾기",
"history.unfavorite": "즐겨찾기 해제",
"cloudSync.title": "클라우드 동기화",
"cloudSync.description": "기록·사전·회의·메모 태그·명령·템플릿을 모바일과 웹에 자동으로 맞춥니다. 어느 기기에서 지워도 다른 기기에서 함께 지워집니다.",
"cloudSync.signIn": "로그인",
"cloudSync.signedInAs": "{{email}} 계정으로 로그인됨",
"cloudSync.noEmail": "이메일 없음",
"cloudSync.lastSync": "마지막 동기화: {{time}}",
"cloudSync.never": "아직 없음",
"cloudSync.upToDate": "모든 변경이 올라갔습니다",
"cloudSync.pending": "올릴 변경 {{count}}건 대기 중",
"cloudSync.failed": "서버가 거부한 변경 {{count}}건 — \"지금 동기화\"로 다시 시도합니다",
"cloudSync.syncNow": "지금 동기화",
"cloudSync.syncing": "동기화 중…",
"cloudSync.signOut": "로그아웃",
"cloudSync.browserPending": "브라우저에서 로그인을 마쳐 주세요.",
"cloudSync.signedOut": "로그아웃했습니다. 이 컴퓨터의 기록은 그대로 남아 있습니다.",
"cloudSync.done": "동기화 완료 ({{count}}건 반영)",
"cloudSync.doneWithErrors": "동기화 완료 ({{count}}건 반영, {{errors}}건 실패 — 다음 동기화 때 다시 시도)",
"mobile.devices.platform.android": "Android",
"mobile.devices.platform.ios": "iPhone·iPad",
"mobile.devices.platform.web": "웹 브라우저",
"mobile.devices.platform.windows": "Windows 데스크톱 앱",
"mobile.devices.platform.macos": "macOS 데스크톱 앱"
}