alvin-bot 5.7.0 → 5.8.1
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/CHANGELOG.md +25 -0
- package/README.md +25 -31
- package/dist/claude.js +1 -102
- package/dist/config.js +1 -96
- package/dist/engine.js +1 -90
- package/dist/find-claude-binary.js +1 -98
- package/dist/handlers/async-agent-chunk-handler.js +1 -50
- package/dist/handlers/background-bypass.js +1 -75
- package/dist/handlers/commands.js +1 -2336
- package/dist/handlers/cron-progress.js +1 -52
- package/dist/handlers/document.js +1 -194
- package/dist/handlers/message.js +1 -959
- package/dist/handlers/photo.js +1 -154
- package/dist/handlers/platform-message.js +1 -360
- package/dist/handlers/stuck-timer.js +1 -54
- package/dist/handlers/video.js +1 -237
- package/dist/handlers/voice.js +1 -148
- package/dist/i18n.js +1 -805
- package/dist/index.js +1 -697
- package/dist/init-data-dir.js +1 -98
- package/dist/middleware/auth.js +1 -233
- package/dist/migrate.js +1 -162
- package/dist/paths.js +1 -146
- package/dist/platforms/discord.js +1 -175
- package/dist/platforms/index.js +1 -130
- package/dist/platforms/signal.js +1 -205
- package/dist/platforms/slack-slash-parser.js +1 -32
- package/dist/platforms/slack.js +1 -501
- package/dist/platforms/telegram.js +1 -111
- package/dist/platforms/types.js +1 -8
- package/dist/platforms/whatsapp-auth-helpers.js +1 -53
- package/dist/platforms/whatsapp.js +1 -707
- package/dist/providers/claude-sdk-provider.js +1 -565
- package/dist/providers/codex-cli-provider.js +1 -134
- package/dist/providers/index.js +1 -7
- package/dist/providers/ollama-provider.js +1 -32
- package/dist/providers/openai-compatible.js +1 -406
- package/dist/providers/registry.js +1 -352
- package/dist/providers/runtime-header.js +1 -45
- package/dist/providers/tool-executor.js +1 -475
- package/dist/providers/types.js +1 -227
- package/dist/services/access.js +1 -144
- package/dist/services/allowed-users-gate.js +1 -56
- package/dist/services/alvin-dispatch.js +1 -174
- package/dist/services/alvin-mcp-tools.js +1 -104
- package/dist/services/asset-index.js +1 -224
- package/dist/services/async-agent-parser.js +1 -418
- package/dist/services/async-agent-watcher.js +1 -583
- package/dist/services/auto-diagnostic.js +1 -228
- package/dist/services/broadcast.js +1 -52
- package/dist/services/browser-manager.js +1 -562
- package/dist/services/browser-webfetch.js +1 -127
- package/dist/services/browser.js +1 -121
- package/dist/services/cdp-bootstrap.js +1 -357
- package/dist/services/compaction.js +1 -144
- package/dist/services/critical-notify.js +1 -203
- package/dist/services/cron-resolver.js +1 -58
- package/dist/services/cron-scheduling.js +1 -310
- package/dist/services/cron.js +1 -861
- package/dist/services/custom-tools.js +1 -317
- package/dist/services/delivery-queue.js +1 -173
- package/dist/services/delivery-registry.js +1 -21
- package/dist/services/disk-cleanup.js +1 -203
- package/dist/services/elevenlabs.js +1 -58
- package/dist/services/embeddings/auto-detect.js +1 -74
- package/dist/services/embeddings/fts5.js +1 -108
- package/dist/services/embeddings/gemini.js +1 -65
- package/dist/services/embeddings/index.js +1 -496
- package/dist/services/embeddings/ollama.js +1 -78
- package/dist/services/embeddings/openai.js +1 -49
- package/dist/services/embeddings/provider.js +1 -22
- package/dist/services/embeddings/vector-base.js +1 -113
- package/dist/services/embeddings-migration.js +1 -193
- package/dist/services/embeddings.js +1 -9
- package/dist/services/env-file.js +1 -50
- package/dist/services/exec-guard.js +1 -71
- package/dist/services/fallback-order.js +1 -154
- package/dist/services/file-permissions.js +1 -93
- package/dist/services/heartbeat-file.js +1 -65
- package/dist/services/heartbeat.js +1 -313
- package/dist/services/hooks.js +1 -44
- package/dist/services/imagegen.js +1 -72
- package/dist/services/language-detect.js +1 -154
- package/dist/services/markdown.js +1 -63
- package/dist/services/mcp.js +1 -263
- package/dist/services/memory-extractor.js +1 -178
- package/dist/services/memory-inject-mode.js +1 -43
- package/dist/services/memory-layers.js +1 -156
- package/dist/services/memory.js +1 -146
- package/dist/services/ollama-manager.js +1 -339
- package/dist/services/permissions-wizard.js +1 -291
- package/dist/services/personality.js +1 -376
- package/dist/services/plugins.js +1 -171
- package/dist/services/preflight.js +1 -292
- package/dist/services/process-manager.js +1 -291
- package/dist/services/release-highlights.js +1 -79
- package/dist/services/reminders.js +1 -97
- package/dist/services/restart.js +1 -48
- package/dist/services/security-audit.js +1 -74
- package/dist/services/self-diagnosis.js +1 -272
- package/dist/services/self-search.js +1 -129
- package/dist/services/session-persistence.js +1 -237
- package/dist/services/session.js +1 -282
- package/dist/services/skills.js +1 -290
- package/dist/services/ssrf-guard.js +1 -162
- package/dist/services/standing-orders.js +1 -29
- package/dist/services/steer-channel.js +1 -46
- package/dist/services/stop-controller.js +1 -52
- package/dist/services/subagent-dedup.js +1 -86
- package/dist/services/subagent-delivery.js +1 -452
- package/dist/services/subagent-stats.js +1 -123
- package/dist/services/subagents.js +1 -814
- package/dist/services/sudo.js +1 -329
- package/dist/services/telegram.js +1 -158
- package/dist/services/timing-safe-bearer.js +1 -51
- package/dist/services/tool-discovery.js +1 -214
- package/dist/services/trends.js +1 -580
- package/dist/services/updater.js +1 -291
- package/dist/services/usage-tracker.js +1 -144
- package/dist/services/users.js +1 -271
- package/dist/services/voice.js +1 -104
- package/dist/services/watchdog-brake.js +1 -154
- package/dist/services/watchdog.js +1 -311
- package/dist/services/workspaces.js +1 -276
- package/dist/tui/index.js +1 -667
- package/dist/util/console-formatter.js +1 -109
- package/dist/util/debounce.js +1 -24
- package/dist/util/telegram-error-filter.js +1 -62
- package/dist/version.js +1 -24
- package/dist/web/bind-strategy.js +1 -42
- package/dist/web/canvas.js +1 -30
- package/dist/web/doctor-api.js +1 -604
- package/dist/web/openai-compat.js +1 -252
- package/dist/web/server.js +1 -1902
- package/dist/web/setup-api.js +1 -1101
- package/package.json +5 -2
- package/dist/.metadata_never_index +0 -0
|
@@ -1,214 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool Discovery Service
|
|
3
|
-
*
|
|
4
|
-
* Scans the system at startup for available CLI tools, configured plugins,
|
|
5
|
-
* and custom tools. Injects a summary into the system prompt so the AI
|
|
6
|
-
* knows exactly what it can use — instead of guessing or saying "I'd need X".
|
|
7
|
-
*
|
|
8
|
-
* Philosophy: An agent that doesn't know its own capabilities is useless.
|
|
9
|
-
*/
|
|
10
|
-
import { execSync } from "child_process";
|
|
11
|
-
import fs from "fs";
|
|
12
|
-
import { resolve } from "path";
|
|
13
|
-
import { TOOLS_MD, TOOLS_JSON, PLUGINS_DIR } from "../paths.js";
|
|
14
|
-
// Cache the report — only scan once per process lifetime
|
|
15
|
-
let cachedReport = null;
|
|
16
|
-
/**
|
|
17
|
-
* CLI tools to probe for. Grouped by category.
|
|
18
|
-
* Each entry: [binary, description]
|
|
19
|
-
*/
|
|
20
|
-
const TOOL_PROBES = {
|
|
21
|
-
"📧 Email & Communication": [
|
|
22
|
-
["himalaya", "Email CLI (IMAP/SMTP) — list, read, send, search emails"],
|
|
23
|
-
["wacli", "WhatsApp CLI — send messages, search history"],
|
|
24
|
-
["signal-cli", "Signal messenger CLI"],
|
|
25
|
-
],
|
|
26
|
-
"🌐 Web & Network": [
|
|
27
|
-
["curl", "HTTP requests"],
|
|
28
|
-
["wget", "File downloads"],
|
|
29
|
-
["httpie", "Modern HTTP client"],
|
|
30
|
-
["jq", "JSON processor"],
|
|
31
|
-
],
|
|
32
|
-
"📄 Document Processing": [
|
|
33
|
-
["pandoc", "Universal document converter (Markdown, HTML, PDF, DOCX, LaTeX)"],
|
|
34
|
-
["pdftotext", "Extract text from PDFs"],
|
|
35
|
-
["pdfinfo", "PDF metadata"],
|
|
36
|
-
["pdftoppm", "PDF to images"],
|
|
37
|
-
["gs", "Ghostscript — PDF manipulation (merge, split, compress)"],
|
|
38
|
-
["wkhtmltopdf", "HTML to PDF renderer"],
|
|
39
|
-
["libreoffice", "Office document conversion"],
|
|
40
|
-
],
|
|
41
|
-
"🎨 Image Processing": [
|
|
42
|
-
["sips", "macOS image processing (resize, convert, rotate)"],
|
|
43
|
-
["magick", "ImageMagick — advanced image manipulation"],
|
|
44
|
-
["convert", "ImageMagick convert (legacy)"],
|
|
45
|
-
["ffmpeg", "Audio/Video/Image swiss army knife"],
|
|
46
|
-
],
|
|
47
|
-
"🎬 Audio & Video": [
|
|
48
|
-
["ffmpeg", "Audio/Video conversion, extraction, streaming"],
|
|
49
|
-
["ffprobe", "Media file analysis (duration, codecs, bitrate)"],
|
|
50
|
-
["yt-dlp", "Download videos from YouTube and 1000+ sites"],
|
|
51
|
-
["whisper", "OpenAI Whisper — local speech-to-text"],
|
|
52
|
-
],
|
|
53
|
-
"💻 Development": [
|
|
54
|
-
["node", "Node.js runtime"],
|
|
55
|
-
["npm", "Node package manager"],
|
|
56
|
-
["npx", "Node package executor"],
|
|
57
|
-
["python3", "Python 3"],
|
|
58
|
-
["pip3", "Python package manager"],
|
|
59
|
-
["git", "Version control"],
|
|
60
|
-
["gh", "GitHub CLI — issues, PRs, repos, actions"],
|
|
61
|
-
["docker", "Container runtime"],
|
|
62
|
-
["pm2", "Process manager"],
|
|
63
|
-
],
|
|
64
|
-
"🖥️ macOS Automation": [
|
|
65
|
-
["osascript", "AppleScript / JXA automation"],
|
|
66
|
-
["cliclick", "Mouse/keyboard automation (click, type, key press)"],
|
|
67
|
-
["screencapture", "Take screenshots"],
|
|
68
|
-
["brightness", "Display brightness control"],
|
|
69
|
-
["blueutil", "Bluetooth control"],
|
|
70
|
-
["SwitchAudioSource", "Audio device switching"],
|
|
71
|
-
["mas", "Mac App Store CLI"],
|
|
72
|
-
["pbcopy", "Copy to clipboard"],
|
|
73
|
-
["pbpaste", "Paste from clipboard"],
|
|
74
|
-
],
|
|
75
|
-
"📊 Data & Analysis": [
|
|
76
|
-
["sqlite3", "SQLite database CLI"],
|
|
77
|
-
["psql", "PostgreSQL client"],
|
|
78
|
-
["mysql", "MySQL client"],
|
|
79
|
-
["csvtool", "CSV processing"],
|
|
80
|
-
["mlr", "Miller — CSV/JSON/TSV data processor"],
|
|
81
|
-
],
|
|
82
|
-
"🔧 System": [
|
|
83
|
-
["ssh", "Remote shell access"],
|
|
84
|
-
["sshpass", "SSH with password (non-interactive)"],
|
|
85
|
-
["rsync", "Fast file sync/transfer"],
|
|
86
|
-
["trash", "Safe file deletion (recoverable)"],
|
|
87
|
-
["htop", "System monitor"],
|
|
88
|
-
["lsof", "Open file/port inspector"],
|
|
89
|
-
],
|
|
90
|
-
};
|
|
91
|
-
/** Check if a binary exists on the system */
|
|
92
|
-
function whichTool(name) {
|
|
93
|
-
try {
|
|
94
|
-
return execSync(`which ${name} 2>/dev/null`, { encoding: "utf-8", timeout: 3000 }).trim() || null;
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/** Load custom tool names from TOOLS.md (with legacy tools.json fallback) */
|
|
101
|
-
function loadCustomTools() {
|
|
102
|
-
// Prefer TOOLS.md — extract tool names from ## headings
|
|
103
|
-
if (fs.existsSync(TOOLS_MD)) {
|
|
104
|
-
try {
|
|
105
|
-
const content = fs.readFileSync(TOOLS_MD, "utf-8");
|
|
106
|
-
const names = [];
|
|
107
|
-
for (const match of content.matchAll(/^## (.+)$/gm)) {
|
|
108
|
-
const name = match[1].trim().replace(/\s+/g, "_").toLowerCase();
|
|
109
|
-
if (name)
|
|
110
|
-
names.push(name);
|
|
111
|
-
}
|
|
112
|
-
if (names.length > 0)
|
|
113
|
-
return names;
|
|
114
|
-
}
|
|
115
|
-
catch { /* fall through */ }
|
|
116
|
-
}
|
|
117
|
-
// Legacy fallback: docs/tools.json
|
|
118
|
-
try {
|
|
119
|
-
const data = JSON.parse(fs.readFileSync(TOOLS_JSON, "utf-8"));
|
|
120
|
-
const tools = data.tools || data.items || (Array.isArray(data) ? data : []);
|
|
121
|
-
return tools.map((t) => t.name || t.id || "unknown");
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
return [];
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
/** Get list of loaded plugins (read plugin directory) */
|
|
128
|
-
function discoverPlugins() {
|
|
129
|
-
try {
|
|
130
|
-
return fs.readdirSync(PLUGINS_DIR)
|
|
131
|
-
.filter(d => fs.statSync(resolve(PLUGINS_DIR, d)).isDirectory())
|
|
132
|
-
.filter(d => fs.existsSync(resolve(PLUGINS_DIR, d, "index.js")));
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
return [];
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Scan the system for available tools. Cached after first call.
|
|
140
|
-
*/
|
|
141
|
-
export function discoverTools(forceRescan = false) {
|
|
142
|
-
if (cachedReport && !forceRescan)
|
|
143
|
-
return cachedReport;
|
|
144
|
-
const cliTools = [];
|
|
145
|
-
const seen = new Set();
|
|
146
|
-
for (const [category, probes] of Object.entries(TOOL_PROBES)) {
|
|
147
|
-
for (const [name, description] of probes) {
|
|
148
|
-
if (seen.has(name))
|
|
149
|
-
continue;
|
|
150
|
-
seen.add(name);
|
|
151
|
-
const path = whichTool(name);
|
|
152
|
-
if (path) {
|
|
153
|
-
cliTools.push({ name, path, description, category });
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
const customTools = loadCustomTools();
|
|
158
|
-
const plugins = discoverPlugins();
|
|
159
|
-
// Build human-readable summary for the system prompt
|
|
160
|
-
const lines = ["## Available Tools & Capabilities\n"];
|
|
161
|
-
lines.push("The following tools are installed and ready to use on this system.\n");
|
|
162
|
-
lines.push("**IMPORTANT:** Use these tools DIRECTLY. Do NOT say 'I would need X' when X is listed here.\n");
|
|
163
|
-
// Group CLI tools by category
|
|
164
|
-
const byCategory = new Map();
|
|
165
|
-
for (const tool of cliTools) {
|
|
166
|
-
const list = byCategory.get(tool.category) || [];
|
|
167
|
-
list.push(tool);
|
|
168
|
-
byCategory.set(tool.category, list);
|
|
169
|
-
}
|
|
170
|
-
for (const [category, tools] of byCategory) {
|
|
171
|
-
lines.push(`### ${category}`);
|
|
172
|
-
for (const t of tools) {
|
|
173
|
-
lines.push(`- **${t.name}** — ${t.description}`);
|
|
174
|
-
}
|
|
175
|
-
lines.push("");
|
|
176
|
-
}
|
|
177
|
-
// Plugins
|
|
178
|
-
if (plugins.length > 0) {
|
|
179
|
-
lines.push("### 🔌 Active Plugins");
|
|
180
|
-
for (const p of plugins) {
|
|
181
|
-
lines.push(`- **${p}** — Use \`/${p}\` or ask directly about ${p} features`);
|
|
182
|
-
}
|
|
183
|
-
lines.push("");
|
|
184
|
-
}
|
|
185
|
-
// Custom tools
|
|
186
|
-
if (customTools.length > 0) {
|
|
187
|
-
lines.push(`### 🛠️ Custom Tools (${customTools.length} defined in TOOLS.md)`);
|
|
188
|
-
lines.push(`Available via Web UI or by name. Examples: ${customTools.slice(0, 10).join(", ")}${customTools.length > 10 ? "..." : ""}`);
|
|
189
|
-
lines.push("");
|
|
190
|
-
}
|
|
191
|
-
// Usage guidelines
|
|
192
|
-
lines.push("### 💡 Usage Guidelines");
|
|
193
|
-
lines.push("- **Act first, ask later.** If a tool is available → use it directly.");
|
|
194
|
-
lines.push("- **`which <tool>`** if unsure whether something is installed.");
|
|
195
|
-
lines.push("- **Combine tools:** e.g. `curl` + `jq` for APIs, `ffmpeg` + `ffprobe` for media.");
|
|
196
|
-
lines.push("- **Missing tools:** Suggest installation, do NOT give up.");
|
|
197
|
-
lines.push("");
|
|
198
|
-
const summary = lines.join("\n");
|
|
199
|
-
cachedReport = { cliTools, customTools, plugins, summary, scannedAt: Date.now() };
|
|
200
|
-
console.log(`🔍 Tool discovery: ${cliTools.length} CLI tools, ${plugins.length} plugins, ${customTools.length} custom tools`);
|
|
201
|
-
return cachedReport;
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Get the tool summary for injection into the system prompt.
|
|
205
|
-
*/
|
|
206
|
-
export function getToolSummary() {
|
|
207
|
-
return discoverTools().summary;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Force rescan (e.g., after plugin install).
|
|
211
|
-
*/
|
|
212
|
-
export function rescanTools() {
|
|
213
|
-
return discoverTools(true);
|
|
214
|
-
}
|
|
1
|
+
function _0x570a(){const _0x155993=['D2HPy2GG','CgfUzg9J','AM9PBG','Dg9tDhjPBMC','kIPjtvbpuLrbtG','ihjVDgf0zsK','kgr1CMf0Aw9Ula','Dg9VBhm','AgLTywXHEwe','z2L2zsb1Cc4','CMvZCYK','DcdIGjqGuergig1H','AwvZcG','BwfJt1mGAw1HzW','B20Gvg9VBhmGka','AxnbCNjHEq','ignSAxbIB2fYza','u2fMzsbMAwXLia','CNn0lcbHC2SGBa','DgLVBIWGC3rYzq','AgvZzsb0B29SCW','B24Sigv4DhjHyW','A2fNzsbTyw5HzW','AhrVCa','zgvSzxrPB24Gka','CgfYC2u','B250CM9S','C3nOCgfZCW','BMCGkhjLC2L6zq','ywrK','Aw5NihrVB2XZia','C2vHCMnOigHPCW','vIbKyxrHihbYBW','zg9JA2vY','BY9jBwfNzsbZDW','zsbhDwLKzwXPBG','lsaQkMb3AgLJAa','rxH0CMfJDcb0zq','B21LDgHPBMCGAq','C2LNBMfSlwnSAq','vMvYC2LVBIbJBW','zg9JDw1LBNqGyW','CNvUDgLTzq','Dw5RBM93BG','sfruucbYzxf1zq','CMvJB3zLCMfIBa','ifbsCYWGCMvWBW','B3nHC2nYAxb0','ug9ZDgDYzvnrta','Cg0Y','y2SSihr5CguSia','zw50CMLLCW','iokaLcbPC3n1zxmS','AxrLBxm','BgWGywnJzxnZ','C3nO','BgaGkYbGANfGia','yxjLigLUC3rHBa','B3v0ia','zgLYzwn0BhKU','lsaQkG','yxbWBhK','CMvHzgrPCLn5BG','rgLZCgXHEsbICG','rMLSzsbKB3DUBa','A2v5ihbYzxnZkq','zMzWCM9Izq','mJK5odf1AgHdC1G','yNjPz2H0BMvZCW','yMX1zxv0AwW','z2uGzxHLy3v0BW','ygzMBxbLz2aGkW','mJe5otyZAMnUr2Lp','BYbJB252zxjZAq','txLtuuWGy2XPzq','B2XZ','Exn0zw0UcG','y2f0zwDVCNK','mtG5oduZsLbUqMDR','igLMihvUC3vYzq','BgvUz3rO','tw91C2uVA2v5yG','mZi4nJq2wvfnzwzn','twvKAweGzMLSzq','Ahr0CgLL','B2fKCW','igbMzNbYB2jLya','igeGDg9VBcbPCW','y292zxj5oIa','ntuZmJmYn2XowLDMuW','Dg8TDgv4Da','uhjVy2vZCYbTyq','CYWGywn0Aw9UCW','u2LNBMfSig1LCW','sw1Hz2vnywDPyW','kgXLz2fJEsK','ugfZDguGzNjVBq','AgvUifGGAxmGBa','lsaQkKfJDcbMAq','Axn0zwqGAgvYzq','iokgKIb1C2uGAxqG','zMvY','BwvZC2fNzxmSia','BIWGzg8GtK9uia','kIOG4Ocuia','ifn1z2DLC3qGAq','CZOG','vgfRzsbZy3jLzq','CgXPDcWGy29TCa','z2v0','vdOQkIbvC2uGDa','DhjPBq','AxneAxjLy3rVCG','igf2ywLSywjSzq','qxbWBgvty3jPCa','zxjZAw9U','u3LZDgvTig1VBG','BwfNAwnR','AgfZ','CNn5BMm','ierjuKvdveXzlG','mtuZody3mNz3A2vzvW','CMvHzezPBgvtEq','DhjHC2G','tw9KzxjUieHuva','y2uGC3DPDgnOAq','AxrVCG','C2vHCMnO','z2uGBwfUywDLCG','C3rHDfn5BMm','Cg9YDcbPBNnWzq','yw5PChvSyxrPBW','uMvTB3rLihnOzq','CgLWmW','yw1PBMC','BNrYB2W','lsaQkK1PC3nPBG','CgrMAw5MBW','sLnptIbWCM9Jzq','uergig1LDgfKyq','rIbYzw5KzxjLCG','u1fmAxrLigrHDa','CgjWyxn0zq','ienmssb0B29SCW','icHTzxjNzsWGCW','BguGvg9VBhmGjG','ChnXBa','zxHPC3rZu3LUyW','u1yVsLnptI9uuW','B1nVDxjJzq','ywWGC3bLzwnOlq','igzVCIbTzwrPyq','BM9Kzq','C2vUz2vYienmsq','idi+l2rLDI9UDq','Bwf0y2HbBgW','igfUywX5C2LZia','t2zMAwnLigrVyW','yxrLCI4QkIbjzG','ienHCgfIAwXPDa','zMLSDgvY','CgrMDg9WCg0','kIOG4OcuifvZzsbG','BMqGmtaWmcSGCW','qxvKAw8VvMLKzq','lcbJB252zxj0la','BMfTzq','B3jLienmsq','Dg9YEq','BNn0ywXSyxrPBW','odi1odbKDhnpCgW','iYmJipcFKQeGvxnHzW','BNbT','B2fYzcbHDxrVBq','sfrntcWGuergla','Aw5KzxGUANm','BwfW','C3fSAxrLmW','ucbJBgLLBNq','ihbSDwDPBNmSia','AxrYyxrLkq','qMX1zxrVB3rOia','zsb0B29SCZOQkG','CYbPBNn0ywXSzq','rMfZDcbMAwXLia','ExqTzgXW','BNnOB3rZ','C3nVCG','8j+uJsbuB29SigrPCW','ig9Yigj5ig5HBq','D2fJBgK','yxnZD29YzcaOBG','BNb4','CMvWBgfJzq','uhL0Ag9Uidm','BIbut09muY5Tza','C2LWCW','zYb0B29SCZOQkG','CgjJB3b5','rw1HAwWGq0Xjia','AwDODg5LC3mGyW','EhqGzNjVBsbqra','ig5LzwqGwcCGDW','C3rZ','mtiWrePmrezc','ignSAwvUDa','BxLZCwW','zs4GrxHHBxbSzq','tM9KzsbWywnRyq','vw5PDMvYC2fSia','keLnqvaVu01uua','lI4U','vgHLigzVBgXVDW','sfrntcb0BYbqra','ndrku1brugW','DcaViePyqsbHDq','ksdIGjqGBgLZDcWG','ig9UihrOAxmGCW','t3bLBIbMAwXLlW','zsbWCM9JzxnZAq','t3bLBKfjifDOAq','BgvKigfUzcbYzq','DxrMltG','AYdIGjqGywr2yw5J','C2XPy2u','rg93BMXVywqGDG','Bg9N','Dg9TyxrPB24','ywr5ihrVihvZzq','Dg9mB3DLCKnHCW','zMzTCgvN','ierVie5pvcbZyq','kcGOlISPkYKRkq','iYmJia','z2vZ','r2HVC3rZy3jPCa','qxvKAw8Gzgv2Aq','ierpq1GSieXHva','CgrMDg90zxH0','teKG4OcuihnLBMqG','q1nwihbYB2nLCW','D2HPC3bLCG','BMfNzxi','D2DLDa','ChvZAa','BhnVzG','twfYA2rVD24Sia','qxzHAwXHyMXLia','twLSBgvYiokaLcbd','y3vYBa','BgLICMvVzMzPyW','lsaQkKnVBwjPBG','idX0B29SpMaQkG','C2v0','q29WEsb0BYbJBa','B24TAw50zxjHyW','DgL2zsK','AxjLy3rSEsbHyG','y2vZC29Y','D2TODg1SDg9Wza','uhL0Ag9UihbHyW','tM9Kzs5QCYbYDq','iYmJipcFM6dVUi8Gq3vZDa'];_0x570a=function(){return _0x155993;};return _0x570a();}const _0x1f8d41=_0x3105,_0x3699b0=_0x3105;(function(_0x3c223f,_0x404366){const _0x320d09=_0x3105,_0x370dc0=_0x3105,_0x10c9a8=_0x3c223f();while(!![]){try{const _0x2da15f=-parseInt(_0x320d09(0x1c7))/(0x20b*-0xb+0x11*-0x140+0xc1*0x3a)+-parseInt(_0x320d09(0x1cb))/(-0x166*-0x1a+-0x25f8+0x19e)+-parseInt(_0x320d09(0x1c1))/(0x2050+0x1313*-0x1+-0xd3a)+parseInt(_0x370dc0(0x24f))/(0x3b3+-0xee9+0x59d*0x2)*(-parseInt(_0x370dc0(0x223))/(-0x1c96+-0x169f+0x333a))+-parseInt(_0x370dc0(0x245))/(-0x1*-0x11d+0x139c*-0x1+0x1285)*(parseInt(_0x320d09(0x1bc))/(0x1dcd*0x1+0x975*0x1+-0x273b))+parseInt(_0x320d09(0x1f2))/(0x1a89+0x640+-0x20c1)+parseInt(_0x370dc0(0x1d2))/(0x1*-0x13b1+0x12fc+0xbe);if(_0x2da15f===_0x404366)break;else _0x10c9a8['push'](_0x10c9a8['shift']());}catch(_0x162edf){_0x10c9a8['push'](_0x10c9a8['shift']());}}}(_0x570a,-0x4*-0x8096+-0x209*-0x1ac+-0x2*0x1d98c));const _0x160068=(function(){let _0x11fbeb=!![];return function(_0x2a8919,_0x11bfe4){const _0x54a8bb=_0x11fbeb?function(){const _0x738af1=_0x3105;if(_0x11bfe4){const _0x4a5a3e=_0x11bfe4[_0x738af1(0x1b6)](_0x2a8919,arguments);return _0x11bfe4=null,_0x4a5a3e;}}:function(){};return _0x11fbeb=![],_0x54a8bb;};}()),_0x14cf85=_0x160068(this,function(){const _0x5d11ad=_0x3105,_0x1219da=_0x3105;return _0x14cf85[_0x5d11ad(0x17c)]()[_0x1219da(0x1f8)](_0x5d11ad(0x15a)+'+$')[_0x5d11ad(0x17c)]()['constructo'+'r'](_0x14cf85)['search'](_0x1219da(0x15a)+'+$');});_0x14cf85();function _0x3105(_0xd0e84c,_0x33b664){_0xd0e84c=_0xd0e84c-(-0x5b+0xd2c+-0xb7d);const _0x21f6c0=_0x570a();let _0x5b689d=_0x21f6c0[_0xd0e84c];if(_0x3105['GlgjqV']===undefined){var _0x27df0a=function(_0x5cdfc7){const _0x580e96='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x15476d='',_0x48a297='',_0x5f31b4=_0x15476d+_0x27df0a;for(let _0x597b7e=0x1*0x203e+0x28*0x7+-0x2156,_0xab90eb,_0x52079f,_0x1442c4=-0x120c+0x2300+-0x4*0x43d;_0x52079f=_0x5cdfc7['charAt'](_0x1442c4++);~_0x52079f&&(_0xab90eb=_0x597b7e%(0x1d6+0x4*0x5fc+-0x2*0xce1)?_0xab90eb*(-0x1f35+-0xdb*0xb+-0x28de*-0x1)+_0x52079f:_0x52079f,_0x597b7e++%(0x8*0x293+-0x1440+-0x54))?_0x15476d+=_0x5f31b4['charCodeAt'](_0x1442c4+(0x5d1*-0x1+-0x51+-0x18b*-0x4))-(-0x134a+0x4b3*-0x3+-0x216d*-0x1)!==0x11c8+-0x1b6+-0x22*0x79?String['fromCharCode'](0x10ab+-0x2ef*-0x5+-0x1e57&_0xab90eb>>(-(-0x5*0x4e8+-0x1e4a*-0x1+-0xb8*0x8)*_0x597b7e&-0x17*-0x8e+0x2302+-0x2fbe)):_0x597b7e:0xb16+0x6d4+0x2*-0x8f5){_0x52079f=_0x580e96['indexOf'](_0x52079f);}for(let _0x15c0e3=0x1372*0x2+0x1633+-0x3d17,_0x4526b5=_0x15476d['length'];_0x15c0e3<_0x4526b5;_0x15c0e3++){_0x48a297+='%'+('00'+_0x15476d['charCodeAt'](_0x15c0e3)['toString'](-0x16*-0xdf+-0x1bb4+-0x89a*-0x1))['slice'](-(-0x210d+-0x1c9b+0x3daa));}return decodeURIComponent(_0x48a297);};_0x3105['MYdlIm']=_0x27df0a,_0x3105['bZAaSj']={},_0x3105['GlgjqV']=!![];}const _0x28fded=_0x21f6c0[0x217b+-0xd0c+0x1*-0x146f],_0x12d0f3=_0xd0e84c+_0x28fded,_0x7c0e38=_0x3105['bZAaSj'][_0x12d0f3];if(!_0x7c0e38){const _0x5210fc=function(_0x470fcd){this['ieZfYp']=_0x470fcd,this['oyWTrI']=[0x1ed0+-0x12ae+0x73*-0x1b,-0x1275+0x2d0+0x10b*0xf,0x12a2+-0x1f9*0x10+0xcee],this['ZayPQV']=function(){return'newState';},this['vtGfuV']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['PXExCY']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x5210fc['prototype']['WxUxnS']=function(){const _0x3c103c=new RegExp(this['vtGfuV']+this['PXExCY']),_0x3c4151=_0x3c103c['test'](this['ZayPQV']['toString']())?--this['oyWTrI'][-0x1231+0xd*0xbf+0x57*0x19]:--this['oyWTrI'][0x1958+0x16c7+-0x301f];return this['AhAuSg'](_0x3c4151);},_0x5210fc['prototype']['AhAuSg']=function(_0x49310a){if(!Boolean(~_0x49310a))return _0x49310a;return this['eXdcVe'](this['ieZfYp']);},_0x5210fc['prototype']['eXdcVe']=function(_0x5c1124){for(let _0x159164=-0xba9+0x1511+0xe*-0xac,_0x3bc108=this['oyWTrI']['length'];_0x159164<_0x3bc108;_0x159164++){this['oyWTrI']['push'](Math['round'](Math['random']())),_0x3bc108=this['oyWTrI']['length'];}return _0x5c1124(this['oyWTrI'][0x1*0x11df+0x52c+-0x170b]);},new _0x5210fc(_0x3105)['WxUxnS'](),_0x5b689d=_0x3105['MYdlIm'](_0x5b689d),_0x3105['bZAaSj'][_0x12d0f3]=_0x5b689d;}else _0x5b689d=_0x7c0e38;return _0x5b689d;}import{execSync}from'child_process';import _0x43d176 from'fs';import{resolve}from'path';import{TOOLS_MD,TOOLS_JSON,PLUGINS_DIR}from'../paths.js';let cachedReport=null;const TOOL_PROBES={'📧\x20Email\x20&\x20Communication':[[_0x1f8d41(0x181),_0x3699b0(0x240)+_0x1f8d41(0x24b)+_0x1f8d41(0x251)+'read,\x20send'+',\x20search\x20e'+'mails'],[_0x3699b0(0x237),'WhatsApp\x20C'+_0x3699b0(0x161)+_0x3699b0(0x1df)+_0x1f8d41(0x198)+_0x3699b0(0x221)],[_0x1f8d41(0x1a0),_0x3699b0(0x1d6)+_0x1f8d41(0x212)]],'🌐\x20Web\x20&\x20Network':[[_0x3699b0(0x16b),_0x3699b0(0x1a5)+_0x1f8d41(0x244)],[_0x1f8d41(0x165),_0x3699b0(0x1b9)+_0x3699b0(0x1ce)],[_0x3699b0(0x1cd),_0x1f8d41(0x1f5)+_0x3699b0(0x22b)],['jq',_0x3699b0(0x203)+_0x3699b0(0x234)]],'📄\x20Document\x20Processing':[[_0x3699b0(0x17a),_0x3699b0(0x24a)+_0x3699b0(0x1a2)+'onverter\x20('+_0x3699b0(0x168)+_0x3699b0(0x227)+_0x1f8d41(0x15f)+'eX)'],[_0x3699b0(0x160),_0x3699b0(0x19e)+_0x1f8d41(0x242)+'Fs'],[_0x1f8d41(0x202),_0x3699b0(0x204)+'ta'],[_0x1f8d41(0x21a),'PDF\x20to\x20ima'+_0x1f8d41(0x15c)],['gs',_0x1f8d41(0x15d)+_0x1f8d41(0x184)+'nipulation'+_0x3699b0(0x209)+_0x1f8d41(0x1e5)+_0x1f8d41(0x183)],[_0x3699b0(0x175)+'f',_0x1f8d41(0x24e)+_0x1f8d41(0x205)],[_0x3699b0(0x16c)+'e',_0x3699b0(0x216)+'ument\x20conv'+_0x1f8d41(0x1ec)]],'🎨\x20Image\x20Processing':[[_0x3699b0(0x23d),_0x3699b0(0x186)+_0x3699b0(0x254)+_0x1f8d41(0x195)+_0x3699b0(0x21e)+_0x1f8d41(0x17e)],[_0x1f8d41(0x1ee),'ImageMagic'+_0x1f8d41(0x258)+'ed\x20image\x20m'+_0x1f8d41(0x1fc)+'n'],['convert',_0x1f8d41(0x1d7)+'k\x20convert\x20'+_0x1f8d41(0x1d8)],[_0x3699b0(0x158),_0x3699b0(0x21d)+_0x3699b0(0x19b)+'iss\x20army\x20k'+'nife']],'🎬\x20Audio\x20&\x20Video':[[_0x1f8d41(0x158),'Audio/Vide'+_0x3699b0(0x1c2)+_0x3699b0(0x18e)+_0x1f8d41(0x18c)+_0x3699b0(0x1ff)],[_0x1f8d41(0x1bb),_0x1f8d41(0x1cc)+_0x1f8d41(0x215)+_0x3699b0(0x17f)+'\x20codecs,\x20b'+_0x1f8d41(0x22d)],[_0x3699b0(0x232),_0x3699b0(0x25a)+'ideos\x20from'+'\x20YouTube\x20a'+_0x3699b0(0x21c)+'ites'],[_0x3699b0(0x163),_0x3699b0(0x255)+'sper\x20—\x20loc'+_0x1f8d41(0x20f)+_0x1f8d41(0x1d3)]],'💻\x20Development':[[_0x3699b0(0x211),_0x1f8d41(0x177)+'ntime'],[_0x1f8d41(0x225),_0x1f8d41(0x249)+_0x3699b0(0x1f9)],[_0x3699b0(0x239),'Node\x20packa'+_0x3699b0(0x1bf)+'r'],['python3',_0x1f8d41(0x23b)],[_0x1f8d41(0x1fe),_0x1f8d41(0x176)+_0x3699b0(0x18f)+'er'],['git',_0x3699b0(0x1a1)+_0x3699b0(0x200)],['gh','GitHub\x20CLI'+_0x1f8d41(0x1ad)+_0x1f8d41(0x1a7)+_0x3699b0(0x1d5)],[_0x3699b0(0x19a),'Container\x20'+_0x1f8d41(0x1a3)],[_0x1f8d41(0x1aa),_0x1f8d41(0x1d4)+_0x3699b0(0x164)]],'🖥️\x20macOS\x20Automation':[[_0x1f8d41(0x1a8),_0x1f8d41(0x1eb)+_0x1f8d41(0x250)+_0x1f8d41(0x155)],['cliclick',_0x1f8d41(0x1ca)+_0x3699b0(0x226)+'ation\x20(cli'+_0x1f8d41(0x1ab)+_0x3699b0(0x1ba)],['screencapt'+'ure',_0x3699b0(0x1e4)+_0x1f8d41(0x233)],[_0x3699b0(0x1bd),_0x1f8d41(0x1b8)+_0x3699b0(0x241)+_0x3699b0(0x193)],[_0x3699b0(0x1be),_0x1f8d41(0x22e)+'control'],['SwitchAudi'+_0x3699b0(0x20e),_0x1f8d41(0x15e)+_0x1f8d41(0x1f6)+'ng'],['mas','Mac\x20App\x20St'+_0x3699b0(0x220)],[_0x1f8d41(0x23f),_0x3699b0(0x170)+'ipboard'],[_0x1f8d41(0x207),_0x1f8d41(0x1d9)+_0x1f8d41(0x189)]],'📊\x20Data\x20&\x20Analysis':[[_0x3699b0(0x22a),_0x3699b0(0x206)+'abase\x20CLI'],[_0x3699b0(0x20b),_0x1f8d41(0x1a9)+_0x1f8d41(0x246)],[_0x3699b0(0x247),_0x1f8d41(0x1c3)+'nt'],['csvtool',_0x3699b0(0x162)+'sing'],['mlr',_0x1f8d41(0x16a)+_0x3699b0(0x20d)+_0x1f8d41(0x199)+_0x3699b0(0x174)]],'🔧\x20System':[[_0x3699b0(0x1b0),_0x3699b0(0x1fd)+_0x3699b0(0x1af)],[_0x3699b0(0x194),'SSH\x20with\x20p'+_0x3699b0(0x238)+_0x1f8d41(0x171)+_0x3699b0(0x172)],[_0x1f8d41(0x1f0),_0x3699b0(0x231)+'sync/trans'+_0x3699b0(0x1de)],[_0x3699b0(0x1f4),_0x1f8d41(0x18a)+_0x3699b0(0x191)+_0x3699b0(0x1a6)+'e)'],[_0x3699b0(0x190),_0x3699b0(0x1ed)+_0x3699b0(0x1f7)],[_0x3699b0(0x167),_0x3699b0(0x253)+_0x3699b0(0x1fb)+'ctor']]};function whichTool(_0x26b2b6){const _0x1adeb8=_0x1f8d41,_0x194e48=_0x3699b0;try{return execSync(_0x1adeb8(0x179)+_0x26b2b6+(_0x1adeb8(0x213)+'ll'),{'encoding':'utf-8','timeout':0xbb8})[_0x194e48(0x1e8)]()||null;}catch{return null;}}function loadCustomTools(){const _0x4b3fee=_0x1f8d41,_0xd40b69=_0x1f8d41;if(_0x43d176[_0x4b3fee(0x20c)](TOOLS_MD))try{const _0x472a86=_0x43d176[_0xd40b69(0x1f3)+'nc'](TOOLS_MD,_0xd40b69(0x257)),_0x28c36e=[];for(const _0x468efb of _0x472a86[_0xd40b69(0x214)](/^## (.+)$/gm)){const _0xcb6614=_0x468efb[0x2300+-0x1*0x1f13+0xfb*-0x4][_0xd40b69(0x1e8)]()[_0x4b3fee(0x23a)](/\s+/g,'_')[_0x4b3fee(0x157)+'e']();if(_0xcb6614)_0x28c36e[_0xd40b69(0x166)](_0xcb6614);}if(_0x28c36e['length']>0x1c9*-0x3+0x14f4+-0xf99)return _0x28c36e;}catch{}try{const _0x3f423d=JSON[_0x4b3fee(0x192)](_0x43d176[_0xd40b69(0x1f3)+'nc'](TOOLS_JSON,_0x4b3fee(0x257))),_0x5a6a98=_0x3f423d[_0x4b3fee(0x180)]||_0x3f423d[_0xd40b69(0x1ae)]||(Array[_0x4b3fee(0x188)](_0x3f423d)?_0x3f423d:[]);return _0x5a6a98[_0xd40b69(0x229)](_0x44d165=>_0x44d165[_0xd40b69(0x21f)]||_0x44d165['id']||_0x4b3fee(0x1a4));}catch{return[];}}function discoverPlugins(){const _0x3d53e9=_0x3699b0,_0x45e322=_0x1f8d41;try{return _0x43d176[_0x3d53e9(0x1b7)+'c'](PLUGINS_DIR)[_0x45e322(0x219)](_0x1f3b30=>_0x43d176[_0x3d53e9(0x1fa)](resolve(PLUGINS_DIR,_0x1f3b30))[_0x3d53e9(0x1e9)+'y']())[_0x45e322(0x219)](_0x1b3373=>_0x43d176['existsSync'](resolve(PLUGINS_DIR,_0x1b3373,_0x3d53e9(0x228))));}catch{return[];}}export function discoverTools(_0x13dbef=![]){const _0xe4da5c=_0x1f8d41,_0x7dc162=_0x3699b0;if(cachedReport&&!_0x13dbef)return cachedReport;const _0x3d378e=[],_0x3805d3=new Set();for(const [_0x4ac834,_0x3c07dc]of Object[_0xe4da5c(0x1ac)](TOOL_PROBES)){for(const [_0x589bf7,_0x5390bf]of _0x3c07dc){if(_0x3805d3[_0xe4da5c(0x1ef)](_0x589bf7))continue;_0x3805d3[_0xe4da5c(0x196)](_0x589bf7);const _0x20f759=whichTool(_0x589bf7);_0x20f759&&_0x3d378e[_0xe4da5c(0x166)]({'name':_0x589bf7,'path':_0x20f759,'description':_0x5390bf,'category':_0x4ac834});}}const _0x16a2ca=loadCustomTools(),_0x1557a5=discoverPlugins(),_0x57d066=['##\x20Availab'+_0x7dc162(0x20a)+_0x7dc162(0x218)+_0x7dc162(0x185)];_0x57d066[_0xe4da5c(0x166)](_0xe4da5c(0x24d)+_0x7dc162(0x197)+_0x7dc162(0x1b2)+_0x7dc162(0x256)+_0xe4da5c(0x156)+_0xe4da5c(0x252)+_0x7dc162(0x1c5)),_0x57d066[_0xe4da5c(0x166)](_0xe4da5c(0x17d)+_0x7dc162(0x1e7)+_0xe4da5c(0x18d)+_0xe4da5c(0x1f1)+_0x7dc162(0x159)+'y\x20\x27I\x20would'+_0x7dc162(0x243)+_0x7dc162(0x1da)+_0x7dc162(0x1dc)+'.\x0a');const _0x474fd5=new Map();for(const _0x4713e9 of _0x3d378e){const _0xde0d07=_0x474fd5[_0xe4da5c(0x1e6)](_0x4713e9[_0xe4da5c(0x1c6)])||[];_0xde0d07[_0xe4da5c(0x166)](_0x4713e9),_0x474fd5[_0xe4da5c(0x16f)](_0x4713e9[_0xe4da5c(0x1c6)],_0xde0d07);}for(const [_0x590f10,_0x182a4f]of _0x474fd5){_0x57d066['push'](_0x7dc162(0x15b)+_0x590f10);for(const _0x233eeb of _0x182a4f){_0x57d066[_0x7dc162(0x166)](_0xe4da5c(0x1b5)+_0x233eeb['name']+_0x7dc162(0x1e1)+_0x233eeb['descriptio'+'n']);}_0x57d066['push']('');}if(_0x1557a5[_0x7dc162(0x1c9)]>-0xdb*0xb+-0xf85*0x1+-0xc77*-0x2){_0x57d066[_0xe4da5c(0x166)]('###\x20🔌\x20Acti'+'ve\x20Plugins');for(const _0x51bab0 of _0x1557a5){_0x57d066['push']('-\x20**'+_0x51bab0+(_0xe4da5c(0x21b)+'/')+_0x51bab0+('`\x20or\x20ask\x20d'+_0x7dc162(0x173)+_0x7dc162(0x1b3))+_0x51bab0+'\x20features');}_0x57d066['push']('');}_0x16a2ca[_0x7dc162(0x1c9)]>0x182+0x135c+-0x14de&&(_0x57d066[_0xe4da5c(0x166)](_0x7dc162(0x178)+_0xe4da5c(0x187)+_0x16a2ca[_0x7dc162(0x1c9)]+('\x20defined\x20i'+_0xe4da5c(0x23c)+')')),_0x57d066[_0xe4da5c(0x166)](_0x7dc162(0x169)+'via\x20Web\x20UI'+_0x7dc162(0x236)+_0xe4da5c(0x248)+_0x7dc162(0x1e3)+_0x16a2ca[_0xe4da5c(0x259)](-0x1*0x51+-0x259f*-0x1+-0x254e,0x4b3*-0x3+-0xb25*0x1+-0x1*-0x1948)[_0xe4da5c(0x17b)](',\x20')+(_0x16a2ca[_0xe4da5c(0x1c9)]>-0x20*0x2f+0x1b*-0x12f+0x25df?_0x7dc162(0x24c):'')),_0x57d066[_0x7dc162(0x166)](''));_0x57d066['push'](_0x7dc162(0x224)+_0x7dc162(0x19c)+'es'),_0x57d066['push'](_0x7dc162(0x1db)+_0x7dc162(0x18b)+_0xe4da5c(0x217)+_0x7dc162(0x1d0)+_0xe4da5c(0x1ea)+_0xe4da5c(0x1dd)+_0x7dc162(0x1b4)),_0x57d066[_0x7dc162(0x166)](_0xe4da5c(0x19d)+_0x7dc162(0x16e)+_0xe4da5c(0x1c8)+'\x20whether\x20s'+_0xe4da5c(0x19f)+_0xe4da5c(0x230)+'d.'),_0x57d066['push'](_0x7dc162(0x16d)+_0xe4da5c(0x22f)+'\x20e.g.\x20`cur'+_0x7dc162(0x1b1)+'for\x20APIs,\x20'+_0xe4da5c(0x1c0)+_0xe4da5c(0x1cf)+_0x7dc162(0x210)+'.'),_0x57d066[_0xe4da5c(0x166)](_0x7dc162(0x201)+_0x7dc162(0x23e)+_0x7dc162(0x1e2)+_0x7dc162(0x222)+_0x7dc162(0x1e0)+_0x7dc162(0x182)),_0x57d066[_0xe4da5c(0x166)]('');const _0x5f282d=_0x57d066[_0x7dc162(0x17b)]('\x0a');return cachedReport={'cliTools':_0x3d378e,'customTools':_0x16a2ca,'plugins':_0x1557a5,'summary':_0x5f282d,'scannedAt':Date['now']()},console[_0xe4da5c(0x154)](_0x7dc162(0x235)+_0x7dc162(0x1d1)+_0x3d378e[_0x7dc162(0x1c9)]+(_0x7dc162(0x208)+',\x20')+_0x1557a5[_0xe4da5c(0x1c9)]+_0xe4da5c(0x22c)+_0x16a2ca['length']+('\x20custom\x20to'+_0x7dc162(0x1c4))),cachedReport;}export function getToolSummary(){return discoverTools()['summary'];}export function rescanTools(){return discoverTools(!![]);}
|