@mohitkumawat/warmup-cli 1.2.14 → 1.2.16
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 +5 -5
- 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/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.map +1 -1
- package/dist/commands/status.js +12 -1
- package/dist/commands/status.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 +16 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +0 -0
- 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 +48 -2
- 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 +1 -0
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +40 -11
- package/dist/ui.js.map +1 -1
- package/dist/warmup.d.ts +39 -0
- package/dist/warmup.d.ts.map +1 -1
- package/dist/warmup.js +55 -0
- package/dist/warmup.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAiB3D;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgB7C"}
|
package/dist/notify.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.notify = notify;
|
|
37
|
+
exports.oneLine = oneLine;
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
/**
|
|
41
|
+
* Best-effort desktop notification so unattended failures/skips are visible
|
|
42
|
+
* instead of hiding in a log the user never opens. Silently no-ops if the
|
|
43
|
+
* platform has no supported notifier.
|
|
44
|
+
*/
|
|
45
|
+
function notify(title, message) {
|
|
46
|
+
try {
|
|
47
|
+
const platform = os.platform();
|
|
48
|
+
const safeTitle = oneLine(title);
|
|
49
|
+
const safeMessage = oneLine(message);
|
|
50
|
+
if (platform === 'darwin') {
|
|
51
|
+
// LaunchAgents run in the user's GUI session, so osascript notifications
|
|
52
|
+
// surface in Notification Center.
|
|
53
|
+
const script = `display notification ${quoteAppleScript(safeMessage)} with title ${quoteAppleScript(safeTitle)}`;
|
|
54
|
+
(0, child_process_1.spawnSync)('osascript', ['-e', script], { stdio: 'ignore', timeout: 10000 });
|
|
55
|
+
}
|
|
56
|
+
else if (platform === 'linux') {
|
|
57
|
+
(0, child_process_1.spawnSync)('notify-send', [safeTitle, safeMessage], { stdio: 'ignore', timeout: 10000 });
|
|
58
|
+
}
|
|
59
|
+
// Windows: no dependable built-in CLI notifier; skip.
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Never let notification failures affect the pre-warm outcome.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Replace control characters (newlines, tabs, etc.) with spaces and bound the
|
|
67
|
+
* length. AppleScript string literals cannot contain raw line breaks, so a
|
|
68
|
+
* multi-line CLI stderr would otherwise make `osascript -e` a syntax error and
|
|
69
|
+
* drop the notification entirely.
|
|
70
|
+
*/
|
|
71
|
+
function oneLine(value) {
|
|
72
|
+
let out = '';
|
|
73
|
+
for (const ch of value) {
|
|
74
|
+
const code = ch.charCodeAt(0);
|
|
75
|
+
out += (code < 0x20 || code === 0x7f) ? ' ' : ch;
|
|
76
|
+
}
|
|
77
|
+
let result = out.replace(/ {2,}/g, ' ').trim();
|
|
78
|
+
if (result.length > 240) {
|
|
79
|
+
result = result.slice(0, 240);
|
|
80
|
+
const last = result.charCodeAt(result.length - 1);
|
|
81
|
+
// Avoid leaving a dangling high surrogate if we cut mid-emoji.
|
|
82
|
+
if (last >= 0xd800 && last <= 0xdbff) {
|
|
83
|
+
result = result.slice(0, -1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
function quoteAppleScript(value) {
|
|
89
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAiBC;AAQD,0BAgBC;AAjDD,iDAA0C;AAC1C,uCAAyB;AAEzB;;;;GAIG;AACH,SAAgB,MAAM,CAAC,KAAa,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,yEAAyE;YACzE,kCAAkC;YAClC,MAAM,MAAM,GAAG,wBAAwB,gBAAgB,CAAC,WAAW,CAAC,eAAe,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjH,IAAA,yBAAS,EAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,IAAA,yBAAS,EAAC,aAAa,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,sDAAsD;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,KAAa;IACnC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACxB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClD,+DAA+D;QAC/D,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;YACrC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAClE,CAAC"}
|
package/dist/runtime.d.ts
CHANGED
|
@@ -4,6 +4,16 @@ export interface RuntimePaths {
|
|
|
4
4
|
claudePath: string;
|
|
5
5
|
}
|
|
6
6
|
export declare function findExecutable(command: string): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a stable, upgrade-surviving path to the Node.js runtime.
|
|
9
|
+
*
|
|
10
|
+
* `process.execPath` (and its realpath) points at the *physical* interpreter —
|
|
11
|
+
* e.g. /opt/homebrew/Cellar/node/25.8.1_1/bin/node — which Homebrew deletes on
|
|
12
|
+
* the next `brew upgrade node` + cleanup, silently breaking the scheduled task.
|
|
13
|
+
* When a stable wrapper symlink (e.g. /opt/homebrew/bin/node) resolves to the
|
|
14
|
+
* same binary, prefer it: it follows version upgrades instead of dangling.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveStableNodePath(): string;
|
|
7
17
|
export declare function parseClaudeAuthStatus(raw: string): boolean;
|
|
8
18
|
export declare function resolveRuntimePaths(cliEntry?: string): RuntimePaths;
|
|
9
19
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmBD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA2B9C;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,MAAwB,GAAG,YAAY,CAsBpF"}
|
package/dist/runtime.js
CHANGED
|
@@ -34,9 +34,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.findExecutable = findExecutable;
|
|
37
|
+
exports.resolveStableNodePath = resolveStableNodePath;
|
|
37
38
|
exports.parseClaudeAuthStatus = parseClaudeAuthStatus;
|
|
38
39
|
exports.resolveRuntimePaths = resolveRuntimePaths;
|
|
39
40
|
const path = __importStar(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
40
42
|
const child_process_1 = require("child_process");
|
|
41
43
|
function getLocatorCommand() {
|
|
42
44
|
return process.platform === 'win32' ? 'where' : 'which';
|
|
@@ -65,6 +67,43 @@ function findExecutable(command) {
|
|
|
65
67
|
return null;
|
|
66
68
|
}
|
|
67
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolve a stable, upgrade-surviving path to the Node.js runtime.
|
|
72
|
+
*
|
|
73
|
+
* `process.execPath` (and its realpath) points at the *physical* interpreter —
|
|
74
|
+
* e.g. /opt/homebrew/Cellar/node/25.8.1_1/bin/node — which Homebrew deletes on
|
|
75
|
+
* the next `brew upgrade node` + cleanup, silently breaking the scheduled task.
|
|
76
|
+
* When a stable wrapper symlink (e.g. /opt/homebrew/bin/node) resolves to the
|
|
77
|
+
* same binary, prefer it: it follows version upgrades instead of dangling.
|
|
78
|
+
*/
|
|
79
|
+
function resolveStableNodePath() {
|
|
80
|
+
let physical;
|
|
81
|
+
try {
|
|
82
|
+
physical = fs.realpathSync(process.execPath);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
physical = path.resolve(process.execPath);
|
|
86
|
+
}
|
|
87
|
+
const candidates = [
|
|
88
|
+
findExecutable('node'), // the user's active node, often a stable symlink
|
|
89
|
+
'/opt/homebrew/bin/node',
|
|
90
|
+
'/usr/local/bin/node',
|
|
91
|
+
'/usr/bin/node',
|
|
92
|
+
].filter((entry) => Boolean(entry));
|
|
93
|
+
for (const candidate of candidates) {
|
|
94
|
+
if (candidate === physical)
|
|
95
|
+
continue; // no gain over the physical path
|
|
96
|
+
try {
|
|
97
|
+
if (fs.existsSync(candidate) && fs.realpathSync(candidate) === physical) {
|
|
98
|
+
return candidate;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// ignore unreadable candidates
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return physical;
|
|
106
|
+
}
|
|
68
107
|
function parseClaudeAuthStatus(raw) {
|
|
69
108
|
try {
|
|
70
109
|
const parsed = JSON.parse(raw);
|
|
@@ -82,9 +121,16 @@ function resolveRuntimePaths(cliEntry = process.argv[1]) {
|
|
|
82
121
|
if (!claudePath) {
|
|
83
122
|
throw new Error('Claude Code not found in PATH.');
|
|
84
123
|
}
|
|
124
|
+
let resolvedCliEntry;
|
|
125
|
+
try {
|
|
126
|
+
resolvedCliEntry = fs.realpathSync(path.resolve(cliEntry));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
resolvedCliEntry = path.resolve(cliEntry);
|
|
130
|
+
}
|
|
85
131
|
return {
|
|
86
|
-
nodePath:
|
|
87
|
-
cliEntry:
|
|
132
|
+
nodePath: resolveStableNodePath(),
|
|
133
|
+
cliEntry: resolvedCliEntry,
|
|
88
134
|
claudePath,
|
|
89
135
|
};
|
|
90
136
|
}
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type WakeResult } from './macos';
|
|
1
2
|
import type { RuntimePaths } from '../runtime';
|
|
2
3
|
export type Platform = 'macos' | 'linux' | 'windows';
|
|
3
4
|
export interface ScheduleInstallOptions {
|
|
@@ -12,5 +13,21 @@ export declare function installSchedule(options: ScheduleInstallOptions): void;
|
|
|
12
13
|
export declare function uninstallSchedule(): void;
|
|
13
14
|
export declare function isScheduleInstalled(): boolean;
|
|
14
15
|
export declare function pauseSchedule(): void;
|
|
16
|
+
export type { WakeResult } from './macos';
|
|
17
|
+
/**
|
|
18
|
+
* Schedule a system wake so the pre-warm can run while the Mac is asleep.
|
|
19
|
+
* Returns null on platforms where waking is handled by the task definition
|
|
20
|
+
* itself (Windows `WakeToRun`, systemd `WakeSystem`) and needs no extra step.
|
|
21
|
+
*/
|
|
22
|
+
export declare function applyWakeSchedule(hour: number, minute: number, options?: {
|
|
23
|
+
interactive?: boolean;
|
|
24
|
+
}): WakeResult | null;
|
|
25
|
+
export declare function clearWakeSchedule(options?: {
|
|
26
|
+
interactive?: boolean;
|
|
27
|
+
}): WakeResult | null;
|
|
28
|
+
export declare function isWakeScheduleActive(): boolean;
|
|
29
|
+
export declare function getWakeCommandHint(hour: number, minute: number): string | null;
|
|
30
|
+
/** The system-local wake time ('HH:MM:SS') warmup would schedule, or null off-macOS. */
|
|
31
|
+
export declare function getWakeTime(hour: number, minute: number): string | null;
|
|
15
32
|
export declare function resumeSchedule(): void;
|
|
16
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AACA,OAAO,EAWL,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AACrD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,cAAc,IAAI,QAAQ,CAKzC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAOxC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAczC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAOrE;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAO7C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,UAAU,GAAG,IAAI,CAKnB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,UAAU,GAAG,IAAI,CAK5F;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAM9C;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9E;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvE;AAED,wBAAgB,cAAc,IAAI,IAAI,CAOrC"}
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,wCAKC;AAED,0CAOC;AAED,4CAcC;AAED,0CAOC;AAED,8CAOC;AAED,kDAOC;AAED,sCAOC;AASD,8CASC;AAED,8CAKC;AAED,oDAMC;AAED,gDAKC;AAGD,kCAKC;AAED,wCAOC;AApJD,uCAAyB;AACzB,mCAYiB;AACjB,mCAAiK;AACjK,uCAAsJ;AAUtJ,SAAgB,cAAc;IAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,OAAO,CAAC,CAAC,OAAO,iBAAiB,CAAC;QACvC,KAAK,OAAO,CAAC,CAAC,OAAO,sBAAsB,CAAC;QAC5C,KAAK,SAAS,CAAC,CAAC,OAAO,0BAA0B,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,6BAA6B,CAAC;QACvC,KAAK,OAAO;YACV,IAAI,CAAC;gBACH,OAAO,IAAA,6BAAqB,GAAE,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,oCAAoC,CAAC;YAC9C,CAAC;QACH,KAAK,SAAS;YACZ,OAAO,0BAA0B,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,OAA+B;IAC7D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,0BAAkB,EAAC,OAAO,CAAC,CAAC;QACjD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;QACnD,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,gCAAsB,EAAC,OAAO,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,4BAAoB,GAAE,CAAC;QAC5C,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,8BAAsB,GAAE,CAAC;QAC9C,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,kCAAwB,GAAE,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB;IACjC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,8BAAsB,GAAE,CAAC;QAC9C,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,gCAAwB,GAAE,CAAC;QAChD,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,oCAA0B,GAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAgB,aAAa;IAC3B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,wBAAgB,GAAE,CAAC;QACxC,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,0BAAkB,GAAE,CAAC;QAC1C,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,8BAAoB,GAAE,CAAC;IAChD,CAAC;AACH,CAAC;AAID;;;;GAIG;AACH,SAAgB,iBAAiB,CAC/B,IAAY,EACZ,MAAc,EACd,UAAqC,EAAE;IAEvC,IAAI,cAAc,EAAE,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAA,4BAAoB,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,iBAAiB,CAAC,UAAqC,EAAE;IACvE,IAAI,cAAc,EAAE,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,oBAAoB;IAClC,IAAI,cAAc,EAAE,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAA,+BAAuB,GAAE,CAAC;IACnC,CAAC;IACD,kFAAkF;IAClF,OAAO,mBAAmB,EAAE,CAAC;AAC/B,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY,EAAE,MAAc;IAC7D,IAAI,cAAc,EAAE,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAA,6BAAqB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wFAAwF;AACxF,SAAgB,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,IAAI,cAAc,EAAE,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAA,4BAAoB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,cAAc;IAC5B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,yBAAiB,GAAE,CAAC;QACzC,KAAK,OAAO,CAAC,CAAC,OAAO,IAAA,2BAAmB,GAAE,CAAC;QAC3C,KAAK,SAAS,CAAC,CAAC,OAAO,IAAA,+BAAqB,GAAE,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|