@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,325 @@
1
+ /**
2
+ * Linux systemd user service manager.
3
+ *
4
+ * Manages services via systemd user units.
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 || `/home/${process.env.USER || "unknown"}`;
14
+ }
15
+ /** Get systemd user units directory */
16
+ function getUnitsDir() {
17
+ return path.join(getHomeDir(), ".config", "systemd", "user");
18
+ }
19
+ /** Get unit file path for a service */
20
+ function getUnitPath(name) {
21
+ return path.join(getUnitsDir(), `${name}.service`);
22
+ }
23
+ /** Get log directory */
24
+ function getLogDir(name) {
25
+ return path.join(getHomeDir(), ".local", "share", name, "logs");
26
+ }
27
+ /** Build systemd unit file content */
28
+ function buildUnit(config) {
29
+ const description = config.description || `${config.name} service`;
30
+ const execStart = config.command.map(escapeSystemd).join(" ");
31
+ const restart = config.restartOnFailure !== false ? "on-failure" : "no";
32
+ const restartSec = config.restartDelay || 5;
33
+ let envLines = "";
34
+ if (config.environment) {
35
+ envLines = Object.entries(config.environment)
36
+ .map(([k, v]) => `Environment="${k}=${escapeSystemd(v)}"`)
37
+ .join("\n");
38
+ }
39
+ let workingDir = "";
40
+ if (config.workingDirectory) {
41
+ workingDir = `WorkingDirectory=${config.workingDirectory}`;
42
+ }
43
+ return `[Unit]
44
+ Description=${description}
45
+ After=network.target
46
+
47
+ [Service]
48
+ Type=simple
49
+ ExecStart=${execStart}
50
+ ${workingDir}
51
+ ${envLines}
52
+ Restart=${restart}
53
+ RestartSec=${restartSec}
54
+
55
+ [Install]
56
+ WantedBy=default.target
57
+ `.replace(/\n{3,}/g, "\n\n");
58
+ }
59
+ /** Escape systemd special characters */
60
+ function escapeSystemd(str) {
61
+ // Escape quotes and backslashes
62
+ return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
63
+ }
64
+ /** Parse unit file to extract ExecStart */
65
+ async function parseUnit(unitPath) {
66
+ try {
67
+ const content = await fs.readFile(unitPath, "utf8");
68
+ let execStart = "";
69
+ let workingDirectory;
70
+ const environment = {};
71
+ for (const rawLine of content.split("\n")) {
72
+ const line = rawLine.trim();
73
+ if (line.startsWith("ExecStart=")) {
74
+ execStart = line.slice("ExecStart=".length);
75
+ }
76
+ else if (line.startsWith("WorkingDirectory=")) {
77
+ workingDirectory = line.slice("WorkingDirectory=".length);
78
+ }
79
+ else if (line.startsWith("Environment=")) {
80
+ const envPart = line.slice("Environment=".length);
81
+ // Parse "KEY=value" format
82
+ const match = envPart.match(/^"?([^=]+)=(.*)$/);
83
+ if (match) {
84
+ const key = match[1];
85
+ let value = match[2];
86
+ // Remove trailing quote if present
87
+ if (value.endsWith('"'))
88
+ value = value.slice(0, -1);
89
+ environment[key] = value;
90
+ }
91
+ }
92
+ }
93
+ // Parse ExecStart into arguments
94
+ const programArguments = parseExecStart(execStart);
95
+ return {
96
+ programArguments,
97
+ workingDirectory,
98
+ environment: Object.keys(environment).length > 0 ? environment : undefined,
99
+ sourcePath: unitPath,
100
+ };
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ /** Parse ExecStart line into arguments */
107
+ function parseExecStart(execStart) {
108
+ const args = [];
109
+ let current = "";
110
+ let inQuote = false;
111
+ let isEscaped = false;
112
+ for (const char of execStart) {
113
+ if (isEscaped) {
114
+ current += char;
115
+ isEscaped = false;
116
+ }
117
+ else if (char === "\\") {
118
+ isEscaped = true;
119
+ }
120
+ else if (char === '"') {
121
+ inQuote = !inQuote;
122
+ }
123
+ else if (char === " " && !inQuote) {
124
+ if (current) {
125
+ args.push(current);
126
+ current = "";
127
+ }
128
+ }
129
+ else {
130
+ current += char;
131
+ }
132
+ }
133
+ if (current)
134
+ args.push(current);
135
+ return args;
136
+ }
137
+ /** Run systemctl command */
138
+ async function systemctl(args) {
139
+ return execFileAsync("systemctl", ["--user", ...args]);
140
+ }
141
+ /** Check if service is enabled */
142
+ async function isEnabled(name) {
143
+ try {
144
+ const { stdout } = await systemctl(["is-enabled", `${name}.service`]);
145
+ return stdout.trim() === "enabled";
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ /** Check if service is active/running */
152
+ async function isActive(name) {
153
+ try {
154
+ const { stdout } = await systemctl(["is-active", `${name}.service`]);
155
+ return stdout.trim() === "active";
156
+ }
157
+ catch {
158
+ return false;
159
+ }
160
+ }
161
+ /** Get service PID */
162
+ async function getPid(name) {
163
+ try {
164
+ const { stdout } = await systemctl([
165
+ "show",
166
+ `${name}.service`,
167
+ "--property=MainPID",
168
+ ]);
169
+ const match = stdout.match(/MainPID=(\d+)/);
170
+ if (match && match[1] !== "0") {
171
+ return Number.parseInt(match[1], 10);
172
+ }
173
+ }
174
+ catch {
175
+ // Service not found
176
+ }
177
+ return undefined;
178
+ }
179
+ /** Enable lingering for current user (allows services to run without login) */
180
+ async function enableLinger() {
181
+ try {
182
+ await execFileAsync("loginctl", ["enable-linger"]);
183
+ return true;
184
+ }
185
+ catch {
186
+ return false;
187
+ }
188
+ }
189
+ /** Linux systemd service manager */
190
+ export const systemdManager = {
191
+ label: "systemd",
192
+ loadedText: "enabled",
193
+ notLoadedText: "disabled",
194
+ async install(config) {
195
+ try {
196
+ const unitPath = getUnitPath(config.name);
197
+ const logDir = getLogDir(config.name);
198
+ // Ensure directories exist
199
+ await fs.mkdir(getUnitsDir(), { recursive: true });
200
+ await fs.mkdir(logDir, { recursive: true });
201
+ // Write unit file
202
+ const unitContent = buildUnit(config);
203
+ await fs.writeFile(unitPath, unitContent, "utf8");
204
+ // Reload systemd
205
+ await systemctl(["daemon-reload"]);
206
+ // Enable the service
207
+ await systemctl(["enable", `${config.name}.service`]);
208
+ // Enable lingering so service runs without login
209
+ await enableLinger();
210
+ // Start the service if runAtLoad
211
+ if (config.runAtLoad !== false) {
212
+ await systemctl(["start", `${config.name}.service`]);
213
+ }
214
+ return { success: true, message: `Service ${config.name} installed` };
215
+ }
216
+ catch (err) {
217
+ return {
218
+ success: false,
219
+ error: err instanceof Error ? err.message : String(err),
220
+ };
221
+ }
222
+ },
223
+ async uninstall(name) {
224
+ try {
225
+ // Stop the service
226
+ try {
227
+ await systemctl(["stop", `${name}.service`]);
228
+ }
229
+ catch {
230
+ // May fail if not running
231
+ }
232
+ // Disable the service
233
+ try {
234
+ await systemctl(["disable", `${name}.service`]);
235
+ }
236
+ catch {
237
+ // May fail if not enabled
238
+ }
239
+ // Remove unit file
240
+ const unitPath = getUnitPath(name);
241
+ try {
242
+ await fs.unlink(unitPath);
243
+ }
244
+ catch {
245
+ // File may not exist
246
+ }
247
+ // Reload systemd
248
+ await systemctl(["daemon-reload"]);
249
+ return { success: true, message: `Service ${name} uninstalled` };
250
+ }
251
+ catch (err) {
252
+ return {
253
+ success: false,
254
+ error: err instanceof Error ? err.message : String(err),
255
+ };
256
+ }
257
+ },
258
+ async start(name) {
259
+ try {
260
+ await systemctl(["start", `${name}.service`]);
261
+ return { success: true, message: `Service ${name} started` };
262
+ }
263
+ catch (err) {
264
+ return {
265
+ success: false,
266
+ error: err instanceof Error ? err.message : String(err),
267
+ };
268
+ }
269
+ },
270
+ async stop(name) {
271
+ try {
272
+ await systemctl(["stop", `${name}.service`]);
273
+ return { success: true, message: `Service ${name} stopped` };
274
+ }
275
+ catch (err) {
276
+ return {
277
+ success: false,
278
+ error: err instanceof Error ? err.message : String(err),
279
+ };
280
+ }
281
+ },
282
+ async restart(name) {
283
+ try {
284
+ await systemctl(["restart", `${name}.service`]);
285
+ return { success: true, message: `Service ${name} restarted` };
286
+ }
287
+ catch (err) {
288
+ return {
289
+ success: false,
290
+ error: err instanceof Error ? err.message : String(err),
291
+ };
292
+ }
293
+ },
294
+ async isInstalled(name) {
295
+ const unitPath = getUnitPath(name);
296
+ try {
297
+ await fs.access(unitPath);
298
+ return true;
299
+ }
300
+ catch {
301
+ return false;
302
+ }
303
+ },
304
+ async isRunning(name) {
305
+ return isActive(name);
306
+ },
307
+ async getCommand(name) {
308
+ const unitPath = getUnitPath(name);
309
+ return parseUnit(unitPath);
310
+ },
311
+ async getRuntime(name) {
312
+ const running = await isActive(name);
313
+ const pid = await getPid(name);
314
+ const enabled = await isEnabled(name);
315
+ return {
316
+ running,
317
+ pid,
318
+ platformInfo: {
319
+ unitPath: getUnitPath(name),
320
+ enabled,
321
+ },
322
+ };
323
+ },
324
+ };
325
+ //# sourceMappingURL=systemd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"systemd.js","sourceRoot":"","sources":["../typescript/src/systemd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Cross-platform daemon/service management types.
3
+ */
4
+ /** Service configuration for installation */
5
+ export interface ServiceConfig {
6
+ /** Unique service name/identifier */
7
+ name: string;
8
+ /** Human-readable description */
9
+ description?: string;
10
+ /** Command to execute (first element is the executable) */
11
+ command: string[];
12
+ /** Working directory for the service */
13
+ workingDirectory?: string;
14
+ /** Environment variables */
15
+ environment?: Record<string, string>;
16
+ /** Auto-restart on failure */
17
+ restartOnFailure?: boolean;
18
+ /** Restart delay in seconds */
19
+ restartDelay?: number;
20
+ /** Keep alive (restart if process exits) */
21
+ keepAlive?: boolean;
22
+ /** Run at system load (boot/login) */
23
+ runAtLoad?: boolean;
24
+ }
25
+ /** Service runtime status */
26
+ export interface ServiceRuntime {
27
+ /** Whether the service is currently running */
28
+ running: boolean;
29
+ /** Process ID if running */
30
+ pid?: number;
31
+ /** Last exit code */
32
+ exitCode?: number;
33
+ /** Service uptime in seconds */
34
+ uptimeSeconds?: number;
35
+ /** Additional platform-specific info */
36
+ platformInfo?: Record<string, unknown>;
37
+ }
38
+ /** Service command details */
39
+ export interface ServiceCommand {
40
+ /** Program arguments */
41
+ programArguments: string[];
42
+ /** Working directory */
43
+ workingDirectory?: string;
44
+ /** Environment variables */
45
+ environment?: Record<string, string>;
46
+ /** Source file path (plist, unit file, etc.) */
47
+ sourcePath?: string;
48
+ }
49
+ /** Result of a service operation */
50
+ export interface ServiceResult {
51
+ success: boolean;
52
+ message?: string;
53
+ error?: string;
54
+ }
55
+ /** Platform-specific service manager interface */
56
+ export interface ServiceManager {
57
+ /** Platform label (LaunchAgent, systemd, Scheduled Task) */
58
+ readonly label: string;
59
+ /** Text shown when service is loaded/enabled */
60
+ readonly loadedText: string;
61
+ /** Text shown when service is not loaded/disabled */
62
+ readonly notLoadedText: string;
63
+ /** Install the service */
64
+ install(config: ServiceConfig): Promise<ServiceResult>;
65
+ /** Uninstall the service */
66
+ uninstall(name: string): Promise<ServiceResult>;
67
+ /** Start the service */
68
+ start(name: string): Promise<ServiceResult>;
69
+ /** Stop the service */
70
+ stop(name: string): Promise<ServiceResult>;
71
+ /** Restart the service */
72
+ restart(name: string): Promise<ServiceResult>;
73
+ /** Check if service is installed/loaded */
74
+ isInstalled(name: string): Promise<boolean>;
75
+ /** Check if service is running */
76
+ isRunning(name: string): Promise<boolean>;
77
+ /** Get service command details */
78
+ getCommand(name: string): Promise<ServiceCommand | null>;
79
+ /** Get service runtime status */
80
+ getRuntime(name: string): Promise<ServiceRuntime>;
81
+ }
82
+ /** Supported platforms */
83
+ export type Platform = "darwin" | "linux" | "win32";
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../typescript/src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Cross-platform daemon/service management types.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../typescript/src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@elizaos/daemon",
3
+ "version": "1.0.0",
4
+ "description": "Cross-platform daemon/service management for Eliza agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "clean": "rm -rf dist",
17
+ "test": "vitest run",
18
+ "lint": "biome check --write --unsafe typescript/src",
19
+ "lint:fix": "biome check --write typescript/src"
20
+ },
21
+ "keywords": [
22
+ "eliza",
23
+ "daemon",
24
+ "service",
25
+ "launchd",
26
+ "systemd",
27
+ "process-manager"
28
+ ],
29
+ "license": "MIT",
30
+ "files": [
31
+ "dist",
32
+ "README.md"
33
+ ],
34
+ "engines": {
35
+ "node": ">=18.0.0"
36
+ },
37
+ "devDependencies": {
38
+ "@biomejs/biome": "^1.9.4",
39
+ "@types/node": "^22.10.2",
40
+ "typescript": "^5.7.3",
41
+ "vitest": "^2.1.8"
42
+ }
43
+ }