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,192 @@
1
+ /**
2
+ * macOS (Darwin) platform implementation.
3
+ */
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import { exec, validateServiceName, validateProcessName, validatePid, validatePort } from '../utils/exec.js';
7
+ import { pathExists } from '../utils/fs.js';
8
+ const GATEWAY_SERVICE_LABEL = 'bot.molt.gateway';
9
+ const QUARANTINE_BASE = '/var/nox-quarantine';
10
+ export const darwin = {
11
+ name: 'darwin',
12
+ getCliLocations() {
13
+ return ['/usr/local/bin/openclaw', '/opt/homebrew/bin/openclaw'];
14
+ },
15
+ getAppLocations() {
16
+ return ['/Applications/OpenClaw.app'];
17
+ },
18
+ getStateDirPath(user) {
19
+ const home = user === 'root' || !user ? '/var/root' : path.join('/Users', user);
20
+ return path.join(home, '.openclaw');
21
+ },
22
+ getServiceName(_profile) {
23
+ return GATEWAY_SERVICE_LABEL;
24
+ },
25
+ async checkServiceRunning(name) {
26
+ try {
27
+ const safeName = validateServiceName(name);
28
+ const { stdout } = await exec(`launchctl list ${safeName} 2>/dev/null || true`, {
29
+ timeout: 5000,
30
+ });
31
+ return stdout.includes(safeName) && !stdout.includes('Could not find');
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ },
37
+ async stopService(name) {
38
+ const safeName = validateServiceName(name);
39
+ await exec(`launchctl unload ~/Library/LaunchAgents/${safeName}.plist 2>/dev/null || true`);
40
+ await exec(`launchctl bootout gui/$(id -u) ${safeName} 2>/dev/null || true`);
41
+ await exec(`launchctl remove ${safeName} 2>/dev/null || true`);
42
+ },
43
+ async disableService(name) {
44
+ await this.stopService(name);
45
+ // Remove plist to prevent reload
46
+ const plistPaths = [
47
+ path.join(os.homedir(), 'Library', 'LaunchAgents', `${name}.plist`),
48
+ `/Library/LaunchAgents/${name}.plist`,
49
+ `/Library/LaunchDaemons/${name}.plist`,
50
+ ];
51
+ for (const p of plistPaths) {
52
+ if (await pathExists(p)) {
53
+ const { rm } = await import('node:fs/promises');
54
+ await rm(p, { force: true }).catch(() => { });
55
+ }
56
+ }
57
+ },
58
+ async findProcesses(name) {
59
+ const results = [];
60
+ try {
61
+ // Validate process name to prevent command injection
62
+ const safeName = validateProcessName(name);
63
+ // Use ps to find processes, then filter by actual process name (not full command line)
64
+ // This avoids false positives from matching directory paths or arguments
65
+ const { stdout } = await exec(`ps -axo pid,comm 2>/dev/null | grep -i "${safeName}" || true`, { timeout: 5000 });
66
+ const lines = stdout.trim().split('\n').filter(Boolean);
67
+ for (const line of lines) {
68
+ const match = line.match(/^\s*(\d+)\s+(.+)$/);
69
+ if (match) {
70
+ const pid = parseInt(match[1], 10);
71
+ const comm = match[2].trim();
72
+ // Extract just the binary name from the path
73
+ const processName = comm.split('/').pop() ?? comm;
74
+ // Only include if the process name itself matches (not just the path)
75
+ if (processName.toLowerCase().includes(name.toLowerCase())) {
76
+ results.push({
77
+ pid,
78
+ name: processName,
79
+ user: undefined,
80
+ });
81
+ }
82
+ }
83
+ }
84
+ // Optional: get RSS via ps for memory
85
+ for (const p of results) {
86
+ try {
87
+ const { stdout: psOut } = await exec(`ps -o rss= -p ${p.pid} 2>/dev/null || true`);
88
+ const kb = parseInt(psOut.trim(), 10);
89
+ if (!Number.isNaN(kb))
90
+ p.memory = kb * 1024;
91
+ }
92
+ catch {
93
+ /* ignore */
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ /* return empty */
99
+ }
100
+ return results;
101
+ },
102
+ async killProcess(pid) {
103
+ const safePid = validatePid(pid);
104
+ await exec(`kill -9 ${safePid}`);
105
+ },
106
+ async blockPort(port) {
107
+ // Validate port number to prevent command injection
108
+ const safePort = validatePort(port);
109
+ // Check if running as root (required for pfctl)
110
+ const isRoot = process.getuid?.() === 0;
111
+ if (!isRoot) {
112
+ throw new Error('Port blocking requires root privileges. Run with: sudo nox isolate --block-port');
113
+ }
114
+ // Use a dedicated anchor so we can add/remove rules without affecting other firewall rules
115
+ const anchor = 'com.nox.openclaw';
116
+ // Block ALL traffic to/from this port (inbound, outbound, and loopback)
117
+ const rules = [
118
+ `block drop in proto tcp from any to any port ${safePort}`,
119
+ `block drop out proto tcp from any to any port ${safePort}`,
120
+ `block drop in proto tcp from any to 127.0.0.1 port ${safePort}`,
121
+ `block drop out proto tcp from any to 127.0.0.1 port ${safePort}`,
122
+ ].join('\n');
123
+ // Create anchor rules file with secure random name to prevent symlink attacks
124
+ const { randomBytes } = await import('node:crypto');
125
+ const randomSuffix = randomBytes(16).toString('hex');
126
+ const rulesFile = `/tmp/nox-pf-rules-${randomSuffix}.conf`;
127
+ // Write rules file using Node.js fs to avoid shell injection
128
+ const { writeFile, unlink } = await import('node:fs/promises');
129
+ await writeFile(rulesFile, rules, { mode: 0o600 });
130
+ try {
131
+ // Check if pfctl is enabled
132
+ const { stdout: status } = await exec(`pfctl -s info 2>&1 | head -1 || true`);
133
+ const isEnabled = status.includes('Enabled');
134
+ // Load rules into our anchor
135
+ const { stderr } = await exec(`pfctl -a ${anchor} -f ${rulesFile} 2>&1`);
136
+ if (stderr && (stderr.includes('Permission denied') || stderr.includes('Operation not permitted'))) {
137
+ throw new Error('Permission denied - run with sudo');
138
+ }
139
+ // Enable pfctl if not already enabled
140
+ if (!isEnabled) {
141
+ await exec(`pfctl -e 2>&1 || true`);
142
+ }
143
+ }
144
+ finally {
145
+ // Clean up temp file securely
146
+ await unlink(rulesFile).catch(() => { });
147
+ }
148
+ },
149
+ async unblockPort(port) {
150
+ // Validate port number (even though we flush all rules, good practice)
151
+ validatePort(port);
152
+ // Check if running as root (required for pfctl)
153
+ const isRoot = process.getuid?.() === 0;
154
+ if (!isRoot) {
155
+ throw new Error('Port unblocking requires root privileges. Run with: sudo nox isolate revert --unblock-port');
156
+ }
157
+ // Flush only our anchor, leaving other firewall rules intact
158
+ const anchor = 'com.nox.openclaw';
159
+ const { stderr } = await exec(`pfctl -a ${anchor} -F all 2>&1`);
160
+ if (stderr && (stderr.includes('Permission denied') || stderr.includes('Operation not permitted'))) {
161
+ throw new Error('Permission denied - run with sudo');
162
+ }
163
+ // Note: We don't disable pfctl entirely as other rules may be active
164
+ // The anchor is now empty, so our blocking rule is removed
165
+ },
166
+ getQuarantinePath() {
167
+ return QUARANTINE_BASE;
168
+ },
169
+ async getAllUsers() {
170
+ const users = [];
171
+ try {
172
+ const { stdout } = await exec('dscl . list /Users UniqueID 2>/dev/null || true', {
173
+ timeout: 5000,
174
+ });
175
+ const lines = stdout.trim().split('\n').filter(Boolean);
176
+ for (const line of lines) {
177
+ const parts = line.split(/\s+/);
178
+ const name = parts[0];
179
+ if (name && name !== '_' && name !== 'nobody' && name !== 'daemon') {
180
+ const uid = parseInt(parts[1], 10);
181
+ if (uid >= 500 || uid === 0)
182
+ users.push(name);
183
+ }
184
+ }
185
+ }
186
+ catch {
187
+ users.push(os.userInfo().username);
188
+ }
189
+ return users.length > 0 ? users : [os.userInfo().username];
190
+ },
191
+ };
192
+ //# sourceMappingURL=darwin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"darwin.js","sourceRoot":"","sources":["../../src/platform/darwin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Platform abstraction layer for detection, enforcement, and isolation.
3
+ */
4
+ import type { PlatformName } from '../types/detection.js';
5
+ import type { ProcessInfo } from '../types/detection.js';
6
+ export type { ProcessInfo };
7
+ export interface Platform {
8
+ name: PlatformName;
9
+ /** Paths to check for OpenClaw CLI binary. */
10
+ getCliLocations(): string[];
11
+ /** Paths to check for OpenClaw app bundle (e.g. macOS .app). */
12
+ getAppLocations(): string[];
13
+ /** State directory path for a given user (e.g. ~/.openclaw). */
14
+ getStateDirPath(user: string): string;
15
+ /** Service name for the gateway (e.g. launchd label, systemd unit). */
16
+ getServiceName(profile?: string): string;
17
+ /** Whether the given service is currently running. */
18
+ checkServiceRunning(name: string): Promise<boolean>;
19
+ /** Stop the given service. */
20
+ stopService(name: string): Promise<void>;
21
+ /** Disable the service from starting on boot. */
22
+ disableService(name: string): Promise<void>;
23
+ /** Find processes matching the given name. */
24
+ findProcesses(name: string): Promise<ProcessInfo[]>;
25
+ /** Kill process by PID. */
26
+ killProcess(pid: number): Promise<void>;
27
+ /** Block outbound TCP traffic to the given port (firewall). */
28
+ blockPort(port: number): Promise<void>;
29
+ /** Remove firewall block for the given port. */
30
+ unblockPort(port: number): Promise<void>;
31
+ /** Base directory for quarantined artifacts. */
32
+ getQuarantinePath(): string;
33
+ /** List of local user account names (for multi-user scan). */
34
+ getAllUsers(): Promise<string[]>;
35
+ }
36
+ export { darwin } from './darwin.js';
37
+ export { linux } from './linux.js';
38
+ export { windows } from './windows.js';
39
+ /**
40
+ * Return the platform implementation for the current OS.
41
+ */
42
+ export declare function getPlatform(): Platform;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,YAAY,CAAC;IAEnB,8CAA8C;IAC9C,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B,gEAAgE;IAChE,eAAe,IAAI,MAAM,EAAE,CAAC;IAE5B,gEAAgE;IAChE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtC,uEAAuE;IACvE,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEzC,sDAAsD;IACtD,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpD,8BAA8B;IAC9B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,iDAAiD;IACjD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C,8CAA8C;IAC9C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpD,2BAA2B;IAC3B,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,+DAA+D;IAC/D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,gDAAgD;IAChD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,gDAAgD;IAChD,iBAAiB,IAAI,MAAM,CAAC;IAE5B,8DAA8D;IAC9D,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAClC;AAMD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAYtC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Platform abstraction layer for detection, enforcement, and isolation.
3
+ */
4
+ import * as os from 'node:os';
5
+ import { darwin } from './darwin.js';
6
+ import { linux } from './linux.js';
7
+ import { windows } from './windows.js';
8
+ export { darwin } from './darwin.js';
9
+ export { linux } from './linux.js';
10
+ export { windows } from './windows.js';
11
+ /**
12
+ * Return the platform implementation for the current OS.
13
+ */
14
+ export function getPlatform() {
15
+ const platform = os.platform();
16
+ switch (platform) {
17
+ case 'darwin':
18
+ return darwin;
19
+ case 'linux':
20
+ return linux;
21
+ case 'win32':
22
+ return windows;
23
+ default:
24
+ throw new Error(`Unsupported platform: ${platform}`);
25
+ }
26
+ }
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/platform/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAiD9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Linux platform implementation.
3
+ */
4
+ import type { Platform } from './index.js';
5
+ export declare const linux: Platform;
6
+ //# sourceMappingURL=linux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux.d.ts","sourceRoot":"","sources":["../../src/platform/linux.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AASxD,eAAO,MAAM,KAAK,EAAE,QAuInB,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Linux platform implementation.
3
+ */
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import { exec, validateServiceName, validateProcessName, validatePid, validatePort } from '../utils/exec.js';
7
+ const GATEWAY_SERVICE_NAME = 'openclaw-gateway';
8
+ const GATEWAY_SERVICE_LEGACY = 'bot.molt.gateway';
9
+ const QUARANTINE_BASE = '/var/lib/nox-quarantine';
10
+ export const linux = {
11
+ name: 'linux',
12
+ getCliLocations() {
13
+ return ['/usr/local/bin/openclaw', '/usr/bin/openclaw'];
14
+ },
15
+ getAppLocations() {
16
+ return [];
17
+ },
18
+ getStateDirPath(user) {
19
+ const home = user === 'root' || !user ? '/root' : path.join('/home', user);
20
+ return path.join(home, '.openclaw');
21
+ },
22
+ getServiceName(_profile) {
23
+ return GATEWAY_SERVICE_NAME;
24
+ },
25
+ async checkServiceRunning(name) {
26
+ try {
27
+ const safeName = validateServiceName(name);
28
+ const { stdout } = await exec(`systemctl is-active ${safeName} 2>/dev/null || true`, {
29
+ timeout: 5000,
30
+ });
31
+ if (stdout.trim() === 'active')
32
+ return true;
33
+ // GATEWAY_SERVICE_LEGACY is a constant, so it's safe
34
+ const { stdout: legacy } = await exec(`systemctl is-active ${GATEWAY_SERVICE_LEGACY} 2>/dev/null || true`, { timeout: 5000 });
35
+ return legacy.trim() === 'active';
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ },
41
+ async stopService(name) {
42
+ const safeName = validateServiceName(name);
43
+ await exec(`sudo systemctl stop ${safeName} 2>/dev/null || true`);
44
+ await exec(`sudo systemctl stop ${GATEWAY_SERVICE_LEGACY} 2>/dev/null || true`);
45
+ },
46
+ async disableService(name) {
47
+ const safeName = validateServiceName(name);
48
+ await this.stopService(safeName);
49
+ await exec(`sudo systemctl disable ${safeName} 2>/dev/null || true`);
50
+ await exec(`sudo systemctl disable ${GATEWAY_SERVICE_LEGACY} 2>/dev/null || true`);
51
+ },
52
+ async findProcesses(name) {
53
+ const results = [];
54
+ try {
55
+ // Validate process name to prevent command injection
56
+ const safeName = validateProcessName(name);
57
+ // Use ps to find processes, then filter by actual process name (not full command line)
58
+ // This avoids false positives from matching directory paths or arguments
59
+ const { stdout } = await exec(`ps -eo pid,comm 2>/dev/null | grep -i "${safeName}" || true`, { timeout: 5000 });
60
+ const lines = stdout.trim().split('\n').filter(Boolean);
61
+ for (const line of lines) {
62
+ const match = line.match(/^\s*(\d+)\s+(.+)$/);
63
+ if (match) {
64
+ const pid = parseInt(match[1], 10);
65
+ const comm = match[2].trim();
66
+ // Extract just the binary name from the path
67
+ const processName = comm.split('/').pop() ?? comm;
68
+ // Only include if the process name itself matches (not just the path)
69
+ if (processName.toLowerCase().includes(name.toLowerCase())) {
70
+ results.push({
71
+ pid,
72
+ name: processName,
73
+ user: undefined,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ for (const p of results) {
79
+ try {
80
+ const { stdout: psOut } = await exec(`ps -o rss= -p ${p.pid} 2>/dev/null || true`);
81
+ const kb = parseInt(psOut.trim(), 10);
82
+ if (!Number.isNaN(kb))
83
+ p.memory = kb * 1024;
84
+ }
85
+ catch {
86
+ /* ignore */
87
+ }
88
+ }
89
+ }
90
+ catch {
91
+ /* return empty */
92
+ }
93
+ return results;
94
+ },
95
+ async killProcess(pid) {
96
+ const safePid = validatePid(pid);
97
+ await exec(`kill -9 ${safePid}`);
98
+ },
99
+ async blockPort(port) {
100
+ const safePort = validatePort(port);
101
+ await exec(`sudo iptables -A OUTPUT -p tcp --dport ${safePort} -j DROP 2>/dev/null || true`);
102
+ },
103
+ async unblockPort(port) {
104
+ const safePort = validatePort(port);
105
+ await exec(`sudo iptables -D OUTPUT -p tcp --dport ${safePort} -j DROP 2>/dev/null || true`);
106
+ },
107
+ getQuarantinePath() {
108
+ return QUARANTINE_BASE;
109
+ },
110
+ async getAllUsers() {
111
+ const users = [];
112
+ try {
113
+ const { pathExists: exists } = await import('../utils/fs.js');
114
+ if (await exists('/etc/passwd')) {
115
+ const { readFile } = await import('node:fs/promises');
116
+ const content = await readFile('/etc/passwd', 'utf8');
117
+ for (const line of content.split('\n')) {
118
+ const parts = line.split(':');
119
+ if (parts.length >= 3) {
120
+ const name = parts[0];
121
+ const uid = parseInt(parts[2], 10);
122
+ if (uid >= 1000 || uid === 0)
123
+ users.push(name);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ catch {
129
+ /* fallback */
130
+ }
131
+ return users.length > 0 ? users : [os.userInfo().username];
132
+ },
133
+ };
134
+ //# sourceMappingURL=linux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linux.js","sourceRoot":"","sources":["../../src/platform/linux.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG7G,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAChD,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAClD,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAElD,MAAM,CAAC,MAAM,KAAK,GAAa;IAC7B,IAAI,EAAE,OAAuB;IAE7B,eAAe;QACb,OAAO,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IAED,eAAe;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,cAAc,CAAC,QAAiB;QAC9B,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY;QACpC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,QAAQ,sBAAsB,EAAE;gBACnF,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC5C,qDAAqD;YACrD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CACnC,uBAAuB,sBAAsB,sBAAsB,EACnE,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;YACF,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,uBAAuB,QAAQ,sBAAsB,CAAC,CAAC;QAClE,MAAM,IAAI,CAAC,uBAAuB,sBAAsB,sBAAsB,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,0BAA0B,QAAQ,sBAAsB,CAAC,CAAC;QACrE,MAAM,IAAI,CAAC,0BAA0B,sBAAsB,sBAAsB,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC3C,uFAAuF;YACvF,yEAAyE;YACzE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAC3B,0CAA0C,QAAQ,WAAW,EAC7D,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC9C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC7B,6CAA6C;oBAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;oBAClD,sEAAsE;oBACtE,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;wBAC3D,OAAO,CAAC,IAAI,CAAC;4BACX,GAAG;4BACH,IAAI,EAAE,WAAW;4BACjB,IAAI,EAAE,SAAS;yBAChB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC;oBACnF,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;wBAAE,CAAC,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;gBAC9C,CAAC;gBAAC,MAAM,CAAC;oBACP,YAAY;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,0CAA0C,QAAQ,8BAA8B,CAAC,CAAC;IAC/F,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,CAAC,0CAA0C,QAAQ,8BAA8B,CAAC,CAAC;IAC/F,CAAC;IAED,iBAAiB;QACf,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC9D,IAAI,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACnC,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,CAAC;4BAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Windows platform implementation.
3
+ */
4
+ import type { Platform } from './index.js';
5
+ export declare const windows: Platform;
6
+ //# sourceMappingURL=windows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../src/platform/windows.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AAWxD,eAAO,MAAM,OAAO,EAAE,QAiJrB,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Windows platform implementation.
3
+ */
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import { exec, validateServiceName, validateProcessName, validatePid, validatePort } from '../utils/exec.js';
7
+ const GATEWAY_SERVICE_NAME = 'OpenClawGateway';
8
+ const QUARANTINE_BASE = path.join(process.env.ProgramData ?? 'C:\\ProgramData', 'NoxQuarantine');
9
+ function getLocalAppData() {
10
+ return process.env.LOCALAPPDATA ?? path.join(process.env.USERPROFILE ?? 'C:\\Users\\User', 'AppData', 'Local');
11
+ }
12
+ export const windows = {
13
+ name: 'windows',
14
+ getCliLocations() {
15
+ const localAppData = getLocalAppData();
16
+ return [
17
+ path.join(localAppData, 'Programs', 'openclaw', 'openclaw.exe'),
18
+ path.join(process.env.ProgramFiles ?? 'C:\\Program Files', 'openclaw', 'openclaw.exe'),
19
+ path.join(process.env['ProgramFiles(x86)'] ?? 'C:\\Program Files (x86)', 'openclaw', 'openclaw.exe'),
20
+ ];
21
+ },
22
+ getAppLocations() {
23
+ return [];
24
+ },
25
+ getStateDirPath(user) {
26
+ const base = process.env.SYSTEMDRIVE ?? 'C:';
27
+ const home = user && user !== 'SYSTEM'
28
+ ? path.join(base, 'Users', user)
29
+ : path.join(base, 'Users', os.userInfo().username);
30
+ return path.join(home, '.openclaw');
31
+ },
32
+ getServiceName(_profile) {
33
+ return GATEWAY_SERVICE_NAME;
34
+ },
35
+ async checkServiceRunning(name) {
36
+ try {
37
+ const safeName = validateServiceName(name);
38
+ const { stdout } = await exec(`sc query ${safeName} 2>nul | findstr /C:"RUNNING"`, { timeout: 5000 });
39
+ return stdout.trim().length > 0;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ },
45
+ async stopService(name) {
46
+ const safeName = validateServiceName(name);
47
+ await exec(`sc stop ${safeName} 2>nul`, { timeout: 15000 });
48
+ },
49
+ async disableService(name) {
50
+ const safeName = validateServiceName(name);
51
+ await this.stopService(safeName);
52
+ await exec(`sc config ${safeName} start= disabled 2>nul`, { timeout: 5000 });
53
+ },
54
+ async findProcesses(name) {
55
+ const results = [];
56
+ try {
57
+ // Validate process name to prevent command injection
58
+ const safeName = validateProcessName(name);
59
+ const { stdout } = await exec(`wmic process where "name like '%${safeName}%'" get ProcessId,Name,WorkingSetSize 2>nul`, { timeout: 10000 });
60
+ const lines = stdout.trim().split('\r\n').filter(Boolean);
61
+ const header = lines[0]?.toLowerCase() ?? '';
62
+ const pidIdx = header.includes('processid') ? header.split(/\s+/).indexOf('processid') : -1;
63
+ const nameIdx = header.includes('name') ? header.split(/\s+/).indexOf('name') : -1;
64
+ const memIdx = header.includes('workingsetsize') ? header.split(/\s+/).indexOf('workingsetsize') : -1;
65
+ for (let i = 1; i < lines.length; i++) {
66
+ const parts = lines[i].trim().split(/\s+/);
67
+ const pid = pidIdx >= 0 ? parseInt(parts[pidIdx], 10) : NaN;
68
+ const procName = nameIdx >= 0 ? parts[nameIdx] ?? 'openclaw' : 'openclaw';
69
+ const mem = memIdx >= 0 ? parseInt(parts[memIdx], 10) : undefined;
70
+ if (!Number.isNaN(pid)) {
71
+ results.push({
72
+ pid,
73
+ name: procName,
74
+ memory: Number.isNaN(mem) ? undefined : mem,
75
+ user: undefined,
76
+ });
77
+ }
78
+ }
79
+ // Fallback: tasklist
80
+ if (results.length === 0) {
81
+ const { stdout: taskOut } = await exec(`tasklist /FI "IMAGENAME eq ${safeName}*" /FO CSV /NH 2>nul`, { timeout: 5000 });
82
+ const taskLines = taskOut.trim().split('\n').filter(Boolean);
83
+ for (const line of taskLines) {
84
+ const match = line.match(/"([^"]+)","(\d+)"/);
85
+ if (match) {
86
+ results.push({
87
+ pid: parseInt(match[2], 10),
88
+ name: match[1],
89
+ user: undefined,
90
+ });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ catch {
96
+ /* return empty */
97
+ }
98
+ return results;
99
+ },
100
+ async killProcess(pid) {
101
+ const safePid = validatePid(pid);
102
+ await exec(`taskkill /F /PID ${safePid} 2>nul`);
103
+ },
104
+ async blockPort(port) {
105
+ const safePort = validatePort(port);
106
+ const ruleName = 'Nox Block OpenClaw';
107
+ await exec(`netsh advfirewall firewall add rule name="${ruleName}" dir=out action=block protocol=TCP remoteport=${safePort} 2>nul`, { timeout: 5000 });
108
+ },
109
+ async unblockPort(port) {
110
+ await exec('netsh advfirewall firewall delete rule name="Nox Block OpenClaw" 2>nul', { timeout: 5000 });
111
+ },
112
+ getQuarantinePath() {
113
+ return QUARANTINE_BASE;
114
+ },
115
+ async getAllUsers() {
116
+ const users = [];
117
+ try {
118
+ const { stdout } = await exec('wmic useraccount where localaccount="true" get name 2>nul', {
119
+ timeout: 10000,
120
+ });
121
+ const lines = stdout.trim().split(/\r?\n/).filter(Boolean);
122
+ for (let i = 1; i < lines.length; i++) {
123
+ const name = lines[i].trim();
124
+ if (name && name !== 'Name')
125
+ users.push(name);
126
+ }
127
+ }
128
+ catch {
129
+ /* fallback */
130
+ }
131
+ return users.length > 0 ? users : [os.userInfo().username];
132
+ },
133
+ };
134
+ //# sourceMappingURL=windows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/platform/windows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Console output formatting with branding and tables.
3
+ */
4
+ import type { DetectionResult, EnforcementResult, IsolationResult, QuarantineManifest } from '../types/index.js';
5
+ import { printBanner } from '../branding.js';
6
+ export { printBanner };
7
+ /**
8
+ * Print detection results to console.
9
+ */
10
+ export declare function printDetectionResult(result: DetectionResult, quarantined?: QuarantineManifest[]): void;
11
+ /**
12
+ * Print enforcement results to console.
13
+ */
14
+ export declare function printEnforcementResult(result: EnforcementResult): void;
15
+ /**
16
+ * Print isolation results to console.
17
+ */
18
+ export declare function printIsolationResult(result: IsolationResult): void;
19
+ /**
20
+ * Print a simple status message.
21
+ */
22
+ export declare function printStatus(message: string, type?: 'info' | 'success' | 'warning' | 'error'): void;
23
+ /**
24
+ * Print quarantine notice box for scan results.
25
+ */
26
+ export declare function printQuarantineNotice(quarantined: QuarantineManifest[]): void;
27
+ //# sourceMappingURL=console.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../src/reporter/console.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAI7C,OAAO,EAAE,WAAW,EAAE,CAAC;AA6CvB;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,GAAE,kBAAkB,EAAO,GAAG,IAAI,CA4O1G;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CA8DtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAyDlE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAgB,GAAG,IAAI,CAQ1G;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAoD7E"}