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,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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|