imperium-crawl 2.2.0 → 2.3.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/.env.example +49 -0
- package/README.md +35 -22
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/stealth/browser-pool.d.ts.map +1 -1
- package/dist/stealth/browser-pool.js +12 -6
- package/dist/stealth/browser-pool.js.map +1 -1
- package/dist/tools/download.d.ts +39 -0
- package/dist/tools/download.d.ts.map +1 -0
- package/dist/tools/download.js +375 -0
- package/dist/tools/download.js.map +1 -0
- package/dist/tools/image-search.d.ts.map +1 -1
- package/dist/tools/image-search.js +3 -11
- package/dist/tools/image-search.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/instagram.d.ts.map +1 -1
- package/dist/tools/instagram.js +16 -16
- package/dist/tools/instagram.js.map +1 -1
- package/dist/tools/manifest.d.ts.map +1 -1
- package/dist/tools/manifest.js +10 -1
- package/dist/tools/manifest.js.map +1 -1
- package/dist/tools/news-search.d.ts.map +1 -1
- package/dist/tools/news-search.js +3 -11
- package/dist/tools/news-search.js.map +1 -1
- package/dist/tools/reddit.d.ts.map +1 -1
- package/dist/tools/reddit.js +18 -15
- package/dist/tools/reddit.js.map +1 -1
- package/dist/tools/rss.d.ts +27 -0
- package/dist/tools/rss.d.ts.map +1 -0
- package/dist/tools/rss.js +123 -0
- package/dist/tools/rss.js.map +1 -0
- package/dist/tools/run-skill.d.ts.map +1 -1
- package/dist/tools/run-skill.js +1 -3
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +3 -11
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/video-search.d.ts.map +1 -1
- package/dist/tools/video-search.js +3 -11
- package/dist/tools/video-search.js.map +1 -1
- package/dist/tools/youtube.d.ts +4 -4
- package/dist/tools/youtube.d.ts.map +1 -1
- package/dist/tools/youtube.js +102 -21
- package/dist/tools/youtube.js.map +1 -1
- package/dist/utils/debug.d.ts +2 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +6 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/tool-response.d.ts +13 -0
- package/dist/utils/tool-response.d.ts.map +1 -0
- package/dist/utils/tool-response.js +7 -0
- package/dist/utils/tool-response.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { promises as fs } from "fs";
|
|
3
|
+
import { join, basename, extname } from "path";
|
|
4
|
+
import { MAX_URL_LENGTH } from "../constants.js";
|
|
5
|
+
import { smartFetch } from "../stealth/index.js";
|
|
6
|
+
import { isPlaywrightAvailable } from "../stealth/browser.js";
|
|
7
|
+
import { acquirePage } from "../stealth/chrome-profile.js";
|
|
8
|
+
import { toolResult, errorResult } from "../utils/tool-response.js";
|
|
9
|
+
import { debugLog } from "../utils/debug.js";
|
|
10
|
+
import * as cheerio from "cheerio";
|
|
11
|
+
export const name = "download";
|
|
12
|
+
export const description = "Download media files (images, videos) from URLs. Supports direct files, page media extraction, YouTube, TikTok, and bulk downloads.";
|
|
13
|
+
export const schema = z.object({
|
|
14
|
+
url: z.string().max(MAX_URL_LENGTH).optional().describe("URL to download from (page, direct file, or video)"),
|
|
15
|
+
urls: z.string().optional().describe("Comma-separated list of URLs for bulk download"),
|
|
16
|
+
file: z.string().optional().describe("Path to text file with one URL per line for bulk download"),
|
|
17
|
+
output: z.string().describe("Output directory for downloaded files"),
|
|
18
|
+
images: z.boolean().default(false).describe("Download all images from the page"),
|
|
19
|
+
og_only: z.boolean().default(false).describe("Download only og:image / twitter:image from the page"),
|
|
20
|
+
video: z.boolean().default(false).describe("Download video elements from the page"),
|
|
21
|
+
all: z.boolean().default(false).describe("Download all media (images + video) from the page"),
|
|
22
|
+
});
|
|
23
|
+
const MEDIA_EXTENSIONS = new Set([
|
|
24
|
+
".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg", ".ico", ".bmp", ".avif",
|
|
25
|
+
".mp4", ".webm", ".mov", ".avi", ".mkv", ".mp3", ".wav", ".ogg", ".flac",
|
|
26
|
+
]);
|
|
27
|
+
function detectUrlType(url) {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = new URL(url);
|
|
30
|
+
const host = parsed.hostname.toLowerCase();
|
|
31
|
+
if (host.includes("youtube.com") || host.includes("youtu.be"))
|
|
32
|
+
return "youtube";
|
|
33
|
+
if (host.includes("tiktok.com"))
|
|
34
|
+
return "tiktok";
|
|
35
|
+
const ext = extname(parsed.pathname).toLowerCase().split("?")[0];
|
|
36
|
+
if (MEDIA_EXTENSIONS.has(ext))
|
|
37
|
+
return "direct-media";
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
return "webpage";
|
|
41
|
+
}
|
|
42
|
+
function sanitizeFilename(name) {
|
|
43
|
+
return name
|
|
44
|
+
.replace(/[^a-zA-Z0-9._-]/g, "-")
|
|
45
|
+
.replace(/-+/g, "-")
|
|
46
|
+
.replace(/^-|-$/g, "")
|
|
47
|
+
.substring(0, 200);
|
|
48
|
+
}
|
|
49
|
+
async function ensureDir(dir) {
|
|
50
|
+
await fs.mkdir(dir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
async function downloadDirect(url, outputDir, filenameHint) {
|
|
53
|
+
const response = await fetch(url, {
|
|
54
|
+
signal: AbortSignal.timeout(60_000),
|
|
55
|
+
redirect: "follow",
|
|
56
|
+
});
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
throw new Error(`HTTP ${response.status} downloading ${url}`);
|
|
59
|
+
}
|
|
60
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
61
|
+
const contentType = response.headers.get("content-type") || "";
|
|
62
|
+
// Determine filename
|
|
63
|
+
let filename;
|
|
64
|
+
if (filenameHint) {
|
|
65
|
+
filename = sanitizeFilename(filenameHint);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const urlPath = new URL(url).pathname;
|
|
69
|
+
const base = basename(urlPath);
|
|
70
|
+
if (base && base.includes(".")) {
|
|
71
|
+
filename = sanitizeFilename(base);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
const ext = contentType.includes("png") ? ".png"
|
|
75
|
+
: contentType.includes("gif") ? ".gif"
|
|
76
|
+
: contentType.includes("webp") ? ".webp"
|
|
77
|
+
: contentType.includes("svg") ? ".svg"
|
|
78
|
+
: contentType.includes("mp4") ? ".mp4"
|
|
79
|
+
: contentType.includes("webm") ? ".webm"
|
|
80
|
+
: ".jpg";
|
|
81
|
+
filename = `download-${Date.now()}${ext}`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
await ensureDir(outputDir);
|
|
85
|
+
const filePath = join(outputDir, filename);
|
|
86
|
+
// Avoid overwrite — append counter if file exists
|
|
87
|
+
let finalPath = filePath;
|
|
88
|
+
let counter = 1;
|
|
89
|
+
while (true) {
|
|
90
|
+
try {
|
|
91
|
+
await fs.access(finalPath);
|
|
92
|
+
const ext = extname(filePath);
|
|
93
|
+
const base = filePath.slice(0, -ext.length);
|
|
94
|
+
finalPath = `${base}-${counter}${ext}`;
|
|
95
|
+
counter++;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
break; // file doesn't exist, good
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
await fs.writeFile(finalPath, buffer);
|
|
102
|
+
return { path: finalPath, size: buffer.length, source: url };
|
|
103
|
+
}
|
|
104
|
+
function extractMediaUrls(html, pageUrl) {
|
|
105
|
+
const $ = cheerio.load(html);
|
|
106
|
+
const base = new URL(pageUrl);
|
|
107
|
+
const resolve = (href) => {
|
|
108
|
+
if (!href || href.startsWith("data:"))
|
|
109
|
+
return null;
|
|
110
|
+
try {
|
|
111
|
+
return new URL(href, base).href;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const images = [];
|
|
118
|
+
const ogImages = [];
|
|
119
|
+
const videos = [];
|
|
120
|
+
const seen = new Set();
|
|
121
|
+
// og:image, twitter:image
|
|
122
|
+
$('meta[property="og:image"], meta[name="twitter:image"]').each((_, el) => {
|
|
123
|
+
const content = $(el).attr("content");
|
|
124
|
+
const url = content ? resolve(content) : null;
|
|
125
|
+
if (url && !seen.has(url)) {
|
|
126
|
+
seen.add(url);
|
|
127
|
+
ogImages.push(url);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
// <img> tags
|
|
131
|
+
$("img").each((_, el) => {
|
|
132
|
+
const src = $(el).attr("src") || $(el).attr("data-src") || $(el).attr("data-lazy-src");
|
|
133
|
+
const url = src ? resolve(src) : null;
|
|
134
|
+
if (url && !seen.has(url)) {
|
|
135
|
+
seen.add(url);
|
|
136
|
+
images.push(url);
|
|
137
|
+
}
|
|
138
|
+
// Also check srcset
|
|
139
|
+
const srcset = $(el).attr("srcset");
|
|
140
|
+
if (srcset) {
|
|
141
|
+
const urls = srcset.split(",").map((s) => s.trim().split(/\s+/)[0]);
|
|
142
|
+
for (const u of urls) {
|
|
143
|
+
const resolved = resolve(u);
|
|
144
|
+
if (resolved && !seen.has(resolved)) {
|
|
145
|
+
seen.add(resolved);
|
|
146
|
+
images.push(resolved);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// <video> and <source> tags
|
|
152
|
+
$("video").each((_, el) => {
|
|
153
|
+
const src = $(el).attr("src");
|
|
154
|
+
const url = src ? resolve(src) : null;
|
|
155
|
+
if (url && !seen.has(url)) {
|
|
156
|
+
seen.add(url);
|
|
157
|
+
videos.push(url);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
$("video source").each((_, el) => {
|
|
161
|
+
const src = $(el).attr("src");
|
|
162
|
+
const url = src ? resolve(src) : null;
|
|
163
|
+
if (url && !seen.has(url)) {
|
|
164
|
+
seen.add(url);
|
|
165
|
+
videos.push(url);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
return { images, ogImages, videos };
|
|
169
|
+
}
|
|
170
|
+
// ── YouTube Download ──
|
|
171
|
+
async function downloadYouTube(url, outputDir) {
|
|
172
|
+
const ytdl = (await import("@distube/ytdl-core")).default;
|
|
173
|
+
const info = await ytdl.getInfo(url);
|
|
174
|
+
const title = sanitizeFilename(info.videoDetails.title || `youtube-${info.videoDetails.videoId}`);
|
|
175
|
+
// Pick best format with both audio and video, preferring mp4
|
|
176
|
+
const format = ytdl.chooseFormat(info.formats, {
|
|
177
|
+
quality: "highest",
|
|
178
|
+
filter: (f) => f.hasVideo && f.hasAudio && f.container === "mp4",
|
|
179
|
+
}) || ytdl.chooseFormat(info.formats, {
|
|
180
|
+
quality: "highest",
|
|
181
|
+
filter: (f) => f.hasVideo && f.hasAudio,
|
|
182
|
+
});
|
|
183
|
+
if (!format) {
|
|
184
|
+
throw new Error("No suitable video format found");
|
|
185
|
+
}
|
|
186
|
+
// Download using fetch with the format URL
|
|
187
|
+
const response = await fetch(format.url, {
|
|
188
|
+
signal: AbortSignal.timeout(300_000), // 5 min timeout for large files
|
|
189
|
+
redirect: "follow",
|
|
190
|
+
});
|
|
191
|
+
if (!response.ok) {
|
|
192
|
+
throw new Error(`HTTP ${response.status} downloading YouTube video`);
|
|
193
|
+
}
|
|
194
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
195
|
+
const ext = format.container === "webm" ? ".webm" : ".mp4";
|
|
196
|
+
const filename = `${title}${ext}`;
|
|
197
|
+
await ensureDir(outputDir);
|
|
198
|
+
const filePath = join(outputDir, filename);
|
|
199
|
+
await fs.writeFile(filePath, buffer);
|
|
200
|
+
return { path: filePath, size: buffer.length, source: url };
|
|
201
|
+
}
|
|
202
|
+
// ── TikTok Download ──
|
|
203
|
+
async function downloadTikTok(url, outputDir) {
|
|
204
|
+
if (!(await isPlaywrightAvailable())) {
|
|
205
|
+
throw new Error("rebrowser-playwright is required for TikTok downloads. Install with: npm i rebrowser-playwright");
|
|
206
|
+
}
|
|
207
|
+
const handle = await acquirePage();
|
|
208
|
+
try {
|
|
209
|
+
const { page } = handle;
|
|
210
|
+
await page.goto(url, { waitUntil: "load", timeout: 30_000 });
|
|
211
|
+
await page.waitForTimeout(3000);
|
|
212
|
+
// Extract video src from the page
|
|
213
|
+
const videoSrc = await page.evaluate(() => {
|
|
214
|
+
const video = document.querySelector("video");
|
|
215
|
+
if (video?.src)
|
|
216
|
+
return video.src;
|
|
217
|
+
const source = document.querySelector("video source");
|
|
218
|
+
if (source && source.src)
|
|
219
|
+
return source.src;
|
|
220
|
+
return null;
|
|
221
|
+
});
|
|
222
|
+
if (!videoSrc) {
|
|
223
|
+
throw new Error("Could not find video element on TikTok page");
|
|
224
|
+
}
|
|
225
|
+
// Download from browser context (may have session cookies)
|
|
226
|
+
const videoBase64 = await page.evaluate(async (src) => {
|
|
227
|
+
const resp = await fetch(src);
|
|
228
|
+
if (!resp.ok)
|
|
229
|
+
return null;
|
|
230
|
+
const buf = await resp.arrayBuffer();
|
|
231
|
+
const bytes = new Uint8Array(buf);
|
|
232
|
+
let binary = "";
|
|
233
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
234
|
+
binary += String.fromCharCode(bytes[i]);
|
|
235
|
+
}
|
|
236
|
+
return btoa(binary);
|
|
237
|
+
}, videoSrc);
|
|
238
|
+
if (!videoBase64) {
|
|
239
|
+
throw new Error("Failed to download TikTok video data");
|
|
240
|
+
}
|
|
241
|
+
const buffer = Buffer.from(videoBase64, "base64");
|
|
242
|
+
// Extract video ID from URL
|
|
243
|
+
const match = url.match(/video\/(\d+)/);
|
|
244
|
+
const videoId = match ? match[1] : Date.now().toString();
|
|
245
|
+
const filename = `tiktok-${videoId}.mp4`;
|
|
246
|
+
await ensureDir(outputDir);
|
|
247
|
+
const filePath = join(outputDir, filename);
|
|
248
|
+
await fs.writeFile(filePath, buffer);
|
|
249
|
+
return { path: filePath, size: buffer.length, source: url };
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
await handle.cleanup();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// ── Execute ──
|
|
256
|
+
export async function execute(input) {
|
|
257
|
+
try {
|
|
258
|
+
// Collect URLs for bulk mode
|
|
259
|
+
let urls = [];
|
|
260
|
+
if (input.urls) {
|
|
261
|
+
urls = input.urls.split(",").map((u) => u.trim()).filter(Boolean);
|
|
262
|
+
}
|
|
263
|
+
else if (input.file) {
|
|
264
|
+
const content = await fs.readFile(input.file, "utf-8");
|
|
265
|
+
urls = content.split("\n").map((l) => l.trim()).filter((l) => l && !l.startsWith("#"));
|
|
266
|
+
}
|
|
267
|
+
else if (input.url) {
|
|
268
|
+
urls = [input.url];
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
return errorResult("Provide --url, --urls, or --file");
|
|
272
|
+
}
|
|
273
|
+
if (urls.length === 0) {
|
|
274
|
+
return errorResult("No valid URLs provided");
|
|
275
|
+
}
|
|
276
|
+
const results = [];
|
|
277
|
+
const errors = [];
|
|
278
|
+
for (const url of urls) {
|
|
279
|
+
try {
|
|
280
|
+
const type = detectUrlType(url);
|
|
281
|
+
debugLog("download", `Processing ${url} (type: ${type})`);
|
|
282
|
+
switch (type) {
|
|
283
|
+
case "youtube": {
|
|
284
|
+
const r = await downloadYouTube(url, input.output);
|
|
285
|
+
results.push(r);
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
case "tiktok": {
|
|
289
|
+
const r = await downloadTikTok(url, input.output);
|
|
290
|
+
results.push(r);
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
case "direct-media": {
|
|
294
|
+
const r = await downloadDirect(url, input.output);
|
|
295
|
+
results.push(r);
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
case "webpage": {
|
|
299
|
+
// Fetch page and extract media
|
|
300
|
+
const pageResult = await smartFetch(url, { maxLevel: 2 });
|
|
301
|
+
const media = extractMediaUrls(pageResult.html, pageResult.url);
|
|
302
|
+
let toDownload = [];
|
|
303
|
+
if (input.og_only) {
|
|
304
|
+
toDownload = media.ogImages;
|
|
305
|
+
}
|
|
306
|
+
else if (input.images) {
|
|
307
|
+
toDownload = [...media.ogImages, ...media.images];
|
|
308
|
+
}
|
|
309
|
+
else if (input.video) {
|
|
310
|
+
toDownload = media.videos;
|
|
311
|
+
}
|
|
312
|
+
else if (input.all) {
|
|
313
|
+
toDownload = [...media.ogImages, ...media.images, ...media.videos];
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
// Default: og:image if available, else first few images
|
|
317
|
+
toDownload = media.ogImages.length > 0 ? media.ogImages : media.images.slice(0, 5);
|
|
318
|
+
}
|
|
319
|
+
if (toDownload.length === 0) {
|
|
320
|
+
errors.push({ url, error: "No media found on page" });
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
// Download in sequence to avoid overwhelming target server
|
|
324
|
+
let count = 0;
|
|
325
|
+
for (const mediaUrl of toDownload) {
|
|
326
|
+
try {
|
|
327
|
+
count++;
|
|
328
|
+
const hostname = new URL(url).hostname.replace(/^www\./, "");
|
|
329
|
+
const hint = `${sanitizeFilename(hostname)}-${count}${extname(new URL(mediaUrl).pathname) || ".jpg"}`;
|
|
330
|
+
const r = await downloadDirect(mediaUrl, input.output, hint);
|
|
331
|
+
results.push(r);
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
debugLog("download", `Failed to download ${mediaUrl}`, err);
|
|
335
|
+
errors.push({ url: mediaUrl, error: err instanceof Error ? err.message : String(err) });
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
debugLog("download", `Failed to process ${url}`, err);
|
|
344
|
+
errors.push({ url, error: err instanceof Error ? err.message : String(err) });
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const totalSize = results.reduce((sum, r) => sum + r.size, 0);
|
|
348
|
+
return toolResult({
|
|
349
|
+
downloaded: results.length,
|
|
350
|
+
failed: errors.length,
|
|
351
|
+
total_size: totalSize,
|
|
352
|
+
total_size_human: formatSize(totalSize),
|
|
353
|
+
files: results.map((r) => ({
|
|
354
|
+
path: r.path,
|
|
355
|
+
size: r.size,
|
|
356
|
+
size_human: formatSize(r.size),
|
|
357
|
+
source: r.source,
|
|
358
|
+
})),
|
|
359
|
+
...(errors.length > 0 ? { errors } : {}),
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function formatSize(bytes) {
|
|
367
|
+
if (bytes < 1024)
|
|
368
|
+
return `${bytes}B`;
|
|
369
|
+
if (bytes < 1024 * 1024)
|
|
370
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
371
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
372
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
373
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/tools/download.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-search.d.ts","sourceRoot":"","sources":["../../src/tools/image-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"image-search.d.ts","sourceRoot":"","sources":["../../src/tools/image-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,IAAI,iBAAiB,CAAC;AAEnC,eAAO,MAAM,WAAW,sEAAsE,CAAC;AAE/F,eAAO,MAAM,MAAM;;;;;;;;;;;;EAIjB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAEtD,wBAAsB,OAAO,CAAC,KAAK,EAAE,gBAAgB;;;;;GAYpD"}
|
|
@@ -2,6 +2,7 @@ import { z } from "zod";
|
|
|
2
2
|
import { issueRequest } from "../brave-api/index.js";
|
|
3
3
|
import { hasBraveApiKey } from "../config.js";
|
|
4
4
|
import { MAX_QUERY_LENGTH } from "../constants.js";
|
|
5
|
+
import { toolResult, errorResult } from "../utils/tool-response.js";
|
|
5
6
|
export const name = "image_search";
|
|
6
7
|
export const description = "Search for images using Brave Search API. Requires BRAVE_API_KEY.";
|
|
7
8
|
export const schema = z.object({
|
|
@@ -11,22 +12,13 @@ export const schema = z.object({
|
|
|
11
12
|
});
|
|
12
13
|
export async function execute(input) {
|
|
13
14
|
if (!hasBraveApiKey()) {
|
|
14
|
-
return
|
|
15
|
-
content: [
|
|
16
|
-
{
|
|
17
|
-
type: "text",
|
|
18
|
-
text: JSON.stringify({ error: "BRAVE_API_KEY is required for image search." }),
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
};
|
|
15
|
+
return errorResult("BRAVE_API_KEY is required for image search.");
|
|
22
16
|
}
|
|
23
17
|
const data = await issueRequest(process.env.BRAVE_API_KEY, "/images/search", {
|
|
24
18
|
q: input.query,
|
|
25
19
|
count: input.count,
|
|
26
20
|
country: input.country,
|
|
27
21
|
});
|
|
28
|
-
return
|
|
29
|
-
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
30
|
-
};
|
|
22
|
+
return toolResult(data);
|
|
31
23
|
}
|
|
32
24
|
//# sourceMappingURL=image-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-search.js","sourceRoot":"","sources":["../../src/tools/image-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"image-search.js","sourceRoot":"","sources":["../../src/tools/image-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAC;AAEnC,MAAM,CAAC,MAAM,WAAW,GAAG,mEAAmE,CAAC;AAE/F,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC7E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC1E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;CAChE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAuB;IACnD,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC,6CAA6C,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,aAAc,EAAE,gBAAgB,EAAE;QAC5E,CAAC,EAAE,KAAK,CAAC,KAAK;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA+BxB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;IAElB,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CACzH;AAED,eAAO,MAAM,QAAQ,EAAE,cAAc,EAsCpC,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -24,6 +24,8 @@ import * as deleteJob from "./delete-job.js";
|
|
|
24
24
|
import * as youtube from "./youtube.js";
|
|
25
25
|
import * as reddit from "./reddit.js";
|
|
26
26
|
import * as instagram from "./instagram.js";
|
|
27
|
+
import * as download from "./download.js";
|
|
28
|
+
import * as rss from "./rss.js";
|
|
27
29
|
export const allTools = [
|
|
28
30
|
// Scraping tools (no API key needed)
|
|
29
31
|
scrape,
|
|
@@ -59,5 +61,8 @@ export const allTools = [
|
|
|
59
61
|
youtube,
|
|
60
62
|
reddit,
|
|
61
63
|
instagram,
|
|
64
|
+
// Media & feeds
|
|
65
|
+
download,
|
|
66
|
+
rss,
|
|
62
67
|
];
|
|
63
68
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,UAAU,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAUhC,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACxC,qCAAqC;IACrC,MAAwB;IACxB,KAAuB;IACvB,GAAqB;IACrB,OAAyB;IACzB,WAA6B;IAC7B,UAA4B;IAC5B,sCAAsC;IACtC,MAAwB;IACxB,UAA4B;IAC5B,WAA6B;IAC7B,WAA6B;IAC7B,eAAe;IACf,WAA6B;IAC7B,QAA0B;IAC1B,UAA4B;IAC5B,sDAAsD;IACtD,YAA8B;IAC9B,QAA0B;IAC1B,gBAAkC;IAClC,oCAAoC;IACpC,SAA2B;IAC3B,kDAAkD;IAClD,QAA0B;IAC1B,QAA0B;IAC1B,mBAAmB;IACnB,WAA6B;IAC7B,QAA0B;IAC1B,SAA2B;IAC3B,SAA2B;IAC3B,yCAAyC;IACzC,OAAyB;IACzB,MAAwB;IACxB,SAA2B;IAC3B,gBAAgB;IAChB,QAA0B;IAC1B,GAAqB;CACtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"instagram.d.ts","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,IAAI,cAAc,CAAC;AAEhC,eAAO,MAAM,WAAW,+JACsI,CAAC;AAI/J,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBjB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAubpD,wBAAsB,OAAO,CAAC,KAAK,EAAE,cAAc;;;;;GA4DlD"}
|
package/dist/tools/instagram.js
CHANGED
|
@@ -4,6 +4,8 @@ import { issueRequest } from "../brave-api/index.js";
|
|
|
4
4
|
import { hasBraveApiKey } from "../config.js";
|
|
5
5
|
import { MAX_QUERY_LENGTH, MAX_ITEMS } from "../constants.js";
|
|
6
6
|
import { parseCompactNumber, sanitizeText, extractScriptJson } from "../social/parsers.js";
|
|
7
|
+
import { toolResult, errorResult } from "../utils/tool-response.js";
|
|
8
|
+
import { debugLog } from "../utils/debug.js";
|
|
7
9
|
export const name = "instagram";
|
|
8
10
|
export const description = "Search Instagram profiles, get profile details with engagement metrics, and discover influencers by niche/location. Search/discover require BRAVE_API_KEY.";
|
|
9
11
|
const ActionEnum = z.enum(["search", "profile", "discover"]);
|
|
@@ -84,8 +86,8 @@ async function searchProfiles(query, location, limit = 20) {
|
|
|
84
86
|
const results = data?.web?.results || [];
|
|
85
87
|
allUrls.push(...results.map((r) => r.url).filter(Boolean));
|
|
86
88
|
}
|
|
87
|
-
catch {
|
|
88
|
-
|
|
89
|
+
catch (err) {
|
|
90
|
+
debugLog("instagram", `Brave search query failed: ${q}`, err);
|
|
89
91
|
}
|
|
90
92
|
// Respect Brave rate limit (Free: 1 req/sec)
|
|
91
93
|
if (queries.indexOf(q) < queries.length - 1) {
|
|
@@ -116,7 +118,8 @@ async function fetchProfileViaApi(username) {
|
|
|
116
118
|
try {
|
|
117
119
|
data = await res.json();
|
|
118
120
|
}
|
|
119
|
-
catch {
|
|
121
|
+
catch (err) {
|
|
122
|
+
debugLog("instagram", `API JSON parse failed for @${username}`, err);
|
|
120
123
|
return null;
|
|
121
124
|
}
|
|
122
125
|
if (data?.status === "fail" || !data?.data?.user)
|
|
@@ -147,7 +150,8 @@ async function fetchProfileViaWeb(username) {
|
|
|
147
150
|
}
|
|
148
151
|
return null;
|
|
149
152
|
}
|
|
150
|
-
catch {
|
|
153
|
+
catch (err) {
|
|
154
|
+
debugLog("instagram", `Web scrape failed for @${username}`, err);
|
|
151
155
|
return null;
|
|
152
156
|
}
|
|
153
157
|
}
|
|
@@ -291,8 +295,8 @@ async function fetchProfile(username) {
|
|
|
291
295
|
if (profile)
|
|
292
296
|
return profile;
|
|
293
297
|
}
|
|
294
|
-
catch {
|
|
295
|
-
|
|
298
|
+
catch (err) {
|
|
299
|
+
debugLog("instagram", `API fetch failed for @${username}, trying web`, err);
|
|
296
300
|
}
|
|
297
301
|
// Fallback: web scrape profile page
|
|
298
302
|
try {
|
|
@@ -300,8 +304,8 @@ async function fetchProfile(username) {
|
|
|
300
304
|
if (profile)
|
|
301
305
|
return profile;
|
|
302
306
|
}
|
|
303
|
-
catch {
|
|
304
|
-
|
|
307
|
+
catch (err) {
|
|
308
|
+
debugLog("instagram", `Web fetch also failed for @${username}`, err);
|
|
305
309
|
}
|
|
306
310
|
return null;
|
|
307
311
|
}
|
|
@@ -407,7 +411,7 @@ export async function execute(input) {
|
|
|
407
411
|
switch (input.action) {
|
|
408
412
|
case "search": {
|
|
409
413
|
if (!input.query) {
|
|
410
|
-
return
|
|
414
|
+
return errorResult("query is required for search action");
|
|
411
415
|
}
|
|
412
416
|
const usernames = await searchProfiles(input.query, input.location, input.limit);
|
|
413
417
|
result = {
|
|
@@ -422,7 +426,7 @@ export async function execute(input) {
|
|
|
422
426
|
case "profile": {
|
|
423
427
|
const targets = input.usernames?.length ? input.usernames : (input.username ? [input.username] : []);
|
|
424
428
|
if (targets.length === 0) {
|
|
425
|
-
return
|
|
429
|
+
return errorResult("username or usernames is required for profile action");
|
|
426
430
|
}
|
|
427
431
|
if (targets.length === 1) {
|
|
428
432
|
const profile = await fetchProfile(targets[0]);
|
|
@@ -449,14 +453,10 @@ export async function execute(input) {
|
|
|
449
453
|
break;
|
|
450
454
|
}
|
|
451
455
|
}
|
|
452
|
-
return
|
|
453
|
-
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
454
|
-
};
|
|
456
|
+
return toolResult(result);
|
|
455
457
|
}
|
|
456
458
|
catch (err) {
|
|
457
|
-
return
|
|
458
|
-
content: [{ type: "text", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err) }) }],
|
|
459
|
-
};
|
|
459
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
//# sourceMappingURL=instagram.js.map
|