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.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +140 -0
  3. package/bin/nox.js +2 -0
  4. package/dist/branding.d.ts +39 -0
  5. package/dist/branding.d.ts.map +1 -0
  6. package/dist/branding.js +66 -0
  7. package/dist/branding.js.map +1 -0
  8. package/dist/cli.d.ts +15 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +94 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/export.d.ts +21 -0
  13. package/dist/commands/export.d.ts.map +1 -0
  14. package/dist/commands/export.js +616 -0
  15. package/dist/commands/export.js.map +1 -0
  16. package/dist/commands/index.d.ts +8 -0
  17. package/dist/commands/index.d.ts.map +1 -0
  18. package/dist/commands/index.js +8 -0
  19. package/dist/commands/index.js.map +1 -0
  20. package/dist/commands/isolate.d.ts +30 -0
  21. package/dist/commands/isolate.d.ts.map +1 -0
  22. package/dist/commands/isolate.js +547 -0
  23. package/dist/commands/isolate.js.map +1 -0
  24. package/dist/commands/purge.d.ts +22 -0
  25. package/dist/commands/purge.d.ts.map +1 -0
  26. package/dist/commands/purge.js +295 -0
  27. package/dist/commands/purge.js.map +1 -0
  28. package/dist/commands/scan.d.ts +23 -0
  29. package/dist/commands/scan.d.ts.map +1 -0
  30. package/dist/commands/scan.js +155 -0
  31. package/dist/commands/scan.js.map +1 -0
  32. package/dist/detector/app-bundle.d.ts +13 -0
  33. package/dist/detector/app-bundle.d.ts.map +1 -0
  34. package/dist/detector/app-bundle.js +27 -0
  35. package/dist/detector/app-bundle.js.map +1 -0
  36. package/dist/detector/cli-binary.d.ts +12 -0
  37. package/dist/detector/cli-binary.d.ts.map +1 -0
  38. package/dist/detector/cli-binary.js +66 -0
  39. package/dist/detector/cli-binary.js.map +1 -0
  40. package/dist/detector/config.d.ts +21 -0
  41. package/dist/detector/config.d.ts.map +1 -0
  42. package/dist/detector/config.js +337 -0
  43. package/dist/detector/config.js.map +1 -0
  44. package/dist/detector/detection-config.d.ts +24 -0
  45. package/dist/detector/detection-config.d.ts.map +1 -0
  46. package/dist/detector/detection-config.js +242 -0
  47. package/dist/detector/detection-config.js.map +1 -0
  48. package/dist/detector/docker.d.ts +10 -0
  49. package/dist/detector/docker.d.ts.map +1 -0
  50. package/dist/detector/docker.js +94 -0
  51. package/dist/detector/docker.js.map +1 -0
  52. package/dist/detector/index.d.ts +50 -0
  53. package/dist/detector/index.d.ts.map +1 -0
  54. package/dist/detector/index.js +155 -0
  55. package/dist/detector/index.js.map +1 -0
  56. package/dist/detector/network.d.ts +34 -0
  57. package/dist/detector/network.d.ts.map +1 -0
  58. package/dist/detector/network.js +205 -0
  59. package/dist/detector/network.js.map +1 -0
  60. package/dist/detector/process.d.ts +16 -0
  61. package/dist/detector/process.d.ts.map +1 -0
  62. package/dist/detector/process.js +47 -0
  63. package/dist/detector/process.js.map +1 -0
  64. package/dist/detector/service.d.ts +17 -0
  65. package/dist/detector/service.d.ts.map +1 -0
  66. package/dist/detector/service.js +51 -0
  67. package/dist/detector/service.js.map +1 -0
  68. package/dist/enforcer/docker-cleaner.d.ts +30 -0
  69. package/dist/enforcer/docker-cleaner.d.ts.map +1 -0
  70. package/dist/enforcer/docker-cleaner.js +163 -0
  71. package/dist/enforcer/docker-cleaner.js.map +1 -0
  72. package/dist/enforcer/file-remover.d.ts +34 -0
  73. package/dist/enforcer/file-remover.d.ts.map +1 -0
  74. package/dist/enforcer/file-remover.js +137 -0
  75. package/dist/enforcer/file-remover.js.map +1 -0
  76. package/dist/enforcer/index.d.ts +33 -0
  77. package/dist/enforcer/index.d.ts.map +1 -0
  78. package/dist/enforcer/index.js +142 -0
  79. package/dist/enforcer/index.js.map +1 -0
  80. package/dist/enforcer/process-killer.d.ts +18 -0
  81. package/dist/enforcer/process-killer.d.ts.map +1 -0
  82. package/dist/enforcer/process-killer.js +80 -0
  83. package/dist/enforcer/process-killer.js.map +1 -0
  84. package/dist/enforcer/service-stopper.d.ts +23 -0
  85. package/dist/enforcer/service-stopper.d.ts.map +1 -0
  86. package/dist/enforcer/service-stopper.js +95 -0
  87. package/dist/enforcer/service-stopper.js.map +1 -0
  88. package/dist/index.d.ts +6 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +10 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/isolator/firewall.d.ts +25 -0
  93. package/dist/isolator/firewall.d.ts.map +1 -0
  94. package/dist/isolator/firewall.js +114 -0
  95. package/dist/isolator/firewall.js.map +1 -0
  96. package/dist/isolator/index.d.ts +63 -0
  97. package/dist/isolator/index.d.ts.map +1 -0
  98. package/dist/isolator/index.js +201 -0
  99. package/dist/isolator/index.js.map +1 -0
  100. package/dist/isolator/lockdown.d.ts +22 -0
  101. package/dist/isolator/lockdown.d.ts.map +1 -0
  102. package/dist/isolator/lockdown.js +401 -0
  103. package/dist/isolator/lockdown.js.map +1 -0
  104. package/dist/isolator/quarantine.d.ts +39 -0
  105. package/dist/isolator/quarantine.d.ts.map +1 -0
  106. package/dist/isolator/quarantine.js +364 -0
  107. package/dist/isolator/quarantine.js.map +1 -0
  108. package/dist/mdm/index.d.ts +93 -0
  109. package/dist/mdm/index.d.ts.map +1 -0
  110. package/dist/mdm/index.js +414 -0
  111. package/dist/mdm/index.js.map +1 -0
  112. package/dist/mdm/intune.d.ts +69 -0
  113. package/dist/mdm/intune.d.ts.map +1 -0
  114. package/dist/mdm/intune.js +409 -0
  115. package/dist/mdm/intune.js.map +1 -0
  116. package/dist/mdm/jamf.d.ts +58 -0
  117. package/dist/mdm/jamf.d.ts.map +1 -0
  118. package/dist/mdm/jamf.js +441 -0
  119. package/dist/mdm/jamf.js.map +1 -0
  120. package/dist/mdm/jumpcloud.d.ts +73 -0
  121. package/dist/mdm/jumpcloud.d.ts.map +1 -0
  122. package/dist/mdm/jumpcloud.js +470 -0
  123. package/dist/mdm/jumpcloud.js.map +1 -0
  124. package/dist/mdm/templates/detect.ps1.d.ts +30 -0
  125. package/dist/mdm/templates/detect.ps1.d.ts.map +1 -0
  126. package/dist/mdm/templates/detect.ps1.js +463 -0
  127. package/dist/mdm/templates/detect.ps1.js.map +1 -0
  128. package/dist/mdm/templates/detect.sh.d.ts +30 -0
  129. package/dist/mdm/templates/detect.sh.d.ts.map +1 -0
  130. package/dist/mdm/templates/detect.sh.js +474 -0
  131. package/dist/mdm/templates/detect.sh.js.map +1 -0
  132. package/dist/mdm/templates/enforce.ps1.d.ts +33 -0
  133. package/dist/mdm/templates/enforce.ps1.d.ts.map +1 -0
  134. package/dist/mdm/templates/enforce.ps1.js +681 -0
  135. package/dist/mdm/templates/enforce.ps1.js.map +1 -0
  136. package/dist/mdm/templates/enforce.sh.d.ts +33 -0
  137. package/dist/mdm/templates/enforce.sh.d.ts.map +1 -0
  138. package/dist/mdm/templates/enforce.sh.js +591 -0
  139. package/dist/mdm/templates/enforce.sh.js.map +1 -0
  140. package/dist/platform/darwin.d.ts +6 -0
  141. package/dist/platform/darwin.d.ts.map +1 -0
  142. package/dist/platform/darwin.js +192 -0
  143. package/dist/platform/darwin.js.map +1 -0
  144. package/dist/platform/index.d.ts +43 -0
  145. package/dist/platform/index.d.ts.map +1 -0
  146. package/dist/platform/index.js +27 -0
  147. package/dist/platform/index.js.map +1 -0
  148. package/dist/platform/linux.d.ts +6 -0
  149. package/dist/platform/linux.d.ts.map +1 -0
  150. package/dist/platform/linux.js +134 -0
  151. package/dist/platform/linux.js.map +1 -0
  152. package/dist/platform/windows.d.ts +6 -0
  153. package/dist/platform/windows.d.ts.map +1 -0
  154. package/dist/platform/windows.js +134 -0
  155. package/dist/platform/windows.js.map +1 -0
  156. package/dist/reporter/console.d.ts +27 -0
  157. package/dist/reporter/console.d.ts.map +1 -0
  158. package/dist/reporter/console.js +431 -0
  159. package/dist/reporter/console.js.map +1 -0
  160. package/dist/reporter/index.d.ts +11 -0
  161. package/dist/reporter/index.d.ts.map +1 -0
  162. package/dist/reporter/index.js +13 -0
  163. package/dist/reporter/index.js.map +1 -0
  164. package/dist/reporter/json.d.ts +61 -0
  165. package/dist/reporter/json.d.ts.map +1 -0
  166. package/dist/reporter/json.js +75 -0
  167. package/dist/reporter/json.js.map +1 -0
  168. package/dist/reporter/webhook.d.ts +57 -0
  169. package/dist/reporter/webhook.d.ts.map +1 -0
  170. package/dist/reporter/webhook.js +230 -0
  171. package/dist/reporter/webhook.js.map +1 -0
  172. package/dist/types/config.d.ts +116 -0
  173. package/dist/types/config.d.ts.map +1 -0
  174. package/dist/types/config.js +6 -0
  175. package/dist/types/config.js.map +1 -0
  176. package/dist/types/detection.d.ts +85 -0
  177. package/dist/types/detection.d.ts.map +1 -0
  178. package/dist/types/detection.js +5 -0
  179. package/dist/types/detection.js.map +1 -0
  180. package/dist/types/enforcement.d.ts +33 -0
  181. package/dist/types/enforcement.d.ts.map +1 -0
  182. package/dist/types/enforcement.js +5 -0
  183. package/dist/types/enforcement.js.map +1 -0
  184. package/dist/types/index.d.ts +8 -0
  185. package/dist/types/index.d.ts.map +1 -0
  186. package/dist/types/index.js +8 -0
  187. package/dist/types/index.js.map +1 -0
  188. package/dist/types/isolation.d.ts +55 -0
  189. package/dist/types/isolation.d.ts.map +1 -0
  190. package/dist/types/isolation.js +5 -0
  191. package/dist/types/isolation.js.map +1 -0
  192. package/dist/utils/exec.d.ts +48 -0
  193. package/dist/utils/exec.d.ts.map +1 -0
  194. package/dist/utils/exec.js +103 -0
  195. package/dist/utils/exec.js.map +1 -0
  196. package/dist/utils/fs.d.ts +34 -0
  197. package/dist/utils/fs.d.ts.map +1 -0
  198. package/dist/utils/fs.js +111 -0
  199. package/dist/utils/fs.js.map +1 -0
  200. package/dist/utils/index.d.ts +7 -0
  201. package/dist/utils/index.d.ts.map +1 -0
  202. package/dist/utils/index.js +7 -0
  203. package/dist/utils/index.js.map +1 -0
  204. package/dist/utils/logger.d.ts +14 -0
  205. package/dist/utils/logger.d.ts.map +1 -0
  206. package/dist/utils/logger.js +48 -0
  207. package/dist/utils/logger.js.map +1 -0
  208. package/docs/intune.md +390 -0
  209. package/docs/jamf.md +400 -0
  210. package/docs/jumpcloud.md +510 -0
  211. 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":"AAAA;;;GAGG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAE9D;;GAEG;AACH,KAAK,UAAU,iBAAiB;IAC9B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,yBAAyB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc;IAC3B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAC3B,0DAA0D,EAC1D,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC;YAElD,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;gBACxC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC;oBACvC,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU;IACvB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAC3B,+DAA+D,EAC/D,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAExD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAEjC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;gBACxC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAE1D,qCAAqC;IACrC,IAAI,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7C,cAAc,EAAE;QAChB,UAAU,EAAE;KACb,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,KAAK,CACV,qBAAqB,UAAU,CAAC,MAAM,gBAAgB,MAAM,CAAC,MAAM,SAAS,CAC7E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,KAAK;QACL,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC/C,CAAC;AACJ,CAAC"}
@@ -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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAcnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,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,EAA8C,MAAM,cAAc,CAAC;AAEzF,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,gDAAgD;AAChD,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;AAEzF,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;GAEG;AACH,SAAS,cAAc,CACrB,GAAuB,EACvB,GAAuB,EACvB,QAA2B,EAC3B,MAAuB,EACvB,OAAyB,EACzB,OAAyB,EACzB,SAA6B,EAC7B,MAAuB;IAEvB,kDAAkD;IAClD,MAAM,SAAS,GACb,OAAO,CAAC,OAAO;QACf,OAAO,CAAC,SAAS;QACjB,SAAS,CAAC,MAAM,GAAG,CAAC;QACpB,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,sEAAsE;IACtE,MAAM,WAAW,GACf,GAAG,CAAC,KAAK;QACT,GAAG,CAAC,KAAK;QACT,QAAQ,CAAC,KAAK;QACd,MAAM,CAAC,KAAK;QACZ,OAAO,CAAC,KAAK;QACb,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE9C,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,UAAyB,EAAE;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,sCAAsC;IACtC,MAAM,cAAc,GAAyB,OAAO,CAAC,IAAI,KAAK,SAAS;QACrE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAE,qCAAqC;QAC/D,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAE,gBAAgB;IAErE,iDAAiD;IACjD,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,GACrE,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,eAAe,CAAC,QAAQ,CAAC;QACzB,eAAe,CAAC,QAAQ,CAAC;QACzB,cAAc,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QACxD,YAAY,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtD,aAAa,CAAC,QAAQ,CAAC;QACvB,aAAa,CAAC,cAAc,CAAC;QAC7B,eAAe,CAAC,QAAQ,CAAC;QACzB,YAAY,EAAE;KACf,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,cAAc,CAC5B,GAAG,EACH,GAAG,EACH,QAAQ,EACR,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,MAAM,CACP,CAAC;IAEF,MAAM,MAAM,GAAoB;QAC9B,OAAO;QACP,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;QACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG;QACH,GAAG;QACH,QAAQ;QACR,MAAM;QACN,OAAO;QACP,OAAO;QACP,SAAS;QACT,MAAM;KACP,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAE7E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,4BAA4B;IAC5B,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAE3B,qBAAqB;IACrB,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IACtC,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEnC,kBAAkB;IAClB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,mBAAmB;IACnB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,GAAG,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAE3B,wBAAwB;IACxB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAEhC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,uBAAuB;YAC1B,OAAO,qBAAqB,CAAC;QAC/B,KAAK,uBAAuB;YAC1B,OAAO,yBAAyB,CAAC;QACnC,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAuB;IAChD,OAAO,MAAM,CAAC,OAAO,KAAK,eAAe,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAuB;IAC/C,OAAO,MAAM,CAAC,OAAO,KAAK,uBAAuB,CAAC;AACpD,CAAC"}
@@ -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