mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-23 16:36:23 +00:00
Add a "keep computer awake" toggle (Claude-style) for long/overnight runs:
the renderer owns the device-local pref and mirrors it to the Electron main
process, which holds a single `powerSaveBlocker('prevent-app-suspension')` —
the same authority split as translucency. Surfaced as a statusbar quick-toggle
and a Settings row.
Introduce a dedicated System settings section (device-local machine prefs) and
de-crowd Appearance by moving Window Translucency + UI Scale into it (both are
main-process/window-owned, not visual theme). Give Haptic Feedback its first
Settings home there too (the titlebar quick-toggle stays). Relocated i18n copy
into `settings.system` across en/zh/zh-hant/ja; wired the `system` route into
the SettingsView union + allowlist + nav.
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
/**
|
|
* Keep-awake — hold a single machine-global power-save blocker.
|
|
*
|
|
* `prevent-app-suspension` stops the system from sleeping (long overnight
|
|
* agent runs keep going) while still letting the display dim. The renderer
|
|
* owns the preference (persisted in localStorage) and mirrors it here over
|
|
* IPC; the main process owns the one native blocker, same authority split as
|
|
* translucency/zoom. Electron auto-releases the blocker on quit.
|
|
*/
|
|
|
|
export type KeepAwakeType = 'prevent-app-suspension' | 'prevent-display-sleep'
|
|
|
|
/** The slice of Electron's `powerSaveBlocker` we use (injected for testing). */
|
|
export interface PowerSaveBlockerLike {
|
|
start(type: KeepAwakeType): number
|
|
stop(id: number): void
|
|
isStarted(id: number): boolean
|
|
}
|
|
|
|
export interface KeepAwake {
|
|
/** Turn the blocker on/off (idempotent). Returns the resulting state. */
|
|
set(on: boolean): boolean
|
|
isActive(): boolean
|
|
}
|
|
|
|
export function createKeepAwake(
|
|
blocker: PowerSaveBlockerLike,
|
|
type: KeepAwakeType = 'prevent-app-suspension'
|
|
): KeepAwake {
|
|
let id: null | number = null
|
|
|
|
const isActive = () => id !== null && blocker.isStarted(id)
|
|
|
|
return {
|
|
isActive,
|
|
set(on) {
|
|
if (on && !isActive()) {
|
|
id = blocker.start(type)
|
|
} else if (!on && id !== null) {
|
|
if (blocker.isStarted(id)) {
|
|
blocker.stop(id)
|
|
}
|
|
|
|
id = null
|
|
}
|
|
|
|
return isActive()
|
|
}
|
|
}
|
|
}
|