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,547 @@
1
+ /**
2
+ * Isolate command - isolate device from OpenClaw.
3
+ */
4
+ import ora from 'ora';
5
+ import chalk from 'chalk';
6
+ import inquirer from 'inquirer';
7
+ import Table from 'cli-table3';
8
+ import { printBanner, EXIT_CODES, VERSION, TOOL_NAME } from '../branding.js';
9
+ import { detect, isDetected } from '../detector/index.js';
10
+ import { printDetectionResult, printIsolationResult, printIsolationJson, sendIsolationWebhook, printStatus, } from '../reporter/index.js';
11
+ import { logger, setLogLevel } from '../utils/logger.js';
12
+ import { getPlatform } from '../platform/index.js';
13
+ import { isolate, unisolate, getIsolationStatus, listQuarantined, restoreQuarantined, deleteQuarantined, } from '../isolator/index.js';
14
+ function getDebugFlag(options) {
15
+ return options.parent?.parent?.opts()?.debug ?? false;
16
+ }
17
+ function getActionDescription(type) {
18
+ switch (type) {
19
+ case 'block-port':
20
+ return 'Adds firewall rule to block outbound connections on the gateway port';
21
+ case 'quarantine':
22
+ return 'Moves OpenClaw binaries and config to quarantine directory';
23
+ case 'lockdown':
24
+ return 'Creates placeholder files to prevent reinstallation';
25
+ default:
26
+ return 'Unknown action';
27
+ }
28
+ }
29
+ function previewActions(detection) {
30
+ const actions = [];
31
+ // Block port if gateway was detected
32
+ if (detection.gateway.found && detection.gateway.port) {
33
+ actions.push({ type: 'block-port', target: `Port ${detection.gateway.port}`, status: 'pending' });
34
+ }
35
+ // Quarantine if artifacts found
36
+ if (detection.cli.found || detection.stateDir.found || detection.app.found) {
37
+ actions.push({ type: 'quarantine', target: 'OpenClaw artifacts', status: 'pending' });
38
+ }
39
+ // Always add lockdown
40
+ actions.push({ type: 'lockdown', target: 'Installation paths', status: 'pending' });
41
+ return actions;
42
+ }
43
+ async function confirmIsolation(actions) {
44
+ console.log();
45
+ console.log(chalk.bold.red('WARNING: Isolation actions can affect system functionality!'));
46
+ console.log();
47
+ console.log(chalk.bold('The following isolation actions will be performed:'));
48
+ console.log();
49
+ for (const action of actions) {
50
+ const icon = chalk.red('●');
51
+ const description = getActionDescription(action.type);
52
+ console.log(` ${icon} ${action.type}: ${action.target}`);
53
+ console.log(` ${chalk.dim(description)}`);
54
+ }
55
+ console.log();
56
+ const { confirmed } = await inquirer.prompt([
57
+ {
58
+ type: 'confirm',
59
+ name: 'confirmed',
60
+ message: 'Do you want to proceed with isolation?',
61
+ default: false,
62
+ },
63
+ ]);
64
+ return confirmed;
65
+ }
66
+ // ============================================================================
67
+ // isolate apply
68
+ // ============================================================================
69
+ export async function isolateApplyCommand(options) {
70
+ if (getDebugFlag(options)) {
71
+ setLogLevel('debug');
72
+ }
73
+ if (!options.quiet && !options.json) {
74
+ printBanner();
75
+ }
76
+ // Check for root/admin privileges
77
+ const isRoot = process.getuid?.() === 0;
78
+ if (!isRoot && !options.dryRun) {
79
+ if (!options.json) {
80
+ console.log(chalk.red.bold('Error: This command requires administrator privileges.'));
81
+ console.log();
82
+ console.log('Run with sudo:');
83
+ console.log(chalk.cyan(' sudo nox isolate'));
84
+ console.log();
85
+ console.log(chalk.dim('Use --dry-run to preview actions without sudo.'));
86
+ }
87
+ else {
88
+ console.log(JSON.stringify({ error: 'This command requires administrator privileges. Run with sudo.' }, null, 2));
89
+ }
90
+ process.exit(EXIT_CODES.ERROR);
91
+ }
92
+ // Run detection
93
+ let detection;
94
+ if (!options.json) {
95
+ const spinner = ora('Scanning for OpenClaw installations...').start();
96
+ try {
97
+ detection = await detect({ allUsers: true });
98
+ if (!isDetected(detection)) {
99
+ spinner.succeed('No OpenClaw installation detected - nothing to isolate');
100
+ process.exit(EXIT_CODES.CLEAN);
101
+ }
102
+ spinner.succeed('OpenClaw detected');
103
+ }
104
+ catch (error) {
105
+ spinner.fail('Detection failed');
106
+ const message = error instanceof Error ? error.message : 'Unknown error';
107
+ logger.error(`Detection error: ${message}`);
108
+ process.exit(EXIT_CODES.ERROR);
109
+ }
110
+ }
111
+ else {
112
+ try {
113
+ detection = await detect({ allUsers: true });
114
+ if (!isDetected(detection)) {
115
+ console.log(JSON.stringify({
116
+ nox: { version: VERSION, tool: TOOL_NAME },
117
+ detection,
118
+ isolation: { actions: [] },
119
+ message: 'No OpenClaw installation detected',
120
+ }, null, 2));
121
+ process.exit(EXIT_CODES.CLEAN);
122
+ }
123
+ }
124
+ catch (error) {
125
+ const message = error instanceof Error ? error.message : 'Unknown error';
126
+ console.log(JSON.stringify({ error: message }, null, 2));
127
+ process.exit(EXIT_CODES.ERROR);
128
+ }
129
+ }
130
+ if (!options.json && !options.quiet) {
131
+ printDetectionResult(detection);
132
+ }
133
+ const previewedActions = previewActions(detection);
134
+ if (previewedActions.length === 0) {
135
+ if (!options.json) {
136
+ printStatus('No isolation actions applicable', 'info');
137
+ }
138
+ process.exit(EXIT_CODES.CLEAN);
139
+ }
140
+ if (!options.force && !options.json) {
141
+ const confirmed = await confirmIsolation(previewedActions);
142
+ if (!confirmed) {
143
+ printStatus('Isolation cancelled', 'warning');
144
+ process.exit(EXIT_CODES.CLEAN);
145
+ }
146
+ }
147
+ // Execute isolation
148
+ let result;
149
+ if (!options.json) {
150
+ const spinner = ora('Executing isolation actions...').start();
151
+ try {
152
+ result = await isolate(detection, {
153
+ all: true,
154
+ dryRun: options.dryRun,
155
+ port: options.port ?? detection.gateway.port, // Use explicit port if provided, else detected
156
+ });
157
+ const hasFailures = result.actions.some(a => a.status === 'failed');
158
+ const hasPending = result.actions.some(a => a.status === 'pending');
159
+ if (hasFailures) {
160
+ spinner.fail('Isolation completed with errors');
161
+ }
162
+ else if (hasPending) {
163
+ spinner.warn('Some isolation actions are pending');
164
+ }
165
+ else {
166
+ spinner.succeed('Isolation completed successfully');
167
+ }
168
+ }
169
+ catch (error) {
170
+ spinner.fail('Isolation failed');
171
+ const message = error instanceof Error ? error.message : 'Unknown error';
172
+ logger.error(`Isolation error: ${message}`);
173
+ process.exit(EXIT_CODES.ERROR);
174
+ }
175
+ }
176
+ else {
177
+ try {
178
+ result = await isolate(detection, {
179
+ all: true,
180
+ dryRun: options.dryRun,
181
+ port: options.port ?? detection.gateway.port, // Use explicit port if provided, else detected
182
+ });
183
+ }
184
+ catch (error) {
185
+ const message = error instanceof Error ? error.message : 'Unknown error';
186
+ console.log(JSON.stringify({ error: message }, null, 2));
187
+ process.exit(EXIT_CODES.ERROR);
188
+ }
189
+ }
190
+ if (options.json) {
191
+ printIsolationJson(detection, result);
192
+ }
193
+ else {
194
+ printIsolationResult(result);
195
+ }
196
+ // Webhook
197
+ if (options.webhook) {
198
+ if (!options.quiet && !options.json) {
199
+ const webhookSpinner = ora('Sending isolation alert to webhook...').start();
200
+ try {
201
+ const webhookResult = await sendIsolationWebhook(options.webhook, detection, result, undefined, { token: options.webhookToken });
202
+ if (webhookResult.success) {
203
+ webhookSpinner.succeed(`Webhook delivered (${webhookResult.duration}ms)`);
204
+ }
205
+ else {
206
+ webhookSpinner.fail(`Webhook failed: ${webhookResult.error}`);
207
+ }
208
+ }
209
+ catch (error) {
210
+ const message = error instanceof Error ? error.message : 'Unknown error';
211
+ webhookSpinner.fail(`Webhook error: ${message}`);
212
+ }
213
+ }
214
+ else {
215
+ try {
216
+ await sendIsolationWebhook(options.webhook, detection, result, undefined, {
217
+ token: options.webhookToken,
218
+ });
219
+ }
220
+ catch (error) {
221
+ logger.debug(`Webhook error: ${error}`);
222
+ }
223
+ }
224
+ }
225
+ const hasFailures = result.actions.some(a => a.status === 'failed');
226
+ const hasSuccess = result.actions.some(a => a.status === 'success');
227
+ if (hasFailures) {
228
+ process.exit(EXIT_CODES.ERROR);
229
+ }
230
+ else if (hasSuccess) {
231
+ process.exit(EXIT_CODES.ISOLATED);
232
+ }
233
+ else {
234
+ process.exit(EXIT_CODES.CLEAN);
235
+ }
236
+ }
237
+ export async function isolateListCommand(options) {
238
+ if (getDebugFlag(options)) {
239
+ setLogLevel('debug');
240
+ }
241
+ if (!options.quiet && !options.json) {
242
+ printBanner();
243
+ }
244
+ const platform = getPlatform();
245
+ const spinner = !options.json ? ora('Loading quarantined items...').start() : null;
246
+ try {
247
+ const entries = await listQuarantined(platform);
248
+ spinner?.succeed(`Found ${entries.length} quarantined item(s)`);
249
+ if (options.json) {
250
+ console.log(JSON.stringify({
251
+ nox: { version: VERSION, tool: TOOL_NAME },
252
+ quarantine: {
253
+ path: platform.getQuarantinePath(),
254
+ items: entries,
255
+ },
256
+ }, null, 2));
257
+ }
258
+ else {
259
+ displayQuarantineTable(entries, platform.getQuarantinePath());
260
+ }
261
+ process.exit(EXIT_CODES.CLEAN);
262
+ }
263
+ catch (error) {
264
+ spinner?.fail('Failed to list quarantined items');
265
+ const message = error instanceof Error ? error.message : 'Unknown error';
266
+ logger.error(`List error: ${message}`);
267
+ process.exit(EXIT_CODES.ERROR);
268
+ }
269
+ }
270
+ function displayQuarantineTable(entries, quarantinePath) {
271
+ if (entries.length === 0) {
272
+ console.log();
273
+ printStatus('No quarantined items found', 'info');
274
+ return;
275
+ }
276
+ console.log();
277
+ console.log(chalk.bold('Quarantined Items:'));
278
+ console.log();
279
+ for (const manifest of entries) {
280
+ const date = new Date(manifest.timestamp);
281
+ const dateStr = date.toLocaleDateString();
282
+ const timeStr = date.toLocaleTimeString();
283
+ // Header for this quarantine entry
284
+ console.log(chalk.cyan('━'.repeat(60)));
285
+ console.log(chalk.bold(` Quarantine ID: ${manifest.id}`));
286
+ console.log(chalk.cyan('━'.repeat(60)));
287
+ // Basic info table
288
+ const infoTable = new Table({
289
+ chars: {
290
+ 'top': '', 'top-mid': '', 'top-left': '', 'top-right': '',
291
+ 'bottom': '', 'bottom-mid': '', 'bottom-left': '', 'bottom-right': '',
292
+ 'left': ' │', 'left-mid': '', 'mid': '', 'mid-mid': '',
293
+ 'right': '│', 'right-mid': '', 'middle': '│',
294
+ },
295
+ colWidths: [20, 38],
296
+ });
297
+ infoTable.push([chalk.dim('Date'), `${dateStr} ${timeStr}`], [chalk.dim('Hostname'), manifest.hostname]);
298
+ // Add detection details if available
299
+ if (manifest.detection) {
300
+ if (manifest.detection.model) {
301
+ const provider = manifest.detection.provider ? ` (${manifest.detection.provider})` : '';
302
+ infoTable.push([chalk.dim('AI Model'), `${manifest.detection.model}${provider}`]);
303
+ }
304
+ if (manifest.detection.autonomous !== undefined) {
305
+ infoTable.push([
306
+ chalk.dim('Autonomous'),
307
+ manifest.detection.autonomous ? chalk.red('ENABLED') : chalk.green('Disabled'),
308
+ ]);
309
+ }
310
+ if (manifest.detection.channels && manifest.detection.channels.length > 0) {
311
+ infoTable.push([chalk.dim('Channels'), manifest.detection.channels.join(', ')]);
312
+ }
313
+ if (manifest.detection.gatewayPort) {
314
+ infoTable.push([chalk.dim('Gateway Port'), manifest.detection.gatewayPort.toString()]);
315
+ }
316
+ if (manifest.detection.processCount) {
317
+ infoTable.push([chalk.dim('Processes'), `${manifest.detection.processCount} running at quarantine`]);
318
+ }
319
+ }
320
+ console.log(infoTable.toString());
321
+ // Artifacts table
322
+ if (manifest.artifacts.length > 0) {
323
+ console.log();
324
+ console.log(chalk.dim(' Quarantined Artifacts:'));
325
+ const artifactTable = new Table({
326
+ head: [chalk.bold('Type'), chalk.bold('Original Path')],
327
+ chars: {
328
+ 'top': '─', 'top-mid': '┬', 'top-left': ' ┌', 'top-right': '┐',
329
+ 'bottom': '─', 'bottom-mid': '┴', 'bottom-left': ' └', 'bottom-right': '┘',
330
+ 'left': ' │', 'left-mid': ' ├', 'mid': '─', 'mid-mid': '┼',
331
+ 'right': '│', 'right-mid': '┤', 'middle': '│',
332
+ },
333
+ colWidths: [12, 46],
334
+ });
335
+ for (const artifact of manifest.artifacts) {
336
+ artifactTable.push([artifact.type, artifact.original]);
337
+ }
338
+ console.log(artifactTable.toString());
339
+ }
340
+ console.log();
341
+ }
342
+ console.log(chalk.dim(`Quarantine location: ${quarantinePath}`));
343
+ console.log(chalk.dim(`Use "nox isolate revert" to restore items, or "nox purge" to delete.`));
344
+ }
345
+ async function confirmRevert(status) {
346
+ console.log();
347
+ console.log(chalk.bold.yellow('The following isolation measures will be reverted:'));
348
+ console.log();
349
+ if (status.portBlocked) {
350
+ console.log(` ${chalk.yellow('●')} Unblock gateway port`);
351
+ }
352
+ if (status.lockdownActive) {
353
+ console.log(` ${chalk.yellow('●')} Remove lockdown (allow reinstallation)`);
354
+ }
355
+ if (status.quarantinedItems > 0) {
356
+ console.log(` ${chalk.yellow('●')} Restore ${status.quarantinedItems} quarantined item(s)`);
357
+ }
358
+ console.log();
359
+ console.log(chalk.dim('Note: This will allow OpenClaw to run again on this device.'));
360
+ console.log();
361
+ const { confirmed } = await inquirer.prompt([
362
+ {
363
+ type: 'confirm',
364
+ name: 'confirmed',
365
+ message: 'Do you want to proceed with reverting isolation?',
366
+ default: false,
367
+ },
368
+ ]);
369
+ return confirmed;
370
+ }
371
+ export async function isolateRevertCommand(options) {
372
+ if (getDebugFlag(options)) {
373
+ setLogLevel('debug');
374
+ }
375
+ if (!options.quiet && !options.json) {
376
+ printBanner();
377
+ }
378
+ // Check for root/admin privileges
379
+ const isRoot = process.getuid?.() === 0;
380
+ if (!isRoot && !options.dryRun) {
381
+ if (!options.json) {
382
+ console.log(chalk.red.bold('Error: This command requires administrator privileges.'));
383
+ console.log();
384
+ console.log('Run with sudo:');
385
+ console.log(chalk.cyan(' sudo nox isolate revert'));
386
+ console.log();
387
+ console.log(chalk.dim('Use --dry-run to preview actions without sudo.'));
388
+ }
389
+ else {
390
+ console.log(JSON.stringify({ error: 'This command requires administrator privileges. Run with sudo.' }, null, 2));
391
+ }
392
+ process.exit(EXIT_CODES.ERROR);
393
+ }
394
+ const platform = getPlatform();
395
+ // Get current isolation status
396
+ const spinner = !options.json ? ora('Checking isolation status...').start() : null;
397
+ const status = await getIsolationStatus();
398
+ spinner?.succeed('Status retrieved');
399
+ // Check if there's anything to revert (always revert all)
400
+ const hasPortToUnblock = status.portBlocked;
401
+ const hasLockdownToRemove = status.lockdownActive;
402
+ const hasQuarantineToRestore = status.quarantinedItems > 0;
403
+ if (!hasPortToUnblock && !hasLockdownToRemove && !hasQuarantineToRestore) {
404
+ if (!options.json) {
405
+ printStatus('No isolation measures to revert', 'info');
406
+ }
407
+ else {
408
+ console.log(JSON.stringify({
409
+ nox: { version: VERSION, tool: TOOL_NAME },
410
+ message: 'No isolation measures to revert',
411
+ status,
412
+ }, null, 2));
413
+ }
414
+ process.exit(EXIT_CODES.CLEAN);
415
+ }
416
+ // Show status and confirm
417
+ if (!options.json) {
418
+ console.log();
419
+ console.log(chalk.bold('Current Isolation Status:'));
420
+ console.log(` Port Blocked: ${status.portBlocked ? chalk.green('Yes') : chalk.dim('No')}`);
421
+ console.log(` Lockdown Active: ${status.lockdownActive ? chalk.green('Yes') : chalk.dim('No')}`);
422
+ console.log(` Quarantined Items: ${status.quarantinedItems}`);
423
+ }
424
+ if (!options.force && !options.json) {
425
+ const confirmed = await confirmRevert({
426
+ portBlocked: !!hasPortToUnblock,
427
+ lockdownActive: !!hasLockdownToRemove,
428
+ quarantinedItems: hasQuarantineToRestore ? status.quarantinedItems : 0,
429
+ });
430
+ if (!confirmed) {
431
+ printStatus('Revert cancelled', 'warning');
432
+ process.exit(EXIT_CODES.CLEAN);
433
+ }
434
+ }
435
+ // Execute revert actions
436
+ const actions = [];
437
+ const errors = [];
438
+ // 1. Unblock port
439
+ if (hasPortToUnblock) {
440
+ const revertSpinner = !options.json ? ora('Unblocking gateway port...').start() : null;
441
+ try {
442
+ // Use the port option if provided, otherwise we need to try the default
443
+ // Note: ideally we'd store which port was blocked, but for now use provided port or default
444
+ const portToUnblock = options.port ?? 18789;
445
+ const result = await unisolate({
446
+ blockPort: true,
447
+ port: portToUnblock,
448
+ dryRun: options.dryRun,
449
+ });
450
+ actions.push(...result.actions);
451
+ revertSpinner?.succeed(`Port ${portToUnblock} unblocked`);
452
+ }
453
+ catch (err) {
454
+ const message = err instanceof Error ? err.message : String(err);
455
+ revertSpinner?.fail(`Failed to unblock port: ${message}`);
456
+ errors.push(message);
457
+ }
458
+ }
459
+ // 2. Remove lockdown
460
+ if (hasLockdownToRemove) {
461
+ const revertSpinner = !options.json ? ora('Removing lockdown...').start() : null;
462
+ try {
463
+ const result = await unisolate({
464
+ lockdown: true,
465
+ dryRun: options.dryRun,
466
+ });
467
+ actions.push(...result.actions);
468
+ revertSpinner?.succeed('Lockdown removed');
469
+ }
470
+ catch (err) {
471
+ const message = err instanceof Error ? err.message : String(err);
472
+ revertSpinner?.fail(`Failed to remove lockdown: ${message}`);
473
+ errors.push(message);
474
+ }
475
+ }
476
+ // 3. Restore quarantined items
477
+ if (hasQuarantineToRestore) {
478
+ const revertSpinner = !options.json ? ora('Restoring quarantined items...').start() : null;
479
+ try {
480
+ const entries = await listQuarantined(platform);
481
+ let restoredCount = 0;
482
+ let skippedCount = 0;
483
+ // Sort by timestamp ASCENDING (oldest first) - oldest has the original data
484
+ const sortedEntries = [...entries].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
485
+ // Track which original paths have been restored to avoid duplicates
486
+ const restoredPaths = new Set();
487
+ for (const entry of sortedEntries) {
488
+ // Check if any artifact's original path was already restored
489
+ const duplicatePaths = entry.artifacts.filter(a => restoredPaths.has(a.original));
490
+ if (duplicatePaths.length > 0) {
491
+ // This is a duplicate quarantine - skip and delete it
492
+ logger.warn(`Skipping duplicate quarantine ${entry.id} (paths already restored)`);
493
+ await deleteQuarantined(platform, entry.id);
494
+ skippedCount++;
495
+ continue;
496
+ }
497
+ const result = await restoreQuarantined(platform, entry.id);
498
+ if (result.success) {
499
+ restoredCount += result.restored;
500
+ // Mark these paths as restored
501
+ for (const artifact of entry.artifacts) {
502
+ restoredPaths.add(artifact.original);
503
+ }
504
+ }
505
+ else {
506
+ errors.push(...result.errors);
507
+ }
508
+ }
509
+ let message = `Restored ${restoredCount} artifact(s)`;
510
+ if (skippedCount > 0) {
511
+ message += ` (skipped ${skippedCount} duplicate quarantine(s))`;
512
+ }
513
+ revertSpinner?.succeed(message);
514
+ }
515
+ catch (err) {
516
+ const message = err instanceof Error ? err.message : String(err);
517
+ revertSpinner?.fail(`Failed to restore quarantine: ${message}`);
518
+ errors.push(message);
519
+ }
520
+ }
521
+ // Output results
522
+ if (options.json) {
523
+ console.log(JSON.stringify({
524
+ nox: { version: VERSION, tool: TOOL_NAME },
525
+ revert: {
526
+ actions,
527
+ errors: errors.length > 0 ? errors : undefined,
528
+ },
529
+ }, null, 2));
530
+ }
531
+ else {
532
+ console.log();
533
+ if (errors.length > 0) {
534
+ console.log(chalk.bold.yellow('Revert completed with errors:'));
535
+ for (const err of errors) {
536
+ console.log(` ${chalk.red('●')} ${err}`);
537
+ }
538
+ }
539
+ else {
540
+ console.log(chalk.bold.green('Isolation successfully reverted.'));
541
+ console.log(chalk.dim('OpenClaw can now run on this device.'));
542
+ }
543
+ console.log();
544
+ }
545
+ process.exit(errors.length > 0 ? EXIT_CODES.ERROR : EXIT_CODES.CLEAN);
546
+ }
547
+ //# sourceMappingURL=isolate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolate.js","sourceRoot":"","sources":["../../src/commands/isolate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Purge command - detect and remove OpenClaw installations.
3
+ */
4
+ interface PurgeCommandOptions {
5
+ dryRun?: boolean;
6
+ force?: boolean;
7
+ json?: boolean;
8
+ webhook?: string;
9
+ webhookToken?: string;
10
+ quiet?: boolean;
11
+ parent?: {
12
+ opts(): {
13
+ debug?: boolean;
14
+ };
15
+ };
16
+ }
17
+ /**
18
+ * Purge command handler.
19
+ */
20
+ export declare function purgeCommand(options: PurgeCommandOptions): Promise<void>;
21
+ export {};
22
+ //# sourceMappingURL=purge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"purge.d.ts","sourceRoot":"","sources":["../../src/commands/purge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,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;AAsFD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiN9E"}