Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions src/main/sharedSettingsFile.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,7 @@ describe("sharedSettingsFile", () => {
agentTerminalFontSize: 12,
guiChatFontSize: 13,
terminalPanelFontSize: 12,
preventSleepWhileWorking: true,
remoteAccessPreventSleep: true,
preventSleep: "while-remote-access",
launchAtStartup: true,
startMinimized: true,
closeToTray: true,
Expand Down Expand Up @@ -259,8 +258,7 @@ describe("sharedSettingsFile", () => {
agentTerminalFontSize: 12,
guiChatFontSize: 13,
terminalPanelFontSize: 12,
preventSleepWhileWorking: true,
remoteAccessPreventSleep: true,
preventSleep: "while-remote-access",
launchAtStartup: true,
startMinimized: true,
closeToTray: true,
Expand Down Expand Up @@ -350,6 +348,23 @@ describe("sharedSettingsFile", () => {
]);
});

it("migrates legacy prevent-sleep booleans from a previous released settings shape", () => {
const settingsPath = join(makeTempDir(), "settings.json");
writeFileSync(
settingsPath,
JSON.stringify({
preventSleepWhileWorking: true,
remoteAccessPreventSleep: false,
}),
"utf8",
);

const settings = readSharedSettingsFile(settingsPath);
expect(settings.preventSleep).toBe("while-working");
expect(settings).not.toHaveProperty("preventSleepWhileWorking");
expect(settings).not.toHaveProperty("remoteAccessPreventSleep");
});

it("defaults usage tracking to Claude and Codex only", () => {
const defaultEnabled = allUsageProviderDescriptors()
.map((provider) => provider.id)
Expand Down
61 changes: 50 additions & 11 deletions src/main/sleepPolicy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,81 @@ import { describe, expect, it } from "vitest";
import { shouldPreventSystemSleep } from "./sleepPolicy";

describe("shouldPreventSystemSleep", () => {
it("keeps the system awake for a working thread when enabled", () => {
it("always keeps the system awake regardless of remote access or thread activity", () => {
expect(
shouldPreventSystemSleep(
{
preventSleepWhileWorking: true,
remoteAccessPreventSleep: false,
preventSleep: "always",
remoteAccessEnabled: false,
},
1,
0,
),
).toBe(true);
expect(
shouldPreventSystemSleep(
{
preventSleep: "always",
remoteAccessEnabled: true,
},
2,
),
).toBe(true);
});

it("keeps the system awake for enabled remote access independently of thread activity", () => {
it("while-remote-access keeps awake when remote access is enabled even with zero threads", () => {
expect(
shouldPreventSystemSleep(
{
preventSleepWhileWorking: false,
remoteAccessPreventSleep: true,
preventSleep: "while-remote-access",
remoteAccessEnabled: true,
},
0,
),
).toBe(true);
});

it("allows sleep when each active reason is opted out", () => {
it("while-remote-access keeps awake when threads are working even if remote access is off", () => {
expect(
shouldPreventSystemSleep(
{
preventSleepWhileWorking: false,
remoteAccessPreventSleep: false,
remoteAccessEnabled: true,
preventSleep: "while-remote-access",
remoteAccessEnabled: false,
},
1,
),
).toBe(true);
});

it("while-remote-access allows sleep when remote access is off and no threads are working", () => {
expect(
shouldPreventSystemSleep(
{
preventSleep: "while-remote-access",
remoteAccessEnabled: false,
},
0,
),
).toBe(false);
});

it("while-working only keeps awake when threads are working", () => {
expect(
shouldPreventSystemSleep(
{
preventSleep: "while-working",
remoteAccessEnabled: true,
},
0,
),
).toBe(false);
expect(
shouldPreventSystemSleep(
{
preventSleep: "while-working",
remoteAccessEnabled: false,
},
1,
),
).toBe(true);
});
});
17 changes: 9 additions & 8 deletions src/main/sleepPolicy.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import type { SharedSettings } from "@/shared/settings";

type SleepPolicySettings = Pick<
SharedSettings,
"preventSleepWhileWorking" | "remoteAccessPreventSleep" | "remoteAccessEnabled"
>;
type SleepPolicySettings = Pick<SharedSettings, "preventSleep" | "remoteAccessEnabled">;

export function shouldPreventSystemSleep(
settings: SleepPolicySettings,
workingThreadCount: number,
): boolean {
const threadRequiresAwake = settings.preventSleepWhileWorking && workingThreadCount > 0;
const remoteAccessRequiresAwake =
settings.remoteAccessPreventSleep && settings.remoteAccessEnabled;
return threadRequiresAwake || remoteAccessRequiresAwake;
switch (settings.preventSleep) {
case "always":
return true;
case "while-remote-access":
return settings.remoteAccessEnabled || workingThreadCount > 0;
case "while-working":
return workingThreadCount > 0;
}
}
35 changes: 27 additions & 8 deletions src/renderer/locales/de/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -1208,6 +1208,7 @@ msgid "Already used by {conflict}"
msgstr "Bereits von {conflict} verwendet"

#. Notification filter: always notify
#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/NotificationSettings.tsx
msgid "Always"
msgstr "Immer"
Expand Down Expand Up @@ -2168,6 +2169,11 @@ msgstr "Thread zum Anhängen auswählen"
msgid "Choose what Poracode does for new pull requests: nothing, fix merge blockers, or fix and merge."
msgstr "Wähle, was Poracode bei neuen Pull Requests tut: nichts, Merge-Blocker beheben oder beheben und mergen."

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Choose when this machine stays awake."
msgstr "Wählen Sie, wann dieser Rechner wach bleibt."

#: src/renderer/views/SettingsOverlay/parts/BrowserSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Choose whether links from Poracode and browser popups stay in Poracode or open externally."
Expand Down Expand Up @@ -5695,13 +5701,13 @@ msgstr "Poracode beim Start im Infobereich der Taskleiste belassen."

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Keep the system awake while any thread is actively working."
msgstr "Halten Sie das System wach, während ein Thread aktiv arbeitet."
#~ msgid "Keep the system awake while any thread is actively working."
#~ msgstr "Halten Sie das System wach, während ein Thread aktiv arbeitet."

#: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Keep the system awake while remote access is enabled."
msgstr "Das System aktiv halten, solange der Fernzugriff aktiviert ist."
#~ msgid "Keep the system awake while remote access is enabled."
#~ msgstr "Das System aktiv halten, solange der Fernzugriff aktiviert ist."

#: src/renderer/components/startup/StartupRecoveryScreen.tsx
msgid "Keep waiting"
Expand Down Expand Up @@ -8276,15 +8282,20 @@ msgstr "Voreinstellungen"
msgid "Press shortcut…"
msgstr "Tastenkürzel drücken…"

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Prevent sleep"
msgstr "Ruhezustand verhindern"

#: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Prevent sleep during remote access"
msgstr "Ruhezustand bei Fernzugriff verhindern"
#~ msgid "Prevent sleep during remote access"
#~ msgstr "Ruhezustand bei Fernzugriff verhindern"

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Prevent sleep while working"
msgstr "Ruhezustand während der Arbeit verhindern"
#~ msgid "Prevent sleep while working"
#~ msgstr "Ruhezustand während der Arbeit verhindern"

#. placeholder {0}: att.name
#: src/renderer/components/composer/AttachmentBar.tsx
Expand Down Expand Up @@ -8825,6 +8836,10 @@ msgstr "Browserseite neu laden"
msgid "Remote"
msgstr "Remote"

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
msgid "Remote access"
msgstr "Fernzugriff"

#: src/renderer/views/MainView/parts/Sidebar/Sidebar.tsx
#: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/SettingsSidebar.tsx
Expand Down Expand Up @@ -12615,6 +12630,10 @@ msgstr "Wo die Unterhaltung des Laufs erstellt wird."
msgid "Where the terminal panel appears."
msgstr "Wo das Terminal-Panel erscheint."

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
msgid "While working"
msgstr "Während der Arbeit"

#. placeholder {0}: env || t`this environment`
#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx
msgid "Will run in {0}:"
Expand Down
35 changes: 27 additions & 8 deletions src/renderer/locales/en/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -1213,6 +1213,7 @@ msgid "Already used by {conflict}"
msgstr "Already used by {conflict}"

#. Notification filter: always notify
#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/NotificationSettings.tsx
msgid "Always"
msgstr "Always"
Expand Down Expand Up @@ -2173,6 +2174,11 @@ msgstr "Choose thread to attach to"
msgid "Choose what Poracode does for new pull requests: nothing, fix merge blockers, or fix and merge."
msgstr "Choose what Poracode does for new pull requests: nothing, fix merge blockers, or fix and merge."

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Choose when this machine stays awake."
msgstr "Choose when this machine stays awake."

#: src/renderer/views/SettingsOverlay/parts/BrowserSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Choose whether links from Poracode and browser popups stay in Poracode or open externally."
Expand Down Expand Up @@ -5700,13 +5706,13 @@ msgstr "Keep Poracode in the system tray when it launches at startup."

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Keep the system awake while any thread is actively working."
msgstr "Keep the system awake while any thread is actively working."
#~ msgid "Keep the system awake while any thread is actively working."
#~ msgstr "Keep the system awake while any thread is actively working."

#: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Keep the system awake while remote access is enabled."
msgstr "Keep the system awake while remote access is enabled."
#~ msgid "Keep the system awake while remote access is enabled."
#~ msgstr "Keep the system awake while remote access is enabled."

#: src/renderer/components/startup/StartupRecoveryScreen.tsx
msgid "Keep waiting"
Expand Down Expand Up @@ -8281,15 +8287,20 @@ msgstr "Presets"
msgid "Press shortcut…"
msgstr "Press shortcut…"

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Prevent sleep"
msgstr "Prevent sleep"

#: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Prevent sleep during remote access"
msgstr "Prevent sleep during remote access"
#~ msgid "Prevent sleep during remote access"
#~ msgstr "Prevent sleep during remote access"

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/settingsSearchIndex.ts
msgid "Prevent sleep while working"
msgstr "Prevent sleep while working"
#~ msgid "Prevent sleep while working"
#~ msgstr "Prevent sleep while working"

#. placeholder {0}: att.name
#: src/renderer/components/composer/AttachmentBar.tsx
Expand Down Expand Up @@ -8830,6 +8841,10 @@ msgstr "Reload browser page"
msgid "Remote"
msgstr "Remote"

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
msgid "Remote access"
msgstr "Remote access"

#: src/renderer/views/MainView/parts/Sidebar/Sidebar.tsx
#: src/renderer/views/SettingsOverlay/parts/RemoteAccessSettings.tsx
#: src/renderer/views/SettingsOverlay/parts/SettingsSidebar.tsx
Expand Down Expand Up @@ -12620,6 +12635,10 @@ msgstr "Where the run's conversation is created."
msgid "Where the terminal panel appears."
msgstr "Where the terminal panel appears."

#: src/renderer/views/SettingsOverlay/parts/GeneralSettings.tsx
msgid "While working"
msgstr "While working"

#. placeholder {0}: env || t`this environment`
#: src/renderer/views/SettingsOverlay/parts/SingleAgentSettings/parts/AgentEnvironmentRow.tsx
msgid "Will run in {0}:"
Expand Down
Loading