@rethinkingstudio/clawpilot 1.1.11-beta.1 → 1.1.11
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 +2 -2
- package/dist/commands/status.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 +2 -2
- 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
|
@@ -25,12 +25,12 @@ export function statusCommand() {
|
|
|
25
25
|
console.log("");
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
console.log(t("status.servicePlatform", service.
|
|
28
|
+
console.log(t("status.servicePlatform", service.manager));
|
|
29
29
|
if (!service.installed) {
|
|
30
30
|
console.log(t("status.serviceNotInstalled"));
|
|
31
31
|
}
|
|
32
32
|
else if (service.running) {
|
|
33
|
-
console.log(t("status.serviceRunning", service.
|
|
33
|
+
console.log(t("status.serviceRunning", service.manager));
|
|
34
34
|
console.log(t("status.serviceLog", service.logPath));
|
|
35
35
|
}
|
|
36
36
|
else {
|
|
@@ -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;AAElE,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAE/B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB,EAAE,OAAO,CAAC,
|
|
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;AAElE,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAE/B,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAwB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1D,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
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":"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"}
|
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
|
@@ -28,12 +28,12 @@ export function statusCommand(): void {
|
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
console.log(t("status.servicePlatform", service.
|
|
31
|
+
console.log(t("status.servicePlatform", service.manager));
|
|
32
32
|
|
|
33
33
|
if (!service.installed) {
|
|
34
34
|
console.log(t("status.serviceNotInstalled"));
|
|
35
35
|
} else if (service.running) {
|
|
36
|
-
console.log(t("status.serviceRunning", service.
|
|
36
|
+
console.log(t("status.serviceRunning", service.manager));
|
|
37
37
|
console.log(t("status.serviceLog", service.logPath));
|
|
38
38
|
} else {
|
|
39
39
|
console.log(t("status.serviceNotRunning"));
|
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
|
};
|