* feat: save dirty editor files before auto-update quitAndInstall
Dispatch a custom event from the preload quitAndInstall to flush unsaved
editor buffers before Electron's quitAndInstall bypasses the normal close
sequence. The EditorPanel claims the event, saves all dirty files via the
existing queueSave path, and resolves/rejects so the updater knows whether
it is safe to proceed.
* fix: address review findings
- Wrap save-before-update in try/catch so a save failure never silently
prevents the update from installing
- Move detail.claim() inside try/catch to prevent promise hang on
unexpected errors
- Add duplicate dirty tab detection to reject when the same file is
dirty in multiple tabs (prevents silent write races)