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,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purge command - detect and remove OpenClaw installations.
|
|
3
|
+
*/
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import inquirer from 'inquirer';
|
|
7
|
+
import { printBanner, EXIT_CODES, VERSION, TOOL_NAME } from '../branding.js';
|
|
8
|
+
import { detect, isDetected } from '../detector/index.js';
|
|
9
|
+
import { printDetectionResult, printEnforcementResult, printEnforcementJson, sendEnforcementWebhook, printStatus, } from '../reporter/index.js';
|
|
10
|
+
import { logger, setLogLevel } from '../utils/logger.js';
|
|
11
|
+
import { enforce } from '../enforcer/index.js';
|
|
12
|
+
import { getPlatform } from '../platform/index.js';
|
|
13
|
+
import { listQuarantined, deleteQuarantined } from '../isolator/index.js';
|
|
14
|
+
/**
|
|
15
|
+
* Handle quarantined items - ask to delete or auto-delete with --force.
|
|
16
|
+
*/
|
|
17
|
+
async function handleQuarantinedItems(quarantined, platform, options) {
|
|
18
|
+
console.log();
|
|
19
|
+
console.log(chalk.yellow(`Found ${quarantined.length} quarantined item(s):`));
|
|
20
|
+
for (const entry of quarantined) {
|
|
21
|
+
console.log(` ${chalk.dim('●')} ${entry.id} (${entry.artifacts.length} artifact(s))`);
|
|
22
|
+
}
|
|
23
|
+
console.log();
|
|
24
|
+
let shouldDelete = options.force;
|
|
25
|
+
if (!shouldDelete) {
|
|
26
|
+
const { confirmed } = await inquirer.prompt([
|
|
27
|
+
{
|
|
28
|
+
type: 'confirm',
|
|
29
|
+
name: 'confirmed',
|
|
30
|
+
message: 'Permanently delete quarantined items?',
|
|
31
|
+
default: false,
|
|
32
|
+
},
|
|
33
|
+
]);
|
|
34
|
+
shouldDelete = confirmed;
|
|
35
|
+
}
|
|
36
|
+
if (shouldDelete) {
|
|
37
|
+
const spinner = ora('Deleting quarantined items...').start();
|
|
38
|
+
let deleted = 0;
|
|
39
|
+
const errors = [];
|
|
40
|
+
for (const entry of quarantined) {
|
|
41
|
+
const result = await deleteQuarantined(platform, entry.id);
|
|
42
|
+
if (result.success) {
|
|
43
|
+
deleted++;
|
|
44
|
+
}
|
|
45
|
+
else if (result.error) {
|
|
46
|
+
errors.push(`${entry.id}: ${result.error}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (errors.length > 0) {
|
|
50
|
+
spinner.fail(`Deleted ${deleted}/${quarantined.length} quarantined items`);
|
|
51
|
+
for (const err of errors) {
|
|
52
|
+
logger.error(err);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
spinner.succeed(`Deleted ${deleted} quarantined item(s)`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
printStatus('Quarantined items preserved', 'info');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Display planned actions and ask for confirmation.
|
|
65
|
+
*/
|
|
66
|
+
async function confirmPurge(dryRun) {
|
|
67
|
+
console.log();
|
|
68
|
+
console.log(chalk.bold.red('WARNING: This will permanently remove OpenClaw!'));
|
|
69
|
+
console.log();
|
|
70
|
+
console.log(chalk.bold('The following actions will be performed:'));
|
|
71
|
+
console.log();
|
|
72
|
+
console.log(` ${chalk.yellow('●')} Kill all running OpenClaw processes`);
|
|
73
|
+
console.log(` ${chalk.yellow('●')} Stop OpenClaw services`);
|
|
74
|
+
console.log(` ${chalk.yellow('●')} Remove CLI binary`);
|
|
75
|
+
console.log(` ${chalk.yellow('●')} Remove app bundle (if present)`);
|
|
76
|
+
console.log(` ${chalk.yellow('●')} Remove configuration directory`);
|
|
77
|
+
console.log(` ${chalk.yellow('●')} Remove Docker containers/images (if present)`);
|
|
78
|
+
console.log();
|
|
79
|
+
const { confirmed } = await inquirer.prompt([
|
|
80
|
+
{
|
|
81
|
+
type: 'confirm',
|
|
82
|
+
name: 'confirmed',
|
|
83
|
+
message: 'Do you want to proceed?',
|
|
84
|
+
default: false,
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
return confirmed;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Purge command handler.
|
|
91
|
+
*/
|
|
92
|
+
export async function purgeCommand(options) {
|
|
93
|
+
// Handle debug mode
|
|
94
|
+
const parentOpts = options.parent?.opts() ?? {};
|
|
95
|
+
if (parentOpts.debug) {
|
|
96
|
+
setLogLevel('debug');
|
|
97
|
+
}
|
|
98
|
+
// Show banner unless quiet or JSON output
|
|
99
|
+
if (!options.quiet && !options.json) {
|
|
100
|
+
printBanner();
|
|
101
|
+
}
|
|
102
|
+
// Check for root/admin privileges
|
|
103
|
+
const isRoot = process.getuid?.() === 0;
|
|
104
|
+
if (!isRoot && !options.dryRun) {
|
|
105
|
+
if (!options.json) {
|
|
106
|
+
console.log(chalk.red.bold('Error: This command requires administrator privileges.'));
|
|
107
|
+
console.log();
|
|
108
|
+
console.log('Run with sudo:');
|
|
109
|
+
console.log(chalk.cyan(' sudo nox purge'));
|
|
110
|
+
console.log();
|
|
111
|
+
console.log(chalk.dim('Use --dry-run to preview actions without sudo.'));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(JSON.stringify({ error: 'This command requires administrator privileges. Run with sudo.' }, null, 2));
|
|
115
|
+
}
|
|
116
|
+
process.exit(EXIT_CODES.ERROR);
|
|
117
|
+
}
|
|
118
|
+
// Always purge all
|
|
119
|
+
const enforceOpts = {
|
|
120
|
+
all: true,
|
|
121
|
+
dryRun: options.dryRun,
|
|
122
|
+
force: options.force,
|
|
123
|
+
};
|
|
124
|
+
// Run detection first
|
|
125
|
+
let detection;
|
|
126
|
+
const platform = getPlatform();
|
|
127
|
+
if (!options.json) {
|
|
128
|
+
const spinner = ora('Scanning for OpenClaw installations...').start();
|
|
129
|
+
try {
|
|
130
|
+
detection = await detect({ allUsers: true });
|
|
131
|
+
if (!isDetected(detection)) {
|
|
132
|
+
spinner.succeed('No active OpenClaw installation detected');
|
|
133
|
+
// Check for quarantined items
|
|
134
|
+
const quarantined = await listQuarantined(platform);
|
|
135
|
+
if (quarantined.length > 0) {
|
|
136
|
+
await handleQuarantinedItems(quarantined, platform, options);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
printStatus('Nothing to purge', 'info');
|
|
140
|
+
}
|
|
141
|
+
process.exit(EXIT_CODES.CLEAN);
|
|
142
|
+
}
|
|
143
|
+
spinner.succeed('OpenClaw detected');
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
spinner.fail('Detection failed');
|
|
147
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
148
|
+
logger.error(`Detection error: ${message}`);
|
|
149
|
+
process.exit(EXIT_CODES.ERROR);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
try {
|
|
154
|
+
detection = await detect({ allUsers: true });
|
|
155
|
+
if (!isDetected(detection)) {
|
|
156
|
+
// Check for quarantined items in JSON mode
|
|
157
|
+
const quarantined = await listQuarantined(platform);
|
|
158
|
+
if (quarantined.length > 0 && options.force) {
|
|
159
|
+
// Auto-delete quarantined items in JSON + force mode
|
|
160
|
+
for (const entry of quarantined) {
|
|
161
|
+
await deleteQuarantined(platform, entry.id);
|
|
162
|
+
}
|
|
163
|
+
console.log(JSON.stringify({
|
|
164
|
+
nox: { version: VERSION, tool: TOOL_NAME },
|
|
165
|
+
detection,
|
|
166
|
+
enforcement: { actions: [], summary: { total: 0, success: 0, failed: 0, skipped: 0 } },
|
|
167
|
+
quarantine: { deleted: quarantined.length },
|
|
168
|
+
message: 'Deleted quarantined items',
|
|
169
|
+
}, null, 2));
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
console.log(JSON.stringify({
|
|
173
|
+
nox: { version: VERSION, tool: TOOL_NAME },
|
|
174
|
+
detection,
|
|
175
|
+
enforcement: { actions: [], summary: { total: 0, success: 0, failed: 0, skipped: 0 } },
|
|
176
|
+
quarantine: { items: quarantined.length },
|
|
177
|
+
message: quarantined.length > 0
|
|
178
|
+
? 'No active installation, but quarantined items exist. Use --force to delete.'
|
|
179
|
+
: 'No OpenClaw installation detected',
|
|
180
|
+
}, null, 2));
|
|
181
|
+
}
|
|
182
|
+
process.exit(EXIT_CODES.CLEAN);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
187
|
+
console.log(JSON.stringify({ error: message }, null, 2));
|
|
188
|
+
process.exit(EXIT_CODES.ERROR);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Show detection results
|
|
192
|
+
if (!options.json && !options.quiet) {
|
|
193
|
+
printDetectionResult(detection);
|
|
194
|
+
}
|
|
195
|
+
// Confirm unless --force or --dry-run
|
|
196
|
+
if (!options.force && !options.dryRun && !options.json) {
|
|
197
|
+
const confirmed = await confirmPurge(options.dryRun ?? false);
|
|
198
|
+
if (!confirmed) {
|
|
199
|
+
printStatus('Purge cancelled', 'warning');
|
|
200
|
+
process.exit(EXIT_CODES.CLEAN);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Execute enforcement using the enforcer module
|
|
204
|
+
let result;
|
|
205
|
+
if (!options.json) {
|
|
206
|
+
const spinner = ora(options.dryRun ? 'Simulating purge actions...' : 'Executing purge actions...').start();
|
|
207
|
+
try {
|
|
208
|
+
result = await enforce(detection, enforceOpts);
|
|
209
|
+
if (result.summary.failed > 0) {
|
|
210
|
+
spinner.fail('Purge completed with errors');
|
|
211
|
+
}
|
|
212
|
+
else if (result.summary.skipped === result.summary.total) {
|
|
213
|
+
spinner.warn('All actions skipped');
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
spinner.succeed('Purge completed');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
spinner.fail('Purge failed');
|
|
221
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
222
|
+
logger.error(`Purge error: ${message}`);
|
|
223
|
+
process.exit(EXIT_CODES.ENFORCE_FAILED);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
try {
|
|
228
|
+
result = await enforce(detection, enforceOpts);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
232
|
+
console.log(JSON.stringify({ error: message }, null, 2));
|
|
233
|
+
process.exit(EXIT_CODES.ENFORCE_FAILED);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Output results
|
|
237
|
+
if (options.json) {
|
|
238
|
+
printEnforcementJson(detection, result);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
printEnforcementResult(result);
|
|
242
|
+
}
|
|
243
|
+
// Send webhook if configured
|
|
244
|
+
if (options.webhook) {
|
|
245
|
+
if (!options.quiet && !options.json) {
|
|
246
|
+
const webhookSpinner = ora('Sending results to webhook...').start();
|
|
247
|
+
try {
|
|
248
|
+
const webhookResult = await sendEnforcementWebhook(options.webhook, detection, result, { token: options.webhookToken });
|
|
249
|
+
if (webhookResult.success) {
|
|
250
|
+
webhookSpinner.succeed(`Webhook delivered (${webhookResult.duration}ms)`);
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
webhookSpinner.fail(`Webhook failed: ${webhookResult.error}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
258
|
+
webhookSpinner.fail(`Webhook error: ${message}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
try {
|
|
263
|
+
await sendEnforcementWebhook(options.webhook, detection, result, {
|
|
264
|
+
token: options.webhookToken,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
logger.debug(`Webhook error: ${error}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Check for quarantined items after purging active installation
|
|
273
|
+
if (!options.json) {
|
|
274
|
+
try {
|
|
275
|
+
const quarantined = await listQuarantined(platform);
|
|
276
|
+
if (quarantined.length > 0) {
|
|
277
|
+
await handleQuarantinedItems(quarantined, platform, options);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
logger.debug(`Error checking quarantine: ${error}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Exit with appropriate code
|
|
285
|
+
if (result.summary.failed > 0) {
|
|
286
|
+
process.exit(EXIT_CODES.ENFORCE_FAILED);
|
|
287
|
+
}
|
|
288
|
+
else if (result.summary.success > 0) {
|
|
289
|
+
process.exit(EXIT_CODES.REMEDIATED);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
process.exit(EXIT_CODES.CLEAN);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=purge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purge.js","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan command - detect OpenClaw installations.
|
|
3
|
+
*/
|
|
4
|
+
interface ScanCommandOptions {
|
|
5
|
+
allUsers?: boolean;
|
|
6
|
+
port?: number;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
yaml?: boolean;
|
|
9
|
+
webhook?: string;
|
|
10
|
+
webhookToken?: string;
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
parent?: {
|
|
13
|
+
opts(): {
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Scan command handler.
|
|
20
|
+
*/
|
|
21
|
+
export declare function scanCommand(options: ScanCommandOptions): Promise<void>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmBH,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,IAAI,IAAI;YAAE,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;KAC7B,CAAC;CACH;AAuBD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsH5E"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan command - detect OpenClaw installations.
|
|
3
|
+
*/
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import YAML from 'yaml';
|
|
6
|
+
import { printBanner, EXIT_CODES, VERSION, TOOL_NAME } from '../branding.js';
|
|
7
|
+
import { detect, isDetected, isRunning } from '../detector/index.js';
|
|
8
|
+
import { printDetectionResult, printDetectionJson, sendDetectionWebhook, printQuarantineNotice, } from '../reporter/index.js';
|
|
9
|
+
import { logger, setLogLevel } from '../utils/logger.js';
|
|
10
|
+
import { getPlatform } from '../platform/index.js';
|
|
11
|
+
import { listQuarantined } from '../isolator/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Format detection result as YAML.
|
|
14
|
+
*/
|
|
15
|
+
function formatYaml(result, quarantined = []) {
|
|
16
|
+
return YAML.stringify({
|
|
17
|
+
nox: {
|
|
18
|
+
version: VERSION,
|
|
19
|
+
tool: TOOL_NAME,
|
|
20
|
+
},
|
|
21
|
+
detection: result,
|
|
22
|
+
quarantine: quarantined.length > 0 ? {
|
|
23
|
+
count: quarantined.length,
|
|
24
|
+
items: quarantined.map(q => ({
|
|
25
|
+
id: q.id,
|
|
26
|
+
timestamp: q.timestamp,
|
|
27
|
+
artifacts: q.artifacts.length,
|
|
28
|
+
})),
|
|
29
|
+
} : undefined,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Scan command handler.
|
|
34
|
+
*/
|
|
35
|
+
export async function scanCommand(options) {
|
|
36
|
+
// Handle debug mode
|
|
37
|
+
const parentOpts = options.parent?.opts() ?? {};
|
|
38
|
+
if (parentOpts.debug) {
|
|
39
|
+
setLogLevel('debug');
|
|
40
|
+
}
|
|
41
|
+
// Show banner unless quiet mode or structured output
|
|
42
|
+
const structuredOutput = options.json || options.yaml;
|
|
43
|
+
if (!options.quiet && !structuredOutput) {
|
|
44
|
+
printBanner();
|
|
45
|
+
}
|
|
46
|
+
let result;
|
|
47
|
+
// Run detection with spinner (unless structured output)
|
|
48
|
+
if (!structuredOutput) {
|
|
49
|
+
const spinner = ora('Scanning for OpenClaw installations...').start();
|
|
50
|
+
try {
|
|
51
|
+
result = await detect({
|
|
52
|
+
port: options.port,
|
|
53
|
+
allUsers: options.allUsers,
|
|
54
|
+
});
|
|
55
|
+
if (isRunning(result)) {
|
|
56
|
+
spinner.fail('OpenClaw detected and running');
|
|
57
|
+
}
|
|
58
|
+
else if (isDetected(result)) {
|
|
59
|
+
spinner.warn('OpenClaw installation detected');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
spinner.succeed('No OpenClaw installation detected');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
spinner.fail('Detection failed');
|
|
67
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
68
|
+
logger.error(`Detection error: ${message}`);
|
|
69
|
+
process.exit(EXIT_CODES.ERROR);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Silent detection for structured output
|
|
74
|
+
try {
|
|
75
|
+
result = await detect({
|
|
76
|
+
port: options.port,
|
|
77
|
+
allUsers: options.allUsers,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
82
|
+
if (options.json) {
|
|
83
|
+
console.log(JSON.stringify({ error: message }, null, 2));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.log(YAML.stringify({ error: message }));
|
|
87
|
+
}
|
|
88
|
+
process.exit(EXIT_CODES.ERROR);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Check for quarantined items
|
|
92
|
+
let quarantined = [];
|
|
93
|
+
try {
|
|
94
|
+
const platform = getPlatform();
|
|
95
|
+
quarantined = await listQuarantined(platform);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logger.debug(`Error checking quarantine: ${error}`);
|
|
99
|
+
}
|
|
100
|
+
// Output results
|
|
101
|
+
if (options.json) {
|
|
102
|
+
printDetectionJson(result, quarantined);
|
|
103
|
+
}
|
|
104
|
+
else if (options.yaml) {
|
|
105
|
+
console.log(formatYaml(result, quarantined));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Show quarantine notice FIRST if items exist
|
|
109
|
+
if (quarantined.length > 0) {
|
|
110
|
+
printQuarantineNotice(quarantined);
|
|
111
|
+
}
|
|
112
|
+
printDetectionResult(result, quarantined);
|
|
113
|
+
}
|
|
114
|
+
// Send webhook if configured
|
|
115
|
+
if (options.webhook) {
|
|
116
|
+
if (!options.quiet && !structuredOutput) {
|
|
117
|
+
const webhookSpinner = ora('Sending results to webhook...').start();
|
|
118
|
+
try {
|
|
119
|
+
const webhookResult = await sendDetectionWebhook(options.webhook, result, { token: options.webhookToken });
|
|
120
|
+
if (webhookResult.success) {
|
|
121
|
+
webhookSpinner.succeed(`Webhook delivered (${webhookResult.duration}ms)`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
webhookSpinner.fail(`Webhook failed: ${webhookResult.error}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
129
|
+
webhookSpinner.fail(`Webhook error: ${message}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Silent webhook for structured output
|
|
134
|
+
try {
|
|
135
|
+
await sendDetectionWebhook(options.webhook, result, {
|
|
136
|
+
token: options.webhookToken,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.debug(`Webhook error: ${error}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Exit with appropriate code
|
|
145
|
+
if (isRunning(result)) {
|
|
146
|
+
process.exit(EXIT_CODES.DETECTED);
|
|
147
|
+
}
|
|
148
|
+
else if (isDetected(result)) {
|
|
149
|
+
process.exit(EXIT_CODES.DETECTED);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
process.exit(EXIT_CODES.CLEAN);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App bundle detection for OpenClaw.
|
|
3
|
+
* Primarily for macOS .app bundles but supports other platforms.
|
|
4
|
+
*/
|
|
5
|
+
import type { Platform } from '../platform/index.js';
|
|
6
|
+
import type { AppBundleDetection } from '../types/detection.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect the OpenClaw application bundle.
|
|
9
|
+
* On macOS, checks for /Applications/OpenClaw.app.
|
|
10
|
+
* On other platforms, checks platform-specific app locations.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectAppBundle(platform: Platform): Promise<AppBundleDetection>;
|
|
13
|
+
//# sourceMappingURL=app-bundle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-bundle.d.ts","sourceRoot":"","sources":["../../src/detector/app-bundle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIhE;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAiB7B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App bundle detection for OpenClaw.
|
|
3
|
+
* Primarily for macOS .app bundles but supports other platforms.
|
|
4
|
+
*/
|
|
5
|
+
import { pathExists } from '../utils/fs.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect the OpenClaw application bundle.
|
|
9
|
+
* On macOS, checks for /Applications/OpenClaw.app.
|
|
10
|
+
* On other platforms, checks platform-specific app locations.
|
|
11
|
+
*/
|
|
12
|
+
export async function detectAppBundle(platform) {
|
|
13
|
+
logger.debug('Detecting app bundle...');
|
|
14
|
+
const locations = platform.getAppLocations();
|
|
15
|
+
for (const loc of locations) {
|
|
16
|
+
if (await pathExists(loc)) {
|
|
17
|
+
logger.debug(`Found app bundle at ${loc}`);
|
|
18
|
+
return {
|
|
19
|
+
found: true,
|
|
20
|
+
path: loc,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
logger.debug('App bundle not found');
|
|
25
|
+
return { found: false };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=app-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-bundle.js","sourceRoot":"","sources":["../../src/detector/app-bundle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB;IAElB,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IAE7C,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAC3C,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,GAAG;aACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI binary detection for OpenClaw.
|
|
3
|
+
* Checks known paths and uses `command -v` to locate the binary.
|
|
4
|
+
*/
|
|
5
|
+
import type { Platform } from '../platform/index.js';
|
|
6
|
+
import type { CliBinaryDetection } from '../types/detection.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect the OpenClaw CLI binary.
|
|
9
|
+
* Checks platform-specific locations and `command -v openclaw`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectCliBinary(platform: Platform): Promise<CliBinaryDetection>;
|
|
12
|
+
//# sourceMappingURL=cli-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-binary.d.ts","sourceRoot":"","sources":["../../src/detector/cli-binary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAqBhE;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,kBAAkB,CAAC,CAyC7B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI binary detection for OpenClaw.
|
|
3
|
+
* Checks known paths and uses `command -v` to locate the binary.
|
|
4
|
+
*/
|
|
5
|
+
import { exec } from '../utils/exec.js';
|
|
6
|
+
import { pathExists } from '../utils/fs.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
/**
|
|
9
|
+
* Attempt to extract version from `openclaw --version` output.
|
|
10
|
+
*/
|
|
11
|
+
async function getVersion(binaryPath) {
|
|
12
|
+
try {
|
|
13
|
+
const { stdout } = await exec(`"${binaryPath}" --version 2>/dev/null`, {
|
|
14
|
+
timeout: 5000,
|
|
15
|
+
});
|
|
16
|
+
// Typical output: "openclaw version 2026.1.15" or just "2026.1.15"
|
|
17
|
+
const match = stdout.match(/(\d+\.\d+\.\d+)/);
|
|
18
|
+
return match ? match[1] : stdout.trim() || undefined;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Detect the OpenClaw CLI binary.
|
|
26
|
+
* Checks platform-specific locations and `command -v openclaw`.
|
|
27
|
+
*/
|
|
28
|
+
export async function detectCliBinary(platform) {
|
|
29
|
+
logger.debug('Detecting CLI binary...');
|
|
30
|
+
const locations = platform.getCliLocations();
|
|
31
|
+
// Check known paths first
|
|
32
|
+
for (const loc of locations) {
|
|
33
|
+
if (await pathExists(loc)) {
|
|
34
|
+
logger.debug(`Found CLI binary at ${loc}`);
|
|
35
|
+
const version = await getVersion(loc);
|
|
36
|
+
return {
|
|
37
|
+
found: true,
|
|
38
|
+
path: loc,
|
|
39
|
+
version,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Fallback: check if `openclaw` is in PATH
|
|
44
|
+
try {
|
|
45
|
+
const cmd = platform.name === 'windows'
|
|
46
|
+
? 'where openclaw 2>nul'
|
|
47
|
+
: 'command -v openclaw 2>/dev/null';
|
|
48
|
+
const { stdout } = await exec(cmd, { timeout: 5000 });
|
|
49
|
+
const foundPath = stdout.trim().split('\n')[0];
|
|
50
|
+
if (foundPath) {
|
|
51
|
+
logger.debug(`Found CLI binary via PATH: ${foundPath}`);
|
|
52
|
+
const version = await getVersion(foundPath);
|
|
53
|
+
return {
|
|
54
|
+
found: true,
|
|
55
|
+
path: foundPath,
|
|
56
|
+
version,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Not found in PATH
|
|
62
|
+
}
|
|
63
|
+
logger.debug('CLI binary not found');
|
|
64
|
+
return { found: false };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=cli-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-binary.js","sourceRoot":"","sources":["../../src/detector/cli-binary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,UAAU,yBAAyB,EAAE;YACrE,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,mEAAmE;QACnE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB;IAElB,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IAE7C,0BAA0B;IAC1B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACtC,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,GAAG;gBACT,OAAO;aACR,CAAC;QACJ,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GACP,QAAQ,CAAC,IAAI,KAAK,SAAS;YACzB,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,iCAAiC,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;YAC5C,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,SAAS;gBACf,OAAO;aACR,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|