@elizaos/daemon 1.0.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 +117 -0
- package/dist/index.d.ts +134 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +181 -0
- package/dist/index.js.map +1 -0
- package/dist/launchd.d.ts +9 -0
- package/dist/launchd.d.ts.map +1 -0
- package/dist/launchd.js +272 -0
- package/dist/launchd.js.map +1 -0
- package/dist/schtasks.d.ts +9 -0
- package/dist/schtasks.d.ts.map +1 -0
- package/dist/schtasks.js +259 -0
- package/dist/schtasks.js.map +1 -0
- package/dist/systemd.d.ts +9 -0
- package/dist/systemd.d.ts.map +1 -0
- package/dist/systemd.js +325 -0
- package/dist/systemd.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
package/dist/launchd.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS LaunchAgent service manager.
|
|
3
|
+
*
|
|
4
|
+
* Manages services via launchd LaunchAgents for the current user.
|
|
5
|
+
*/
|
|
6
|
+
import { execFile } from "node:child_process";
|
|
7
|
+
import fs from "node:fs/promises";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { promisify } from "node:util";
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
/** Get home directory */
|
|
12
|
+
function getHomeDir() {
|
|
13
|
+
return process.env.HOME || `/Users/${process.env.USER || "unknown"}`;
|
|
14
|
+
}
|
|
15
|
+
/** Get LaunchAgents directory */
|
|
16
|
+
function getLaunchAgentsDir() {
|
|
17
|
+
return path.join(getHomeDir(), "Library", "LaunchAgents");
|
|
18
|
+
}
|
|
19
|
+
/** Get plist file path for a service */
|
|
20
|
+
function getPlistPath(name) {
|
|
21
|
+
return path.join(getLaunchAgentsDir(), `${name}.plist`);
|
|
22
|
+
}
|
|
23
|
+
/** Get log directory */
|
|
24
|
+
function getLogDir(name) {
|
|
25
|
+
return path.join(getHomeDir(), "Library", "Logs", name);
|
|
26
|
+
}
|
|
27
|
+
/** Build plist XML content */
|
|
28
|
+
function buildPlist(config) {
|
|
29
|
+
const logDir = getLogDir(config.name);
|
|
30
|
+
const stdoutPath = path.join(logDir, "stdout.log");
|
|
31
|
+
const stderrPath = path.join(logDir, "stderr.log");
|
|
32
|
+
const programArgs = config.command
|
|
33
|
+
.map((arg) => ` <string>${escapeXml(arg)}</string>`)
|
|
34
|
+
.join("\n");
|
|
35
|
+
let envVars = "";
|
|
36
|
+
if (config.environment && Object.keys(config.environment).length > 0) {
|
|
37
|
+
const entries = Object.entries(config.environment)
|
|
38
|
+
.map(([k, v]) => ` <key>${escapeXml(k)}</key>\n <string>${escapeXml(v)}</string>`)
|
|
39
|
+
.join("\n");
|
|
40
|
+
envVars = ` <key>EnvironmentVariables</key>\n <dict>\n${entries}\n </dict>\n`;
|
|
41
|
+
}
|
|
42
|
+
let workingDir = "";
|
|
43
|
+
if (config.workingDirectory) {
|
|
44
|
+
workingDir = ` <key>WorkingDirectory</key>\n <string>${escapeXml(config.workingDirectory)}</string>\n`;
|
|
45
|
+
}
|
|
46
|
+
const keepAlive = config.keepAlive !== false;
|
|
47
|
+
const runAtLoad = config.runAtLoad !== false;
|
|
48
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
49
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
50
|
+
<plist version="1.0">
|
|
51
|
+
<dict>
|
|
52
|
+
<key>Label</key>
|
|
53
|
+
<string>${escapeXml(config.name)}</string>
|
|
54
|
+
<key>ProgramArguments</key>
|
|
55
|
+
<array>
|
|
56
|
+
${programArgs}
|
|
57
|
+
</array>
|
|
58
|
+
${workingDir}${envVars} <key>StandardOutPath</key>
|
|
59
|
+
<string>${escapeXml(stdoutPath)}</string>
|
|
60
|
+
<key>StandardErrorPath</key>
|
|
61
|
+
<string>${escapeXml(stderrPath)}</string>
|
|
62
|
+
<key>KeepAlive</key>
|
|
63
|
+
<${keepAlive}/>
|
|
64
|
+
<key>RunAtLoad</key>
|
|
65
|
+
<${runAtLoad}/>
|
|
66
|
+
</dict>
|
|
67
|
+
</plist>
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
/** Escape XML special characters */
|
|
71
|
+
function escapeXml(str) {
|
|
72
|
+
return str
|
|
73
|
+
.replace(/&/g, "&")
|
|
74
|
+
.replace(/</g, "<")
|
|
75
|
+
.replace(/>/g, ">")
|
|
76
|
+
.replace(/"/g, """)
|
|
77
|
+
.replace(/'/g, "'");
|
|
78
|
+
}
|
|
79
|
+
/** Parse plist file to extract program arguments */
|
|
80
|
+
async function parsePlist(plistPath) {
|
|
81
|
+
try {
|
|
82
|
+
const content = await fs.readFile(plistPath, "utf8");
|
|
83
|
+
// Extract ProgramArguments
|
|
84
|
+
const argsMatch = content.match(/<key>ProgramArguments<\/key>\s*<array>([\s\S]*?)<\/array>/);
|
|
85
|
+
const programArguments = [];
|
|
86
|
+
if (argsMatch) {
|
|
87
|
+
const stringMatches = argsMatch[1].matchAll(/<string>(.*?)<\/string>/g);
|
|
88
|
+
for (const match of stringMatches) {
|
|
89
|
+
programArguments.push(unescapeXml(match[1]));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Extract WorkingDirectory
|
|
93
|
+
const wdMatch = content.match(/<key>WorkingDirectory<\/key>\s*<string>(.*?)<\/string>/);
|
|
94
|
+
const workingDirectory = wdMatch ? unescapeXml(wdMatch[1]) : undefined;
|
|
95
|
+
// Extract EnvironmentVariables
|
|
96
|
+
const environment = {};
|
|
97
|
+
const envMatch = content.match(/<key>EnvironmentVariables<\/key>\s*<dict>([\s\S]*?)<\/dict>/);
|
|
98
|
+
if (envMatch) {
|
|
99
|
+
const pairs = envMatch[1].matchAll(/<key>(.*?)<\/key>\s*<string>(.*?)<\/string>/g);
|
|
100
|
+
for (const pair of pairs) {
|
|
101
|
+
environment[unescapeXml(pair[1])] = unescapeXml(pair[2]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
programArguments,
|
|
106
|
+
workingDirectory,
|
|
107
|
+
environment: Object.keys(environment).length > 0 ? environment : undefined,
|
|
108
|
+
sourcePath: plistPath,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Unescape XML entities */
|
|
116
|
+
function unescapeXml(str) {
|
|
117
|
+
return str
|
|
118
|
+
.replace(/</g, "<")
|
|
119
|
+
.replace(/>/g, ">")
|
|
120
|
+
.replace(/"/g, '"')
|
|
121
|
+
.replace(/'/g, "'")
|
|
122
|
+
.replace(/&/g, "&");
|
|
123
|
+
}
|
|
124
|
+
/** Check if service is loaded */
|
|
125
|
+
async function isLoaded(name) {
|
|
126
|
+
try {
|
|
127
|
+
const { stdout } = await execFileAsync("launchctl", ["list"]);
|
|
128
|
+
return stdout.includes(name);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Get service PID if running */
|
|
135
|
+
async function getPid(name) {
|
|
136
|
+
try {
|
|
137
|
+
const { stdout } = await execFileAsync("launchctl", ["list", name]);
|
|
138
|
+
// Parse output: "PID\tStatus\tLabel" or JSON depending on format
|
|
139
|
+
const lines = stdout.trim().split("\n");
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
const match = line.match(/^\s*"PID"\s*=\s*(\d+)/);
|
|
142
|
+
if (match)
|
|
143
|
+
return Number.parseInt(match[1], 10);
|
|
144
|
+
// Tab-separated format
|
|
145
|
+
const parts = line.split("\t");
|
|
146
|
+
if (parts[0] && /^\d+$/.test(parts[0])) {
|
|
147
|
+
return Number.parseInt(parts[0], 10);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Service not found
|
|
153
|
+
}
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
/** macOS LaunchAgent service manager */
|
|
157
|
+
export const launchdManager = {
|
|
158
|
+
label: "LaunchAgent",
|
|
159
|
+
loadedText: "loaded",
|
|
160
|
+
notLoadedText: "not loaded",
|
|
161
|
+
async install(config) {
|
|
162
|
+
try {
|
|
163
|
+
const plistPath = getPlistPath(config.name);
|
|
164
|
+
const logDir = getLogDir(config.name);
|
|
165
|
+
// Ensure directories exist
|
|
166
|
+
await fs.mkdir(getLaunchAgentsDir(), { recursive: true });
|
|
167
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
168
|
+
// Write plist file
|
|
169
|
+
const plistContent = buildPlist(config);
|
|
170
|
+
await fs.writeFile(plistPath, plistContent, "utf8");
|
|
171
|
+
// Load the service
|
|
172
|
+
await execFileAsync("launchctl", ["load", plistPath]);
|
|
173
|
+
return { success: true, message: `Service ${config.name} installed` };
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
error: err instanceof Error ? err.message : String(err),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
async uninstall(name) {
|
|
183
|
+
try {
|
|
184
|
+
const plistPath = getPlistPath(name);
|
|
185
|
+
// Unload if loaded
|
|
186
|
+
if (await isLoaded(name)) {
|
|
187
|
+
try {
|
|
188
|
+
await execFileAsync("launchctl", ["unload", plistPath]);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// May fail if already unloaded
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Remove plist file
|
|
195
|
+
try {
|
|
196
|
+
await fs.unlink(plistPath);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// File may not exist
|
|
200
|
+
}
|
|
201
|
+
return { success: true, message: `Service ${name} uninstalled` };
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
error: err instanceof Error ? err.message : String(err),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
async start(name) {
|
|
211
|
+
try {
|
|
212
|
+
await execFileAsync("launchctl", ["start", name]);
|
|
213
|
+
return { success: true, message: `Service ${name} started` };
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
error: err instanceof Error ? err.message : String(err),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
async stop(name) {
|
|
223
|
+
try {
|
|
224
|
+
await execFileAsync("launchctl", ["stop", name]);
|
|
225
|
+
return { success: true, message: `Service ${name} stopped` };
|
|
226
|
+
}
|
|
227
|
+
catch (err) {
|
|
228
|
+
return {
|
|
229
|
+
success: false,
|
|
230
|
+
error: err instanceof Error ? err.message : String(err),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
async restart(name) {
|
|
235
|
+
const stopResult = await this.stop(name);
|
|
236
|
+
if (!stopResult.success) {
|
|
237
|
+
// Continue anyway - service might not be running
|
|
238
|
+
}
|
|
239
|
+
return this.start(name);
|
|
240
|
+
},
|
|
241
|
+
async isInstalled(name) {
|
|
242
|
+
const plistPath = getPlistPath(name);
|
|
243
|
+
try {
|
|
244
|
+
await fs.access(plistPath);
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
async isRunning(name) {
|
|
252
|
+
const pid = await getPid(name);
|
|
253
|
+
return pid !== undefined;
|
|
254
|
+
},
|
|
255
|
+
async getCommand(name) {
|
|
256
|
+
const plistPath = getPlistPath(name);
|
|
257
|
+
return parsePlist(plistPath);
|
|
258
|
+
},
|
|
259
|
+
async getRuntime(name) {
|
|
260
|
+
const running = await this.isRunning(name);
|
|
261
|
+
const pid = await getPid(name);
|
|
262
|
+
return {
|
|
263
|
+
running,
|
|
264
|
+
pid,
|
|
265
|
+
platformInfo: {
|
|
266
|
+
plistPath: getPlistPath(name),
|
|
267
|
+
logDir: getLogDir(name),
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=launchd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../typescript/src/launchd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Scheduled Tasks service manager.
|
|
3
|
+
*
|
|
4
|
+
* Manages services via Windows Task Scheduler.
|
|
5
|
+
*/
|
|
6
|
+
import type { ServiceManager } from "./types.js";
|
|
7
|
+
/** Windows Scheduled Task service manager */
|
|
8
|
+
export declare const schtasksManager: ServiceManager;
|
|
9
|
+
//# sourceMappingURL=schtasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schtasks.d.ts","sourceRoot":"","sources":["../typescript/src/schtasks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,YAAY,CAAC;AA8DpB,6CAA6C;AAC7C,eAAO,MAAM,eAAe,EAAE,cAkJ7B,CAAC"}
|
package/dist/schtasks.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Scheduled Tasks service manager.
|
|
3
|
+
*
|
|
4
|
+
* Manages services via Windows Task Scheduler.
|
|
5
|
+
*/
|
|
6
|
+
import { execFile } from "node:child_process";
|
|
7
|
+
import { promisify } from "node:util";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
/** Run schtasks command */
|
|
10
|
+
async function schtasks(args) {
|
|
11
|
+
return execFileAsync("schtasks", args);
|
|
12
|
+
}
|
|
13
|
+
/** Run PowerShell command */
|
|
14
|
+
async function powershell(script) {
|
|
15
|
+
return execFileAsync("powershell", [
|
|
16
|
+
"-NoProfile",
|
|
17
|
+
"-ExecutionPolicy",
|
|
18
|
+
"Bypass",
|
|
19
|
+
"-Command",
|
|
20
|
+
script,
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
/** Check if task exists */
|
|
24
|
+
async function taskExists(name) {
|
|
25
|
+
try {
|
|
26
|
+
await schtasks(["/Query", "/TN", name, "/FO", "LIST"]);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Get task status */
|
|
34
|
+
async function getTaskStatus(name) {
|
|
35
|
+
try {
|
|
36
|
+
const { stdout } = await schtasks([
|
|
37
|
+
"/Query",
|
|
38
|
+
"/TN",
|
|
39
|
+
name,
|
|
40
|
+
"/FO",
|
|
41
|
+
"LIST",
|
|
42
|
+
"/V",
|
|
43
|
+
]);
|
|
44
|
+
const running = stdout.includes("Running");
|
|
45
|
+
let lastResult;
|
|
46
|
+
const resultMatch = stdout.match(/Last Result:\s*(\d+)/);
|
|
47
|
+
if (resultMatch) {
|
|
48
|
+
lastResult = Number.parseInt(resultMatch[1], 10);
|
|
49
|
+
}
|
|
50
|
+
return { running, lastResult };
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return { running: false };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Windows Scheduled Task service manager */
|
|
57
|
+
export const schtasksManager = {
|
|
58
|
+
label: "Scheduled Task",
|
|
59
|
+
loadedText: "registered",
|
|
60
|
+
notLoadedText: "not registered",
|
|
61
|
+
async install(config) {
|
|
62
|
+
try {
|
|
63
|
+
// Build the command
|
|
64
|
+
const [program, ...args] = config.command;
|
|
65
|
+
const commandLine = args.length > 0
|
|
66
|
+
? `"${program}" ${args.map((a) => `"${a}"`).join(" ")}`
|
|
67
|
+
: `"${program}"`;
|
|
68
|
+
// Create XML for the task (allows more options than command line)
|
|
69
|
+
const xml = buildTaskXml(config);
|
|
70
|
+
// Use PowerShell to register the task with XML
|
|
71
|
+
const script = `
|
|
72
|
+
$xml = @'
|
|
73
|
+
${xml}
|
|
74
|
+
'@
|
|
75
|
+
Register-ScheduledTask -TaskName "${config.name}" -Xml $xml -Force
|
|
76
|
+
`;
|
|
77
|
+
await powershell(script);
|
|
78
|
+
// Start the task if runAtLoad
|
|
79
|
+
if (config.runAtLoad !== false) {
|
|
80
|
+
await schtasks(["/Run", "/TN", config.name]);
|
|
81
|
+
}
|
|
82
|
+
return { success: true, message: `Service ${config.name} installed` };
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
error: err instanceof Error ? err.message : String(err),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
async uninstall(name) {
|
|
92
|
+
try {
|
|
93
|
+
// Stop the task if running
|
|
94
|
+
try {
|
|
95
|
+
await schtasks(["/End", "/TN", name]);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// May fail if not running
|
|
99
|
+
}
|
|
100
|
+
// Delete the task
|
|
101
|
+
await schtasks(["/Delete", "/TN", name, "/F"]);
|
|
102
|
+
return { success: true, message: `Service ${name} uninstalled` };
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
error: err instanceof Error ? err.message : String(err),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
async start(name) {
|
|
112
|
+
try {
|
|
113
|
+
await schtasks(["/Run", "/TN", name]);
|
|
114
|
+
return { success: true, message: `Service ${name} started` };
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return {
|
|
118
|
+
success: false,
|
|
119
|
+
error: err instanceof Error ? err.message : String(err),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
async stop(name) {
|
|
124
|
+
try {
|
|
125
|
+
await schtasks(["/End", "/TN", name]);
|
|
126
|
+
return { success: true, message: `Service ${name} stopped` };
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: err instanceof Error ? err.message : String(err),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
async restart(name) {
|
|
136
|
+
const stopResult = await this.stop(name);
|
|
137
|
+
if (!stopResult.success) {
|
|
138
|
+
// Continue anyway
|
|
139
|
+
}
|
|
140
|
+
// Brief delay before restart
|
|
141
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
142
|
+
return this.start(name);
|
|
143
|
+
},
|
|
144
|
+
async isInstalled(name) {
|
|
145
|
+
return taskExists(name);
|
|
146
|
+
},
|
|
147
|
+
async isRunning(name) {
|
|
148
|
+
const status = await getTaskStatus(name);
|
|
149
|
+
return status.running;
|
|
150
|
+
},
|
|
151
|
+
async getCommand(name) {
|
|
152
|
+
try {
|
|
153
|
+
const { stdout } = await powershell(`
|
|
154
|
+
$task = Get-ScheduledTask -TaskName "${name}" -ErrorAction SilentlyContinue
|
|
155
|
+
if ($task) {
|
|
156
|
+
$action = $task.Actions[0]
|
|
157
|
+
@{
|
|
158
|
+
Execute = $action.Execute
|
|
159
|
+
Arguments = $action.Arguments
|
|
160
|
+
WorkingDirectory = $action.WorkingDirectory
|
|
161
|
+
} | ConvertTo-Json
|
|
162
|
+
}
|
|
163
|
+
`);
|
|
164
|
+
const data = JSON.parse(stdout.trim());
|
|
165
|
+
const programArguments = [data.Execute];
|
|
166
|
+
if (data.Arguments) {
|
|
167
|
+
// Parse arguments (simplified)
|
|
168
|
+
programArguments.push(...data.Arguments.split(/\s+/).filter(Boolean));
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
programArguments,
|
|
172
|
+
workingDirectory: data.WorkingDirectory || undefined,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
async getRuntime(name) {
|
|
180
|
+
const status = await getTaskStatus(name);
|
|
181
|
+
return {
|
|
182
|
+
running: status.running,
|
|
183
|
+
exitCode: status.lastResult,
|
|
184
|
+
platformInfo: {
|
|
185
|
+
taskName: name,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
/** Build Task Scheduler XML */
|
|
191
|
+
function buildTaskXml(config) {
|
|
192
|
+
const [program, ...args] = config.command;
|
|
193
|
+
const arguments_ = args.length > 0 ? args.map((a) => `"${a}"`).join(" ") : "";
|
|
194
|
+
const description = config.description || `${config.name} service`;
|
|
195
|
+
const workingDir = config.workingDirectory || "";
|
|
196
|
+
// Build restart settings
|
|
197
|
+
const restartInterval = config.restartDelay
|
|
198
|
+
? `PT${config.restartDelay}S`
|
|
199
|
+
: "PT5S";
|
|
200
|
+
return `<?xml version="1.0" encoding="UTF-16"?>
|
|
201
|
+
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
202
|
+
<RegistrationInfo>
|
|
203
|
+
<Description>${escapeXml(description)}</Description>
|
|
204
|
+
</RegistrationInfo>
|
|
205
|
+
<Triggers>
|
|
206
|
+
<LogonTrigger>
|
|
207
|
+
<Enabled>true</Enabled>
|
|
208
|
+
</LogonTrigger>
|
|
209
|
+
</Triggers>
|
|
210
|
+
<Principals>
|
|
211
|
+
<Principal id="Author">
|
|
212
|
+
<LogonType>InteractiveToken</LogonType>
|
|
213
|
+
<RunLevel>LeastPrivilege</RunLevel>
|
|
214
|
+
</Principal>
|
|
215
|
+
</Principals>
|
|
216
|
+
<Settings>
|
|
217
|
+
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
|
218
|
+
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
|
219
|
+
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
|
220
|
+
<AllowHardTerminate>true</AllowHardTerminate>
|
|
221
|
+
<StartWhenAvailable>true</StartWhenAvailable>
|
|
222
|
+
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
|
223
|
+
<IdleSettings>
|
|
224
|
+
<StopOnIdleEnd>false</StopOnIdleEnd>
|
|
225
|
+
<RestartOnIdle>false</RestartOnIdle>
|
|
226
|
+
</IdleSettings>
|
|
227
|
+
<AllowStartOnDemand>true</AllowStartOnDemand>
|
|
228
|
+
<Enabled>true</Enabled>
|
|
229
|
+
<Hidden>false</Hidden>
|
|
230
|
+
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
|
231
|
+
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
|
|
232
|
+
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
|
|
233
|
+
<WakeToRun>false</WakeToRun>
|
|
234
|
+
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
|
|
235
|
+
<Priority>7</Priority>
|
|
236
|
+
<RestartOnFailure>
|
|
237
|
+
<Interval>${restartInterval}</Interval>
|
|
238
|
+
<Count>3</Count>
|
|
239
|
+
</RestartOnFailure>
|
|
240
|
+
</Settings>
|
|
241
|
+
<Actions Context="Author">
|
|
242
|
+
<Exec>
|
|
243
|
+
<Command>${escapeXml(program)}</Command>
|
|
244
|
+
${arguments_ ? `<Arguments>${escapeXml(arguments_)}</Arguments>` : ""}
|
|
245
|
+
${workingDir ? `<WorkingDirectory>${escapeXml(workingDir)}</WorkingDirectory>` : ""}
|
|
246
|
+
</Exec>
|
|
247
|
+
</Actions>
|
|
248
|
+
</Task>`;
|
|
249
|
+
}
|
|
250
|
+
/** Escape XML special characters */
|
|
251
|
+
function escapeXml(str) {
|
|
252
|
+
return str
|
|
253
|
+
.replace(/&/g, "&")
|
|
254
|
+
.replace(/</g, "<")
|
|
255
|
+
.replace(/>/g, ">")
|
|
256
|
+
.replace(/"/g, """)
|
|
257
|
+
.replace(/'/g, "'");
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=schtasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schtasks.js","sourceRoot":"","sources":["../typescript/src/schtasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linux systemd user service manager.
|
|
3
|
+
*
|
|
4
|
+
* Manages services via systemd user units.
|
|
5
|
+
*/
|
|
6
|
+
import type { ServiceManager } from "./types.js";
|
|
7
|
+
/** Linux systemd service manager */
|
|
8
|
+
export declare const systemdManager: ServiceManager;
|
|
9
|
+
//# sourceMappingURL=systemd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.d.ts","sourceRoot":"","sources":["../typescript/src/systemd.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,YAAY,CAAC;AAkMpB,oCAAoC;AACpC,eAAO,MAAM,cAAc,EAAE,cAkJ5B,CAAC"}
|