@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.
@@ -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, "&amp;")
74
+ .replace(/</g, "&lt;")
75
+ .replace(/>/g, "&gt;")
76
+ .replace(/"/g, "&quot;")
77
+ .replace(/'/g, "&apos;");
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(/&lt;/g, "<")
119
+ .replace(/&gt;/g, ">")
120
+ .replace(/&quot;/g, '"')
121
+ .replace(/&apos;/g, "'")
122
+ .replace(/&amp;/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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAStC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,yBAAyB;AACzB,SAAS,UAAU;IACjB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,UAAU,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;AACvE,CAAC;AAED,iCAAiC;AACjC,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC;AAED,wCAAwC;AACxC,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,wBAAwB;AACxB,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,8BAA8B;AAC9B,SAAS,UAAU,CAAC,MAAqB;IACvC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO;SAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;SACtD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;aAC/C,GAAG,CACF,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACT,cAAc,SAAS,CAAC,CAAC,CAAC,yBAAyB,SAAS,CAAC,CAAC,CAAC,WAAW,CAC7E;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,GAAG,gDAAgD,OAAO,eAAe,CAAC;IACnF,CAAC;IAED,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC5B,UAAU,GAAG,4CAA4C,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAC3G,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;IAE7C,OAAO;;;;;YAKG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;;;EAGhC,WAAW;;EAEX,UAAU,GAAG,OAAO;YACV,SAAS,CAAC,UAAU,CAAC;;YAErB,SAAS,CAAC,UAAU,CAAC;;KAE5B,SAAS;;KAET,SAAS;;;CAGb,CAAC;AACF,CAAC;AAED,oCAAoC;AACpC,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,oDAAoD;AACpD,KAAK,UAAU,UAAU,CAAC,SAAiB;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAErD,2BAA2B;QAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAC7B,2DAA2D,CAC5D,CAAC;QACF,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;YACxE,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAC3B,wDAAwD,CACzD,CAAC;QACF,MAAM,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvE,+BAA+B;QAC/B,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,6DAA6D,CAC9D,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAChC,8CAA8C,CAC/C,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,OAAO;YACL,gBAAgB;YAChB,gBAAgB;YAChB,WAAW,EACT,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YAC/D,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG;SACP,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,iCAAiC;AACjC,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACpE,iEAAiE;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,uBAAuB;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,KAAK,EAAE,aAAa;IACpB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,YAAY;IAE3B,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEtC,2BAA2B;YAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5C,mBAAmB;YACnB,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;YAEpD,mBAAmB;YACnB,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YAEtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAErC,mBAAmB;YACnB,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,+BAA+B;gBACjC,CAAC;YACH,CAAC;YAED,oBAAoB;YACpB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,IAAI,UAAU,EAAE,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,iDAAiD;QACnD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO;YACL,OAAO;YACP,GAAG;YACH,YAAY,EAAE;gBACZ,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC;gBAC7B,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC;aACxB;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -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"}
@@ -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, "&amp;")
254
+ .replace(/</g, "&lt;")
255
+ .replace(/>/g, "&gt;")
256
+ .replace(/"/g, "&quot;")
257
+ .replace(/'/g, "&apos;");
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"}