zilmate 1.3.5 → 1.4.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/dist/agents/automation-planner.agent.d.ts +108 -0
- package/dist/agents/automation-planner.agent.d.ts.map +1 -1
- package/dist/agents/automation-planner.agent.js +13 -4
- package/dist/agents/automation-planner.agent.js.map +1 -1
- package/dist/agents/manager.d.ts +117 -0
- package/dist/agents/manager.d.ts.map +1 -1
- package/dist/agents/manager.js +25 -1
- package/dist/agents/manager.js.map +1 -1
- package/dist/agents/security.agent.d.ts +340 -0
- package/dist/agents/security.agent.d.ts.map +1 -0
- package/dist/agents/security.agent.js +76 -0
- package/dist/agents/security.agent.js.map +1 -0
- package/dist/cli/confirm.d.ts.map +1 -1
- package/dist/cli/confirm.js +8 -14
- package/dist/cli/confirm.js.map +1 -1
- package/dist/cli/format.js +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +2 -0
- package/dist/cli/interactive.js.map +1 -1
- package/dist/cli/triggers.d.ts.map +1 -1
- package/dist/cli/triggers.js +12 -4
- package/dist/cli/triggers.js.map +1 -1
- package/dist/cli/voice.d.ts.map +1 -1
- package/dist/cli/voice.js +2 -0
- package/dist/cli/voice.js.map +1 -1
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +4 -0
- package/dist/config/env.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/jobs/trigger-orchestrator.d.ts +26 -0
- package/dist/jobs/trigger-orchestrator.d.ts.map +1 -0
- package/dist/jobs/trigger-orchestrator.js +252 -0
- package/dist/jobs/trigger-orchestrator.js.map +1 -0
- package/dist/jobs/trigger-policies.d.ts +36 -0
- package/dist/jobs/trigger-policies.d.ts.map +1 -0
- package/dist/jobs/trigger-policies.js +68 -0
- package/dist/jobs/trigger-policies.js.map +1 -0
- package/dist/jobs/trigger-router.d.ts +14 -0
- package/dist/jobs/trigger-router.d.ts.map +1 -0
- package/dist/jobs/trigger-router.js +114 -0
- package/dist/jobs/trigger-router.js.map +1 -0
- package/dist/jobs/workflows.d.ts +4 -1
- package/dist/jobs/workflows.d.ts.map +1 -1
- package/dist/jobs/workflows.js +18 -42
- package/dist/jobs/workflows.js.map +1 -1
- package/dist/memory/personal-context.d.ts +45 -0
- package/dist/memory/personal-context.d.ts.map +1 -0
- package/dist/memory/personal-context.js +103 -0
- package/dist/memory/personal-context.js.map +1 -0
- package/dist/runtime/confirm.d.ts +3 -0
- package/dist/runtime/confirm.d.ts.map +1 -1
- package/dist/runtime/confirm.js +38 -12
- package/dist/runtime/confirm.js.map +1 -1
- package/dist/runtime/progress.d.ts.map +1 -1
- package/dist/runtime/progress.js +3 -0
- package/dist/runtime/progress.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/skills/loader.d.ts +14 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +105 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/tools/cli-runner.d.ts +13 -0
- package/dist/tools/cli-runner.d.ts.map +1 -0
- package/dist/tools/cli-runner.js +75 -0
- package/dist/tools/cli-runner.js.map +1 -0
- package/dist/tools/computer-use.tool.d.ts +159 -0
- package/dist/tools/computer-use.tool.d.ts.map +1 -0
- package/dist/tools/computer-use.tool.js +356 -0
- package/dist/tools/computer-use.tool.js.map +1 -0
- package/dist/tools/orchestration.tool.d.ts +83 -0
- package/dist/tools/orchestration.tool.d.ts.map +1 -0
- package/dist/tools/orchestration.tool.js +154 -0
- package/dist/tools/orchestration.tool.js.map +1 -0
- package/dist/tools/osint-install.tool.d.ts +35 -0
- package/dist/tools/osint-install.tool.d.ts.map +1 -0
- package/dist/tools/osint-install.tool.js +334 -0
- package/dist/tools/osint-install.tool.js.map +1 -0
- package/dist/tools/osint.tool.d.ts +445 -0
- package/dist/tools/osint.tool.d.ts.map +1 -0
- package/dist/tools/osint.tool.js +630 -0
- package/dist/tools/osint.tool.js.map +1 -0
- package/dist/tools/pentest-install.tool.d.ts +32 -0
- package/dist/tools/pentest-install.tool.d.ts.map +1 -0
- package/dist/tools/pentest-install.tool.js +201 -0
- package/dist/tools/pentest-install.tool.js.map +1 -0
- package/dist/tools/pentest.tool.d.ts +595 -0
- package/dist/tools/pentest.tool.d.ts.map +1 -0
- package/dist/tools/pentest.tool.js +841 -0
- package/dist/tools/pentest.tool.js.map +1 -0
- package/dist/tools/personal-context.tool.d.ts +32 -0
- package/dist/tools/personal-context.tool.d.ts.map +1 -0
- package/dist/tools/personal-context.tool.js +76 -0
- package/dist/tools/personal-context.tool.js.map +1 -0
- package/dist/tools/skills.tool.d.ts +17 -0
- package/dist/tools/skills.tool.d.ts.map +1 -0
- package/dist/tools/skills.tool.js +44 -0
- package/dist/tools/skills.tool.js.map +1 -0
- package/dist/voice/cascade.d.ts.map +1 -1
- package/dist/voice/cascade.js +71 -24
- package/dist/voice/cascade.js.map +1 -1
- package/dist/voice/deepgram.d.ts.map +1 -1
- package/dist/voice/deepgram.js +8 -1
- package/dist/voice/deepgram.js.map +1 -1
- package/dist/voice/types.d.ts +4 -0
- package/dist/voice/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type InstallResult = {
|
|
2
|
+
tool: string;
|
|
3
|
+
status: 'installed' | 'already_present' | 'failed';
|
|
4
|
+
detail: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const osintInstallTools: {
|
|
7
|
+
checkOsintTools: import("ai").Tool<Record<string, never>, {
|
|
8
|
+
platform: NodeJS.Platform;
|
|
9
|
+
available: ("sherlock" | "blackbird" | "naminter" | "maigret" | "holehe" | "linkook" | "shodan" | "phoneinfoga" | "theHarvester" | "spiderfoot" | "exiftool")[];
|
|
10
|
+
missing: ("sherlock" | "blackbird" | "naminter" | "maigret" | "holehe" | "linkook" | "shodan" | "phoneinfoga" | "theHarvester" | "spiderfoot" | "exiftool")[];
|
|
11
|
+
readyForInvestigation: boolean;
|
|
12
|
+
details: {
|
|
13
|
+
tool: "sherlock" | "blackbird" | "naminter" | "maigret" | "holehe" | "linkook" | "shodan" | "phoneinfoga" | "theHarvester" | "spiderfoot" | "exiftool";
|
|
14
|
+
description: "Username scanner across 300+ social networks" | "Deep username dossier across 3,000+ sites" | "Username + email scanner (WhatsMyName, 600+ sites) with PDF export" | "TLS-impersonation username scanner (bypasses Cloudflare)" | "Recursive profile link mapper" | "Silent email registration check across 120+ platforms" | "International phone number intelligence scanner" | "Domain email/subdomain/employee harvester" | "Automated reconnaissance framework (200+ modules)" | "File metadata extractor (GPS, camera serial, author, etc.)" | "Shodan CLI for querying open ports, services, CVEs";
|
|
15
|
+
available: boolean;
|
|
16
|
+
}[];
|
|
17
|
+
}>;
|
|
18
|
+
installOsintTools: import("ai").Tool<{
|
|
19
|
+
force: boolean;
|
|
20
|
+
tools?: ("sherlock" | "blackbird" | "naminter" | "maigret" | "holehe" | "linkook" | "shodan" | "phoneinfoga" | "theHarvester" | "spiderfoot" | "exiftool")[] | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
platform: NodeJS.Platform;
|
|
23
|
+
summary: {
|
|
24
|
+
installed: number;
|
|
25
|
+
skipped: number;
|
|
26
|
+
failed: number;
|
|
27
|
+
};
|
|
28
|
+
failed: {
|
|
29
|
+
tool: string;
|
|
30
|
+
detail: string;
|
|
31
|
+
}[];
|
|
32
|
+
results: InstallResult[];
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=osint-install.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osint-install.tool.d.ts","sourceRoot":"","sources":["../../src/tools/osint-install.tool.ts"],"names":[],"mappings":"AAoFA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAoMF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkG7B,CAAC"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { execFile, spawn } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { tool } from 'ai';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { requestConfirmation } from '../runtime/confirm.js';
|
|
6
|
+
import { emitProgress } from '../runtime/progress.js';
|
|
7
|
+
import { commandExists } from './cli-runner.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
// ─── Platform helpers ────────────────────────────────────────────────────────
|
|
10
|
+
const IS_WIN = process.platform === 'win32';
|
|
11
|
+
const IS_MAC = process.platform === 'darwin';
|
|
12
|
+
const IS_LINUX = process.platform === 'linux';
|
|
13
|
+
async function confirmInstallAction(toolName, details) {
|
|
14
|
+
return requestConfirmation({
|
|
15
|
+
toolkitSlug: 'ZILMATE',
|
|
16
|
+
toolSlug: 'OSINT_INSTALL',
|
|
17
|
+
action: `Install ${toolName}`,
|
|
18
|
+
access: 'Write',
|
|
19
|
+
targetTools: ['ZILMATE_OSINT'],
|
|
20
|
+
details,
|
|
21
|
+
summary: details.join('; '),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check whether a Python module is importable.
|
|
26
|
+
* Tries `python` on Windows first (Anaconda compat), then `python3`.
|
|
27
|
+
*/
|
|
28
|
+
async function pythonModuleExists(module) {
|
|
29
|
+
const pythons = IS_WIN ? ['python', 'python3'] : ['python3', 'python'];
|
|
30
|
+
for (const py of pythons) {
|
|
31
|
+
try {
|
|
32
|
+
await execFileAsync(py, ['-c', `import ${module}`], { windowsHide: true, timeout: 8_000 });
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch { /* try next */ }
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Run a process and stream stderr/stdout back as a combined string.
|
|
41
|
+
* Resolves even on non-zero exit (many installers use non-zero for warnings).
|
|
42
|
+
*/
|
|
43
|
+
function runInstallCommand(command, args, env) {
|
|
44
|
+
return new Promise((resolve, reject) => {
|
|
45
|
+
const child = spawn(command, args, {
|
|
46
|
+
env: { ...process.env, ...env },
|
|
47
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
48
|
+
windowsHide: true,
|
|
49
|
+
shell: IS_WIN, // Required on Windows so PATH is resolved correctly
|
|
50
|
+
});
|
|
51
|
+
let output = '';
|
|
52
|
+
child.stdout.setEncoding('utf8');
|
|
53
|
+
child.stderr.setEncoding('utf8');
|
|
54
|
+
child.stdout.on('data', (c) => { output += c; });
|
|
55
|
+
child.stderr.on('data', (c) => { output += c; });
|
|
56
|
+
child.on('error', reject);
|
|
57
|
+
child.on('close', () => resolve(output));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** pip install — works on all platforms; uses `pip` on Windows, `pip3` on Unix */
|
|
61
|
+
async function pipInstall(pkg) {
|
|
62
|
+
const pip = IS_WIN ? 'pip' : 'pip3';
|
|
63
|
+
return runInstallCommand(pip, ['install', '--upgrade', pkg]);
|
|
64
|
+
}
|
|
65
|
+
/** pipx install — preferred for CLI tools; falls back gracefully */
|
|
66
|
+
async function pipxInstall(pkg) {
|
|
67
|
+
// Ensure pipx is available
|
|
68
|
+
if (!(await commandExists('pipx'))) {
|
|
69
|
+
await pipInstall('pipx');
|
|
70
|
+
}
|
|
71
|
+
return runInstallCommand('pipx', ['install', '--force', pkg]);
|
|
72
|
+
}
|
|
73
|
+
const OSINT_TOOLS = [
|
|
74
|
+
// ── Username scanners ──────────────────────────────────────────────────────
|
|
75
|
+
{
|
|
76
|
+
name: 'sherlock',
|
|
77
|
+
description: 'Username scanner across 300+ social networks',
|
|
78
|
+
check: () => commandExists('sherlock'),
|
|
79
|
+
install: async () => {
|
|
80
|
+
// pipx is the recommended method since 2025
|
|
81
|
+
return pipxInstall('sherlock-project');
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'maigret',
|
|
86
|
+
description: 'Deep username dossier across 3,000+ sites',
|
|
87
|
+
check: () => commandExists('maigret'),
|
|
88
|
+
install: async () => {
|
|
89
|
+
// pip3 install maigret is the official PyPI method
|
|
90
|
+
return pipInstall('maigret');
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: 'blackbird',
|
|
95
|
+
description: 'Username + email scanner (WhatsMyName, 600+ sites) with PDF export',
|
|
96
|
+
check: () => commandExists('blackbird'),
|
|
97
|
+
install: async () => {
|
|
98
|
+
// Blackbird ships as a Python CLI via pip
|
|
99
|
+
const out = await pipInstall('blackbird-osint');
|
|
100
|
+
return out;
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'naminter',
|
|
105
|
+
description: 'TLS-impersonation username scanner (bypasses Cloudflare)',
|
|
106
|
+
check: () => commandExists('naminter'),
|
|
107
|
+
install: async () => pipInstall('naminter'),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'linkook',
|
|
111
|
+
description: 'Recursive profile link mapper',
|
|
112
|
+
check: () => commandExists('linkook'),
|
|
113
|
+
install: async () => pipInstall('linkook'),
|
|
114
|
+
},
|
|
115
|
+
// ── Email / identity tools ─────────────────────────────────────────────────
|
|
116
|
+
{
|
|
117
|
+
name: 'holehe',
|
|
118
|
+
description: 'Silent email registration check across 120+ platforms',
|
|
119
|
+
check: () => commandExists('holehe'),
|
|
120
|
+
install: async () => {
|
|
121
|
+
// Official: pip3 install holehe
|
|
122
|
+
return pipInstall('holehe');
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
// ── Phone ──────────────────────────────────────────────────────────────────
|
|
126
|
+
{
|
|
127
|
+
name: 'phoneinfoga',
|
|
128
|
+
description: 'International phone number intelligence scanner',
|
|
129
|
+
check: () => commandExists('phoneinfoga'),
|
|
130
|
+
install: async () => {
|
|
131
|
+
if (IS_MAC) {
|
|
132
|
+
// Homebrew is the cleanest Mac install
|
|
133
|
+
if (await commandExists('brew')) {
|
|
134
|
+
return runInstallCommand('brew', ['install', 'sundowndev/tap/phoneinfoga']);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (IS_LINUX) {
|
|
138
|
+
// Official bash installer (fetches the right binary for arch)
|
|
139
|
+
return runInstallCommand('bash', [
|
|
140
|
+
'-c',
|
|
141
|
+
'bash <( curl -sSL https://raw.githubusercontent.com/sundowndev/phoneinfoga/master/support/scripts/install )',
|
|
142
|
+
]);
|
|
143
|
+
}
|
|
144
|
+
if (IS_WIN) {
|
|
145
|
+
// Windows: download the .exe via PowerShell into %USERPROFILE%\bin
|
|
146
|
+
return runInstallCommand('powershell.exe', [
|
|
147
|
+
'-NoProfile',
|
|
148
|
+
'-Command',
|
|
149
|
+
`
|
|
150
|
+
$dir = "$env:USERPROFILE\\bin"
|
|
151
|
+
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
152
|
+
$url = "https://github.com/sundowndev/phoneinfoga/releases/latest/download/phoneinfoga_Windows_x86_64.zip"
|
|
153
|
+
$zip = "$env:TEMP\\phoneinfoga.zip"
|
|
154
|
+
Invoke-WebRequest -Uri $url -OutFile $zip
|
|
155
|
+
Expand-Archive -Path $zip -DestinationPath $dir -Force
|
|
156
|
+
Write-Output "PhoneInfoga extracted to $dir — ensure $dir is on your PATH"
|
|
157
|
+
`.trim(),
|
|
158
|
+
]);
|
|
159
|
+
}
|
|
160
|
+
return 'Unsupported platform for PhoneInfoga auto-install. See: https://sundowndev.github.io/phoneinfoga/getting-started/install/';
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
// ── Domain recon ──────────────────────────────────────────────────────────
|
|
164
|
+
{
|
|
165
|
+
name: 'theHarvester',
|
|
166
|
+
description: 'Domain email/subdomain/employee harvester',
|
|
167
|
+
check: () => commandExists('theHarvester'),
|
|
168
|
+
install: async () => {
|
|
169
|
+
if (IS_LINUX || IS_MAC) {
|
|
170
|
+
// Clone & pip-install is the most reliable method (apt version often lags)
|
|
171
|
+
const out = await runInstallCommand('bash', [
|
|
172
|
+
'-c',
|
|
173
|
+
[
|
|
174
|
+
'git clone https://github.com/laramies/theHarvester /tmp/theHarvester 2>&1 || true',
|
|
175
|
+
'cd /tmp/theHarvester',
|
|
176
|
+
'pip3 install -r requirements/base.txt',
|
|
177
|
+
'pip3 install -e .',
|
|
178
|
+
].join(' && '),
|
|
179
|
+
]);
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
if (IS_WIN) {
|
|
183
|
+
return runInstallCommand('powershell.exe', [
|
|
184
|
+
'-NoProfile', '-Command',
|
|
185
|
+
'git clone https://github.com/laramies/theHarvester $env:TEMP\\theHarvester; cd $env:TEMP\\theHarvester; pip install -r requirements/base.txt; pip install -e .',
|
|
186
|
+
]);
|
|
187
|
+
}
|
|
188
|
+
return pipInstall('theHarvester');
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
// ── Frameworks ────────────────────────────────────────────────────────────
|
|
192
|
+
{
|
|
193
|
+
name: 'spiderfoot',
|
|
194
|
+
description: 'Automated reconnaissance framework (200+ modules)',
|
|
195
|
+
check: () => pythonModuleExists('spiderfoot'),
|
|
196
|
+
install: async () => {
|
|
197
|
+
if (IS_WIN || IS_MAC || IS_LINUX) {
|
|
198
|
+
// Clone SpiderFoot — pip package may be stale
|
|
199
|
+
const out = await runInstallCommand('bash', [
|
|
200
|
+
'-c',
|
|
201
|
+
[
|
|
202
|
+
'git clone https://github.com/smicallef/spiderfoot /tmp/spiderfoot 2>&1 || true',
|
|
203
|
+
'cd /tmp/spiderfoot',
|
|
204
|
+
'pip3 install -r requirements.txt',
|
|
205
|
+
].join(' && '),
|
|
206
|
+
]);
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
return pipInstall('spiderfoot');
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
// ── File forensics ────────────────────────────────────────────────────────
|
|
213
|
+
{
|
|
214
|
+
name: 'exiftool',
|
|
215
|
+
description: 'File metadata extractor (GPS, camera serial, author, etc.)',
|
|
216
|
+
check: () => commandExists('exiftool'),
|
|
217
|
+
install: async () => {
|
|
218
|
+
if (IS_WIN) {
|
|
219
|
+
// Chocolatey is the easiest Windows path
|
|
220
|
+
if (await commandExists('choco')) {
|
|
221
|
+
return runInstallCommand('choco', ['install', 'exiftool', '-y']);
|
|
222
|
+
}
|
|
223
|
+
// Winget fallback
|
|
224
|
+
if (await commandExists('winget')) {
|
|
225
|
+
return runInstallCommand('winget', ['install', '--id', 'OliverBetz.ExifTool', '--accept-package-agreements', '--accept-source-agreements']);
|
|
226
|
+
}
|
|
227
|
+
return 'Install ExifTool manually: https://exiftool.org/#download (add exiftool.exe to PATH)';
|
|
228
|
+
}
|
|
229
|
+
if (IS_MAC) {
|
|
230
|
+
if (await commandExists('brew')) {
|
|
231
|
+
return runInstallCommand('brew', ['install', 'exiftool']);
|
|
232
|
+
}
|
|
233
|
+
return 'Install Homebrew first: https://brew.sh, then run: brew install exiftool';
|
|
234
|
+
}
|
|
235
|
+
// Linux: apt
|
|
236
|
+
return runInstallCommand('sudo', ['apt-get', 'install', '-y', 'libimage-exiftool-perl']);
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
// ── Shodan CLI ────────────────────────────────────────────────────────────
|
|
240
|
+
{
|
|
241
|
+
name: 'shodan',
|
|
242
|
+
description: 'Shodan CLI for querying open ports, services, CVEs',
|
|
243
|
+
check: () => commandExists('shodan'),
|
|
244
|
+
install: async () => pipInstall('shodan'),
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
// ─── Exported tools ──────────────────────────────────────────────────────────
|
|
248
|
+
export const osintInstallTools = {
|
|
249
|
+
checkOsintTools: tool({
|
|
250
|
+
description: 'Check which OSINT tools are already installed on this machine. Always run this before installing to see what is missing.',
|
|
251
|
+
inputSchema: z.object({}),
|
|
252
|
+
execute: async () => {
|
|
253
|
+
const checks = await Promise.all(OSINT_TOOLS.map(async (entry) => ({
|
|
254
|
+
tool: entry.name,
|
|
255
|
+
description: entry.description,
|
|
256
|
+
available: await entry.check(),
|
|
257
|
+
})));
|
|
258
|
+
const available = checks.filter((c) => c.available).map((c) => c.tool);
|
|
259
|
+
const missing = checks.filter((c) => !c.available).map((c) => c.tool);
|
|
260
|
+
return {
|
|
261
|
+
platform: process.platform,
|
|
262
|
+
available,
|
|
263
|
+
missing,
|
|
264
|
+
readyForInvestigation: missing.length === 0,
|
|
265
|
+
details: checks,
|
|
266
|
+
};
|
|
267
|
+
},
|
|
268
|
+
}),
|
|
269
|
+
installOsintTools: tool({
|
|
270
|
+
description: 'Install OSINT tools on this machine. Works cross-platform (Windows/macOS/Linux). Skips tools already present. Optionally target a subset. Run checkOsintTools first.',
|
|
271
|
+
inputSchema: z.object({
|
|
272
|
+
tools: z
|
|
273
|
+
.array(z.enum([
|
|
274
|
+
'sherlock', 'maigret', 'blackbird', 'naminter', 'linkook',
|
|
275
|
+
'holehe', 'phoneinfoga', 'theHarvester', 'spiderfoot', 'exiftool', 'shodan',
|
|
276
|
+
]))
|
|
277
|
+
.optional()
|
|
278
|
+
.describe('Subset to install. Omit to install everything missing.'),
|
|
279
|
+
force: z
|
|
280
|
+
.boolean()
|
|
281
|
+
.optional()
|
|
282
|
+
.default(false)
|
|
283
|
+
.describe('If true, reinstalls even tools already present.'),
|
|
284
|
+
}),
|
|
285
|
+
execute: async ({ tools: subset, force }) => {
|
|
286
|
+
const targets = subset
|
|
287
|
+
? OSINT_TOOLS.filter((t) => subset.includes(t.name))
|
|
288
|
+
: OSINT_TOOLS;
|
|
289
|
+
const results = [];
|
|
290
|
+
for (const entry of targets) {
|
|
291
|
+
emitProgress({ type: 'tool:start', label: `Checking ${entry.name}` });
|
|
292
|
+
const exists = await entry.check();
|
|
293
|
+
if (exists && !force) {
|
|
294
|
+
results.push({ tool: entry.name, status: 'already_present', detail: 'Found on PATH — skipped.' });
|
|
295
|
+
emitProgress({ type: 'tool:end', label: `${entry.name} already installed` });
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
const approved = await confirmInstallAction(entry.name, [
|
|
299
|
+
`Platform: ${process.platform}`,
|
|
300
|
+
`Tool: ${entry.name}`,
|
|
301
|
+
entry.description,
|
|
302
|
+
'Uses pip3/pipx (Python tools), brew (macOS), apt (Linux), choco/winget (Windows)',
|
|
303
|
+
'Network access required — downloads packages from PyPI and GitHub',
|
|
304
|
+
]);
|
|
305
|
+
if (!approved) {
|
|
306
|
+
results.push({ tool: entry.name, status: 'failed', detail: 'User declined installation.' });
|
|
307
|
+
emitProgress({ type: 'tool:end', label: `${entry.name} skipped` });
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
try {
|
|
311
|
+
emitProgress({ type: 'tool:start', label: `Installing ${entry.name}`, detail: entry.description });
|
|
312
|
+
const output = await entry.install();
|
|
313
|
+
results.push({ tool: entry.name, status: 'installed', detail: output.slice(0, 400) });
|
|
314
|
+
emitProgress({ type: 'tool:end', label: `${entry.name} installed` });
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
318
|
+
results.push({ tool: entry.name, status: 'failed', detail });
|
|
319
|
+
emitProgress({ type: 'tool:end', label: `${entry.name} failed` });
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
const installed = results.filter((r) => r.status === 'installed').length;
|
|
323
|
+
const skipped = results.filter((r) => r.status === 'already_present').length;
|
|
324
|
+
const failed = results.filter((r) => r.status === 'failed');
|
|
325
|
+
return {
|
|
326
|
+
platform: process.platform,
|
|
327
|
+
summary: { installed, skipped, failed: failed.length },
|
|
328
|
+
failed: failed.map((f) => ({ tool: f.tool, detail: f.detail })),
|
|
329
|
+
results,
|
|
330
|
+
};
|
|
331
|
+
},
|
|
332
|
+
}),
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=osint-install.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osint-install.tool.js","sourceRoot":"","sources":["../../src/tools/osint-install.tool.ts"],"names":[],"mappings":"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"}
|