imperium-crawl 2.1.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 (88) hide show
  1. package/README.md +59 -89
  2. package/dist/cli-tui.d.ts +1 -1
  3. package/dist/cli-tui.js +1 -1
  4. package/dist/cli.js +1 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +0 -11
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +0 -18
  9. package/dist/config.js.map +1 -1
  10. package/dist/constants.d.ts +1 -1
  11. package/dist/constants.js +1 -1
  12. package/dist/formatters.d.ts +2 -2
  13. package/dist/formatters.js +2 -2
  14. package/dist/index.js +6 -28
  15. package/dist/index.js.map +1 -1
  16. package/dist/recipes/index.d.ts.map +1 -1
  17. package/dist/recipes/index.js +2 -0
  18. package/dist/recipes/index.js.map +1 -1
  19. package/dist/recipes/influencer-content-scout.json +14 -0
  20. package/dist/skills/manager.d.ts +1 -1
  21. package/dist/skills/manager.d.ts.map +1 -1
  22. package/dist/social/ai-fallback.d.ts +1 -1
  23. package/dist/social/ai-fallback.d.ts.map +1 -1
  24. package/dist/social/ai-fallback.js +19 -0
  25. package/dist/social/ai-fallback.js.map +1 -1
  26. package/dist/social/types.d.ts +33 -2
  27. package/dist/social/types.d.ts.map +1 -1
  28. package/dist/social/types.js +1 -1
  29. package/dist/stealth/browser-pool.d.ts.map +1 -1
  30. package/dist/stealth/browser-pool.js +12 -6
  31. package/dist/stealth/browser-pool.js.map +1 -1
  32. package/dist/tools/download.d.ts +39 -0
  33. package/dist/tools/download.d.ts.map +1 -0
  34. package/dist/tools/download.js +375 -0
  35. package/dist/tools/download.js.map +1 -0
  36. package/dist/tools/image-search.d.ts.map +1 -1
  37. package/dist/tools/image-search.js +3 -11
  38. package/dist/tools/image-search.js.map +1 -1
  39. package/dist/tools/index.d.ts.map +1 -1
  40. package/dist/tools/index.js +7 -0
  41. package/dist/tools/index.js.map +1 -1
  42. package/dist/tools/instagram.d.ts +51 -0
  43. package/dist/tools/instagram.d.ts.map +1 -0
  44. package/dist/tools/instagram.js +462 -0
  45. package/dist/tools/instagram.js.map +1 -0
  46. package/dist/tools/interact.d.ts +4 -4
  47. package/dist/tools/interact.js +1 -1
  48. package/dist/tools/interact.js.map +1 -1
  49. package/dist/tools/manifest.d.ts +0 -1
  50. package/dist/tools/manifest.d.ts.map +1 -1
  51. package/dist/tools/manifest.js +18 -2
  52. package/dist/tools/manifest.js.map +1 -1
  53. package/dist/tools/news-search.d.ts.map +1 -1
  54. package/dist/tools/news-search.js +3 -11
  55. package/dist/tools/news-search.js.map +1 -1
  56. package/dist/tools/reddit.d.ts.map +1 -1
  57. package/dist/tools/reddit.js +18 -15
  58. package/dist/tools/reddit.js.map +1 -1
  59. package/dist/tools/rss.d.ts +27 -0
  60. package/dist/tools/rss.d.ts.map +1 -0
  61. package/dist/tools/rss.js +123 -0
  62. package/dist/tools/rss.js.map +1 -0
  63. package/dist/tools/run-skill.d.ts +10 -4
  64. package/dist/tools/run-skill.d.ts.map +1 -1
  65. package/dist/tools/run-skill.js +340 -20
  66. package/dist/tools/run-skill.js.map +1 -1
  67. package/dist/tools/search.d.ts.map +1 -1
  68. package/dist/tools/search.js +3 -11
  69. package/dist/tools/search.js.map +1 -1
  70. package/dist/tools/video-search.d.ts.map +1 -1
  71. package/dist/tools/video-search.js +3 -11
  72. package/dist/tools/video-search.js.map +1 -1
  73. package/dist/tools/youtube.d.ts +4 -4
  74. package/dist/tools/youtube.d.ts.map +1 -1
  75. package/dist/tools/youtube.js +102 -21
  76. package/dist/tools/youtube.js.map +1 -1
  77. package/dist/utils/debug.d.ts +2 -0
  78. package/dist/utils/debug.d.ts.map +1 -0
  79. package/dist/utils/debug.js +6 -0
  80. package/dist/utils/debug.js.map +1 -0
  81. package/dist/utils/fetcher.d.ts.map +1 -1
  82. package/dist/utils/fetcher.js +1 -3
  83. package/dist/utils/fetcher.js.map +1 -1
  84. package/dist/utils/tool-response.d.ts +13 -0
  85. package/dist/utils/tool-response.d.ts.map +1 -0
  86. package/dist/utils/tool-response.js +7 -0
  87. package/dist/utils/tool-response.js.map +1 -0
  88. package/package.json +5 -9
@@ -0,0 +1,462 @@
1
+ import { z } from "zod";
2
+ import { smartFetch } from "../stealth/index.js";
3
+ import { issueRequest } from "../brave-api/index.js";
4
+ import { hasBraveApiKey } from "../config.js";
5
+ import { MAX_QUERY_LENGTH, MAX_ITEMS } from "../constants.js";
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";
9
+ export const name = "instagram";
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.";
11
+ const ActionEnum = z.enum(["search", "profile", "discover"]);
12
+ export const schema = z.object({
13
+ action: ActionEnum.describe("Action: search (find profiles), profile (get details), discover (full pipeline)"),
14
+ // search + discover
15
+ query: z.string().max(MAX_QUERY_LENGTH).optional().describe("Search query (for action: search)"),
16
+ location: z.string().max(200).optional().describe("Location filter, e.g. 'beograd', 'new york'"),
17
+ niche: z.string().max(500).optional().describe("Niche/industry for discovery, e.g. 'travel hotel', 'food'"),
18
+ // profile
19
+ username: z.string().max(200).optional().describe("Single username (for action: profile)"),
20
+ usernames: z.array(z.string().max(200)).max(100).optional().describe("Multiple usernames (for action: profile)"),
21
+ // filters (discover)
22
+ min_followers: z.number().min(0).default(1000).optional().describe("Minimum followers (discover filter)"),
23
+ max_followers: z.number().min(0).default(80000).optional().describe("Maximum followers (discover filter)"),
24
+ min_engagement: z.number().min(0).default(3).optional().describe("Minimum engagement rate % (discover filter)"),
25
+ max_days_since_post: z.number().min(1).default(30).optional().describe("Max days since last post (discover filter)"),
26
+ // general
27
+ limit: z.number().min(1).max(MAX_ITEMS).default(20).describe("Max results to return"),
28
+ sort: z.enum(["engagement", "followers"]).default("engagement").describe("Sort order for results"),
29
+ });
30
+ // ── Constants ──
31
+ const IG_API_BASE = "https://i.instagram.com/api/v1";
32
+ const IG_APP_ID = "936619743392459";
33
+ const IG_USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1";
34
+ // Paths that are NOT user profiles
35
+ const NON_PROFILE_PATHS = new Set([
36
+ "explore", "accounts", "about", "legal", "privacy", "terms",
37
+ "developer", "reels", "stories", "p", "reel", "tv", "direct",
38
+ "directory", "web", "challenge", "emails", "session", "nametag",
39
+ "lite", "ar", "creators", "branded_content", "shopping",
40
+ ]);
41
+ // ── Helpers ──
42
+ function sleep(ms) {
43
+ return new Promise((r) => setTimeout(r, ms));
44
+ }
45
+ function extractUsernamesFromUrls(urls) {
46
+ const usernames = new Set();
47
+ const usernameRegex = /instagram\.com\/([a-zA-Z0-9_.]{1,30})\/?(?:\?|$|#|\/)/;
48
+ for (const url of urls) {
49
+ const match = usernameRegex.exec(url);
50
+ if (match) {
51
+ const username = match[1].toLowerCase();
52
+ if (!NON_PROFILE_PATHS.has(username)) {
53
+ usernames.add(username);
54
+ }
55
+ }
56
+ }
57
+ return Array.from(usernames);
58
+ }
59
+ // ── Search via Brave ──
60
+ async function searchProfiles(query, location, limit = 20) {
61
+ if (!hasBraveApiKey()) {
62
+ throw new Error("BRAVE_API_KEY is required for instagram search/discover. Set it in your environment or run: imperium-crawl setup");
63
+ }
64
+ // Build search queries — no quotes around terms for broader results
65
+ const baseQuery = `site:instagram.com ${query}`;
66
+ const locationSuffix = location ? ` ${location}` : "";
67
+ const excludes = ' -"/p/" -"/reel/" -"/explore/"';
68
+ // Build multiple query variations to gather more profiles
69
+ const queries = [
70
+ `${baseQuery}${locationSuffix}${excludes}`,
71
+ ];
72
+ // Add variation queries for discover (when we need more results)
73
+ if (limit > 20) {
74
+ queries.push(`site:instagram.com ${query} influencer${locationSuffix}${excludes}`);
75
+ queries.push(`site:instagram.com ${query} blogger${locationSuffix}${excludes}`);
76
+ queries.push(`site:instagram.com ${query} content creator${locationSuffix}${excludes}`);
77
+ queries.push(`site:instagram.com ${query} guide${locationSuffix}${excludes}`);
78
+ }
79
+ const allUrls = [];
80
+ for (const q of queries) {
81
+ try {
82
+ const data = await issueRequest(process.env.BRAVE_API_KEY, "/web/search", {
83
+ q,
84
+ count: 20,
85
+ });
86
+ const results = data?.web?.results || [];
87
+ allUrls.push(...results.map((r) => r.url).filter(Boolean));
88
+ }
89
+ catch (err) {
90
+ debugLog("instagram", `Brave search query failed: ${q}`, err);
91
+ }
92
+ // Respect Brave rate limit (Free: 1 req/sec)
93
+ if (queries.indexOf(q) < queries.length - 1) {
94
+ await sleep(1500);
95
+ }
96
+ // Stop if we have enough unique usernames
97
+ if (extractUsernamesFromUrls(allUrls).length >= limit * 2)
98
+ break;
99
+ }
100
+ return extractUsernamesFromUrls(allUrls);
101
+ }
102
+ // ── Profile Fetch — Dual Strategy ──
103
+ /** Strategy 1: Instagram internal API (fast, but rate-limited) */
104
+ async function fetchProfileViaApi(username) {
105
+ const res = await fetch(`${IG_API_BASE}/users/web_profile_info/?username=${encodeURIComponent(username)}`, {
106
+ headers: {
107
+ "x-ig-app-id": IG_APP_ID,
108
+ "User-Agent": IG_USER_AGENT,
109
+ Accept: "*/*",
110
+ },
111
+ signal: AbortSignal.timeout(15_000),
112
+ });
113
+ if (res.status === 429)
114
+ return null; // Signal to try fallback
115
+ if (!res.ok)
116
+ return null;
117
+ let data;
118
+ try {
119
+ data = await res.json();
120
+ }
121
+ catch (err) {
122
+ debugLog("instagram", `API JSON parse failed for @${username}`, err);
123
+ return null;
124
+ }
125
+ if (data?.status === "fail" || !data?.data?.user)
126
+ return null;
127
+ return parseApiUser(data.data.user, username);
128
+ }
129
+ /** Strategy 2: Web scrape profile page — requires browser (level 3) for IG */
130
+ async function fetchProfileViaWeb(username) {
131
+ try {
132
+ const result = await smartFetch(`https://www.instagram.com/${encodeURIComponent(username)}/`, {
133
+ forceLevel: 3,
134
+ });
135
+ // Try embedded JSON first (older IG layouts)
136
+ const jsonData = extractScriptJson(result.html, "__additionalDataLoaded")
137
+ ?? extractScriptJson(result.html, "__initialData");
138
+ if (jsonData) {
139
+ const user = jsonData?.graphql?.user
140
+ ?? jsonData?.data?.user
141
+ ?? jsonData?.user;
142
+ if (user && (user.edge_followed_by || user.follower_count)) {
143
+ return parseProfileData(user, username);
144
+ }
145
+ }
146
+ // Fallback: extract from meta tags (works on current IG layout)
147
+ const metaData = extractProfileFromMeta(result.html, username);
148
+ if (metaData) {
149
+ return parseProfileData(metaData, username);
150
+ }
151
+ return null;
152
+ }
153
+ catch (err) {
154
+ debugLog("instagram", `Web scrape failed for @${username}`, err);
155
+ return null;
156
+ }
157
+ }
158
+ /** Extract profile data from meta tags — works on current IG layout.
159
+ * OG description format: "298M Followers, 243 Following, 1,614 Posts - See Instagram photos..." */
160
+ function extractProfileFromMeta(html, username) {
161
+ // Match og:description — try multiple patterns
162
+ const descMatch = html.match(/og:description[^>]*content="([^"]+)"/i)
163
+ ?? html.match(/og:description[^>]*content='([^']+)'/i)
164
+ ?? html.match(/<meta\s+name="description"\s+content="([^"]+)"/i);
165
+ if (!descMatch)
166
+ return null;
167
+ const desc = descMatch[1];
168
+ const followersMatch = desc.match(/([\d,.]+[KMB]?)\s*Followers/i);
169
+ const followingMatch = desc.match(/([\d,.]+[KMB]?)\s*Following/i);
170
+ const postsMatch = desc.match(/([\d,.]+[KMB]?)\s*Posts/i);
171
+ if (!followersMatch)
172
+ return null;
173
+ const followers = parseCompactNumber(followersMatch[1]);
174
+ const following = parseCompactNumber(followingMatch?.[1] || "0");
175
+ const posts = parseCompactNumber(postsMatch?.[1] || "0");
176
+ // Extract name from title: "Name (@username) • Instagram photos and videos"
177
+ const titleMatch = html.match(/<title>\s*([^<]+)/);
178
+ let name = username;
179
+ if (titleMatch) {
180
+ // Clean: remove " • Instagram..." suffix, extract before (@username)
181
+ let raw = titleMatch[1].replace(/\s*[•·|]\s*Instagram.*/i, "").trim();
182
+ const parenIdx = raw.indexOf("(@");
183
+ if (parenIdx > 0)
184
+ raw = raw.substring(0, parenIdx).trim();
185
+ if (raw)
186
+ name = raw;
187
+ }
188
+ // Extract bio from description after stats
189
+ // Format: "1,614 Posts - See Instagram photos and videos from Nike (@nike)"
190
+ // Or with bio: "1,614 Posts - Bio text here. See Instagram photos..."
191
+ let bio = "";
192
+ const afterPosts = desc.match(/Posts\s*[-–]\s*(.+)/i);
193
+ if (afterPosts) {
194
+ let rawBio = afterPosts[1];
195
+ // Remove "See Instagram photos and videos from Name (@username)" boilerplate
196
+ rawBio = rawBio.replace(/See Instagram photos and videos from .+$/i, "").trim();
197
+ // Remove trailing (@username) fragments
198
+ rawBio = rawBio.replace(/\(@?[\w.]+\)\s*$/, "").trim();
199
+ bio = sanitizeText(rawBio).substring(0, 1000);
200
+ }
201
+ return {
202
+ full_name: name,
203
+ biography: bio,
204
+ edge_followed_by: { count: isNaN(followers) ? 0 : followers },
205
+ edge_follow: { count: isNaN(following) ? 0 : following },
206
+ edge_owner_to_timeline_media: { count: isNaN(posts) ? 0 : posts, edges: [] },
207
+ is_private: false,
208
+ is_verified: html.includes('"is_verified":true'),
209
+ is_business_account: html.includes('"is_business_account":true') || html.includes('"is_professional_account":true'),
210
+ };
211
+ }
212
+ /** Parse user data from API response format */
213
+ function parseApiUser(user, username) {
214
+ if (user.is_private)
215
+ return null;
216
+ const followers = user.edge_followed_by?.count ?? 0;
217
+ const following = user.edge_follow?.count ?? 0;
218
+ const postsCount = user.edge_owner_to_timeline_media?.count ?? 0;
219
+ const edges = user.edge_owner_to_timeline_media?.edges ?? [];
220
+ const recentPosts = extractRecentPosts(edges);
221
+ const engagementRate = calcEngagement(followers, recentPosts);
222
+ return {
223
+ name: user.full_name || username,
224
+ username,
225
+ url: `https://www.instagram.com/${username}/`,
226
+ description: (user.biography || "").substring(0, 1000),
227
+ avatar: user.profile_pic_url_hd || user.profile_pic_url,
228
+ verified: user.is_verified ?? false,
229
+ followers,
230
+ following,
231
+ posts_count: postsCount,
232
+ is_business: user.is_business_account ?? user.is_professional_account ?? false,
233
+ business_email: user.business_email || undefined,
234
+ engagement_rate: engagementRate,
235
+ recent_posts: recentPosts,
236
+ };
237
+ }
238
+ /** Parse user data from web scrape (similar structure, slightly different fields) */
239
+ function parseProfileData(user, username) {
240
+ if (user.is_private)
241
+ return null;
242
+ const followers = user.edge_followed_by?.count ?? user.follower_count ?? 0;
243
+ const following = user.edge_follow?.count ?? user.following_count ?? 0;
244
+ const postsCount = user.edge_owner_to_timeline_media?.count ?? user.media_count ?? 0;
245
+ const edges = user.edge_owner_to_timeline_media?.edges ?? [];
246
+ const recentPosts = extractRecentPosts(edges);
247
+ const engagementRate = calcEngagement(followers, recentPosts);
248
+ return {
249
+ name: user.full_name || username,
250
+ username,
251
+ url: `https://www.instagram.com/${username}/`,
252
+ description: (user.biography || "").substring(0, 1000),
253
+ avatar: user.profile_pic_url_hd || user.profile_pic_url,
254
+ verified: user.is_verified ?? false,
255
+ followers,
256
+ following,
257
+ posts_count: postsCount,
258
+ is_business: user.is_business_account ?? user.is_professional_account ?? false,
259
+ business_email: user.business_email || undefined,
260
+ engagement_rate: engagementRate,
261
+ recent_posts: recentPosts,
262
+ };
263
+ }
264
+ function extractRecentPosts(edges) {
265
+ const posts = [];
266
+ for (let i = 0; i < Math.min(edges.length, 3); i++) {
267
+ const node = edges[i]?.node;
268
+ if (!node)
269
+ continue;
270
+ posts.push({
271
+ id: node.id || node.shortcode || "",
272
+ url: node.shortcode ? `https://www.instagram.com/p/${node.shortcode}/` : "",
273
+ likes: node.edge_liked_by?.count ?? node.edge_media_preview_like?.count ?? 0,
274
+ comments: node.edge_media_to_comment?.count ?? 0,
275
+ caption: sanitizeText(node.edge_media_to_caption?.edges?.[0]?.node?.text || "").substring(0, 500),
276
+ timestamp: node.taken_at_timestamp
277
+ ? new Date(node.taken_at_timestamp * 1000).toISOString()
278
+ : "",
279
+ is_video: node.is_video ?? false,
280
+ });
281
+ }
282
+ return posts;
283
+ }
284
+ function calcEngagement(followers, posts) {
285
+ if (followers <= 0 || posts.length === 0)
286
+ return 0;
287
+ const total = posts.reduce((sum, p) => sum + p.likes + p.comments, 0);
288
+ return Math.round((total / posts.length / followers) * 100 * 100) / 100;
289
+ }
290
+ /** Main fetch with fallback chain: API → Web → Meta tags */
291
+ async function fetchProfile(username) {
292
+ // Try API first (fastest)
293
+ try {
294
+ const profile = await fetchProfileViaApi(username);
295
+ if (profile)
296
+ return profile;
297
+ }
298
+ catch (err) {
299
+ debugLog("instagram", `API fetch failed for @${username}, trying web`, err);
300
+ }
301
+ // Fallback: web scrape profile page
302
+ try {
303
+ const profile = await fetchProfileViaWeb(username);
304
+ if (profile)
305
+ return profile;
306
+ }
307
+ catch (err) {
308
+ debugLog("instagram", `Web fetch also failed for @${username}`, err);
309
+ }
310
+ return null;
311
+ }
312
+ // ── Batch Profile Fetch ──
313
+ async function fetchProfiles(usernames, onProgress) {
314
+ const profiles = [];
315
+ let stoppedEarly = false;
316
+ let consecutiveNulls = 0;
317
+ for (let i = 0; i < usernames.length; i++) {
318
+ if (onProgress)
319
+ onProgress(i + 1, usernames.length, usernames[i]);
320
+ const profile = await fetchProfile(usernames[i]);
321
+ profiles.push(profile);
322
+ if (profile) {
323
+ consecutiveNulls = 0;
324
+ }
325
+ else {
326
+ consecutiveNulls++;
327
+ // 5 consecutive nulls likely means rate limiting — stop early
328
+ if (consecutiveNulls >= 5) {
329
+ process.stderr.write(`\n⚠️ ${consecutiveNulls} consecutive failures after ${i + 1}/${usernames.length} profiles. Likely rate-limited. Returning partial results.\n`);
330
+ stoppedEarly = true;
331
+ break;
332
+ }
333
+ }
334
+ // Rate limit: 1.5 req/sec between calls
335
+ if (i < usernames.length - 1) {
336
+ await sleep(1500);
337
+ }
338
+ }
339
+ return { profiles, stopped_early: stoppedEarly };
340
+ }
341
+ // ── Discover Pipeline ──
342
+ async function discoverInfluencers(input) {
343
+ const niche = input.niche || input.query || "";
344
+ if (!niche) {
345
+ throw new Error("niche or query is required for discover action");
346
+ }
347
+ const minFollowers = input.min_followers ?? 1000;
348
+ const maxFollowers = input.max_followers ?? 80000;
349
+ const minEngagement = input.min_engagement ?? 3;
350
+ const maxDaysSincePost = input.max_days_since_post ?? 30;
351
+ const limit = input.limit;
352
+ // Phase 1: Search for usernames
353
+ process.stderr.write(`🔍 Searching Instagram profiles for "${niche}"${input.location ? ` in ${input.location}` : ""}...\n`);
354
+ const usernames = await searchProfiles(niche, input.location, limit * 3);
355
+ if (usernames.length === 0) {
356
+ return {
357
+ query: niche,
358
+ location: input.location,
359
+ filters: { min_followers: minFollowers, max_followers: maxFollowers, min_engagement: minEngagement },
360
+ profiles: [],
361
+ total_scanned: 0,
362
+ total_matched: 0,
363
+ };
364
+ }
365
+ process.stderr.write(`📋 Found ${usernames.length} potential profiles. Fetching details...\n`);
366
+ // Phase 2: Fetch profiles with rate limiting
367
+ const { profiles: rawProfiles, stopped_early } = await fetchProfiles(usernames, (current, total, username) => {
368
+ process.stderr.write(` Fetching profile ${current}/${total}: @${username}...\r`);
369
+ });
370
+ process.stderr.write("\n");
371
+ // Phase 3: Filter
372
+ const cutoffDate = new Date();
373
+ cutoffDate.setDate(cutoffDate.getDate() - maxDaysSincePost);
374
+ const filtered = rawProfiles.filter((p) => {
375
+ if (!p)
376
+ return false;
377
+ if (p.followers < minFollowers || p.followers > maxFollowers)
378
+ return false;
379
+ if (p.engagement_rate < minEngagement)
380
+ return false;
381
+ // Check recency of last post
382
+ if (p.recent_posts.length > 0) {
383
+ const lastPost = p.recent_posts[0];
384
+ if (lastPost.timestamp && new Date(lastPost.timestamp) < cutoffDate)
385
+ return false;
386
+ }
387
+ return true;
388
+ });
389
+ // Phase 4: Sort
390
+ const sorted = filtered.sort((a, b) => input.sort === "followers"
391
+ ? b.followers - a.followers
392
+ : b.engagement_rate - a.engagement_rate);
393
+ const result = sorted.slice(0, limit);
394
+ if (stopped_early) {
395
+ process.stderr.write(`⚠️ Results may be incomplete due to rate limiting.\n`);
396
+ }
397
+ process.stderr.write(`✅ Found ${result.length} influencers matching criteria.\n`);
398
+ return {
399
+ query: niche,
400
+ location: input.location,
401
+ filters: { min_followers: minFollowers, max_followers: maxFollowers, min_engagement: minEngagement },
402
+ profiles: result,
403
+ total_scanned: rawProfiles.length,
404
+ total_matched: result.length,
405
+ };
406
+ }
407
+ // ── Execute ──
408
+ export async function execute(input) {
409
+ try {
410
+ let result;
411
+ switch (input.action) {
412
+ case "search": {
413
+ if (!input.query) {
414
+ return errorResult("query is required for search action");
415
+ }
416
+ const usernames = await searchProfiles(input.query, input.location, input.limit);
417
+ result = {
418
+ query: input.query,
419
+ location: input.location,
420
+ platform: "instagram",
421
+ usernames,
422
+ count: usernames.length,
423
+ };
424
+ break;
425
+ }
426
+ case "profile": {
427
+ const targets = input.usernames?.length ? input.usernames : (input.username ? [input.username] : []);
428
+ if (targets.length === 0) {
429
+ return errorResult("username or usernames is required for profile action");
430
+ }
431
+ if (targets.length === 1) {
432
+ const profile = await fetchProfile(targets[0]);
433
+ result = profile || { error: `Could not fetch profile for @${targets[0]}. Account may be private or not found.` };
434
+ }
435
+ else {
436
+ const { profiles, stopped_early } = await fetchProfiles(targets, (current, total, username) => {
437
+ process.stderr.write(` Fetching profile ${current}/${total}: @${username}...\r`);
438
+ });
439
+ process.stderr.write("\n");
440
+ const successful = profiles.filter((p) => p !== null);
441
+ result = {
442
+ profiles: successful,
443
+ total_requested: targets.length,
444
+ total_fetched: successful.length,
445
+ failed: targets.filter((_, i) => profiles[i] === null),
446
+ stopped_early,
447
+ };
448
+ }
449
+ break;
450
+ }
451
+ case "discover": {
452
+ result = await discoverInfluencers(input);
453
+ break;
454
+ }
455
+ }
456
+ return toolResult(result);
457
+ }
458
+ catch (err) {
459
+ return errorResult(err instanceof Error ? err.message : String(err));
460
+ }
461
+ }
462
+ //# sourceMappingURL=instagram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/tools/instagram.ts"],"names":[],"mappings":"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"}
@@ -63,7 +63,7 @@ export declare const schema: z.ZodObject<{
63
63
  target_selector?: string | undefined;
64
64
  target_ref?: string | undefined;
65
65
  file_paths?: string[] | undefined;
66
- storage?: "local" | "session" | undefined;
66
+ storage?: "session" | "local" | undefined;
67
67
  auth_profile?: string | undefined;
68
68
  cookies?: {
69
69
  value: string;
@@ -90,7 +90,7 @@ export declare const schema: z.ZodObject<{
90
90
  target_selector?: string | undefined;
91
91
  target_ref?: string | undefined;
92
92
  file_paths?: string[] | undefined;
93
- storage?: "local" | "session" | undefined;
93
+ storage?: "session" | "local" | undefined;
94
94
  auth_profile?: string | undefined;
95
95
  cookies?: {
96
96
  value: string;
@@ -180,7 +180,7 @@ export declare const schema: z.ZodObject<{
180
180
  target_selector?: string | undefined;
181
181
  target_ref?: string | undefined;
182
182
  file_paths?: string[] | undefined;
183
- storage?: "local" | "session" | undefined;
183
+ storage?: "session" | "local" | undefined;
184
184
  auth_profile?: string | undefined;
185
185
  cookies?: {
186
186
  value: string;
@@ -234,7 +234,7 @@ export declare const schema: z.ZodObject<{
234
234
  target_selector?: string | undefined;
235
235
  target_ref?: string | undefined;
236
236
  file_paths?: string[] | undefined;
237
- storage?: "local" | "session" | undefined;
237
+ storage?: "session" | "local" | undefined;
238
238
  auth_profile?: string | undefined;
239
239
  cookies?: {
240
240
  value: string;
@@ -506,7 +506,7 @@ export async function execute(input) {
506
506
  actionResults.push({ type: action.type, success: false, error: `Action '${action.type}' denied by policy` });
507
507
  continue;
508
508
  }
509
- // "confirm" is treated as "allow" in MCP context (no interactive prompt available)
509
+ // "confirm" is treated as "allow" (no interactive prompt available)
510
510
  }
511
511
  // Human-like delay between actions
512
512
  await page.waitForTimeout(humanDelay());