@mohitkumawat/warmup-cli 1.2.15 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -14
- package/dist/commands/default.d.ts +3 -1
- package/dist/commands/default.d.ts.map +1 -1
- package/dist/commands/default.js +25 -0
- package/dist/commands/default.js.map +1 -1
- package/dist/commands/doctor.d.ts +51 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +219 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/execute.d.ts +24 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +53 -21
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/logs.d.ts +12 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +27 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/menu.d.ts +52 -0
- package/dist/commands/menu.d.ts.map +1 -0
- package/dist/commands/menu.js +185 -0
- package/dist/commands/menu.js.map +1 -0
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +94 -5
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts +8 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +89 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +25 -4
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +15 -0
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/config.d.ts +23 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -3
- package/dist/index.js.map +1 -1
- package/dist/notify.d.ts +14 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +91 -0
- package/dist/notify.js.map +1 -0
- package/dist/runtime.d.ts +10 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +39 -8
- package/dist/runtime.js.map +1 -1
- package/dist/scheduler/index.d.ts +17 -0
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +42 -0
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/linux.d.ts.map +1 -1
- package/dist/scheduler/linux.js +3 -10
- package/dist/scheduler/linux.js.map +1 -1
- package/dist/scheduler/macos.d.ts +38 -0
- package/dist/scheduler/macos.d.ts.map +1 -1
- package/dist/scheduler/macos.js +158 -23
- package/dist/scheduler/macos.js.map +1 -1
- package/dist/scheduler/script.d.ts +18 -0
- package/dist/scheduler/script.d.ts.map +1 -0
- package/dist/scheduler/script.js +62 -0
- package/dist/scheduler/script.js.map +1 -0
- package/dist/scheduler/windows.js +1 -1
- package/dist/ui.d.ts +50 -4
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +250 -38
- package/dist/ui.js.map +1 -1
- package/dist/warmup.d.ts +52 -4
- package/dist/warmup.d.ts.map +1 -1
- package/dist/warmup.js +194 -79
- package/dist/warmup.js.map +1 -1
- package/package.json +3 -1
package/dist/scheduler/index.js
CHANGED
|
@@ -40,6 +40,11 @@ exports.installSchedule = installSchedule;
|
|
|
40
40
|
exports.uninstallSchedule = uninstallSchedule;
|
|
41
41
|
exports.isScheduleInstalled = isScheduleInstalled;
|
|
42
42
|
exports.pauseSchedule = pauseSchedule;
|
|
43
|
+
exports.applyWakeSchedule = applyWakeSchedule;
|
|
44
|
+
exports.clearWakeSchedule = clearWakeSchedule;
|
|
45
|
+
exports.isWakeScheduleActive = isWakeScheduleActive;
|
|
46
|
+
exports.getWakeCommandHint = getWakeCommandHint;
|
|
47
|
+
exports.getWakeTime = getWakeTime;
|
|
43
48
|
exports.resumeSchedule = resumeSchedule;
|
|
44
49
|
const os = __importStar(require("os"));
|
|
45
50
|
const macos_1 = require("./macos");
|
|
@@ -109,6 +114,43 @@ function pauseSchedule() {
|
|
|
109
114
|
case 'windows': return (0, windows_1.pauseWindowsSchedule)();
|
|
110
115
|
}
|
|
111
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Schedule a system wake so the pre-warm can run while the Mac is asleep.
|
|
119
|
+
* Returns null on platforms where waking is handled by the task definition
|
|
120
|
+
* itself (Windows `WakeToRun`, systemd `WakeSystem`) and needs no extra step.
|
|
121
|
+
*/
|
|
122
|
+
function applyWakeSchedule(hour, minute, options = {}) {
|
|
123
|
+
if (detectPlatform() === 'macos') {
|
|
124
|
+
return (0, macos_1.applyMacWakeSchedule)(hour, minute, options);
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
function clearWakeSchedule(options = {}) {
|
|
129
|
+
if (detectPlatform() === 'macos') {
|
|
130
|
+
return (0, macos_1.clearMacWakeSchedule)(options);
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
function isWakeScheduleActive() {
|
|
135
|
+
if (detectPlatform() === 'macos') {
|
|
136
|
+
return (0, macos_1.isMacWakeScheduleActive)();
|
|
137
|
+
}
|
|
138
|
+
// Windows/Linux bake the wake flag into the task; treat install as authoritative.
|
|
139
|
+
return isScheduleInstalled();
|
|
140
|
+
}
|
|
141
|
+
function getWakeCommandHint(hour, minute) {
|
|
142
|
+
if (detectPlatform() === 'macos') {
|
|
143
|
+
return (0, macos_1.buildPmsetWakeCommand)(hour, minute);
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
/** The system-local wake time ('HH:MM:SS') warmup would schedule, or null off-macOS. */
|
|
148
|
+
function getWakeTime(hour, minute) {
|
|
149
|
+
if (detectPlatform() === 'macos') {
|
|
150
|
+
return (0, macos_1.buildMacWakeSchedule)(hour, minute).time;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
112
154
|
function resumeSchedule() {
|
|
113
155
|
const platform = detectPlatform();
|
|
114
156
|
switch (platform) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linux.d.ts","sourceRoot":"","sources":["../../src/scheduler/linux.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"linux.d.ts","sourceRoot":"","sources":["../../src/scheduler/linux.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAQtD,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,MAAM,CAAC;AA0BvD,wBAAgB,2BAA2B,IAAI,OAAO,CAGrD;AAkCD,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,OAAO,EACtB,gBAAgB,EAAE,OAAO,GACxB,qBAAqB,CAIvB;AAED,wBAAgB,2BAA2B,IAAI,qBAAqB,CAKnE;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAK9C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAAG,MAAM,CAEzF;AAyFD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAS1E;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAuB7C;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAclD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAoBzC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAoB1C"}
|
package/dist/scheduler/linux.js
CHANGED
|
@@ -48,6 +48,7 @@ const path = __importStar(require("path"));
|
|
|
48
48
|
const os = __importStar(require("os"));
|
|
49
49
|
const child_process_1 = require("child_process");
|
|
50
50
|
const runtime_1 = require("../runtime");
|
|
51
|
+
const script_1 = require("./script");
|
|
51
52
|
const SERVICE_NAME = 'warmup';
|
|
52
53
|
const SYSTEMD_USER_DIR = path.join(os.homedir(), '.config', 'systemd', 'user');
|
|
53
54
|
const SERVICE_PATH = path.join(SYSTEMD_USER_DIR, `${SERVICE_NAME}.service`);
|
|
@@ -55,9 +56,6 @@ const TIMER_PATH = path.join(SYSTEMD_USER_DIR, `${SERVICE_NAME}.timer`);
|
|
|
55
56
|
function getWarmupScriptPath() {
|
|
56
57
|
return path.join(os.homedir(), '.warmup', 'warmup.sh');
|
|
57
58
|
}
|
|
58
|
-
function shellQuote(value) {
|
|
59
|
-
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
60
|
-
}
|
|
61
59
|
function runCommand(command, args) {
|
|
62
60
|
return (0, child_process_1.spawnSync)(command, args, {
|
|
63
61
|
encoding: 'utf-8',
|
|
@@ -126,13 +124,7 @@ function getLinuxSchedulerName() {
|
|
|
126
124
|
: 'Linux (cron)';
|
|
127
125
|
}
|
|
128
126
|
function buildLinuxWarmupScript(runtime) {
|
|
129
|
-
return
|
|
130
|
-
set -euo pipefail
|
|
131
|
-
|
|
132
|
-
mkdir -p "$HOME/.warmup/logs"
|
|
133
|
-
|
|
134
|
-
${shellQuote(runtime.nodePath)} ${shellQuote(runtime.cliEntry)} _execute-warmup >> "$HOME/.warmup/logs/systemd.log" 2>&1
|
|
135
|
-
`;
|
|
127
|
+
return (0, script_1.buildWarmupShellScript)(runtime, 'systemd.log');
|
|
136
128
|
}
|
|
137
129
|
function createWarmupScript(runtime) {
|
|
138
130
|
const scriptPath = getWarmupScriptPath();
|
|
@@ -162,6 +154,7 @@ Description=warmup daily pre-warm timer
|
|
|
162
154
|
OnCalendar=*-*-* ${hStr}:${mStr}:00
|
|
163
155
|
Persistent=true
|
|
164
156
|
AccuracySec=1min
|
|
157
|
+
WakeSystem=true
|
|
165
158
|
|
|
166
159
|
[Install]
|
|
167
160
|
WantedBy=timers.target
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linux.js","sourceRoot":"","sources":["../../src/scheduler/linux.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"linux.js","sourceRoot":"","sources":["../../src/scheduler/linux.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
import type { ScheduleInstallOptions } from './index';
|
|
2
2
|
export declare function buildMacWarmupScript(runtime: ScheduleInstallOptions['runtime']): string;
|
|
3
|
+
export interface MacWakeSchedule {
|
|
4
|
+
days: string;
|
|
5
|
+
time: string;
|
|
6
|
+
}
|
|
7
|
+
export type WakeStatus = 'applied' | 'needs-sudo' | 'unsupported' | 'failed';
|
|
8
|
+
export interface WakeResult {
|
|
9
|
+
status: WakeStatus;
|
|
10
|
+
/** The exact command a user can run manually if elevation is required. */
|
|
11
|
+
command: string;
|
|
12
|
+
}
|
|
13
|
+
/** Compute the wake time (fire time minus the lead), wrapping past midnight. */
|
|
14
|
+
export declare function buildMacWakeSchedule(hour: number, minute: number, leadMinutes?: number): MacWakeSchedule;
|
|
15
|
+
/** Human-readable command shown to the user when sudo is required. */
|
|
16
|
+
export declare function buildPmsetWakeCommand(hour: number, minute: number): string;
|
|
17
|
+
/**
|
|
18
|
+
* Schedule a daily system wake a few minutes before the pre-warm fires.
|
|
19
|
+
* `pmset repeat` requires root; if a password is needed and we are not running
|
|
20
|
+
* interactively, returns 'needs-sudo' with the command for the user to run.
|
|
21
|
+
*
|
|
22
|
+
* Note: macOS supports only ONE `pmset repeat` schedule and it is global, so
|
|
23
|
+
* this overwrites any existing repeating wake the user may have set.
|
|
24
|
+
*/
|
|
25
|
+
export declare function applyMacWakeSchedule(hour: number, minute: number, options?: {
|
|
26
|
+
interactive?: boolean;
|
|
27
|
+
}): WakeResult;
|
|
28
|
+
/** Remove the daily wake schedule (best-effort). */
|
|
29
|
+
export declare function clearMacWakeSchedule(options?: {
|
|
30
|
+
interactive?: boolean;
|
|
31
|
+
}): WakeResult;
|
|
32
|
+
/**
|
|
33
|
+
* Parse `pmset -g sched` output for an active *repeating* wake/poweron event.
|
|
34
|
+
* Only the "Repeating power events" section is inspected — one-time entries in
|
|
35
|
+
* the "Scheduled power events" section (e.g. macOS's own maintenance wakes)
|
|
36
|
+
* must not register as a false positive.
|
|
37
|
+
*/
|
|
38
|
+
export declare function parseWakeScheduleActive(pmsetOutput: string): boolean;
|
|
39
|
+
/** Whether a repeating wake/poweron event is currently registered. */
|
|
40
|
+
export declare function isMacWakeScheduleActive(): boolean;
|
|
3
41
|
/**
|
|
4
42
|
* Install a launchd plist for macOS.
|
|
5
43
|
* Key feature: RunAtLoad=true ensures boot-recovery.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../src/scheduler/macos.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../src/scheduler/macos.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAmBtD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,CAAC,SAAS,CAAC,GAAG,MAAM,CAEvF;AAOD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAA0B,GACtC,eAAe,CAMjB;AAMD,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG1E;AAqBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,UAAU,CAEZ;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,UAAU,CAExF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAKpE;AAED,sEAAsE;AACtE,wBAAgB,uBAAuB,IAAI,OAAO,CAYjD;AAWD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAuDxE;AA4DD,+BAA+B;AAC/B,wBAAgB,oBAAoB,IAAI,IAAI,CAW3C;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC"}
|
package/dist/scheduler/macos.js
CHANGED
|
@@ -34,6 +34,12 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.buildMacWarmupScript = buildMacWarmupScript;
|
|
37
|
+
exports.buildMacWakeSchedule = buildMacWakeSchedule;
|
|
38
|
+
exports.buildPmsetWakeCommand = buildPmsetWakeCommand;
|
|
39
|
+
exports.applyMacWakeSchedule = applyMacWakeSchedule;
|
|
40
|
+
exports.clearMacWakeSchedule = clearMacWakeSchedule;
|
|
41
|
+
exports.parseWakeScheduleActive = parseWakeScheduleActive;
|
|
42
|
+
exports.isMacWakeScheduleActive = isMacWakeScheduleActive;
|
|
37
43
|
exports.installMacSchedule = installMacSchedule;
|
|
38
44
|
exports.uninstallMacSchedule = uninstallMacSchedule;
|
|
39
45
|
exports.isMacScheduleInstalled = isMacScheduleInstalled;
|
|
@@ -43,9 +49,13 @@ const fs = __importStar(require("fs"));
|
|
|
43
49
|
const path = __importStar(require("path"));
|
|
44
50
|
const os = __importStar(require("os"));
|
|
45
51
|
const child_process_1 = require("child_process");
|
|
52
|
+
const script_1 = require("./script");
|
|
46
53
|
const PLIST_NAME = 'com.warmup.prewarm';
|
|
47
54
|
const PLIST_DIR = path.join(os.homedir(), 'Library', 'LaunchAgents');
|
|
48
55
|
const PLIST_PATH = path.join(PLIST_DIR, `${PLIST_NAME}.plist`);
|
|
56
|
+
/** Wake the Mac this many minutes before the launchd fire time, so it is awake
|
|
57
|
+
* and ready when the pre-warm runs. */
|
|
58
|
+
const WAKE_LEAD_MINUTES = 3;
|
|
49
59
|
/**
|
|
50
60
|
* Get the path to the warmup script.
|
|
51
61
|
* We generate a small shell script that warmup's launchd plist will execute.
|
|
@@ -53,17 +63,92 @@ const PLIST_PATH = path.join(PLIST_DIR, `${PLIST_NAME}.plist`);
|
|
|
53
63
|
function getWarmupScriptPath() {
|
|
54
64
|
return path.join(os.homedir(), '.warmup', 'warmup.sh');
|
|
55
65
|
}
|
|
56
|
-
function shellQuote(value) {
|
|
57
|
-
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
58
|
-
}
|
|
59
66
|
function buildMacWarmupScript(runtime) {
|
|
60
|
-
return
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
return (0, script_1.buildWarmupShellScript)(runtime, 'launchd.log');
|
|
68
|
+
}
|
|
69
|
+
function pad2(value) {
|
|
70
|
+
return value.toString().padStart(2, '0');
|
|
71
|
+
}
|
|
72
|
+
/** Compute the wake time (fire time minus the lead), wrapping past midnight. */
|
|
73
|
+
function buildMacWakeSchedule(hour, minute, leadMinutes = WAKE_LEAD_MINUTES) {
|
|
74
|
+
const total = (((hour * 60 + minute - leadMinutes) % 1440) + 1440) % 1440;
|
|
75
|
+
return {
|
|
76
|
+
days: 'MTWRFSU',
|
|
77
|
+
time: `${pad2(Math.floor(total / 60))}:${pad2(total % 60)}:00`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function pmsetRepeatArgs(wake) {
|
|
81
|
+
return ['repeat', 'wakeorpoweron', wake.days, wake.time];
|
|
82
|
+
}
|
|
83
|
+
/** Human-readable command shown to the user when sudo is required. */
|
|
84
|
+
function buildPmsetWakeCommand(hour, minute) {
|
|
85
|
+
const wake = buildMacWakeSchedule(hour, minute);
|
|
86
|
+
return `sudo pmset ${pmsetRepeatArgs(wake).join(' ')}`;
|
|
87
|
+
}
|
|
88
|
+
function runSudoPmset(args, interactive) {
|
|
89
|
+
const command = `sudo pmset ${args.join(' ')}`;
|
|
90
|
+
try {
|
|
91
|
+
// Non-interactive (`-n`) never blocks on a password prompt; interactive
|
|
92
|
+
// inherits the TTY so the user can authenticate during `warmup setup`.
|
|
93
|
+
const sudoArgs = interactive ? ['pmset', ...args] : ['-n', 'pmset', ...args];
|
|
94
|
+
const result = (0, child_process_1.spawnSync)('sudo', sudoArgs, {
|
|
95
|
+
stdio: interactive ? 'inherit' : 'pipe',
|
|
96
|
+
timeout: interactive ? 120000 : 10000,
|
|
97
|
+
});
|
|
98
|
+
if (result.error)
|
|
99
|
+
return { status: 'failed', command };
|
|
100
|
+
if (result.status === 0)
|
|
101
|
+
return { status: 'applied', command };
|
|
102
|
+
// Non-zero from `sudo -n` almost always means a password is required.
|
|
103
|
+
return { status: interactive ? 'failed' : 'needs-sudo', command };
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return { status: 'failed', command };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Schedule a daily system wake a few minutes before the pre-warm fires.
|
|
111
|
+
* `pmset repeat` requires root; if a password is needed and we are not running
|
|
112
|
+
* interactively, returns 'needs-sudo' with the command for the user to run.
|
|
113
|
+
*
|
|
114
|
+
* Note: macOS supports only ONE `pmset repeat` schedule and it is global, so
|
|
115
|
+
* this overwrites any existing repeating wake the user may have set.
|
|
116
|
+
*/
|
|
117
|
+
function applyMacWakeSchedule(hour, minute, options = {}) {
|
|
118
|
+
return runSudoPmset(pmsetRepeatArgs(buildMacWakeSchedule(hour, minute)), !!options.interactive);
|
|
119
|
+
}
|
|
120
|
+
/** Remove the daily wake schedule (best-effort). */
|
|
121
|
+
function clearMacWakeSchedule(options = {}) {
|
|
122
|
+
return runSudoPmset(['repeat', 'cancel'], !!options.interactive);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Parse `pmset -g sched` output for an active *repeating* wake/poweron event.
|
|
126
|
+
* Only the "Repeating power events" section is inspected — one-time entries in
|
|
127
|
+
* the "Scheduled power events" section (e.g. macOS's own maintenance wakes)
|
|
128
|
+
* must not register as a false positive.
|
|
129
|
+
*/
|
|
130
|
+
function parseWakeScheduleActive(pmsetOutput) {
|
|
131
|
+
const afterRepeating = pmsetOutput.split(/Repeating power events:/i)[1];
|
|
132
|
+
if (!afterRepeating)
|
|
133
|
+
return false;
|
|
134
|
+
const repeatingSection = afterRepeating.split(/Scheduled power events:/i)[0];
|
|
135
|
+
return /wakepoweron|wakeorpoweron/i.test(repeatingSection);
|
|
136
|
+
}
|
|
137
|
+
/** Whether a repeating wake/poweron event is currently registered. */
|
|
138
|
+
function isMacWakeScheduleActive() {
|
|
139
|
+
try {
|
|
140
|
+
const result = (0, child_process_1.spawnSync)('pmset', ['-g', 'sched'], {
|
|
141
|
+
encoding: 'utf-8',
|
|
142
|
+
timeout: 10000,
|
|
143
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
144
|
+
});
|
|
145
|
+
if (result.status !== 0)
|
|
146
|
+
return false;
|
|
147
|
+
return parseWakeScheduleActive(result.stdout || '');
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
67
152
|
}
|
|
68
153
|
/** Create the warmup shell script that launchd will execute */
|
|
69
154
|
function createWarmupScript(runtime) {
|
|
@@ -105,7 +190,8 @@ function installMacSchedule(options) {
|
|
|
105
190
|
<integer>${minute}</integer>
|
|
106
191
|
</dict>
|
|
107
192
|
|
|
108
|
-
<!--
|
|
193
|
+
<!-- Run once at load (login/boot) and on the next wake after a missed fire.
|
|
194
|
+
NOTE: this does NOT wake a sleeping Mac — a pmset wake handles that. -->
|
|
109
195
|
<key>RunAtLoad</key>
|
|
110
196
|
<true/>
|
|
111
197
|
|
|
@@ -125,20 +211,72 @@ function installMacSchedule(options) {
|
|
|
125
211
|
</dict>
|
|
126
212
|
</plist>`;
|
|
127
213
|
fs.writeFileSync(PLIST_PATH, plist);
|
|
128
|
-
|
|
214
|
+
loadAgent();
|
|
215
|
+
}
|
|
216
|
+
/** GUI domain target for the modern `launchctl bootstrap`/`bootout` API. */
|
|
217
|
+
function domainTarget() {
|
|
218
|
+
const uid = typeof process.getuid === 'function' ? process.getuid() : undefined;
|
|
219
|
+
return uid === undefined ? null : `gui/${uid}`;
|
|
220
|
+
}
|
|
221
|
+
/** Whether the LaunchAgent is currently registered with launchd. */
|
|
222
|
+
function isAgentLoaded() {
|
|
223
|
+
try {
|
|
224
|
+
const result = (0, child_process_1.spawnSync)('launchctl', ['list', PLIST_NAME], { stdio: 'pipe', timeout: 10000 });
|
|
225
|
+
return result.status === 0;
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/** (Re)load the LaunchAgent, preferring the modern bootstrap API with a
|
|
232
|
+
* fallback to the legacy `launchctl load` for older macOS. */
|
|
233
|
+
function loadAgent() {
|
|
234
|
+
const target = domainTarget();
|
|
235
|
+
if (target) {
|
|
236
|
+
try {
|
|
237
|
+
(0, child_process_1.execSync)(`launchctl bootout ${target}/${PLIST_NAME} 2>/dev/null`, { stdio: 'pipe' });
|
|
238
|
+
}
|
|
239
|
+
catch { }
|
|
240
|
+
try {
|
|
241
|
+
(0, child_process_1.execSync)(`launchctl bootstrap ${target} "${PLIST_PATH}"`, { stdio: 'pipe' });
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Fall through to legacy API.
|
|
246
|
+
}
|
|
247
|
+
}
|
|
129
248
|
try {
|
|
130
|
-
(0, child_process_1.execSync)(`launchctl unload ${PLIST_PATH} 2>/dev/null`, { stdio: 'pipe' });
|
|
249
|
+
(0, child_process_1.execSync)(`launchctl unload "${PLIST_PATH}" 2>/dev/null`, { stdio: 'pipe' });
|
|
131
250
|
}
|
|
132
251
|
catch { }
|
|
133
|
-
|
|
134
|
-
|
|
252
|
+
try {
|
|
253
|
+
(0, child_process_1.execSync)(`launchctl load "${PLIST_PATH}"`, { stdio: 'pipe' });
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
// Tolerate "already loaded"; only fail if the agent truly isn't registered.
|
|
257
|
+
if (!isAgentLoaded()) {
|
|
258
|
+
const detail = (err?.stderr || err?.message || '').toString().trim();
|
|
259
|
+
throw new Error(`Failed to load warmup LaunchAgent: ${detail}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
135
262
|
}
|
|
136
|
-
/**
|
|
137
|
-
function
|
|
263
|
+
/** Unload the LaunchAgent via modern then legacy APIs (best-effort). */
|
|
264
|
+
function unloadAgent() {
|
|
265
|
+
const target = domainTarget();
|
|
266
|
+
if (target) {
|
|
267
|
+
try {
|
|
268
|
+
(0, child_process_1.execSync)(`launchctl bootout ${target}/${PLIST_NAME} 2>/dev/null`, { stdio: 'pipe' });
|
|
269
|
+
}
|
|
270
|
+
catch { }
|
|
271
|
+
}
|
|
138
272
|
try {
|
|
139
|
-
(0, child_process_1.execSync)(`launchctl unload ${PLIST_PATH} 2>/dev/null`, { stdio: 'pipe' });
|
|
273
|
+
(0, child_process_1.execSync)(`launchctl unload "${PLIST_PATH}" 2>/dev/null`, { stdio: 'pipe' });
|
|
140
274
|
}
|
|
141
275
|
catch { }
|
|
276
|
+
}
|
|
277
|
+
/** Remove the launchd plist */
|
|
278
|
+
function uninstallMacSchedule() {
|
|
279
|
+
unloadAgent();
|
|
142
280
|
if (fs.existsSync(PLIST_PATH)) {
|
|
143
281
|
fs.unlinkSync(PLIST_PATH);
|
|
144
282
|
}
|
|
@@ -153,16 +291,13 @@ function isMacScheduleInstalled() {
|
|
|
153
291
|
}
|
|
154
292
|
/** Temporarily disable by unloading (don't delete) */
|
|
155
293
|
function pauseMacSchedule() {
|
|
156
|
-
|
|
157
|
-
(0, child_process_1.execSync)(`launchctl unload ${PLIST_PATH} 2>/dev/null`, { stdio: 'pipe' });
|
|
158
|
-
}
|
|
159
|
-
catch { }
|
|
294
|
+
unloadAgent();
|
|
160
295
|
}
|
|
161
296
|
/** Re-enable by loading */
|
|
162
297
|
function resumeMacSchedule() {
|
|
163
298
|
if (fs.existsSync(PLIST_PATH)) {
|
|
164
299
|
try {
|
|
165
|
-
(
|
|
300
|
+
loadAgent();
|
|
166
301
|
}
|
|
167
302
|
catch { }
|
|
168
303
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos.js","sourceRoot":"","sources":["../../src/scheduler/macos.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"macos.js","sourceRoot":"","sources":["../../src/scheduler/macos.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,oDAEC;AAyBD,oDAUC;AAOD,sDAGC;AA6BD,oDAMC;AAGD,oDAEC;AAQD,0DAKC;AAGD,0DAYC;AAeD,gDAuDC;AA6DD,oDAWC;AAGD,wDAEC;AAGD,4CAEC;AAGD,8CAMC;AA3SD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,iDAAoD;AAEpD,qCAAkD;AAElD,MAAM,UAAU,GAAG,oBAAoB,CAAC;AACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,QAAQ,CAAC,CAAC;AAE/D;wCACwC;AACxC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAA0C;IAC7E,OAAO,IAAA,+BAAsB,EAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAoBD,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,SAAgB,oBAAoB,CAClC,IAAY,EACZ,MAAc,EACd,cAAsB,iBAAiB;IAEvC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1E,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAqB;IAC5C,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,sEAAsE;AACtE,SAAgB,qBAAqB,CAAC,IAAY,EAAE,MAAc;IAChE,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,cAAc,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,WAAoB;IACxD,MAAM,OAAO,GAAG,cAAc,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,wEAAwE;QACxE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,MAAM,EAAE,QAAQ,EAAE;YACzC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACvC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;SACtC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC/D,sEAAsE;QACtE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAClC,IAAY,EACZ,MAAc,EACd,UAAqC,EAAE;IAEvC,OAAO,YAAY,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAClG,CAAC;AAED,oDAAoD;AACpD,SAAgB,oBAAoB,CAAC,UAAqC,EAAE;IAC1E,OAAO,YAAY,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,WAAmB;IACzD,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,4BAA4B,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC7D,CAAC;AAED,sEAAsE;AACtE,SAAgB,uBAAuB;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YACjD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,OAAO,uBAAuB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,kBAAkB,CAAC,OAA0C;IACpE,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE7C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,OAA+B;IAChE,uCAAuC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEjC,MAAM,KAAK,GAAG;;;;;YAKJ,UAAU;;;;;cAKR,UAAU;;;;;;;eAOT,IAAI;;eAEJ,MAAM;;;;;;;;;;;;;;YAcT,EAAE,CAAC,OAAO,EAAE;;;;YAIZ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,CAAC;;YAEhE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,CAAC;;SAEnE,CAAC;IAER,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEpC,SAAS,EAAE,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC;AACjD,CAAC;AAED,oEAAoE;AACpE,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,WAAW,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;+DAC+D;AAC/D,SAAS,SAAS;IAChB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,qBAAqB,MAAM,IAAI,UAAU,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,uBAAuB,MAAM,KAAK,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,qBAAqB,UAAU,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,mBAAmB,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,4EAA4E;QAC5E,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW;IAClB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,qBAAqB,MAAM,IAAI,UAAU,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,qBAAqB,UAAU,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,+BAA+B;AAC/B,SAAgB,oBAAoB;IAClC,WAAW,EAAE,CAAC;IAEd,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,2CAA2C;AAC3C,SAAgB,sBAAsB;IACpC,OAAO,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC;AAED,sDAAsD;AACtD,SAAgB,gBAAgB;IAC9B,WAAW,EAAE,CAAC;AAChB,CAAC;AAED,2BAA2B;AAC3B,SAAgB,iBAAiB;IAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,SAAS,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RuntimePaths } from '../runtime';
|
|
2
|
+
/**
|
|
3
|
+
* Build the resilient bash launcher shared by launchd (macOS) and
|
|
4
|
+
* systemd/cron (Linux).
|
|
5
|
+
*
|
|
6
|
+
* Hardening over a bare `node cli _execute-warmup` invocation:
|
|
7
|
+
* - If the recorded Node.js interpreter has vanished (e.g. after
|
|
8
|
+
* `brew upgrade node` removed the pinned Cellar build, or an nvm version
|
|
9
|
+
* was uninstalled), fall back to a PATH-resolved `node`.
|
|
10
|
+
* - If node or the CLI entry still cannot be found, append a dated JSON
|
|
11
|
+
* failure entry to the logs so it surfaces in `warmup status` instead of
|
|
12
|
+
* failing silently into a log nobody reads.
|
|
13
|
+
*
|
|
14
|
+
* `set -e` is intentionally omitted so the fallback/logging branches run; the
|
|
15
|
+
* script's exit status is that of the final node invocation.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildWarmupShellScript(runtime: RuntimePaths, logFileName: string): string;
|
|
18
|
+
//# sourceMappingURL=script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/scheduler/script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAuCzF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildWarmupShellScript = buildWarmupShellScript;
|
|
4
|
+
function shellQuote(value) {
|
|
5
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build the resilient bash launcher shared by launchd (macOS) and
|
|
9
|
+
* systemd/cron (Linux).
|
|
10
|
+
*
|
|
11
|
+
* Hardening over a bare `node cli _execute-warmup` invocation:
|
|
12
|
+
* - If the recorded Node.js interpreter has vanished (e.g. after
|
|
13
|
+
* `brew upgrade node` removed the pinned Cellar build, or an nvm version
|
|
14
|
+
* was uninstalled), fall back to a PATH-resolved `node`.
|
|
15
|
+
* - If node or the CLI entry still cannot be found, append a dated JSON
|
|
16
|
+
* failure entry to the logs so it surfaces in `warmup status` instead of
|
|
17
|
+
* failing silently into a log nobody reads.
|
|
18
|
+
*
|
|
19
|
+
* `set -e` is intentionally omitted so the fallback/logging branches run; the
|
|
20
|
+
* script's exit status is that of the final node invocation.
|
|
21
|
+
*/
|
|
22
|
+
function buildWarmupShellScript(runtime, logFileName) {
|
|
23
|
+
return `#!/bin/bash
|
|
24
|
+
set -uo pipefail
|
|
25
|
+
|
|
26
|
+
WARMUP_LOG_DIR="$HOME/.warmup/logs"
|
|
27
|
+
mkdir -p "$WARMUP_LOG_DIR"
|
|
28
|
+
|
|
29
|
+
NODE_BIN=${shellQuote(runtime.nodePath)}
|
|
30
|
+
CLI_ENTRY=${shellQuote(runtime.cliEntry)}
|
|
31
|
+
|
|
32
|
+
# Recover if the recorded interpreter was removed by a toolchain upgrade.
|
|
33
|
+
# launchd runs with a minimal PATH (/usr/bin:/bin:/usr/sbin:/sbin), so we check
|
|
34
|
+
# common install locations explicitly rather than relying on \`command -v\`.
|
|
35
|
+
if [ ! -x "$NODE_BIN" ]; then
|
|
36
|
+
for candidate in /opt/homebrew/bin/node /usr/local/bin/node /usr/bin/node "$(command -v node 2>/dev/null || true)"; do
|
|
37
|
+
if [ -n "$candidate" ] && [ -x "$candidate" ]; then NODE_BIN="$candidate"; break; fi
|
|
38
|
+
done
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
warmup_log_failure() {
|
|
42
|
+
ts="$(date -u +%Y-%m-%dT%H:%M:%S.000Z)"
|
|
43
|
+
day="$(date +%Y-%m-%d)"
|
|
44
|
+
printf '{"timestamp":"%s","status":"failed","message":"%s"}\\n' "$ts" "$1" >> "$WARMUP_LOG_DIR/$day.log"
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if [ ! -x "$NODE_BIN" ]; then
|
|
48
|
+
warmup_log_failure "Node.js runtime not found - re-run: warmup setup"
|
|
49
|
+
echo "warmup: Node.js runtime not found" >&2
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
if [ ! -e "$CLI_ENTRY" ]; then
|
|
54
|
+
warmup_log_failure "warmup CLI entry missing - re-run: warmup setup"
|
|
55
|
+
echo "warmup: CLI entry not found at $CLI_ENTRY" >&2
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
"$NODE_BIN" "$CLI_ENTRY" _execute-warmup >> "$WARMUP_LOG_DIR/${logFileName}" 2>&1
|
|
60
|
+
`;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/scheduler/script.ts"],"names":[],"mappings":";;AAqBA,wDAuCC;AA1DD,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,sBAAsB,CAAC,OAAqB,EAAE,WAAmB;IAC/E,OAAO;;;;;;WAME,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3B,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DA6BuB,WAAW;CACzE,CAAC;AACF,CAAC"}
|
|
@@ -92,7 +92,7 @@ function installWindowsSchedule(options) {
|
|
|
92
92
|
const psCommand = `
|
|
93
93
|
$task = Get-ScheduledTask -TaskName '${TASK_NAME}'
|
|
94
94
|
$task.Settings.StartWhenAvailable = $true
|
|
95
|
-
$task.Settings.WakeToRun = $
|
|
95
|
+
$task.Settings.WakeToRun = $true
|
|
96
96
|
$task.Settings.DisallowStartIfOnBatteries = $false
|
|
97
97
|
$task.Settings.StopIfGoingOnBatteries = $false
|
|
98
98
|
Set-ScheduledTask -InputObject $task
|