* ⚡️ perf(desktop): show the main window on the loading screen's first paint
`ready-to-show` only fires with the `load` event for the desktop entry, which
lands ~250ms after the static loading screen has actually painted. The preload
now reports that first paint (double rAF after `#loading-screen` enters the
DOM) and the main process shows the window on whichever signal arrives first.
Measured on the packaged app (warm start, window creation = 0): window visible
at +140ms instead of +370ms, with the loading screen already painted.
Claude-Session: https://claude.ai/code/session_012z4cpfrWDXZDtNgT4uJKoS
* ⚡️ perf(desktop): enable the V8 compile cache for the main process bundle
Injected as an entry banner because rolldown hoists chunk requires above any
statement in the entry source, so `main-app` would otherwise load uncached.
Main bundle load 55ms → 37ms warm; exec → main.js ~10ms faster on a
packaged build.
Claude-Session: https://claude.ai/code/session_012z4cpfrWDXZDtNgT4uJKoS
* ✨ feat(desktop): show Vite transform progress on the dev loading screens
A cold `bun run dev` sits on the loading logo for 10s+ while Vite transforms
thousands of modules. A serve-only plugin streams the transform count and the
current file over the HMR socket, and an injected client renders it at the
bottom of the window for as long as any boot placeholder (`#loading-screen`,
`#boot-shell`, `#app-shell-fallback`) is on screen.
Claude-Session: https://claude.ai/code/session_012z4cpfrWDXZDtNgT4uJKoS
Packaging prunes the app's macOS `.lproj` markers via `electronLanguages`, which
makes Chromium report `en-US` for both `app.getLocale()` and the renderer's
`navigator.language` on a non-English system. First launch therefore came up in
English, and i18next then cached that wrong value in localStorage.
Resolve the UI language from `app.getPreferredSystemLanguages()` — the only API
that survives the pruning — and hand it to the renderer via the `lng` query
param and a new `lobeEnv.systemLanguage` preload field, so no code path depends
on the poisoned values anymore.
* 🐛 fix(desktop): preserve Error cause across IPC so renderer sees real failure reason
Electron's IPC error serialization carries an Error's message/stack/name plus
its enumerable own properties, but a standard `cause` (set via
`new Error(msg, { cause })`) is non-enumerable — so the real failure reason
(e.g. undici wrapping ENOTFOUND/ECONNREFUSED under a generic
`TypeError: fetch failed`) was dropped on the way to the renderer.
- IPC base: re-expose `cause` as an enumerable, clone-safe field in the central
handler catch (nested Errors flattened to { name, message, code }) so every
IPC method's error carries it.
- Heterogeneous agent executor: include `cause` in the ChatMessageError body so
the surfaced error structure exposes the underlying reason alongside message.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* 🐛 fix(desktop): ferry IPC error cause via a serializable envelope
Making `cause` enumerable before rethrowing didn't actually reach the renderer:
Electron's `ipcRenderer.invoke` rebuilds a thrown handler error from its *string*
form (`Error invoking remote method '<channel>': <String(error)>`), so the
original error object — and any `cause` — never crosses the boundary.
Switch to an explicit serializable envelope:
- `~common/ipcError`: `toIpcErrorEnvelope` (clone-safe plain object, recursively
captures name/message/stack/code/cause) + `isIpcErrorEnvelope` /
`fromIpcErrorEnvelope` to rebuild a real Error.
- IPC base handler: return the envelope instead of throwing.
- preload `invoke`: detect the envelope and re-throw a rebuilt Error (with
`cause`), preserving the "promise rejects on failure" contract.
- hetero executor: flatten the Error cause to a plain object for the
DB-persisted `ChatMessageError.body`.
Adds unit tests for the envelope round-trip and the preload unwrap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* add desktop
fix build
update release desktop ci
improve desktop build for pr workflow
update desktop build workflow
test auto updater
fix
fix release nightly channel
support shortcut framework
improve nightly version rule
add zip release
only add mac publish
fix static file relative issue
support delete files
fix lint
enable asar
add setting open in editor in menu
add electron store framework and locale update flow
fix default searchFCModel
refactor the electron server ipc to stable mode
improve electron dev workflow
improve electron build workflow
make qwen2.5b default
improve comment workflow
fix types
refactor code
improve window size of settings/provider
路由拦截器v3.5
fix RouteIntercept issue
improve log
use productName in package.json
update
add pin list for feature flag
update
sure settings update
make ollama as default provider in desktop
fix desktop close page issue
fix desktop default variants
improve to reduce bundle
improve to reduce bundle again
improve set desktop version workflow
add nightly icons
add prebuild scripts to reduce package size
add to test prebuild
fix workflow
try to add sign and notarize for mac in workflow
try to add sign and notarize
add i18n for menu and main
update menu i18n
add i18n framework
add menu implement and setting
improve layout design for desktop
update Author
fix failed register protocol
fix prod building
fix tests
fix open error of mac and windows
improve lint
update pr comment
add service framework
add fileSearchService
improve
fix release workflow
add header
improve pr workflow fetch
improve client fetch
add linux upload workflow
improve workflow and implement
fix build electron in ci
build the desktop framework
fix build electron in ci
update tsconfig
fix desktop build workflow
finish desktop build workflow
fix workflow build steps
update workflow
test release workflow
refactor
update
update
improve loading state
refactor the 404 error
* 重构存储路径,统一到一个 lobehub-storage 下,方便未来用户自定义存储路径
* fix lint
* update
* try to fix windows open issue
* rename
* fix storage
* refactor the remote server sync
* refactor the request method
* 完成服务端同步实现逻辑
* fix lint
* save size
* refactor to make sure different instance of ipc channel
* clean log
* fix refresh
* fix tools calling
* fix auth callback issue
* update workflow
* add window ico
* push
* update
* add beta release
* fix update issue
* 完成官方实例链接
* fix
* fix stdio