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

@ -522,5 +522,24 @@
"settings.captionRefine.desc": "本地 AI 会根据上下文修正已确定字幕的空格、标点和听错的词。",
"settings.captionModel": "实时字幕模型",
"settings.captionModel.same": "与听写相同",
"settings.captionModel.desc": "仅实时字幕使用单独的模型识别,会与听写模型一同加载。"
"settings.captionModel.desc": "仅实时字幕使用单独的模型识别,会与听写模型一同加载。",
"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}} 项失败 — 下次同步时重试)"
}