@openclaw-cloud/agent-controller 0.9.4 → 0.9.6
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/dist/platform/linux.js +138 -37
- package/dist/platform/linux.js.map +1 -1
- package/package.json +1 -1
package/dist/platform/linux.js
CHANGED
|
@@ -1,19 +1,34 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
2
|
+
import { homedir, userInfo } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { execAsync } from '../utils/exec.js';
|
|
5
5
|
import { which } from './common.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
const SYSTEM_SERVICE_PATH = '/etc/systemd/system/agent-controller.service';
|
|
7
|
+
const DBUS_ERROR_PATTERNS = [
|
|
8
|
+
'No medium found',
|
|
9
|
+
'Failed to connect to bus',
|
|
10
|
+
'No such file or directory',
|
|
11
|
+
];
|
|
12
|
+
async function isUserSystemdAvailable() {
|
|
13
|
+
try {
|
|
14
|
+
await execAsync('systemctl --user status 2>&1');
|
|
15
|
+
return true;
|
|
14
16
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
catch (err) {
|
|
18
|
+
// Node exec error includes message, stderr, and stdout — check all
|
|
19
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
20
|
+
const stderr = err?.stderr ?? '';
|
|
21
|
+
const stdout = err?.stdout ?? '';
|
|
22
|
+
const combined = `${msg}\n${stderr}\n${stdout}`;
|
|
23
|
+
if (DBUS_ERROR_PATTERNS.some(pattern => combined.includes(pattern))) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// Non-D-Bus errors (e.g. no services running) — user systemd is still available
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function buildUserService(nodePath, agentControllerPath, config) {
|
|
31
|
+
return `[Unit]
|
|
17
32
|
Description=OpenClaw Agent Controller
|
|
18
33
|
After=network.target
|
|
19
34
|
|
|
@@ -30,6 +45,42 @@ ExecStart="${nodePath}" "${agentControllerPath}"
|
|
|
30
45
|
[Install]
|
|
31
46
|
WantedBy=default.target
|
|
32
47
|
`;
|
|
48
|
+
}
|
|
49
|
+
function buildSystemService(nodePath, agentControllerPath, config) {
|
|
50
|
+
const home = homedir();
|
|
51
|
+
const info = userInfo();
|
|
52
|
+
const isRoot = info.uid === 0;
|
|
53
|
+
const userGroupLines = isRoot ? '' : `User=${info.username}\nGroup=${info.gid}\n`;
|
|
54
|
+
return `[Unit]
|
|
55
|
+
Description=OpenClaw Agent Controller
|
|
56
|
+
After=network.target
|
|
57
|
+
|
|
58
|
+
[Service]
|
|
59
|
+
Type=simple
|
|
60
|
+
Restart=always
|
|
61
|
+
RestartSec=10
|
|
62
|
+
${userGroupLines}WorkingDirectory=${home}
|
|
63
|
+
Environment=HOME=${home}
|
|
64
|
+
Environment=CENTRIFUGO_URL=${config.centrifugoUrl}
|
|
65
|
+
Environment=AGENT_TOKEN=${config.agentToken}
|
|
66
|
+
Environment=AGENT_ID=${config.agentId}
|
|
67
|
+
Environment=BACKEND_URL=${config.backendInternalUrl}
|
|
68
|
+
ExecStart="${nodePath}" "${agentControllerPath}"
|
|
69
|
+
|
|
70
|
+
[Install]
|
|
71
|
+
WantedBy=multi-user.target
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
export async function installLinux(config) {
|
|
75
|
+
const home = homedir();
|
|
76
|
+
const systemdDir = join(home, '.config', 'systemd', 'user');
|
|
77
|
+
const userServicePath = join(systemdDir, 'agent-controller.service');
|
|
78
|
+
const nodePath = process.execPath;
|
|
79
|
+
let agentControllerPath = await which('agent-controller');
|
|
80
|
+
if (!agentControllerPath) {
|
|
81
|
+
agentControllerPath = join(nodePath, '..', 'agent-controller');
|
|
82
|
+
}
|
|
83
|
+
await fs.mkdir(systemdDir, { recursive: true });
|
|
33
84
|
// Stop existing service before reinstalling
|
|
34
85
|
try {
|
|
35
86
|
await execAsync('systemctl --user stop agent-controller 2>/dev/null');
|
|
@@ -38,48 +89,98 @@ WantedBy=default.target
|
|
|
38
89
|
catch {
|
|
39
90
|
// Not running — fine
|
|
40
91
|
}
|
|
41
|
-
await fs.writeFile(
|
|
42
|
-
console.log(`Written: ${
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
console.log('systemd
|
|
46
|
-
|
|
47
|
-
|
|
92
|
+
await fs.writeFile(userServicePath, buildUserService(nodePath, agentControllerPath, config), 'utf8');
|
|
93
|
+
console.log(`Written: ${userServicePath}`);
|
|
94
|
+
const userSystemdOk = await isUserSystemdAvailable();
|
|
95
|
+
if (!userSystemdOk) {
|
|
96
|
+
console.log('User systemd session not available. Falling back to system-level service...');
|
|
97
|
+
const systemService = buildSystemService(nodePath, agentControllerPath, config);
|
|
98
|
+
await fs.writeFile(SYSTEM_SERVICE_PATH, systemService, 'utf8');
|
|
99
|
+
console.log(`Written: ${SYSTEM_SERVICE_PATH}`);
|
|
100
|
+
try {
|
|
101
|
+
await execAsync('systemctl daemon-reload');
|
|
102
|
+
console.log('systemd daemon reloaded.');
|
|
103
|
+
await execAsync('systemctl enable --now agent-controller');
|
|
104
|
+
console.log('Service enabled and started.');
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.warn('systemctl command failed:', err instanceof Error ? err.message : err);
|
|
108
|
+
}
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log('Agent Controller installed as a systemd system service.');
|
|
111
|
+
console.log('');
|
|
112
|
+
console.log('Useful commands:');
|
|
113
|
+
console.log(' Start: systemctl start agent-controller');
|
|
114
|
+
console.log(' Stop: systemctl stop agent-controller');
|
|
115
|
+
console.log(' Status: systemctl status agent-controller');
|
|
116
|
+
console.log(' Logs: journalctl -u agent-controller -f');
|
|
117
|
+
console.log(' Uninstall: agent-controller uninstall');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
try {
|
|
121
|
+
await execAsync('systemctl --user daemon-reload');
|
|
122
|
+
console.log('systemd daemon reloaded.');
|
|
123
|
+
await execAsync('systemctl --user enable --now agent-controller');
|
|
124
|
+
console.log('Service enabled and started.');
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.warn('systemctl command failed:', err instanceof Error ? err.message : err);
|
|
128
|
+
}
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log('Agent Controller installed as a systemd user service.');
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log('Useful commands:');
|
|
133
|
+
console.log(' Start: systemctl --user start agent-controller');
|
|
134
|
+
console.log(' Stop: systemctl --user stop agent-controller');
|
|
135
|
+
console.log(' Status: systemctl --user status agent-controller');
|
|
136
|
+
console.log(' Logs: journalctl --user -u agent-controller -f');
|
|
137
|
+
console.log(' Uninstall: agent-controller uninstall');
|
|
48
138
|
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
console.warn('systemctl command failed:', err instanceof Error ? err.message : err);
|
|
51
|
-
}
|
|
52
|
-
console.log('');
|
|
53
|
-
console.log('Agent Controller installed as a systemd user service.');
|
|
54
|
-
console.log('');
|
|
55
|
-
console.log('Useful commands:');
|
|
56
|
-
console.log(' Start: systemctl --user start agent-controller');
|
|
57
|
-
console.log(' Stop: systemctl --user stop agent-controller');
|
|
58
|
-
console.log(' Status: systemctl --user status agent-controller');
|
|
59
|
-
console.log(' Logs: journalctl --user -u agent-controller -f');
|
|
60
|
-
console.log(' Uninstall: agent-controller uninstall');
|
|
61
139
|
}
|
|
62
140
|
export async function uninstallLinux() {
|
|
141
|
+
let userDisableSucceeded = false;
|
|
63
142
|
try {
|
|
64
143
|
await execAsync('systemctl --user disable --now agent-controller');
|
|
65
|
-
console.log('Service disabled and stopped.');
|
|
144
|
+
console.log('Service disabled and stopped (user).');
|
|
145
|
+
userDisableSucceeded = true;
|
|
66
146
|
}
|
|
67
147
|
catch (err) {
|
|
68
|
-
console.warn('systemctl disable failed
|
|
148
|
+
console.warn('systemctl --user disable failed, trying system-level:', err instanceof Error ? err.message : err);
|
|
149
|
+
}
|
|
150
|
+
if (!userDisableSucceeded) {
|
|
151
|
+
try {
|
|
152
|
+
await execAsync('systemctl disable --now agent-controller');
|
|
153
|
+
console.log('Service disabled and stopped (system).');
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
console.warn('systemctl disable failed (may not be enabled):', err instanceof Error ? err.message : err);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const userServicePath = join(homedir(), '.config', 'systemd', 'user', 'agent-controller.service');
|
|
160
|
+
try {
|
|
161
|
+
await fs.unlink(userServicePath);
|
|
162
|
+
console.log(`Removed: ${userServicePath}`);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
console.log(`Service file not found: ${userServicePath}`);
|
|
69
166
|
}
|
|
70
|
-
const servicePath = join(homedir(), '.config', 'systemd', 'user', 'agent-controller.service');
|
|
71
167
|
try {
|
|
72
|
-
await fs.unlink(
|
|
73
|
-
console.log(`Removed: ${
|
|
168
|
+
await fs.unlink(SYSTEM_SERVICE_PATH);
|
|
169
|
+
console.log(`Removed: ${SYSTEM_SERVICE_PATH}`);
|
|
74
170
|
}
|
|
75
171
|
catch {
|
|
76
|
-
|
|
172
|
+
// Not present — fine
|
|
77
173
|
}
|
|
78
174
|
try {
|
|
79
175
|
await execAsync('systemctl --user daemon-reload');
|
|
80
176
|
}
|
|
81
177
|
catch {
|
|
82
|
-
|
|
178
|
+
try {
|
|
179
|
+
await execAsync('systemctl daemon-reload');
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// best-effort
|
|
183
|
+
}
|
|
83
184
|
}
|
|
84
185
|
console.log('Agent Controller uninstalled.');
|
|
85
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linux.js","sourceRoot":"","sources":["../../src/platform/linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"linux.js","sourceRoot":"","sources":["../../src/platform/linux.ts"],"names":[],"mappings":"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"}
|