feat(desktop): split daemon and release settings to main process

Move daemon management and release channel settings out of the renderer's
AsyncStorage and into a desktop-owned settings store persisted by the main
process. Adds a "Keep daemon running after quit" option, a daemon lifecycle
section in settings, and a one-time migration of legacy renderer-owned
desktop settings.
This commit is contained in:
Mohamed Boudra
2026-04-25 13:59:07 +07:00
parent 2b37276577
commit ae3e88e7e1
20 changed files with 1792 additions and 187 deletions
@@ -0,0 +1,67 @@
import { describe, expect, it, vi } from "vitest";
import { DEFAULT_DESKTOP_SETTINGS, type DesktopSettingsStore } from "./desktop-settings";
import { createDesktopSettingsCommandHandlers } from "./desktop-settings-commands";
function createStoreMock(): DesktopSettingsStore {
return {
get: vi.fn(async () => DEFAULT_DESKTOP_SETTINGS),
patch: vi.fn(async () => ({
...DEFAULT_DESKTOP_SETTINGS,
releaseChannel: "beta",
})),
migrateLegacyRendererSettings: vi.fn(async () => ({
...DEFAULT_DESKTOP_SETTINGS,
releaseChannel: "beta",
daemon: {
manageBuiltInDaemon: false,
keepRunningAfterQuit: true,
},
})),
};
}
describe("desktop-settings-commands", () => {
it("exposes get and patch handlers through the desktop command bus shape", async () => {
const store = createStoreMock();
const handlers = createDesktopSettingsCommandHandlers({ settingsStore: store });
await expect(handlers.get_desktop_settings()).resolves.toEqual(DEFAULT_DESKTOP_SETTINGS);
await expect(
handlers.patch_desktop_settings({
daemon: { keepRunningAfterQuit: false },
}),
).resolves.toEqual({
...DEFAULT_DESKTOP_SETTINGS,
releaseChannel: "beta",
});
expect(store.get).toHaveBeenCalledTimes(1);
expect(store.patch).toHaveBeenCalledWith({
daemon: { keepRunningAfterQuit: false },
});
});
it("accepts legacy renderer settings migration payloads", async () => {
const store = createStoreMock();
const handlers = createDesktopSettingsCommandHandlers({ settingsStore: store });
const result = await handlers.migrate_legacy_desktop_settings({
releaseChannel: "beta",
manageBuiltInDaemon: false,
});
expect(result).toEqual({
...DEFAULT_DESKTOP_SETTINGS,
releaseChannel: "beta",
daemon: {
manageBuiltInDaemon: false,
keepRunningAfterQuit: true,
},
});
expect(store.migrateLegacyRendererSettings).toHaveBeenCalledWith({
releaseChannel: "beta",
manageBuiltInDaemon: false,
});
});
});