nox-openclaw-hunter 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/bin/nox.js +2 -0
- package/dist/branding.d.ts +39 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +66 -0
- package/dist/branding.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +94 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/export.d.ts +21 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +616 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +8 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/isolate.d.ts +30 -0
- package/dist/commands/isolate.d.ts.map +1 -0
- package/dist/commands/isolate.js +547 -0
- package/dist/commands/isolate.js.map +1 -0
- package/dist/commands/purge.d.ts +22 -0
- package/dist/commands/purge.d.ts.map +1 -0
- package/dist/commands/purge.js +295 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/scan.d.ts +23 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +155 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/detector/app-bundle.d.ts +13 -0
- package/dist/detector/app-bundle.d.ts.map +1 -0
- package/dist/detector/app-bundle.js +27 -0
- package/dist/detector/app-bundle.js.map +1 -0
- package/dist/detector/cli-binary.d.ts +12 -0
- package/dist/detector/cli-binary.d.ts.map +1 -0
- package/dist/detector/cli-binary.js +66 -0
- package/dist/detector/cli-binary.js.map +1 -0
- package/dist/detector/config.d.ts +21 -0
- package/dist/detector/config.d.ts.map +1 -0
- package/dist/detector/config.js +337 -0
- package/dist/detector/config.js.map +1 -0
- package/dist/detector/detection-config.d.ts +24 -0
- package/dist/detector/detection-config.d.ts.map +1 -0
- package/dist/detector/detection-config.js +242 -0
- package/dist/detector/detection-config.js.map +1 -0
- package/dist/detector/docker.d.ts +10 -0
- package/dist/detector/docker.d.ts.map +1 -0
- package/dist/detector/docker.js +94 -0
- package/dist/detector/docker.js.map +1 -0
- package/dist/detector/index.d.ts +50 -0
- package/dist/detector/index.d.ts.map +1 -0
- package/dist/detector/index.js +155 -0
- package/dist/detector/index.js.map +1 -0
- package/dist/detector/network.d.ts +34 -0
- package/dist/detector/network.d.ts.map +1 -0
- package/dist/detector/network.js +205 -0
- package/dist/detector/network.js.map +1 -0
- package/dist/detector/process.d.ts +16 -0
- package/dist/detector/process.d.ts.map +1 -0
- package/dist/detector/process.js +47 -0
- package/dist/detector/process.js.map +1 -0
- package/dist/detector/service.d.ts +17 -0
- package/dist/detector/service.d.ts.map +1 -0
- package/dist/detector/service.js +51 -0
- package/dist/detector/service.js.map +1 -0
- package/dist/enforcer/docker-cleaner.d.ts +30 -0
- package/dist/enforcer/docker-cleaner.d.ts.map +1 -0
- package/dist/enforcer/docker-cleaner.js +163 -0
- package/dist/enforcer/docker-cleaner.js.map +1 -0
- package/dist/enforcer/file-remover.d.ts +34 -0
- package/dist/enforcer/file-remover.d.ts.map +1 -0
- package/dist/enforcer/file-remover.js +137 -0
- package/dist/enforcer/file-remover.js.map +1 -0
- package/dist/enforcer/index.d.ts +33 -0
- package/dist/enforcer/index.d.ts.map +1 -0
- package/dist/enforcer/index.js +142 -0
- package/dist/enforcer/index.js.map +1 -0
- package/dist/enforcer/process-killer.d.ts +18 -0
- package/dist/enforcer/process-killer.d.ts.map +1 -0
- package/dist/enforcer/process-killer.js +80 -0
- package/dist/enforcer/process-killer.js.map +1 -0
- package/dist/enforcer/service-stopper.d.ts +23 -0
- package/dist/enforcer/service-stopper.d.ts.map +1 -0
- package/dist/enforcer/service-stopper.js +95 -0
- package/dist/enforcer/service-stopper.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/isolator/firewall.d.ts +25 -0
- package/dist/isolator/firewall.d.ts.map +1 -0
- package/dist/isolator/firewall.js +114 -0
- package/dist/isolator/firewall.js.map +1 -0
- package/dist/isolator/index.d.ts +63 -0
- package/dist/isolator/index.d.ts.map +1 -0
- package/dist/isolator/index.js +201 -0
- package/dist/isolator/index.js.map +1 -0
- package/dist/isolator/lockdown.d.ts +22 -0
- package/dist/isolator/lockdown.d.ts.map +1 -0
- package/dist/isolator/lockdown.js +401 -0
- package/dist/isolator/lockdown.js.map +1 -0
- package/dist/isolator/quarantine.d.ts +39 -0
- package/dist/isolator/quarantine.d.ts.map +1 -0
- package/dist/isolator/quarantine.js +364 -0
- package/dist/isolator/quarantine.js.map +1 -0
- package/dist/mdm/index.d.ts +93 -0
- package/dist/mdm/index.d.ts.map +1 -0
- package/dist/mdm/index.js +414 -0
- package/dist/mdm/index.js.map +1 -0
- package/dist/mdm/intune.d.ts +69 -0
- package/dist/mdm/intune.d.ts.map +1 -0
- package/dist/mdm/intune.js +409 -0
- package/dist/mdm/intune.js.map +1 -0
- package/dist/mdm/jamf.d.ts +58 -0
- package/dist/mdm/jamf.d.ts.map +1 -0
- package/dist/mdm/jamf.js +441 -0
- package/dist/mdm/jamf.js.map +1 -0
- package/dist/mdm/jumpcloud.d.ts +73 -0
- package/dist/mdm/jumpcloud.d.ts.map +1 -0
- package/dist/mdm/jumpcloud.js +470 -0
- package/dist/mdm/jumpcloud.js.map +1 -0
- package/dist/mdm/templates/detect.ps1.d.ts +30 -0
- package/dist/mdm/templates/detect.ps1.d.ts.map +1 -0
- package/dist/mdm/templates/detect.ps1.js +463 -0
- package/dist/mdm/templates/detect.ps1.js.map +1 -0
- package/dist/mdm/templates/detect.sh.d.ts +30 -0
- package/dist/mdm/templates/detect.sh.d.ts.map +1 -0
- package/dist/mdm/templates/detect.sh.js +474 -0
- package/dist/mdm/templates/detect.sh.js.map +1 -0
- package/dist/mdm/templates/enforce.ps1.d.ts +33 -0
- package/dist/mdm/templates/enforce.ps1.d.ts.map +1 -0
- package/dist/mdm/templates/enforce.ps1.js +681 -0
- package/dist/mdm/templates/enforce.ps1.js.map +1 -0
- package/dist/mdm/templates/enforce.sh.d.ts +33 -0
- package/dist/mdm/templates/enforce.sh.d.ts.map +1 -0
- package/dist/mdm/templates/enforce.sh.js +591 -0
- package/dist/mdm/templates/enforce.sh.js.map +1 -0
- package/dist/platform/darwin.d.ts +6 -0
- package/dist/platform/darwin.d.ts.map +1 -0
- package/dist/platform/darwin.js +192 -0
- package/dist/platform/darwin.js.map +1 -0
- package/dist/platform/index.d.ts +43 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +27 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/linux.d.ts +6 -0
- package/dist/platform/linux.d.ts.map +1 -0
- package/dist/platform/linux.js +134 -0
- package/dist/platform/linux.js.map +1 -0
- package/dist/platform/windows.d.ts +6 -0
- package/dist/platform/windows.d.ts.map +1 -0
- package/dist/platform/windows.js +134 -0
- package/dist/platform/windows.js.map +1 -0
- package/dist/reporter/console.d.ts +27 -0
- package/dist/reporter/console.d.ts.map +1 -0
- package/dist/reporter/console.js +431 -0
- package/dist/reporter/console.js.map +1 -0
- package/dist/reporter/index.d.ts +11 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +13 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/reporter/json.d.ts +61 -0
- package/dist/reporter/json.d.ts.map +1 -0
- package/dist/reporter/json.js +75 -0
- package/dist/reporter/json.js.map +1 -0
- package/dist/reporter/webhook.d.ts +57 -0
- package/dist/reporter/webhook.d.ts.map +1 -0
- package/dist/reporter/webhook.js +230 -0
- package/dist/reporter/webhook.js.map +1 -0
- package/dist/types/config.d.ts +116 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/detection.d.ts +85 -0
- package/dist/types/detection.d.ts.map +1 -0
- package/dist/types/detection.js +5 -0
- package/dist/types/detection.js.map +1 -0
- package/dist/types/enforcement.d.ts +33 -0
- package/dist/types/enforcement.d.ts.map +1 -0
- package/dist/types/enforcement.js +5 -0
- package/dist/types/enforcement.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/isolation.d.ts +55 -0
- package/dist/types/isolation.d.ts.map +1 -0
- package/dist/types/isolation.js +5 -0
- package/dist/types/isolation.js.map +1 -0
- package/dist/utils/exec.d.ts +48 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +103 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/fs.d.ts +34 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +111 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +48 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/intune.md +390 -0
- package/docs/jamf.md +400 -0
- package/docs/jumpcloud.md +510 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/detector/docker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiF7D;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC,CA6B7D"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker detection for OpenClaw.
|
|
3
|
+
* Checks for OpenClaw containers and images.
|
|
4
|
+
*/
|
|
5
|
+
import { exec } from '../utils/exec.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
const OPENCLAW_PATTERNS = ['openclaw', 'moltbot', 'clawdbot'];
|
|
8
|
+
/**
|
|
9
|
+
* Check if Docker is available on the system.
|
|
10
|
+
*/
|
|
11
|
+
async function isDockerAvailable() {
|
|
12
|
+
try {
|
|
13
|
+
await exec('docker info 2>/dev/null', { timeout: 5000 });
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Find running containers matching OpenClaw patterns.
|
|
22
|
+
*/
|
|
23
|
+
async function findContainers() {
|
|
24
|
+
const containers = [];
|
|
25
|
+
try {
|
|
26
|
+
const { stdout } = await exec('docker ps --format "{{.Names}}\\t{{.Image}}" 2>/dev/null', { timeout: 10000 });
|
|
27
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
28
|
+
for (const line of lines) {
|
|
29
|
+
const [name, image] = line.split('\t');
|
|
30
|
+
const combined = `${name} ${image}`.toLowerCase();
|
|
31
|
+
for (const pattern of OPENCLAW_PATTERNS) {
|
|
32
|
+
if (combined.includes(pattern)) {
|
|
33
|
+
containers.push(name || image || line);
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
logger.debug(`Error listing Docker containers: ${err}`);
|
|
41
|
+
}
|
|
42
|
+
return containers;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Find Docker images matching OpenClaw patterns.
|
|
46
|
+
*/
|
|
47
|
+
async function findImages() {
|
|
48
|
+
const images = [];
|
|
49
|
+
try {
|
|
50
|
+
const { stdout } = await exec('docker images --format "{{.Repository}}:{{.Tag}}" 2>/dev/null', { timeout: 10000 });
|
|
51
|
+
const lines = stdout.trim().split('\n').filter(Boolean);
|
|
52
|
+
for (const line of lines) {
|
|
53
|
+
const lower = line.toLowerCase();
|
|
54
|
+
for (const pattern of OPENCLAW_PATTERNS) {
|
|
55
|
+
if (lower.includes(pattern)) {
|
|
56
|
+
images.push(line);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
logger.debug(`Error listing Docker images: ${err}`);
|
|
64
|
+
}
|
|
65
|
+
return images;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Detect OpenClaw Docker containers and images.
|
|
69
|
+
*/
|
|
70
|
+
export async function detectDocker() {
|
|
71
|
+
logger.debug('Detecting Docker containers and images...');
|
|
72
|
+
// First check if Docker is available
|
|
73
|
+
if (!(await isDockerAvailable())) {
|
|
74
|
+
logger.debug('Docker not available');
|
|
75
|
+
return { found: false };
|
|
76
|
+
}
|
|
77
|
+
const [containers, images] = await Promise.all([
|
|
78
|
+
findContainers(),
|
|
79
|
+
findImages(),
|
|
80
|
+
]);
|
|
81
|
+
const found = containers.length > 0 || images.length > 0;
|
|
82
|
+
if (found) {
|
|
83
|
+
logger.debug(`Docker detection: ${containers.length} containers, ${images.length} images`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
logger.debug('No OpenClaw Docker artifacts found');
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
found,
|
|
90
|
+
containers: containers.length > 0 ? containers : undefined,
|
|
91
|
+
images: images.length > 0 ? images : undefined,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/detector/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates all detection capabilities:
|
|
5
|
+
* - CLI binary detection
|
|
6
|
+
* - App bundle detection
|
|
7
|
+
* - State directory detection
|
|
8
|
+
* - Config file detection
|
|
9
|
+
* - Service detection
|
|
10
|
+
* - Gateway network detection
|
|
11
|
+
* - Process detection
|
|
12
|
+
* - Docker detection
|
|
13
|
+
*/
|
|
14
|
+
import type { DetectOptions } from '../types/config.js';
|
|
15
|
+
import type { DetectionResult, DetectionSummary } from '../types/detection.js';
|
|
16
|
+
export { detectCliBinary } from './cli-binary.js';
|
|
17
|
+
export { detectAppBundle } from './app-bundle.js';
|
|
18
|
+
export { detectStateDir, detectConfig } from './config.js';
|
|
19
|
+
export { detectService } from './service.js';
|
|
20
|
+
export { detectGateway, getDefaultGatewayPort, getAlternativePorts } from './network.js';
|
|
21
|
+
export type { GatewayDetectOptions } from './network.js';
|
|
22
|
+
export { detectProcesses, getOpenClawProcessNames } from './process.js';
|
|
23
|
+
export { detectDocker } from './docker.js';
|
|
24
|
+
/**
|
|
25
|
+
* Run all OpenClaw detection checks and aggregate results.
|
|
26
|
+
*
|
|
27
|
+
* @param options - Detection options (port, allUsers)
|
|
28
|
+
* @returns Comprehensive detection result
|
|
29
|
+
*/
|
|
30
|
+
export declare function detect(options?: DetectOptions): Promise<DetectionResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Quick check to determine if OpenClaw is detected.
|
|
33
|
+
* Faster than full detect() as it short-circuits on first positive.
|
|
34
|
+
*
|
|
35
|
+
* @returns true if any OpenClaw artifact is detected
|
|
36
|
+
*/
|
|
37
|
+
export declare function quickCheck(): Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Get a human-readable status string for display.
|
|
40
|
+
*/
|
|
41
|
+
export declare function getSummaryLabel(summary: DetectionSummary): string;
|
|
42
|
+
/**
|
|
43
|
+
* Check if the detection result indicates any threat.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isDetected(result: DetectionResult): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if OpenClaw is actively running.
|
|
48
|
+
*/
|
|
49
|
+
export declare function isRunning(result: DetectionResult): boolean;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/detector/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EASjB,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0C3C;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAsD1B;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAwBnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CASjE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAE1D"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates all detection capabilities:
|
|
5
|
+
* - CLI binary detection
|
|
6
|
+
* - App bundle detection
|
|
7
|
+
* - State directory detection
|
|
8
|
+
* - Config file detection
|
|
9
|
+
* - Service detection
|
|
10
|
+
* - Gateway network detection
|
|
11
|
+
* - Process detection
|
|
12
|
+
* - Docker detection
|
|
13
|
+
*/
|
|
14
|
+
import * as os from 'node:os';
|
|
15
|
+
import { getPlatform } from '../platform/index.js';
|
|
16
|
+
import { logger } from '../utils/logger.js';
|
|
17
|
+
import { detectCliBinary } from './cli-binary.js';
|
|
18
|
+
import { detectAppBundle } from './app-bundle.js';
|
|
19
|
+
import { detectStateDir, detectConfig } from './config.js';
|
|
20
|
+
import { detectService } from './service.js';
|
|
21
|
+
import { detectGateway } from './network.js';
|
|
22
|
+
import { detectProcesses } from './process.js';
|
|
23
|
+
import { detectDocker } from './docker.js';
|
|
24
|
+
// Re-export individual detectors for direct use
|
|
25
|
+
export { detectCliBinary } from './cli-binary.js';
|
|
26
|
+
export { detectAppBundle } from './app-bundle.js';
|
|
27
|
+
export { detectStateDir, detectConfig } from './config.js';
|
|
28
|
+
export { detectService } from './service.js';
|
|
29
|
+
export { detectGateway, getDefaultGatewayPort, getAlternativePorts } from './network.js';
|
|
30
|
+
export { detectProcesses, getOpenClawProcessNames } from './process.js';
|
|
31
|
+
export { detectDocker } from './docker.js';
|
|
32
|
+
/**
|
|
33
|
+
* Determine the overall detection summary based on individual results.
|
|
34
|
+
*/
|
|
35
|
+
function computeSummary(cli, app, stateDir, config, service, gateway, processes, docker) {
|
|
36
|
+
// Check if anything indicates OpenClaw is running
|
|
37
|
+
const isRunning = service.running ||
|
|
38
|
+
gateway.listening ||
|
|
39
|
+
processes.length > 0 ||
|
|
40
|
+
(docker.containers && docker.containers.length > 0);
|
|
41
|
+
if (isRunning) {
|
|
42
|
+
return 'installed-and-running';
|
|
43
|
+
}
|
|
44
|
+
// Check if anything indicates OpenClaw is installed (but not running)
|
|
45
|
+
const isInstalled = cli.found ||
|
|
46
|
+
app.found ||
|
|
47
|
+
stateDir.found ||
|
|
48
|
+
config.found ||
|
|
49
|
+
service.found ||
|
|
50
|
+
(docker.images && docker.images.length > 0);
|
|
51
|
+
if (isInstalled) {
|
|
52
|
+
return 'installed-not-running';
|
|
53
|
+
}
|
|
54
|
+
return 'not-installed';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Run all OpenClaw detection checks and aggregate results.
|
|
58
|
+
*
|
|
59
|
+
* @param options - Detection options (port, allUsers)
|
|
60
|
+
* @returns Comprehensive detection result
|
|
61
|
+
*/
|
|
62
|
+
export async function detect(options = {}) {
|
|
63
|
+
const startTime = Date.now();
|
|
64
|
+
logger.debug('Starting OpenClaw detection...');
|
|
65
|
+
const platform = getPlatform();
|
|
66
|
+
// Configure gateway detection options
|
|
67
|
+
const gatewayOptions = options.port !== undefined
|
|
68
|
+
? { port: options.port } // Explicit port: skip auto-discovery
|
|
69
|
+
: { autoDiscover: true, scanAlternatives: true }; // Auto-discover
|
|
70
|
+
// Run all detections in parallel for performance
|
|
71
|
+
const [cli, app, stateDir, config, service, gateway, processes, docker] = await Promise.all([
|
|
72
|
+
detectCliBinary(platform),
|
|
73
|
+
detectAppBundle(platform),
|
|
74
|
+
detectStateDir(platform, { allUsers: options.allUsers }),
|
|
75
|
+
detectConfig(platform, { allUsers: options.allUsers }),
|
|
76
|
+
detectService(platform),
|
|
77
|
+
detectGateway(gatewayOptions),
|
|
78
|
+
detectProcesses(platform),
|
|
79
|
+
detectDocker(),
|
|
80
|
+
]);
|
|
81
|
+
const summary = computeSummary(cli, app, stateDir, config, service, gateway, processes, docker);
|
|
82
|
+
const result = {
|
|
83
|
+
summary,
|
|
84
|
+
platform: platform.name,
|
|
85
|
+
hostname: os.hostname(),
|
|
86
|
+
timestamp: new Date().toISOString(),
|
|
87
|
+
cli,
|
|
88
|
+
app,
|
|
89
|
+
stateDir,
|
|
90
|
+
config,
|
|
91
|
+
service,
|
|
92
|
+
gateway,
|
|
93
|
+
processes,
|
|
94
|
+
docker,
|
|
95
|
+
};
|
|
96
|
+
const elapsed = Date.now() - startTime;
|
|
97
|
+
logger.debug(`Detection completed in ${elapsed}ms with summary: ${summary}`);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Quick check to determine if OpenClaw is detected.
|
|
102
|
+
* Faster than full detect() as it short-circuits on first positive.
|
|
103
|
+
*
|
|
104
|
+
* @returns true if any OpenClaw artifact is detected
|
|
105
|
+
*/
|
|
106
|
+
export async function quickCheck() {
|
|
107
|
+
const platform = getPlatform();
|
|
108
|
+
// Check CLI first (fastest)
|
|
109
|
+
const cli = await detectCliBinary(platform);
|
|
110
|
+
if (cli.found)
|
|
111
|
+
return true;
|
|
112
|
+
// Check gateway port
|
|
113
|
+
const gateway = await detectGateway();
|
|
114
|
+
if (gateway.listening)
|
|
115
|
+
return true;
|
|
116
|
+
// Check processes
|
|
117
|
+
const processes = await detectProcesses(platform);
|
|
118
|
+
if (processes.length > 0)
|
|
119
|
+
return true;
|
|
120
|
+
// Check app bundle
|
|
121
|
+
const app = await detectAppBundle(platform);
|
|
122
|
+
if (app.found)
|
|
123
|
+
return true;
|
|
124
|
+
// Check state directory
|
|
125
|
+
const stateDir = await detectStateDir(platform);
|
|
126
|
+
if (stateDir.found)
|
|
127
|
+
return true;
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get a human-readable status string for display.
|
|
132
|
+
*/
|
|
133
|
+
export function getSummaryLabel(summary) {
|
|
134
|
+
switch (summary) {
|
|
135
|
+
case 'installed-and-running':
|
|
136
|
+
return 'INSTALLED & RUNNING';
|
|
137
|
+
case 'installed-not-running':
|
|
138
|
+
return 'INSTALLED (NOT RUNNING)';
|
|
139
|
+
case 'not-installed':
|
|
140
|
+
return 'NOT INSTALLED';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if the detection result indicates any threat.
|
|
145
|
+
*/
|
|
146
|
+
export function isDetected(result) {
|
|
147
|
+
return result.summary !== 'not-installed';
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if OpenClaw is actively running.
|
|
151
|
+
*/
|
|
152
|
+
export function isRunning(result) {
|
|
153
|
+
return result.summary === 'installed-and-running';
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/detector/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network detection for OpenClaw gateway.
|
|
3
|
+
* Checks if the gateway port is listening.
|
|
4
|
+
* Supports auto-discovery of non-default ports.
|
|
5
|
+
*/
|
|
6
|
+
import type { GatewayDetection } from '../types/detection.js';
|
|
7
|
+
export interface GatewayDetectOptions {
|
|
8
|
+
/** Specific port to check (skips auto-discovery if provided) */
|
|
9
|
+
port?: number;
|
|
10
|
+
/** Whether to auto-discover the port from config/processes */
|
|
11
|
+
autoDiscover?: boolean;
|
|
12
|
+
/** Whether to scan alternative ports if default not found */
|
|
13
|
+
scanAlternatives?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect the OpenClaw gateway by checking if the port is listening.
|
|
17
|
+
*
|
|
18
|
+
* Detection strategy:
|
|
19
|
+
* 1. If explicit port provided, check only that port
|
|
20
|
+
* 2. Try to read port from config file
|
|
21
|
+
* 3. Try to discover port from running processes
|
|
22
|
+
* 4. Check default port (18789)
|
|
23
|
+
* 5. Optionally scan alternative ports
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectGateway(options?: GatewayDetectOptions | number): Promise<GatewayDetection>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the default gateway port.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getDefaultGatewayPort(): number;
|
|
30
|
+
/**
|
|
31
|
+
* Get the list of alternative ports that are scanned.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAlternativePorts(): number[];
|
|
34
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/detector/network.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA0I9D,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,oBAAoB,GAAG,MAAW,GAC1C,OAAO,CAAC,gBAAgB,CAAC,CAwE3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network detection for OpenClaw gateway.
|
|
3
|
+
* Checks if the gateway port is listening.
|
|
4
|
+
* Supports auto-discovery of non-default ports.
|
|
5
|
+
*/
|
|
6
|
+
import * as net from 'node:net';
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import { exec } from '../utils/exec.js';
|
|
11
|
+
import { pathExists } from '../utils/fs.js';
|
|
12
|
+
import { logger } from '../utils/logger.js';
|
|
13
|
+
const DEFAULT_GATEWAY_PORT = 18789;
|
|
14
|
+
const ALTERNATIVE_PORTS = [18789, 18790, 8789, 3000, 8080];
|
|
15
|
+
const CONNECT_TIMEOUT_MS = 2000;
|
|
16
|
+
/**
|
|
17
|
+
* Check if a TCP port is listening on localhost.
|
|
18
|
+
*/
|
|
19
|
+
async function isPortListening(port) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const socket = new net.Socket();
|
|
22
|
+
let resolved = false;
|
|
23
|
+
const cleanup = () => {
|
|
24
|
+
if (!resolved) {
|
|
25
|
+
resolved = true;
|
|
26
|
+
socket.destroy();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
socket.setTimeout(CONNECT_TIMEOUT_MS);
|
|
30
|
+
socket.on('connect', () => {
|
|
31
|
+
cleanup();
|
|
32
|
+
resolve(true);
|
|
33
|
+
});
|
|
34
|
+
socket.on('timeout', () => {
|
|
35
|
+
cleanup();
|
|
36
|
+
resolve(false);
|
|
37
|
+
});
|
|
38
|
+
socket.on('error', () => {
|
|
39
|
+
cleanup();
|
|
40
|
+
resolve(false);
|
|
41
|
+
});
|
|
42
|
+
socket.connect(port, '127.0.0.1');
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Try to read the gateway port from OpenClaw config file.
|
|
47
|
+
*/
|
|
48
|
+
async function getPortFromConfig() {
|
|
49
|
+
const configPath = path.join(os.homedir(), '.openclaw', 'openclaw.json');
|
|
50
|
+
try {
|
|
51
|
+
if (!(await pathExists(configPath))) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const content = await fs.readFile(configPath, 'utf8');
|
|
55
|
+
const config = JSON.parse(content);
|
|
56
|
+
// Check common config keys for port
|
|
57
|
+
const port = config.gateway?.port ??
|
|
58
|
+
config.port ??
|
|
59
|
+
config.server?.port ??
|
|
60
|
+
config.gatewayPort;
|
|
61
|
+
if (typeof port === 'number' && port > 0 && port < 65536) {
|
|
62
|
+
logger.debug(`Found port ${port} in config file`);
|
|
63
|
+
return port;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
logger.debug(`Could not read port from config: ${err}`);
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Discover the gateway port by checking what ports openclaw processes are listening on.
|
|
73
|
+
* Uses lsof on macOS/Linux or netstat on Windows.
|
|
74
|
+
*/
|
|
75
|
+
async function discoverPortFromProcess() {
|
|
76
|
+
const platform = os.platform();
|
|
77
|
+
try {
|
|
78
|
+
let cmd;
|
|
79
|
+
if (platform === 'darwin' || platform === 'linux') {
|
|
80
|
+
// Use lsof to find listening ports for openclaw processes
|
|
81
|
+
cmd = 'lsof -i -P -n 2>/dev/null | grep -i openclaw | grep LISTEN || true';
|
|
82
|
+
}
|
|
83
|
+
else if (platform === 'win32') {
|
|
84
|
+
// Use netstat and tasklist on Windows
|
|
85
|
+
cmd = 'netstat -ano | findstr LISTENING 2>nul || echo ""';
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const { stdout } = await exec(cmd, { timeout: 5000 });
|
|
91
|
+
if (!stdout.trim()) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
// Parse output to find port numbers
|
|
95
|
+
// macOS/Linux lsof format: "openclaw 1234 user 5u IPv4 ... TCP *:18789 (LISTEN)"
|
|
96
|
+
// Windows netstat format: "TCP 0.0.0.0:18789 0.0.0.0:0 LISTENING 1234"
|
|
97
|
+
const portMatch = stdout.match(/:(\d{4,5})\s+\(LISTEN\)|:(\d{4,5})\s+.*LISTENING/i);
|
|
98
|
+
if (portMatch) {
|
|
99
|
+
const port = parseInt(portMatch[1] || portMatch[2], 10);
|
|
100
|
+
if (port > 0 && port < 65536) {
|
|
101
|
+
logger.debug(`Discovered port ${port} from running process`);
|
|
102
|
+
return port;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger.debug(`Could not discover port from process: ${err}`);
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Scan alternative ports to find the gateway.
|
|
113
|
+
*/
|
|
114
|
+
async function scanAlternativePorts() {
|
|
115
|
+
logger.debug('Scanning alternative ports...');
|
|
116
|
+
for (const port of ALTERNATIVE_PORTS) {
|
|
117
|
+
if (await isPortListening(port)) {
|
|
118
|
+
logger.debug(`Found listening port: ${port}`);
|
|
119
|
+
return port;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Detect the OpenClaw gateway by checking if the port is listening.
|
|
126
|
+
*
|
|
127
|
+
* Detection strategy:
|
|
128
|
+
* 1. If explicit port provided, check only that port
|
|
129
|
+
* 2. Try to read port from config file
|
|
130
|
+
* 3. Try to discover port from running processes
|
|
131
|
+
* 4. Check default port (18789)
|
|
132
|
+
* 5. Optionally scan alternative ports
|
|
133
|
+
*/
|
|
134
|
+
export async function detectGateway(options = {}) {
|
|
135
|
+
// Support legacy signature: detectGateway(port)
|
|
136
|
+
if (typeof options === 'number') {
|
|
137
|
+
options = { port: options };
|
|
138
|
+
}
|
|
139
|
+
const { port: explicitPort, autoDiscover = true, scanAlternatives = true, } = options;
|
|
140
|
+
// If explicit port provided, only check that
|
|
141
|
+
if (explicitPort !== undefined) {
|
|
142
|
+
logger.debug(`Checking explicit port ${explicitPort}...`);
|
|
143
|
+
const listening = await isPortListening(explicitPort);
|
|
144
|
+
return {
|
|
145
|
+
found: listening,
|
|
146
|
+
port: explicitPort,
|
|
147
|
+
listening,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// Auto-discovery flow
|
|
151
|
+
let portToCheck;
|
|
152
|
+
if (autoDiscover) {
|
|
153
|
+
// 1. Try config file
|
|
154
|
+
portToCheck = await getPortFromConfig();
|
|
155
|
+
// 2. Try process discovery
|
|
156
|
+
if (portToCheck === undefined) {
|
|
157
|
+
portToCheck = await discoverPortFromProcess();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// 3. Try default port
|
|
161
|
+
if (portToCheck === undefined) {
|
|
162
|
+
portToCheck = DEFAULT_GATEWAY_PORT;
|
|
163
|
+
}
|
|
164
|
+
logger.debug(`Detecting gateway on port ${portToCheck}...`);
|
|
165
|
+
let listening = await isPortListening(portToCheck);
|
|
166
|
+
if (listening) {
|
|
167
|
+
logger.debug(`Gateway detected: port ${portToCheck} is listening`);
|
|
168
|
+
return {
|
|
169
|
+
found: true,
|
|
170
|
+
port: portToCheck,
|
|
171
|
+
listening: true,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// 4. Scan alternatives if enabled and default not found
|
|
175
|
+
if (scanAlternatives && portToCheck === DEFAULT_GATEWAY_PORT) {
|
|
176
|
+
const altPort = await scanAlternativePorts();
|
|
177
|
+
if (altPort !== undefined && altPort !== DEFAULT_GATEWAY_PORT) {
|
|
178
|
+
logger.debug(`Gateway detected on alternative port: ${altPort}`);
|
|
179
|
+
return {
|
|
180
|
+
found: true,
|
|
181
|
+
port: altPort,
|
|
182
|
+
listening: true,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
logger.debug(`Gateway not detected on port ${portToCheck}`);
|
|
187
|
+
return {
|
|
188
|
+
found: false,
|
|
189
|
+
port: portToCheck,
|
|
190
|
+
listening: false,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get the default gateway port.
|
|
195
|
+
*/
|
|
196
|
+
export function getDefaultGatewayPort() {
|
|
197
|
+
return DEFAULT_GATEWAY_PORT;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get the list of alternative ports that are scanned.
|
|
201
|
+
*/
|
|
202
|
+
export function getAlternativePorts() {
|
|
203
|
+
return [...ALTERNATIVE_PORTS];
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/detector/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process detection for OpenClaw.
|
|
3
|
+
* Finds running OpenClaw processes using platform-specific methods.
|
|
4
|
+
*/
|
|
5
|
+
import type { Platform } from '../platform/index.js';
|
|
6
|
+
import type { ProcessDetection } from '../types/detection.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect running OpenClaw processes.
|
|
9
|
+
* Uses platform-specific process enumeration (ps, tasklist).
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectProcesses(platform: Platform): Promise<ProcessDetection[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Get the list of process names we search for.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getOpenClawProcessNames(): string[];
|
|
16
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/detector/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9D;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA+B7B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAElD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process detection for OpenClaw.
|
|
3
|
+
* Finds running OpenClaw processes using platform-specific methods.
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
const OPENCLAW_PROCESS_NAMES = ['openclaw', 'moltbot', 'clawdbot'];
|
|
7
|
+
/**
|
|
8
|
+
* Detect running OpenClaw processes.
|
|
9
|
+
* Uses platform-specific process enumeration (ps, tasklist).
|
|
10
|
+
*/
|
|
11
|
+
export async function detectProcesses(platform) {
|
|
12
|
+
logger.debug('Detecting running processes...');
|
|
13
|
+
const allProcesses = [];
|
|
14
|
+
for (const name of OPENCLAW_PROCESS_NAMES) {
|
|
15
|
+
try {
|
|
16
|
+
const processes = await platform.findProcesses(name);
|
|
17
|
+
for (const proc of processes) {
|
|
18
|
+
// Avoid duplicates by PID
|
|
19
|
+
if (!allProcesses.some((p) => p.pid === proc.pid)) {
|
|
20
|
+
allProcesses.push({
|
|
21
|
+
pid: proc.pid,
|
|
22
|
+
name: proc.name,
|
|
23
|
+
memory: proc.memory,
|
|
24
|
+
user: proc.user,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
logger.debug(`Error finding processes for ${name}: ${err}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (allProcesses.length > 0) {
|
|
34
|
+
logger.debug(`Found ${allProcesses.length} OpenClaw process(es)`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
logger.debug('No OpenClaw processes found');
|
|
38
|
+
}
|
|
39
|
+
return allProcesses;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the list of process names we search for.
|
|
43
|
+
*/
|
|
44
|
+
export function getOpenClawProcessNames() {
|
|
45
|
+
return [...OPENCLAW_PROCESS_NAMES];
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/detector/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAEnE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB;IAElB,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAE/C,MAAM,YAAY,GAAuB,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,sBAAsB,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,0BAA0B;gBAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClD,YAAY,CAAC,IAAI,CAAC;wBAChB,GAAG,EAAE,IAAI,CAAC,GAAG;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,+BAA+B,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,SAAS,YAAY,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,GAAG,sBAAsB,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service detection for OpenClaw gateway.
|
|
3
|
+
* Checks launchd (macOS), systemd (Linux), and Windows services.
|
|
4
|
+
*/
|
|
5
|
+
import type { Platform } from '../platform/index.js';
|
|
6
|
+
import type { ServiceDetection } from '../types/detection.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect the OpenClaw gateway service.
|
|
9
|
+
* Uses platform-specific service management (launchctl, systemctl, sc).
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectService(platform: Platform): Promise<ServiceDetection>;
|
|
12
|
+
/**
|
|
13
|
+
* Check if the service definition file exists (plist, unit file, etc.).
|
|
14
|
+
* This indicates OpenClaw was installed even if not currently running.
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectServiceDefinition(platform: Platform): Promise<boolean>;
|
|
17
|
+
//# sourceMappingURL=service.d.ts.map
|