@rethinkingstudio/clawpilot 1.1.11-beta.1 → 1.1.12
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 +20 -1
- package/dist/commands/install.js +8 -5
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/pair.d.ts +1 -0
- package/dist/commands/pair.js +8 -3
- package/dist/commands/pair.js.map +1 -1
- package/dist/commands/status.js +90 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/i18n/index.js +4 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/platform/service-manager.d.ts +3 -0
- package/dist/platform/service-manager.js +166 -27
- package/dist/platform/service-manager.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/install.ts +8 -3
- package/src/commands/pair.ts +8 -3
- package/src/commands/status.ts +107 -2
- package/src/i18n/index.ts +4 -0
- package/src/index.ts +2 -1
- package/src/platform/service-manager.ts +174 -25
package/README.md
CHANGED
|
@@ -26,8 +26,15 @@ Generate a QR code for iOS pairing:
|
|
|
26
26
|
clawpilot pair
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
Print only the pairing code without rendering a QR code:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
clawpilot pair --code-only
|
|
33
|
+
```
|
|
34
|
+
|
|
29
35
|
Options:
|
|
30
36
|
- `-n, --name <name>` — Display name for this host
|
|
37
|
+
- `--code-only` — Print only the access code and skip QR code output
|
|
31
38
|
|
|
32
39
|
### Run
|
|
33
40
|
|
|
@@ -54,7 +61,19 @@ clawpilot install
|
|
|
54
61
|
```
|
|
55
62
|
|
|
56
63
|
- macOS: installs a `launchd` user agent
|
|
57
|
-
- Linux:
|
|
64
|
+
- Linux: prefers `systemd --user`, and falls back to `nohup` when `systemctl --user` is unavailable
|
|
65
|
+
|
|
66
|
+
On Linux hosts without `systemd --user`, `clawpilot install` will generate a fallback launcher at:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
~/.clawai/clawpilot-start.sh
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
You can start it manually with:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
bash ~/.clawai/clawpilot-start.sh
|
|
76
|
+
```
|
|
58
77
|
|
|
59
78
|
### Stop Service
|
|
60
79
|
|
package/dist/commands/install.js
CHANGED
|
@@ -2,13 +2,14 @@ import { existsSync, unlinkSync } from "fs";
|
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { homedir } from "os";
|
|
4
4
|
import { t } from "../i18n/index.js";
|
|
5
|
-
import { getServicePlatform, installService, restartService, stopService, uninstallService, servicePaths, } from "../platform/service-manager.js";
|
|
5
|
+
import { getServicePlatform, getServiceStatus, installService, restartService, stopService, uninstallService, servicePaths, } from "../platform/service-manager.js";
|
|
6
6
|
export function isInstalled() {
|
|
7
7
|
const platform = getServicePlatform();
|
|
8
8
|
if (platform === "macos")
|
|
9
9
|
return existsSync(servicePaths.macPlistPath);
|
|
10
|
-
if (platform === "linux")
|
|
11
|
-
return existsSync(servicePaths.linuxServicePath);
|
|
10
|
+
if (platform === "linux") {
|
|
11
|
+
return existsSync(servicePaths.linuxServicePath) || existsSync(servicePaths.linuxNohupStartScriptPath);
|
|
12
|
+
}
|
|
12
13
|
return false;
|
|
13
14
|
}
|
|
14
15
|
export function installCommand() {
|
|
@@ -20,7 +21,8 @@ export function installCommand() {
|
|
|
20
21
|
}
|
|
21
22
|
const started = installService();
|
|
22
23
|
if (started) {
|
|
23
|
-
|
|
24
|
+
const service = getServiceStatus();
|
|
25
|
+
console.log(t("install.serviceStarted", service.manager));
|
|
24
26
|
return;
|
|
25
27
|
}
|
|
26
28
|
console.log(t("install.installFailed", platformName(platform)));
|
|
@@ -31,6 +33,7 @@ export function installCommand() {
|
|
|
31
33
|
else if (platform === "linux") {
|
|
32
34
|
console.log(t("install.serviceFileWritten", servicePaths.linuxServicePath));
|
|
33
35
|
console.log(t("install.startManually", "systemctl --user daemon-reload && systemctl --user enable --now clawpilot.service"));
|
|
36
|
+
console.log(t("install.startManually", `bash "${servicePaths.linuxNohupStartScriptPath}"`));
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
export function restartCommand() {
|
|
@@ -96,7 +99,7 @@ function platformName(platform) {
|
|
|
96
99
|
case "macos":
|
|
97
100
|
return "launchd";
|
|
98
101
|
case "linux":
|
|
99
|
-
return "systemd";
|
|
102
|
+
return "systemd/nohup";
|
|
100
103
|
default:
|
|
101
104
|
return process.platform;
|
|
102
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACrC,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAExC,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,UAAU,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IACvE,IAAI,QAAQ,KAAK,OAAO;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pair.d.ts
CHANGED
package/dist/commands/pair.js
CHANGED
|
@@ -81,9 +81,14 @@ export async function pairCommand(opts) {
|
|
|
81
81
|
accessCode,
|
|
82
82
|
displayName,
|
|
83
83
|
});
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
if (opts.codeOnly) {
|
|
85
|
+
console.log(accessCode);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(t("pair.scanQR"));
|
|
89
|
+
qrcodeTerminal.generate(qrPayload, { small: true });
|
|
90
|
+
console.log(t("pair.accessCode", accessCode));
|
|
91
|
+
}
|
|
87
92
|
console.log(t("pair.installingService"));
|
|
88
93
|
installCommand();
|
|
89
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,SAAS,mBAAmB,CAAC,IAAY;IACvC,0EAA0E;IAC1E,OAAO,IAAI;SACR,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAE,gCAAgC;SAC7E,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAc,8BAA8B;SAC3E,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAoB,qCAAqC;SAClF,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAe,wCAAwC;AACzF,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,kBAAkB,EAAE,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AACD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AAErC,MAAM,oBAAoB,GAAG,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
1
2
|
import { configExists, readConfig, readGatewayUrl } from "../config/config.js";
|
|
2
3
|
import { t } from "../i18n/index.js";
|
|
3
4
|
import { getServiceStatus } from "../platform/service-manager.js";
|
|
@@ -25,13 +26,16 @@ export function statusCommand() {
|
|
|
25
26
|
console.log("");
|
|
26
27
|
return;
|
|
27
28
|
}
|
|
28
|
-
console.log(t("status.servicePlatform", service.
|
|
29
|
+
console.log(t("status.servicePlatform", service.manager));
|
|
29
30
|
if (!service.installed) {
|
|
30
31
|
console.log(t("status.serviceNotInstalled"));
|
|
31
32
|
}
|
|
32
33
|
else if (service.running) {
|
|
33
|
-
console.log(t("status.serviceRunning", service.
|
|
34
|
+
console.log(t("status.serviceRunning", service.manager));
|
|
34
35
|
console.log(t("status.serviceLog", service.logPath));
|
|
36
|
+
const health = readHealth(service.logPath);
|
|
37
|
+
console.log(formatHealthLine("status.relayHealth", health.relay));
|
|
38
|
+
console.log(formatHealthLine("status.gatewayHealth", health.gateway));
|
|
35
39
|
}
|
|
36
40
|
else {
|
|
37
41
|
console.log(t("status.serviceNotRunning"));
|
|
@@ -44,4 +48,88 @@ export function statusCommand() {
|
|
|
44
48
|
}
|
|
45
49
|
console.log("");
|
|
46
50
|
}
|
|
51
|
+
function readHealth(logPath) {
|
|
52
|
+
if (!existsSync(logPath)) {
|
|
53
|
+
return {
|
|
54
|
+
relay: { kind: "unknown", detail: "log missing" },
|
|
55
|
+
gateway: { kind: "unknown", detail: "log missing" },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const lines = readTailLines(logPath, 400);
|
|
59
|
+
return {
|
|
60
|
+
relay: parseRelayHealth(lines),
|
|
61
|
+
gateway: parseGatewayHealth(lines),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function readTailLines(path, maxLines) {
|
|
65
|
+
const raw = readFileSync(path, "utf-8");
|
|
66
|
+
const lines = raw.split(/\r?\n/).filter(Boolean);
|
|
67
|
+
return lines.slice(-maxLines);
|
|
68
|
+
}
|
|
69
|
+
function parseRelayHealth(lines) {
|
|
70
|
+
const connectedIndex = findLastIndex(lines, (line) => line.includes("Relay connected."));
|
|
71
|
+
const disconnectedIndex = findLastIndex(lines, (line) => line.includes("Relay disconnected.") || line.includes("Relay connection closed:"));
|
|
72
|
+
if (connectedIndex === -1 && disconnectedIndex === -1) {
|
|
73
|
+
return { kind: "unknown", detail: "no relay events yet" };
|
|
74
|
+
}
|
|
75
|
+
if (connectedIndex > disconnectedIndex) {
|
|
76
|
+
return { kind: "ok", detail: "connected" };
|
|
77
|
+
}
|
|
78
|
+
const line = disconnectedIndex >= 0 ? lines[disconnectedIndex] : "";
|
|
79
|
+
const detail = line.includes("Relay connection closed:")
|
|
80
|
+
? line.replace(/^.*Relay connection closed:\s*/, "").trim()
|
|
81
|
+
: "disconnected";
|
|
82
|
+
return { kind: "error", detail };
|
|
83
|
+
}
|
|
84
|
+
function parseGatewayHealth(lines) {
|
|
85
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
86
|
+
const line = lines[i];
|
|
87
|
+
if (line.includes("Gateway connected.")) {
|
|
88
|
+
return { kind: "ok", detail: "connected" };
|
|
89
|
+
}
|
|
90
|
+
if (line.includes("Gateway disconnected:")) {
|
|
91
|
+
return {
|
|
92
|
+
kind: classifyGatewayDetail(line),
|
|
93
|
+
detail: line.replace(/^.*Gateway disconnected:\s*/, "").trim(),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (line.includes("[gateway-client] connect failed:")) {
|
|
97
|
+
return {
|
|
98
|
+
kind: "error",
|
|
99
|
+
detail: line.replace(/^.*connect failed:\s*/, "").trim(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (line.includes("[gateway-client] ws error:")) {
|
|
103
|
+
return {
|
|
104
|
+
kind: "error",
|
|
105
|
+
detail: line.replace(/^.*ws error:\s*/, "").trim(),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { kind: "unknown", detail: "no gateway events yet" };
|
|
110
|
+
}
|
|
111
|
+
function classifyGatewayDetail(line) {
|
|
112
|
+
const detail = line.toLowerCase();
|
|
113
|
+
if (detail.includes("unauthorized") || detail.includes("mismatch") || detail.includes("not allowed")) {
|
|
114
|
+
return "error";
|
|
115
|
+
}
|
|
116
|
+
if (detail.includes("tick timeout") || detail.includes("service restart")) {
|
|
117
|
+
return "warn";
|
|
118
|
+
}
|
|
119
|
+
return "warn";
|
|
120
|
+
}
|
|
121
|
+
function findLastIndex(lines, predicate) {
|
|
122
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
123
|
+
if (predicate(lines[i]))
|
|
124
|
+
return i;
|
|
125
|
+
}
|
|
126
|
+
return -1;
|
|
127
|
+
}
|
|
128
|
+
function formatHealthLine(key, state) {
|
|
129
|
+
const icon = state.kind === "ok" ? "✓"
|
|
130
|
+
: state.kind === "warn" ? "⚠"
|
|
131
|
+
: state.kind === "error" ? "✗"
|
|
132
|
+
: "-";
|
|
133
|
+
return t(key, icon, state.detail ?? "");
|
|
134
|
+
}
|
|
47
135
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n/index.js
CHANGED
|
@@ -47,6 +47,8 @@ const en = {
|
|
|
47
47
|
"status.serviceNotInstalled": "\nService: ✗ Not installed — run 'clawpilot install'",
|
|
48
48
|
"status.serviceRunning": (manager) => `\nService: ✓ Running (${manager})`,
|
|
49
49
|
"status.serviceLog": (path) => ` Log : ${path}`,
|
|
50
|
+
"status.relayHealth": (icon, detail) => ` Relay : ${icon} ${detail}`,
|
|
51
|
+
"status.gatewayHealth": (icon, detail) => ` Gateway : ${icon} ${detail}`,
|
|
50
52
|
"status.serviceNotRunning": "\nService: ⚠ Installed but not running",
|
|
51
53
|
"status.serviceFile": (path) => ` Service file : ${path}`,
|
|
52
54
|
"status.serviceStart": (command) => ` Start : ${command}`,
|
|
@@ -112,6 +114,8 @@ const zh = {
|
|
|
112
114
|
"status.serviceNotInstalled": "\n服务:✗ 未安装 — 请运行 'clawpilot install'",
|
|
113
115
|
"status.serviceRunning": (manager) => `\n服务:✓ 运行中 (${manager})`,
|
|
114
116
|
"status.serviceLog": (path) => ` 日志:${path}`,
|
|
117
|
+
"status.relayHealth": (icon, detail) => ` 中继连接:${icon} ${detail}`,
|
|
118
|
+
"status.gatewayHealth": (icon, detail) => ` 网关连接:${icon} ${detail}`,
|
|
115
119
|
"status.serviceNotRunning": "\n服务:⚠ 已安装但未运行",
|
|
116
120
|
"status.serviceFile": (path) => ` 服务文件:${path}`,
|
|
117
121
|
"status.serviceStart": (command) => ` 启动命令:${command}`,
|
package/dist/i18n/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAIA,MAAM,EAAE,GAA6B;IACnC,OAAO;IACP,wBAAwB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,kCAAkC,EAAE,4BAA4B;IAClG,yBAAyB,EAAE,+HAA+H;IAC1J,oBAAoB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,kCAAkC,MAAM,IAAI,IAAI,EAAE;IAC1F,kBAAkB,EAAE,gCAAgC;IACpD,yBAAyB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,wBAAwB,MAAM,IAAI,IAAI,EAAE;IACrF,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,2BAA2B,EAAE,EAAE;IAC1D,aAAa,EAAE,gDAAgD;IAC/D,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,iCAAiC,IAAI,EAAE;IACpE,wBAAwB,EAAE,iDAAiD;IAE3E,MAAM;IACN,cAAc,EAAE,+BAA+B;IAC/C,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,EAAE,EAAE;IAChD,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,GAAG,EAAE;IACpD,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,GAAG,EAAE;IACnD,eAAe,EAAE,kBAAkB;IACnC,kBAAkB,EAAE,mCAAmC;IACvD,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,iBAAiB,OAAO,aAAa,KAAK,KAAK;IAEhF,UAAU;IACV,wBAAwB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,qCAAqC,OAAO,GAAG;IACtF,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,kCAAkC,OAAO,GAAG;IAClF,4BAA4B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,4BAA4B,IAAI,EAAE;IAC1E,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,OAAO,EAAE;IAClE,oBAAoB,EAAE,2BAA2B;IACjD,0BAA0B,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,yBAAyB,OAAO,GAAG;IAC5E,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iCAAiC,OAAO,GAAG;IACjF,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,4BAA4B,OAAO,GAAG;IACtE,2BAA2B,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,yCAAyC,OAAO,GAAG;IAC7F,mBAAmB,EAAE,iCAAiC;IACtD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,+DAA+D,QAAQ,EAAE;IAC9G,uBAAuB,EAAE,yDAAyD;IAClF,uBAAuB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,IAAI,EAAE;IAC5D,4BAA4B,EAAE,0BAA0B;IACxD,kBAAkB,EAAE,uBAAuB;IAC3C,uBAAuB,EAAE,wDAAwD;IAEjF,SAAS;IACT,cAAc,EAAE,uCAAuC;IACvD,kBAAkB,EAAE,sDAAsD;IAC1E,eAAe,EAAE,qBAAqB;IACtC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,IAAI,EAAE;IAC1D,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,EAAE,EAAE;IACpD,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,GAAG,EAAE;IACxD,wBAAwB,EAAE,2CAA2C;IACrE,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,GAAG,EAAE;IAC/C,wBAAwB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,OAAO,EAAE;IACtE,4BAA4B,EAAE,wDAAwD;IACtF,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,2BAA2B,OAAO,GAAG;IAC3E,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;IAChD,0BAA0B,EAAE,0CAA0C;IACtE,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,IAAI,EAAE;IAC1D,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,aAAa,OAAO,EAAE;IAC1D,2BAA2B,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,0CAA0C,QAAQ,EAAE;IAE/F,YAAY;IACZ,oBAAoB,EAAE,sDAAsD;IAC5E,sBAAsB,EAAE,qCAAqC;IAC7D,kBAAkB,EAAE,wEAAwE;IAC5F,kBAAkB,EAAE,wBAAwB;IAC5C,qBAAqB,EAAE,qDAAqD;IAC5E,kBAAkB,EAAE,8EAA8E;IAClG,iBAAiB,EAAE,wCAAwC;IAC3D,gBAAgB,EAAE,yCAAyC;IAC3D,kBAAkB,EAAE,6CAA6C;IACjE,kBAAkB,EAAE,gDAAgD;CACrE,CAAC;AAEF,MAAM,EAAE,GAA6B;IACnC,OAAO;IACP,wBAAwB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,YAAY;IAC7D,yBAAyB,EAAE,0DAA0D;IACrF,oBAAoB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,WAAW,MAAM,IAAI,IAAI,EAAE;IACnE,kBAAkB,EAAE,aAAa;IACjC,yBAAyB,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,MAAM,IAAI,IAAI,EAAE;IACrE,iBAAiB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE;IAC7C,aAAa,EAAE,6BAA6B;IAC5C,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,IAAI,EAAE;IACnD,wBAAwB,EAAE,kBAAkB;IAE5C,MAAM;IACN,cAAc,EAAE,oBAAoB;IACpC,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,EAAE,EAAE;IAC5C,iBAAiB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE;IAC5C,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,GAAG,EAAE;IAC5C,eAAe,EAAE,QAAQ;IACzB,kBAAkB,EAAE,aAAa;IACjC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,OAAO,WAAW,KAAK,KAAK;IAElE,UAAU;IACV,wBAAwB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,OAAO,SAAS;IAChE,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,OAAO,UAAU;IAC7D,4BAA4B,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;IACzD,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,OAAO,EAAE;IACxD,oBAAoB,EAAE,WAAW;IACjC,0BAA0B,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,OAAO,MAAM;IAC/D,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,OAAO,UAAU;IAC7D,iBAAiB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,WAAW;IACzD,2BAA2B,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,OAAO,MAAM;IACrE,mBAAmB,EAAE,eAAe;IACpC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,QAAQ,aAAa;IAClE,uBAAuB,EAAE,2BAA2B;IACpD,uBAAuB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE;IACpD,4BAA4B,EAAE,WAAW;IACzC,kBAAkB,EAAE,UAAU;IAC9B,uBAAuB,EAAE,mCAAmC;IAE5D,SAAS;IACT,cAAc,EAAE,2BAA2B;IAC3C,kBAAkB,EAAE,mCAAmC;IACvD,eAAe,EAAE,WAAW;IAC5B,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE;IAChD,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE;IAC7C,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,GAAG,EAAE;IAC/C,wBAAwB,EAAE,gBAAgB;IAC1C,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE;IAC1C,wBAAwB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,OAAO,EAAE;IAC3D,4BAA4B,EAAE,uCAAuC;IACrE,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,OAAO,GAAG;IAChE,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,IAAI,EAAE;IAC7C,0BAA0B,EAAE,iBAAiB;IAC7C,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE;IAChD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,OAAO,EAAE;IACvD,2BAA2B,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,QAAQ,OAAO;IAExE,YAAY;IACZ,oBAAoB,EAAE,gCAAgC;IACtD,sBAAsB,EAAE,uBAAuB;IAC/C,kBAAkB,EAAE,+CAA+C;IACnE,kBAAkB,EAAE,aAAa;IACjC,qBAAqB,EAAE,qDAAqD;IAC5E,kBAAkB,EAAE,kDAAkD;IACtE,iBAAiB,EAAE,uBAAuB;IAC1C,gBAAgB,EAAE,qCAAqC;IACvD,kBAAkB,EAAE,sCAAsC;IAC1D,kBAAkB,EAAE,kCAAkC;CACvD,CAAC;AAEF,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAClF,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,MAAM,MAAM,GAAW,YAAY,EAAE,CAAC;AACtC,MAAM,IAAI,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAEvC,MAAM,UAAU,CAAC,CAAC,GAAW,EAAE,GAAG,IAAc;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAQ,GAAa,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,GAAa,CAAC;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,6 +18,7 @@ program
|
|
|
18
18
|
.description("Register with relay server and display QR code for iOS pairing")
|
|
19
19
|
.option("-s, --server <url>", "Relay server URL", "https://clawpilot.codeaddict.cn")
|
|
20
20
|
.option("-n, --name <name>", "Display name for this host")
|
|
21
|
+
.option("--code-only", "Print only the access code and skip QR code output", false)
|
|
21
22
|
.action(async (opts) => {
|
|
22
23
|
try {
|
|
23
24
|
await pairCommand(opts);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,oFAAoF,CAAC;KACjG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gEAAgE,CAAC;KAC7E,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,iCAAiC,CAAC;KACnF,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export interface ServiceStatus {
|
|
|
4
4
|
installed: boolean;
|
|
5
5
|
running: boolean;
|
|
6
6
|
serviceName: string;
|
|
7
|
+
manager: string;
|
|
7
8
|
servicePath?: string;
|
|
8
9
|
logPath: string;
|
|
9
10
|
startHint?: string;
|
|
@@ -19,4 +20,6 @@ export declare const servicePaths: {
|
|
|
19
20
|
errorLogPath: string;
|
|
20
21
|
macPlistPath: string;
|
|
21
22
|
linuxServicePath: string;
|
|
23
|
+
linuxNohupPidPath: string;
|
|
24
|
+
linuxNohupStartScriptPath: string;
|
|
22
25
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
2
2
|
import { execSync } from "child_process";
|
|
3
3
|
import { homedir } from "os";
|
|
4
4
|
import { join } from "path";
|
|
@@ -13,6 +13,8 @@ const LINUX_SERVICE_PATH = join(LINUX_SYSTEMD_USER_DIR, LINUX_SERVICE_NAME);
|
|
|
13
13
|
const LOG_DIR = join(homedir(), ".clawai");
|
|
14
14
|
const LOG_PATH = join(LOG_DIR, "clawpilot.log");
|
|
15
15
|
const ERROR_LOG_PATH = join(LOG_DIR, "clawpilot-error.log");
|
|
16
|
+
const LINUX_NOHUP_PID_PATH = join(LOG_DIR, "clawpilot.pid");
|
|
17
|
+
const LINUX_NOHUP_START_SCRIPT_PATH = join(LOG_DIR, "clawpilot-start.sh");
|
|
16
18
|
function detectPlatform() {
|
|
17
19
|
if (process.platform === "darwin")
|
|
18
20
|
return "macos";
|
|
@@ -40,6 +42,69 @@ function getProgramArgs() {
|
|
|
40
42
|
const scriptPath = process.argv[1];
|
|
41
43
|
return nodeBin === scriptPath ? [scriptPath, "run"] : [nodeBin, scriptPath, "run"];
|
|
42
44
|
}
|
|
45
|
+
function ensureLogDir() {
|
|
46
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
function canUseSystemdUser() {
|
|
49
|
+
if (!commandExists("systemctl"))
|
|
50
|
+
return false;
|
|
51
|
+
try {
|
|
52
|
+
run("systemctl --user show-environment", "pipe");
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function isPidRunning(pid) {
|
|
60
|
+
try {
|
|
61
|
+
process.kill(pid, 0);
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function readNohupPid() {
|
|
69
|
+
if (!existsSync(LINUX_NOHUP_PID_PATH))
|
|
70
|
+
return null;
|
|
71
|
+
try {
|
|
72
|
+
const raw = readFileSync(LINUX_NOHUP_PID_PATH, "utf-8").trim();
|
|
73
|
+
const pid = Number(raw);
|
|
74
|
+
return Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function removeNohupPidFile() {
|
|
81
|
+
if (existsSync(LINUX_NOHUP_PID_PATH)) {
|
|
82
|
+
unlinkSync(LINUX_NOHUP_PID_PATH);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function getNohupStartCommand() {
|
|
86
|
+
return `bash ${shellEscape(LINUX_NOHUP_START_SCRIPT_PATH)}`;
|
|
87
|
+
}
|
|
88
|
+
function writeLinuxNohupStartScript() {
|
|
89
|
+
const args = getProgramArgs().map(shellEscape).join(" ");
|
|
90
|
+
const script = `#!/usr/bin/env bash
|
|
91
|
+
set -euo pipefail
|
|
92
|
+
|
|
93
|
+
mkdir -p ${shellEscape(LOG_DIR)}
|
|
94
|
+
if [ -f ${shellEscape(LINUX_NOHUP_PID_PATH)} ]; then
|
|
95
|
+
pid="$(cat ${shellEscape(LINUX_NOHUP_PID_PATH)} 2>/dev/null || true)"
|
|
96
|
+
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
|
|
97
|
+
echo "clawpilot is already running (pid=$pid)"
|
|
98
|
+
exit 0
|
|
99
|
+
fi
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
nohup ${args} >> ${shellEscape(LOG_PATH)} 2>> ${shellEscape(ERROR_LOG_PATH)} < /dev/null &
|
|
103
|
+
echo $! > ${shellEscape(LINUX_NOHUP_PID_PATH)}
|
|
104
|
+
echo "clawpilot started in nohup mode (pid=$(cat ${shellEscape(LINUX_NOHUP_PID_PATH)}))"
|
|
105
|
+
`;
|
|
106
|
+
writeFileSync(LINUX_NOHUP_START_SCRIPT_PATH, script, { encoding: "utf-8", mode: 0o755 });
|
|
107
|
+
}
|
|
43
108
|
function installMacService() {
|
|
44
109
|
const argsXml = getProgramArgs().map((arg) => ` <string>${arg}</string>`).join("\n");
|
|
45
110
|
const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -64,7 +129,7 @@ ${argsXml}
|
|
|
64
129
|
</dict>
|
|
65
130
|
</plist>`;
|
|
66
131
|
mkdirSync(MAC_PLIST_DIR, { recursive: true });
|
|
67
|
-
|
|
132
|
+
ensureLogDir();
|
|
68
133
|
try {
|
|
69
134
|
run(`launchctl unload -w "${MAC_PLIST_PATH}"`);
|
|
70
135
|
}
|
|
@@ -80,9 +145,9 @@ ${argsXml}
|
|
|
80
145
|
return false;
|
|
81
146
|
}
|
|
82
147
|
}
|
|
83
|
-
function
|
|
148
|
+
function installLinuxServiceSystemd() {
|
|
84
149
|
mkdirSync(LINUX_SYSTEMD_USER_DIR, { recursive: true });
|
|
85
|
-
|
|
150
|
+
ensureLogDir();
|
|
86
151
|
const args = getProgramArgs().map(shellEscape).join(" ");
|
|
87
152
|
const serviceContent = `[Unit]
|
|
88
153
|
Description=ClawPilot relay client
|
|
@@ -102,13 +167,28 @@ StandardError=append:${ERROR_LOG_PATH}
|
|
|
102
167
|
WantedBy=default.target
|
|
103
168
|
`;
|
|
104
169
|
writeFileSync(LINUX_SERVICE_PATH, serviceContent, "utf-8");
|
|
105
|
-
|
|
106
|
-
|
|
170
|
+
run("systemctl --user daemon-reload", "inherit");
|
|
171
|
+
run(`systemctl --user enable --now ${LINUX_SERVICE_NAME}`, "inherit");
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
function installLinuxServiceNohup() {
|
|
175
|
+
ensureLogDir();
|
|
176
|
+
writeLinuxNohupStartScript();
|
|
177
|
+
run(`sh -lc ${shellEscape(getNohupStartCommand())}`, "inherit");
|
|
178
|
+
const pid = readNohupPid();
|
|
179
|
+
return pid != null && isPidRunning(pid);
|
|
180
|
+
}
|
|
181
|
+
function installLinuxService() {
|
|
182
|
+
if (canUseSystemdUser()) {
|
|
183
|
+
try {
|
|
184
|
+
return installLinuxServiceSystemd();
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Fall back to nohup below.
|
|
188
|
+
}
|
|
107
189
|
}
|
|
108
190
|
try {
|
|
109
|
-
|
|
110
|
-
run(`systemctl --user enable --now ${LINUX_SERVICE_NAME}`, "inherit");
|
|
111
|
-
return true;
|
|
191
|
+
return installLinuxServiceNohup();
|
|
112
192
|
}
|
|
113
193
|
catch {
|
|
114
194
|
return false;
|
|
@@ -142,7 +222,7 @@ function uninstallMacArtifacts() {
|
|
|
142
222
|
}
|
|
143
223
|
function uninstallLinuxArtifacts(removeFile) {
|
|
144
224
|
let changed = false;
|
|
145
|
-
if (
|
|
225
|
+
if (canUseSystemdUser()) {
|
|
146
226
|
try {
|
|
147
227
|
run(`systemctl --user stop ${LINUX_SERVICE_NAME}`);
|
|
148
228
|
changed = true;
|
|
@@ -164,22 +244,45 @@ function uninstallLinuxArtifacts(removeFile) {
|
|
|
164
244
|
// ignore
|
|
165
245
|
}
|
|
166
246
|
}
|
|
247
|
+
const nohupPid = readNohupPid();
|
|
248
|
+
if (nohupPid != null) {
|
|
249
|
+
try {
|
|
250
|
+
process.kill(nohupPid, "SIGTERM");
|
|
251
|
+
changed = true;
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// ignore
|
|
255
|
+
}
|
|
256
|
+
removeNohupPidFile();
|
|
257
|
+
changed = true;
|
|
258
|
+
}
|
|
167
259
|
if (removeFile && existsSync(LINUX_SERVICE_PATH)) {
|
|
168
260
|
unlinkSync(LINUX_SERVICE_PATH);
|
|
169
261
|
changed = true;
|
|
170
262
|
}
|
|
263
|
+
if (removeFile && existsSync(LINUX_NOHUP_START_SCRIPT_PATH)) {
|
|
264
|
+
unlinkSync(LINUX_NOHUP_START_SCRIPT_PATH);
|
|
265
|
+
changed = true;
|
|
266
|
+
}
|
|
171
267
|
return changed;
|
|
172
268
|
}
|
|
173
269
|
function restartMacService() {
|
|
174
270
|
return installMacService();
|
|
175
271
|
}
|
|
176
272
|
function restartLinuxService() {
|
|
177
|
-
if (
|
|
178
|
-
|
|
273
|
+
if (canUseSystemdUser() && existsSync(LINUX_SERVICE_PATH)) {
|
|
274
|
+
try {
|
|
275
|
+
run("systemctl --user daemon-reload", "inherit");
|
|
276
|
+
run(`systemctl --user restart ${LINUX_SERVICE_NAME}`, "inherit");
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Fall back to nohup restart below.
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
uninstallLinuxArtifacts(false);
|
|
179
284
|
try {
|
|
180
|
-
|
|
181
|
-
run(`systemctl --user restart ${LINUX_SERVICE_NAME}`, "inherit");
|
|
182
|
-
return true;
|
|
285
|
+
return installLinuxServiceNohup();
|
|
183
286
|
}
|
|
184
287
|
catch {
|
|
185
288
|
return false;
|
|
@@ -244,30 +347,63 @@ export function getServiceStatus() {
|
|
|
244
347
|
installed: existsSync(MAC_PLIST_PATH),
|
|
245
348
|
running,
|
|
246
349
|
serviceName: MAC_LABEL,
|
|
350
|
+
manager: "launchd",
|
|
247
351
|
servicePath: MAC_PLIST_PATH,
|
|
248
352
|
logPath: LOG_PATH,
|
|
249
353
|
startHint: `launchctl start ${MAC_LABEL}`,
|
|
250
354
|
};
|
|
251
355
|
}
|
|
252
356
|
if (platform === "linux") {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
357
|
+
const pid = readNohupPid();
|
|
358
|
+
const hasNohupArtifacts = pid != null || existsSync(LINUX_NOHUP_START_SCRIPT_PATH);
|
|
359
|
+
const running = pid != null && isPidRunning(pid);
|
|
360
|
+
if (!running && pid != null) {
|
|
361
|
+
removeNohupPidFile();
|
|
362
|
+
}
|
|
363
|
+
if (running || (hasNohupArtifacts && !canUseSystemdUser())) {
|
|
364
|
+
return {
|
|
365
|
+
platform,
|
|
366
|
+
installed: hasNohupArtifacts,
|
|
367
|
+
running,
|
|
368
|
+
serviceName: "clawpilot (nohup)",
|
|
369
|
+
manager: "nohup",
|
|
370
|
+
servicePath: existsSync(LINUX_NOHUP_START_SCRIPT_PATH) ? LINUX_NOHUP_START_SCRIPT_PATH : undefined,
|
|
371
|
+
logPath: LOG_PATH,
|
|
372
|
+
startHint: getNohupStartCommand(),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
const hasSystemdServiceFile = existsSync(LINUX_SERVICE_PATH);
|
|
376
|
+
if (hasSystemdServiceFile) {
|
|
377
|
+
let systemdRunning = false;
|
|
378
|
+
if (canUseSystemdUser()) {
|
|
379
|
+
try {
|
|
380
|
+
run(`systemctl --user is-active --quiet ${LINUX_SERVICE_NAME}`);
|
|
381
|
+
systemdRunning = true;
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
systemdRunning = false;
|
|
385
|
+
}
|
|
261
386
|
}
|
|
387
|
+
return {
|
|
388
|
+
platform,
|
|
389
|
+
installed: true,
|
|
390
|
+
running: systemdRunning,
|
|
391
|
+
serviceName: LINUX_SERVICE_NAME,
|
|
392
|
+
manager: "systemd",
|
|
393
|
+
servicePath: LINUX_SERVICE_PATH,
|
|
394
|
+
logPath: LOG_PATH,
|
|
395
|
+
startHint: `systemctl --user start ${LINUX_SERVICE_NAME}`,
|
|
396
|
+
};
|
|
262
397
|
}
|
|
263
398
|
return {
|
|
264
399
|
platform,
|
|
265
|
-
installed:
|
|
400
|
+
installed: hasNohupArtifacts,
|
|
266
401
|
running,
|
|
267
|
-
serviceName:
|
|
268
|
-
|
|
402
|
+
serviceName: "clawpilot (nohup)",
|
|
403
|
+
manager: "nohup",
|
|
404
|
+
servicePath: existsSync(LINUX_NOHUP_START_SCRIPT_PATH) ? LINUX_NOHUP_START_SCRIPT_PATH : undefined,
|
|
269
405
|
logPath: LOG_PATH,
|
|
270
|
-
startHint:
|
|
406
|
+
startHint: getNohupStartCommand(),
|
|
271
407
|
};
|
|
272
408
|
}
|
|
273
409
|
return {
|
|
@@ -275,6 +411,7 @@ export function getServiceStatus() {
|
|
|
275
411
|
installed: false,
|
|
276
412
|
running: false,
|
|
277
413
|
serviceName: "",
|
|
414
|
+
manager: "unsupported",
|
|
278
415
|
logPath: LOG_PATH,
|
|
279
416
|
};
|
|
280
417
|
}
|
|
@@ -283,5 +420,7 @@ export const servicePaths = {
|
|
|
283
420
|
errorLogPath: ERROR_LOG_PATH,
|
|
284
421
|
macPlistPath: MAC_PLIST_PATH,
|
|
285
422
|
linuxServicePath: LINUX_SERVICE_PATH,
|
|
423
|
+
linuxNohupPidPath: LINUX_NOHUP_PID_PATH,
|
|
424
|
+
linuxNohupStartScriptPath: LINUX_NOHUP_START_SCRIPT_PATH,
|
|
286
425
|
};
|
|
287
426
|
//# sourceMappingURL=service-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-manager.js","sourceRoot":"","sources":["../../src/platform/service-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"service-manager.js","sourceRoot":"","sources":["../../src/platform/service-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAe5B,MAAM,SAAS,GAAG,gCAAgC,CAAC;AACnD,MAAM,aAAa,GAAG,6BAA6B,CAAC;AACpD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACjE,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;AACjE,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,aAAa,QAAQ,CAAC,CAAC;AAEzE,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAC/C,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC7E,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;AAE5E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAChD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;AAC5D,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAC5D,MAAM,6BAA6B,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;AAE1E,SAAS,cAAc;IACrB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAClD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACjD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,GAAG,CAAC,OAAe,EAAE,QAA4B,MAAM;IAC9D,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC;QACH,GAAG,CAAC,cAAc,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,YAAY;IACnB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,iBAAiB;IACxB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,CAAC;QACH,GAAG,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACrC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,QAAQ,WAAW,CAAC,6BAA6B,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,0BAA0B;IACjC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG;;;WAGN,WAAW,CAAC,OAAO,CAAC;UACrB,WAAW,CAAC,oBAAoB,CAAC;eAC5B,WAAW,CAAC,oBAAoB,CAAC;;;;;;;QAOxC,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC,QAAQ,WAAW,CAAC,cAAc,CAAC;YAC/D,WAAW,CAAC,oBAAoB,CAAC;mDACM,WAAW,CAAC,oBAAoB,CAAC;CACnF,CAAC;IACA,aAAa,CAAC,6BAA6B,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,YAAY,GAAG;;;;;;YAMX,SAAS;;;EAGnB,OAAO;;;;;;;YAOG,QAAQ;;YAER,cAAc;;SAEjB,CAAC;IAER,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,YAAY,EAAE,CAAC;IAEf,IAAI,CAAC;QACH,GAAG,CAAC,wBAAwB,cAAc,GAAG,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;IAED,aAAa,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,GAAG,CAAC,sBAAsB,cAAc,GAAG,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B;IACjC,SAAS,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,YAAY,EAAE,CAAC;IAEf,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG;;;;;;;YAOb,IAAI;;;mBAGG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;wBACrB,QAAQ;uBACT,cAAc;;;;CAIpC,CAAC;IAEA,aAAa,CAAC,kBAAkB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3D,GAAG,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;IACjD,GAAG,CAAC,iCAAiC,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB;IAC/B,YAAY,EAAE,CAAC;IACf,0BAA0B,EAAE,CAAC;IAC7B,GAAG,CAAC,UAAU,WAAW,CAAC,oBAAoB,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,OAAO,GAAG,IAAI,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,OAAO,0BAA0B,EAAE,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB;IAC5B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC;QACH,GAAG,CAAC,wBAAwB,cAAc,GAAG,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,CAAC;QACH,GAAG,CAAC,wBAAwB,kBAAkB,GAAG,CAAC,CAAC;QACnD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACnC,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAmB;IAClD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,GAAG,CAAC,yBAAyB,kBAAkB,EAAE,CAAC,CAAC;YACnD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,GAAG,CAAC,4BAA4B,kBAAkB,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,GAAG,CAAC,gCAAgC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,kBAAkB,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,IAAI,UAAU,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACjD,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,UAAU,IAAI,UAAU,CAAC,6BAA6B,CAAC,EAAE,CAAC;QAC5D,UAAU,CAAC,6BAA6B,CAAC,CAAC;QAC1C,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,iBAAiB,EAAE,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,GAAG,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;YACjD,GAAG,CAAC,4BAA4B,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,QAAQ,cAAc,EAAE,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,iBAAiB,EAAE,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,mBAAmB,EAAE,CAAC;QAC/B;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,QAAQ,cAAc,EAAE,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,iBAAiB,EAAE,CAAC;QAC7B,KAAK,OAAO;YACV,OAAO,mBAAmB,EAAE,CAAC;QAC/B;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,QAAQ,cAAc,EAAE,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,OAAO;YACV,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;QACxC;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,QAAQ,cAAc,EAAE,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,OAAO;YACV,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACvC;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,GAAG,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;YACnC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,UAAU,CAAC,cAAc,CAAC;YACrC,OAAO;YACP,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,mBAAmB,SAAS,EAAE;SAC1C,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,iBAAiB,GAAG,GAAG,IAAI,IAAI,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,kBAAkB,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAC3D,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,iBAAiB;gBAC5B,OAAO;gBACP,WAAW,EAAE,mBAAmB;gBAChC,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS;gBAClG,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE,oBAAoB,EAAE;aAClC,CAAC;QACJ,CAAC;QAED,MAAM,qBAAqB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAC7D,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,iBAAiB,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,GAAG,CAAC,sCAAsC,kBAAkB,EAAE,CAAC,CAAC;oBAChE,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc,GAAG,KAAK,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,OAAO;gBACL,QAAQ;gBACR,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,cAAc;gBACvB,WAAW,EAAE,kBAAkB;gBAC/B,OAAO,EAAE,SAAS;gBAClB,WAAW,EAAE,kBAAkB;gBAC/B,OAAO,EAAE,QAAQ;gBACjB,SAAS,EAAE,0BAA0B,kBAAkB,EAAE;aAC1D,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,iBAAiB;YAC5B,OAAO;YACP,WAAW,EAAE,mBAAmB;YAChC,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,SAAS;YAClG,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,oBAAoB,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,QAAQ;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,QAAQ;IACjB,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;IAC5B,gBAAgB,EAAE,kBAAkB;IACpC,iBAAiB,EAAE,oBAAoB;IACvC,yBAAyB,EAAE,6BAA6B;CACzD,CAAC"}
|
package/package.json
CHANGED
package/src/commands/install.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { homedir } from "os";
|
|
|
4
4
|
import { t } from "../i18n/index.js";
|
|
5
5
|
import {
|
|
6
6
|
getServicePlatform,
|
|
7
|
+
getServiceStatus,
|
|
7
8
|
installService,
|
|
8
9
|
restartService,
|
|
9
10
|
stopService,
|
|
@@ -14,7 +15,9 @@ import {
|
|
|
14
15
|
export function isInstalled(): boolean {
|
|
15
16
|
const platform = getServicePlatform();
|
|
16
17
|
if (platform === "macos") return existsSync(servicePaths.macPlistPath);
|
|
17
|
-
if (platform === "linux")
|
|
18
|
+
if (platform === "linux") {
|
|
19
|
+
return existsSync(servicePaths.linuxServicePath) || existsSync(servicePaths.linuxNohupStartScriptPath);
|
|
20
|
+
}
|
|
18
21
|
return false;
|
|
19
22
|
}
|
|
20
23
|
|
|
@@ -28,7 +31,8 @@ export function installCommand(): void {
|
|
|
28
31
|
|
|
29
32
|
const started = installService();
|
|
30
33
|
if (started) {
|
|
31
|
-
|
|
34
|
+
const service = getServiceStatus();
|
|
35
|
+
console.log(t("install.serviceStarted", service.manager));
|
|
32
36
|
return;
|
|
33
37
|
}
|
|
34
38
|
|
|
@@ -39,6 +43,7 @@ export function installCommand(): void {
|
|
|
39
43
|
} else if (platform === "linux") {
|
|
40
44
|
console.log(t("install.serviceFileWritten", servicePaths.linuxServicePath));
|
|
41
45
|
console.log(t("install.startManually", "systemctl --user daemon-reload && systemctl --user enable --now clawpilot.service"));
|
|
46
|
+
console.log(t("install.startManually", `bash "${servicePaths.linuxNohupStartScriptPath}"`));
|
|
42
47
|
}
|
|
43
48
|
}
|
|
44
49
|
|
|
@@ -107,7 +112,7 @@ function platformName(platform: ReturnType<typeof getServicePlatform>): string {
|
|
|
107
112
|
case "macos":
|
|
108
113
|
return "launchd";
|
|
109
114
|
case "linux":
|
|
110
|
-
return "systemd";
|
|
115
|
+
return "systemd/nohup";
|
|
111
116
|
default:
|
|
112
117
|
return process.platform;
|
|
113
118
|
}
|
package/src/commands/pair.ts
CHANGED
|
@@ -32,6 +32,7 @@ const DEFAULT_RELAY_SERVER = "https://clawpilot.codeaddict.cn";
|
|
|
32
32
|
interface PairOptions {
|
|
33
33
|
server?: string;
|
|
34
34
|
name?: string;
|
|
35
|
+
codeOnly?: boolean;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
export async function pairCommand(opts: PairOptions): Promise<void> {
|
|
@@ -107,9 +108,13 @@ export async function pairCommand(opts: PairOptions): Promise<void> {
|
|
|
107
108
|
displayName,
|
|
108
109
|
});
|
|
109
110
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
if (opts.codeOnly) {
|
|
112
|
+
console.log(accessCode);
|
|
113
|
+
} else {
|
|
114
|
+
console.log(t("pair.scanQR"));
|
|
115
|
+
qrcodeTerminal.generate(qrPayload, { small: true });
|
|
116
|
+
console.log(t("pair.accessCode", accessCode));
|
|
117
|
+
}
|
|
113
118
|
|
|
114
119
|
console.log(t("pair.installingService"));
|
|
115
120
|
installCommand();
|
package/src/commands/status.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
1
2
|
import { configExists, readConfig, readGatewayUrl } from "../config/config.js";
|
|
2
3
|
import { t } from "../i18n/index.js";
|
|
3
4
|
import { getServiceStatus } from "../platform/service-manager.js";
|
|
4
5
|
|
|
6
|
+
type HealthState = {
|
|
7
|
+
kind: "ok" | "warn" | "error" | "unknown";
|
|
8
|
+
detail?: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
5
11
|
export function statusCommand(): void {
|
|
6
12
|
console.log(t("status.title"));
|
|
7
13
|
|
|
@@ -28,13 +34,16 @@ export function statusCommand(): void {
|
|
|
28
34
|
return;
|
|
29
35
|
}
|
|
30
36
|
|
|
31
|
-
console.log(t("status.servicePlatform", service.
|
|
37
|
+
console.log(t("status.servicePlatform", service.manager));
|
|
32
38
|
|
|
33
39
|
if (!service.installed) {
|
|
34
40
|
console.log(t("status.serviceNotInstalled"));
|
|
35
41
|
} else if (service.running) {
|
|
36
|
-
console.log(t("status.serviceRunning", service.
|
|
42
|
+
console.log(t("status.serviceRunning", service.manager));
|
|
37
43
|
console.log(t("status.serviceLog", service.logPath));
|
|
44
|
+
const health = readHealth(service.logPath);
|
|
45
|
+
console.log(formatHealthLine("status.relayHealth", health.relay));
|
|
46
|
+
console.log(formatHealthLine("status.gatewayHealth", health.gateway));
|
|
38
47
|
} else {
|
|
39
48
|
console.log(t("status.serviceNotRunning"));
|
|
40
49
|
if (service.servicePath) {
|
|
@@ -47,3 +56,99 @@ export function statusCommand(): void {
|
|
|
47
56
|
|
|
48
57
|
console.log("");
|
|
49
58
|
}
|
|
59
|
+
|
|
60
|
+
function readHealth(logPath: string): { relay: HealthState; gateway: HealthState } {
|
|
61
|
+
if (!existsSync(logPath)) {
|
|
62
|
+
return {
|
|
63
|
+
relay: { kind: "unknown", detail: "log missing" },
|
|
64
|
+
gateway: { kind: "unknown", detail: "log missing" },
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const lines = readTailLines(logPath, 400);
|
|
69
|
+
return {
|
|
70
|
+
relay: parseRelayHealth(lines),
|
|
71
|
+
gateway: parseGatewayHealth(lines),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function readTailLines(path: string, maxLines: number): string[] {
|
|
76
|
+
const raw = readFileSync(path, "utf-8");
|
|
77
|
+
const lines = raw.split(/\r?\n/).filter(Boolean);
|
|
78
|
+
return lines.slice(-maxLines);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function parseRelayHealth(lines: string[]): HealthState {
|
|
82
|
+
const connectedIndex = findLastIndex(lines, (line) => line.includes("Relay connected."));
|
|
83
|
+
const disconnectedIndex = findLastIndex(
|
|
84
|
+
lines,
|
|
85
|
+
(line) => line.includes("Relay disconnected.") || line.includes("Relay connection closed:")
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
if (connectedIndex === -1 && disconnectedIndex === -1) {
|
|
89
|
+
return { kind: "unknown", detail: "no relay events yet" };
|
|
90
|
+
}
|
|
91
|
+
if (connectedIndex > disconnectedIndex) {
|
|
92
|
+
return { kind: "ok", detail: "connected" };
|
|
93
|
+
}
|
|
94
|
+
const line = disconnectedIndex >= 0 ? lines[disconnectedIndex] : "";
|
|
95
|
+
const detail = line.includes("Relay connection closed:")
|
|
96
|
+
? line.replace(/^.*Relay connection closed:\s*/, "").trim()
|
|
97
|
+
: "disconnected";
|
|
98
|
+
return { kind: "error", detail };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function parseGatewayHealth(lines: string[]): HealthState {
|
|
102
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
103
|
+
const line = lines[i];
|
|
104
|
+
if (line.includes("Gateway connected.")) {
|
|
105
|
+
return { kind: "ok", detail: "connected" };
|
|
106
|
+
}
|
|
107
|
+
if (line.includes("Gateway disconnected:")) {
|
|
108
|
+
return {
|
|
109
|
+
kind: classifyGatewayDetail(line),
|
|
110
|
+
detail: line.replace(/^.*Gateway disconnected:\s*/, "").trim(),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (line.includes("[gateway-client] connect failed:")) {
|
|
114
|
+
return {
|
|
115
|
+
kind: "error",
|
|
116
|
+
detail: line.replace(/^.*connect failed:\s*/, "").trim(),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (line.includes("[gateway-client] ws error:")) {
|
|
120
|
+
return {
|
|
121
|
+
kind: "error",
|
|
122
|
+
detail: line.replace(/^.*ws error:\s*/, "").trim(),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return { kind: "unknown", detail: "no gateway events yet" };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function classifyGatewayDetail(line: string): HealthState["kind"] {
|
|
130
|
+
const detail = line.toLowerCase();
|
|
131
|
+
if (detail.includes("unauthorized") || detail.includes("mismatch") || detail.includes("not allowed")) {
|
|
132
|
+
return "error";
|
|
133
|
+
}
|
|
134
|
+
if (detail.includes("tick timeout") || detail.includes("service restart")) {
|
|
135
|
+
return "warn";
|
|
136
|
+
}
|
|
137
|
+
return "warn";
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function findLastIndex(lines: string[], predicate: (line: string) => boolean): number {
|
|
141
|
+
for (let i = lines.length - 1; i >= 0; i -= 1) {
|
|
142
|
+
if (predicate(lines[i])) return i;
|
|
143
|
+
}
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function formatHealthLine(key: string, state: HealthState): string {
|
|
148
|
+
const icon =
|
|
149
|
+
state.kind === "ok" ? "✓"
|
|
150
|
+
: state.kind === "warn" ? "⚠"
|
|
151
|
+
: state.kind === "error" ? "✗"
|
|
152
|
+
: "-";
|
|
153
|
+
return t(key, icon, state.detail ?? "");
|
|
154
|
+
}
|
package/src/i18n/index.ts
CHANGED
|
@@ -54,6 +54,8 @@ const en: Record<string, MsgValue> = {
|
|
|
54
54
|
"status.serviceNotInstalled": "\nService: ✗ Not installed — run 'clawpilot install'",
|
|
55
55
|
"status.serviceRunning": (manager) => `\nService: ✓ Running (${manager})`,
|
|
56
56
|
"status.serviceLog": (path) => ` Log : ${path}`,
|
|
57
|
+
"status.relayHealth": (icon, detail) => ` Relay : ${icon} ${detail}`,
|
|
58
|
+
"status.gatewayHealth": (icon, detail) => ` Gateway : ${icon} ${detail}`,
|
|
57
59
|
"status.serviceNotRunning": "\nService: ⚠ Installed but not running",
|
|
58
60
|
"status.serviceFile": (path) => ` Service file : ${path}`,
|
|
59
61
|
"status.serviceStart": (command) => ` Start : ${command}`,
|
|
@@ -124,6 +126,8 @@ const zh: Record<string, MsgValue> = {
|
|
|
124
126
|
"status.serviceNotInstalled": "\n服务:✗ 未安装 — 请运行 'clawpilot install'",
|
|
125
127
|
"status.serviceRunning": (manager) => `\n服务:✓ 运行中 (${manager})`,
|
|
126
128
|
"status.serviceLog": (path) => ` 日志:${path}`,
|
|
129
|
+
"status.relayHealth": (icon, detail) => ` 中继连接:${icon} ${detail}`,
|
|
130
|
+
"status.gatewayHealth": (icon, detail) => ` 网关连接:${icon} ${detail}`,
|
|
127
131
|
"status.serviceNotRunning": "\n服务:⚠ 已安装但未运行",
|
|
128
132
|
"status.serviceFile": (path) => ` 服务文件:${path}`,
|
|
129
133
|
"status.serviceStart": (command) => ` 启动命令:${command}`,
|
package/src/index.ts
CHANGED
|
@@ -22,7 +22,8 @@ program
|
|
|
22
22
|
.description("Register with relay server and display QR code for iOS pairing")
|
|
23
23
|
.option("-s, --server <url>", "Relay server URL", "https://clawpilot.codeaddict.cn")
|
|
24
24
|
.option("-n, --name <name>", "Display name for this host")
|
|
25
|
-
.
|
|
25
|
+
.option("--code-only", "Print only the access code and skip QR code output", false)
|
|
26
|
+
.action(async (opts: { server: string; name: string; codeOnly?: boolean }) => {
|
|
26
27
|
try {
|
|
27
28
|
await pairCommand(opts);
|
|
28
29
|
} catch (err) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from "fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
2
2
|
import { execSync } from "child_process";
|
|
3
3
|
import { homedir } from "os";
|
|
4
4
|
import { join } from "path";
|
|
@@ -10,6 +10,7 @@ export interface ServiceStatus {
|
|
|
10
10
|
installed: boolean;
|
|
11
11
|
running: boolean;
|
|
12
12
|
serviceName: string;
|
|
13
|
+
manager: string;
|
|
13
14
|
servicePath?: string;
|
|
14
15
|
logPath: string;
|
|
15
16
|
startHint?: string;
|
|
@@ -28,6 +29,8 @@ const LINUX_SERVICE_PATH = join(LINUX_SYSTEMD_USER_DIR, LINUX_SERVICE_NAME);
|
|
|
28
29
|
const LOG_DIR = join(homedir(), ".clawai");
|
|
29
30
|
const LOG_PATH = join(LOG_DIR, "clawpilot.log");
|
|
30
31
|
const ERROR_LOG_PATH = join(LOG_DIR, "clawpilot-error.log");
|
|
32
|
+
const LINUX_NOHUP_PID_PATH = join(LOG_DIR, "clawpilot.pid");
|
|
33
|
+
const LINUX_NOHUP_START_SCRIPT_PATH = join(LOG_DIR, "clawpilot-start.sh");
|
|
31
34
|
|
|
32
35
|
function detectPlatform(): ServicePlatform {
|
|
33
36
|
if (process.platform === "darwin") return "macos";
|
|
@@ -58,6 +61,71 @@ function getProgramArgs(): string[] {
|
|
|
58
61
|
return nodeBin === scriptPath ? [scriptPath, "run"] : [nodeBin, scriptPath, "run"];
|
|
59
62
|
}
|
|
60
63
|
|
|
64
|
+
function ensureLogDir(): void {
|
|
65
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function canUseSystemdUser(): boolean {
|
|
69
|
+
if (!commandExists("systemctl")) return false;
|
|
70
|
+
try {
|
|
71
|
+
run("systemctl --user show-environment", "pipe");
|
|
72
|
+
return true;
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function isPidRunning(pid: number): boolean {
|
|
79
|
+
try {
|
|
80
|
+
process.kill(pid, 0);
|
|
81
|
+
return true;
|
|
82
|
+
} catch {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function readNohupPid(): number | null {
|
|
88
|
+
if (!existsSync(LINUX_NOHUP_PID_PATH)) return null;
|
|
89
|
+
try {
|
|
90
|
+
const raw = readFileSync(LINUX_NOHUP_PID_PATH, "utf-8").trim();
|
|
91
|
+
const pid = Number(raw);
|
|
92
|
+
return Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
93
|
+
} catch {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function removeNohupPidFile(): void {
|
|
99
|
+
if (existsSync(LINUX_NOHUP_PID_PATH)) {
|
|
100
|
+
unlinkSync(LINUX_NOHUP_PID_PATH);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function getNohupStartCommand(): string {
|
|
105
|
+
return `bash ${shellEscape(LINUX_NOHUP_START_SCRIPT_PATH)}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function writeLinuxNohupStartScript(): void {
|
|
109
|
+
const args = getProgramArgs().map(shellEscape).join(" ");
|
|
110
|
+
const script = `#!/usr/bin/env bash
|
|
111
|
+
set -euo pipefail
|
|
112
|
+
|
|
113
|
+
mkdir -p ${shellEscape(LOG_DIR)}
|
|
114
|
+
if [ -f ${shellEscape(LINUX_NOHUP_PID_PATH)} ]; then
|
|
115
|
+
pid="$(cat ${shellEscape(LINUX_NOHUP_PID_PATH)} 2>/dev/null || true)"
|
|
116
|
+
if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
|
|
117
|
+
echo "clawpilot is already running (pid=$pid)"
|
|
118
|
+
exit 0
|
|
119
|
+
fi
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
nohup ${args} >> ${shellEscape(LOG_PATH)} 2>> ${shellEscape(ERROR_LOG_PATH)} < /dev/null &
|
|
123
|
+
echo $! > ${shellEscape(LINUX_NOHUP_PID_PATH)}
|
|
124
|
+
echo "clawpilot started in nohup mode (pid=$(cat ${shellEscape(LINUX_NOHUP_PID_PATH)}))"
|
|
125
|
+
`;
|
|
126
|
+
writeFileSync(LINUX_NOHUP_START_SCRIPT_PATH, script, { encoding: "utf-8", mode: 0o755 });
|
|
127
|
+
}
|
|
128
|
+
|
|
61
129
|
function installMacService(): boolean {
|
|
62
130
|
const argsXml = getProgramArgs().map((arg) => ` <string>${arg}</string>`).join("\n");
|
|
63
131
|
const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -83,7 +151,7 @@ ${argsXml}
|
|
|
83
151
|
</plist>`;
|
|
84
152
|
|
|
85
153
|
mkdirSync(MAC_PLIST_DIR, { recursive: true });
|
|
86
|
-
|
|
154
|
+
ensureLogDir();
|
|
87
155
|
|
|
88
156
|
try {
|
|
89
157
|
run(`launchctl unload -w "${MAC_PLIST_PATH}"`);
|
|
@@ -101,9 +169,9 @@ ${argsXml}
|
|
|
101
169
|
}
|
|
102
170
|
}
|
|
103
171
|
|
|
104
|
-
function
|
|
172
|
+
function installLinuxServiceSystemd(): boolean {
|
|
105
173
|
mkdirSync(LINUX_SYSTEMD_USER_DIR, { recursive: true });
|
|
106
|
-
|
|
174
|
+
ensureLogDir();
|
|
107
175
|
|
|
108
176
|
const args = getProgramArgs().map(shellEscape).join(" ");
|
|
109
177
|
const serviceContent = `[Unit]
|
|
@@ -125,15 +193,30 @@ WantedBy=default.target
|
|
|
125
193
|
`;
|
|
126
194
|
|
|
127
195
|
writeFileSync(LINUX_SERVICE_PATH, serviceContent, "utf-8");
|
|
196
|
+
run("systemctl --user daemon-reload", "inherit");
|
|
197
|
+
run(`systemctl --user enable --now ${LINUX_SERVICE_NAME}`, "inherit");
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
128
200
|
|
|
129
|
-
|
|
130
|
-
|
|
201
|
+
function installLinuxServiceNohup(): boolean {
|
|
202
|
+
ensureLogDir();
|
|
203
|
+
writeLinuxNohupStartScript();
|
|
204
|
+
run(`sh -lc ${shellEscape(getNohupStartCommand())}`, "inherit");
|
|
205
|
+
const pid = readNohupPid();
|
|
206
|
+
return pid != null && isPidRunning(pid);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function installLinuxService(): boolean {
|
|
210
|
+
if (canUseSystemdUser()) {
|
|
211
|
+
try {
|
|
212
|
+
return installLinuxServiceSystemd();
|
|
213
|
+
} catch {
|
|
214
|
+
// Fall back to nohup below.
|
|
215
|
+
}
|
|
131
216
|
}
|
|
132
217
|
|
|
133
218
|
try {
|
|
134
|
-
|
|
135
|
-
run(`systemctl --user enable --now ${LINUX_SERVICE_NAME}`, "inherit");
|
|
136
|
-
return true;
|
|
219
|
+
return installLinuxServiceNohup();
|
|
137
220
|
} catch {
|
|
138
221
|
return false;
|
|
139
222
|
}
|
|
@@ -166,7 +249,8 @@ function uninstallMacArtifacts(): boolean {
|
|
|
166
249
|
|
|
167
250
|
function uninstallLinuxArtifacts(removeFile: boolean): boolean {
|
|
168
251
|
let changed = false;
|
|
169
|
-
|
|
252
|
+
|
|
253
|
+
if (canUseSystemdUser()) {
|
|
170
254
|
try {
|
|
171
255
|
run(`systemctl --user stop ${LINUX_SERVICE_NAME}`);
|
|
172
256
|
changed = true;
|
|
@@ -185,10 +269,28 @@ function uninstallLinuxArtifacts(removeFile: boolean): boolean {
|
|
|
185
269
|
// ignore
|
|
186
270
|
}
|
|
187
271
|
}
|
|
272
|
+
|
|
273
|
+
const nohupPid = readNohupPid();
|
|
274
|
+
if (nohupPid != null) {
|
|
275
|
+
try {
|
|
276
|
+
process.kill(nohupPid, "SIGTERM");
|
|
277
|
+
changed = true;
|
|
278
|
+
} catch {
|
|
279
|
+
// ignore
|
|
280
|
+
}
|
|
281
|
+
removeNohupPidFile();
|
|
282
|
+
changed = true;
|
|
283
|
+
}
|
|
284
|
+
|
|
188
285
|
if (removeFile && existsSync(LINUX_SERVICE_PATH)) {
|
|
189
286
|
unlinkSync(LINUX_SERVICE_PATH);
|
|
190
287
|
changed = true;
|
|
191
288
|
}
|
|
289
|
+
if (removeFile && existsSync(LINUX_NOHUP_START_SCRIPT_PATH)) {
|
|
290
|
+
unlinkSync(LINUX_NOHUP_START_SCRIPT_PATH);
|
|
291
|
+
changed = true;
|
|
292
|
+
}
|
|
293
|
+
|
|
192
294
|
return changed;
|
|
193
295
|
}
|
|
194
296
|
|
|
@@ -197,11 +299,19 @@ function restartMacService(): boolean {
|
|
|
197
299
|
}
|
|
198
300
|
|
|
199
301
|
function restartLinuxService(): boolean {
|
|
200
|
-
if (
|
|
302
|
+
if (canUseSystemdUser() && existsSync(LINUX_SERVICE_PATH)) {
|
|
303
|
+
try {
|
|
304
|
+
run("systemctl --user daemon-reload", "inherit");
|
|
305
|
+
run(`systemctl --user restart ${LINUX_SERVICE_NAME}`, "inherit");
|
|
306
|
+
return true;
|
|
307
|
+
} catch {
|
|
308
|
+
// Fall back to nohup restart below.
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
uninstallLinuxArtifacts(false);
|
|
201
313
|
try {
|
|
202
|
-
|
|
203
|
-
run(`systemctl --user restart ${LINUX_SERVICE_NAME}`, "inherit");
|
|
204
|
-
return true;
|
|
314
|
+
return installLinuxServiceNohup();
|
|
205
315
|
} catch {
|
|
206
316
|
return false;
|
|
207
317
|
}
|
|
@@ -271,6 +381,7 @@ export function getServiceStatus(): ServiceStatus {
|
|
|
271
381
|
installed: existsSync(MAC_PLIST_PATH),
|
|
272
382
|
running,
|
|
273
383
|
serviceName: MAC_LABEL,
|
|
384
|
+
manager: "launchd",
|
|
274
385
|
servicePath: MAC_PLIST_PATH,
|
|
275
386
|
logPath: LOG_PATH,
|
|
276
387
|
startHint: `launchctl start ${MAC_LABEL}`,
|
|
@@ -278,23 +389,58 @@ export function getServiceStatus(): ServiceStatus {
|
|
|
278
389
|
}
|
|
279
390
|
|
|
280
391
|
if (platform === "linux") {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
392
|
+
const pid = readNohupPid();
|
|
393
|
+
const hasNohupArtifacts = pid != null || existsSync(LINUX_NOHUP_START_SCRIPT_PATH);
|
|
394
|
+
const running = pid != null && isPidRunning(pid);
|
|
395
|
+
if (!running && pid != null) {
|
|
396
|
+
removeNohupPidFile();
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
if (running || (hasNohupArtifacts && !canUseSystemdUser())) {
|
|
400
|
+
return {
|
|
401
|
+
platform,
|
|
402
|
+
installed: hasNohupArtifacts,
|
|
403
|
+
running,
|
|
404
|
+
serviceName: "clawpilot (nohup)",
|
|
405
|
+
manager: "nohup",
|
|
406
|
+
servicePath: existsSync(LINUX_NOHUP_START_SCRIPT_PATH) ? LINUX_NOHUP_START_SCRIPT_PATH : undefined,
|
|
407
|
+
logPath: LOG_PATH,
|
|
408
|
+
startHint: getNohupStartCommand(),
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const hasSystemdServiceFile = existsSync(LINUX_SERVICE_PATH);
|
|
413
|
+
if (hasSystemdServiceFile) {
|
|
414
|
+
let systemdRunning = false;
|
|
415
|
+
if (canUseSystemdUser()) {
|
|
416
|
+
try {
|
|
417
|
+
run(`systemctl --user is-active --quiet ${LINUX_SERVICE_NAME}`);
|
|
418
|
+
systemdRunning = true;
|
|
419
|
+
} catch {
|
|
420
|
+
systemdRunning = false;
|
|
421
|
+
}
|
|
288
422
|
}
|
|
423
|
+
return {
|
|
424
|
+
platform,
|
|
425
|
+
installed: true,
|
|
426
|
+
running: systemdRunning,
|
|
427
|
+
serviceName: LINUX_SERVICE_NAME,
|
|
428
|
+
manager: "systemd",
|
|
429
|
+
servicePath: LINUX_SERVICE_PATH,
|
|
430
|
+
logPath: LOG_PATH,
|
|
431
|
+
startHint: `systemctl --user start ${LINUX_SERVICE_NAME}`,
|
|
432
|
+
};
|
|
289
433
|
}
|
|
434
|
+
|
|
290
435
|
return {
|
|
291
436
|
platform,
|
|
292
|
-
installed:
|
|
437
|
+
installed: hasNohupArtifacts,
|
|
293
438
|
running,
|
|
294
|
-
serviceName:
|
|
295
|
-
|
|
439
|
+
serviceName: "clawpilot (nohup)",
|
|
440
|
+
manager: "nohup",
|
|
441
|
+
servicePath: existsSync(LINUX_NOHUP_START_SCRIPT_PATH) ? LINUX_NOHUP_START_SCRIPT_PATH : undefined,
|
|
296
442
|
logPath: LOG_PATH,
|
|
297
|
-
startHint:
|
|
443
|
+
startHint: getNohupStartCommand(),
|
|
298
444
|
};
|
|
299
445
|
}
|
|
300
446
|
|
|
@@ -303,6 +449,7 @@ export function getServiceStatus(): ServiceStatus {
|
|
|
303
449
|
installed: false,
|
|
304
450
|
running: false,
|
|
305
451
|
serviceName: "",
|
|
452
|
+
manager: "unsupported",
|
|
306
453
|
logPath: LOG_PATH,
|
|
307
454
|
};
|
|
308
455
|
}
|
|
@@ -312,4 +459,6 @@ export const servicePaths = {
|
|
|
312
459
|
errorLogPath: ERROR_LOG_PATH,
|
|
313
460
|
macPlistPath: MAC_PLIST_PATH,
|
|
314
461
|
linuxServicePath: LINUX_SERVICE_PATH,
|
|
462
|
+
linuxNohupPidPath: LINUX_NOHUP_PID_PATH,
|
|
463
|
+
linuxNohupStartScriptPath: LINUX_NOHUP_START_SCRIPT_PATH,
|
|
315
464
|
};
|