imperium-crawl 2.2.0 → 2.3.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 (56) hide show
  1. package/README.md +35 -22
  2. package/dist/cli.js +1 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/constants.d.ts +1 -1
  5. package/dist/constants.js +1 -1
  6. package/dist/stealth/browser-pool.d.ts.map +1 -1
  7. package/dist/stealth/browser-pool.js +12 -6
  8. package/dist/stealth/browser-pool.js.map +1 -1
  9. package/dist/tools/download.d.ts +39 -0
  10. package/dist/tools/download.d.ts.map +1 -0
  11. package/dist/tools/download.js +375 -0
  12. package/dist/tools/download.js.map +1 -0
  13. package/dist/tools/image-search.d.ts.map +1 -1
  14. package/dist/tools/image-search.js +3 -11
  15. package/dist/tools/image-search.js.map +1 -1
  16. package/dist/tools/index.d.ts.map +1 -1
  17. package/dist/tools/index.js +5 -0
  18. package/dist/tools/index.js.map +1 -1
  19. package/dist/tools/instagram.d.ts.map +1 -1
  20. package/dist/tools/instagram.js +16 -16
  21. package/dist/tools/instagram.js.map +1 -1
  22. package/dist/tools/manifest.d.ts.map +1 -1
  23. package/dist/tools/manifest.js +10 -1
  24. package/dist/tools/manifest.js.map +1 -1
  25. package/dist/tools/news-search.d.ts.map +1 -1
  26. package/dist/tools/news-search.js +3 -11
  27. package/dist/tools/news-search.js.map +1 -1
  28. package/dist/tools/reddit.d.ts.map +1 -1
  29. package/dist/tools/reddit.js +18 -15
  30. package/dist/tools/reddit.js.map +1 -1
  31. package/dist/tools/rss.d.ts +27 -0
  32. package/dist/tools/rss.d.ts.map +1 -0
  33. package/dist/tools/rss.js +123 -0
  34. package/dist/tools/rss.js.map +1 -0
  35. package/dist/tools/run-skill.d.ts.map +1 -1
  36. package/dist/tools/run-skill.js +1 -3
  37. package/dist/tools/run-skill.js.map +1 -1
  38. package/dist/tools/search.d.ts.map +1 -1
  39. package/dist/tools/search.js +3 -11
  40. package/dist/tools/search.js.map +1 -1
  41. package/dist/tools/video-search.d.ts.map +1 -1
  42. package/dist/tools/video-search.js +3 -11
  43. package/dist/tools/video-search.js.map +1 -1
  44. package/dist/tools/youtube.d.ts +4 -4
  45. package/dist/tools/youtube.d.ts.map +1 -1
  46. package/dist/tools/youtube.js +102 -21
  47. package/dist/tools/youtube.js.map +1 -1
  48. package/dist/utils/debug.d.ts +2 -0
  49. package/dist/utils/debug.d.ts.map +1 -0
  50. package/dist/utils/debug.js +6 -0
  51. package/dist/utils/debug.js.map +1 -0
  52. package/dist/utils/tool-response.d.ts +13 -0
  53. package/dist/utils/tool-response.d.ts.map +1 -0
  54. package/dist/utils/tool-response.js +7 -0
  55. package/dist/utils/tool-response.js.map +1 -0
  56. package/package.json +3 -1
@@ -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;AAKxB,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;;;;;GAqBpD"}
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;AAEnD,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;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;iBAC/E;aACF;SACF,CAAC;IACJ,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;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAC;AACJ,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;AA6BxB,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,EAmCpC,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"}
@@ -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
@@ -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;AAU5C,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;CAC5B,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;AAQxB,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;AAsbpD,wBAAsB,OAAO,CAAC,KAAK,EAAE,cAAc;;;;;GAgElD"}
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"}
@@ -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
- // Rate limit or other error — continue with what we have
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
- // API failed, try web fallback
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
- // Web also failed
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 { content: [{ type: "text", text: JSON.stringify({ error: "query is required for search action" }) }] };
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 { content: [{ type: "text", text: JSON.stringify({ error: "username or usernames is required for profile action" }) }] };
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