research-powerpack-mcp 3.4.7 → 3.5.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 (45) hide show
  1. package/README.md +63 -655
  2. package/dist/clients/reddit.d.ts.map +1 -1
  3. package/dist/clients/reddit.js +23 -35
  4. package/dist/clients/reddit.js.map +1 -1
  5. package/dist/clients/scraper.d.ts +1 -6
  6. package/dist/clients/scraper.d.ts.map +1 -1
  7. package/dist/clients/scraper.js +33 -69
  8. package/dist/clients/scraper.js.map +1 -1
  9. package/dist/config/env.d.ts +75 -0
  10. package/dist/config/env.d.ts.map +1 -0
  11. package/dist/config/env.js +87 -0
  12. package/dist/config/env.js.map +1 -0
  13. package/dist/config/yaml/tools-enhanced.yaml +0 -0
  14. package/dist/index.js +85 -25
  15. package/dist/index.js.map +1 -1
  16. package/dist/services/llm-processor.js +0 -25
  17. package/dist/services/llm-processor.js.map +1 -1
  18. package/dist/tools/reddit.d.ts.map +1 -1
  19. package/dist/tools/reddit.js +77 -29
  20. package/dist/tools/reddit.js.map +1 -1
  21. package/dist/tools/research.d.ts +2 -6
  22. package/dist/tools/research.d.ts.map +1 -1
  23. package/dist/tools/research.js +60 -47
  24. package/dist/tools/research.js.map +1 -1
  25. package/dist/tools/scrape.d.ts +1 -5
  26. package/dist/tools/scrape.d.ts.map +1 -1
  27. package/dist/tools/scrape.js +107 -64
  28. package/dist/tools/scrape.js.map +1 -1
  29. package/dist/tools/search.d.ts +1 -5
  30. package/dist/tools/search.d.ts.map +1 -1
  31. package/dist/tools/search.js +26 -16
  32. package/dist/tools/search.js.map +1 -1
  33. package/dist/tools/utils.d.ts +20 -59
  34. package/dist/tools/utils.d.ts.map +1 -1
  35. package/dist/tools/utils.js +25 -61
  36. package/dist/tools/utils.js.map +1 -1
  37. package/dist/utils/logger.d.ts +36 -0
  38. package/dist/utils/logger.d.ts.map +1 -0
  39. package/dist/utils/logger.js +40 -0
  40. package/dist/utils/logger.js.map +1 -0
  41. package/dist/utils/response.d.ts +101 -0
  42. package/dist/utils/response.d.ts.map +1 -0
  43. package/dist/utils/response.js +183 -0
  44. package/dist/utils/response.js.map +1 -0
  45. package/package.json +8 -2
@@ -6,28 +6,10 @@ import { ResearchClient } from '../clients/research.js';
6
6
  import { FileAttachmentService } from '../services/file-attachment.js';
7
7
  import { RESEARCH } from '../config/index.js';
8
8
  import { classifyError } from '../utils/errors.js';
9
+ import { safeLog, calculateTokenAllocation, TOKEN_BUDGETS, formatSuccess, formatError, formatBatchHeader, formatDuration, } from './utils.js';
9
10
  // Constants
10
- const TOTAL_TOKEN_BUDGET = 32000;
11
11
  const MIN_QUESTIONS = 1; // Allow single question for flexibility
12
12
  const MAX_QUESTIONS = 10;
13
- function calculateTokenAllocation(questionCount) {
14
- if (questionCount <= 0)
15
- return TOTAL_TOKEN_BUDGET;
16
- return Math.floor(TOTAL_TOKEN_BUDGET / questionCount);
17
- }
18
- /**
19
- * Safe logger wrapper - NEVER throws
20
- */
21
- async function safeLog(logger, sessionId, level, message) {
22
- if (!logger || !sessionId)
23
- return;
24
- try {
25
- await logger(level, message, sessionId);
26
- }
27
- catch {
28
- console.error(`[Research Tool] Logger failed: ${message}`);
29
- }
30
- }
31
13
  const SYSTEM_PROMPT = `You are an expert research consultant. Provide evidence-based, multi-perspective analysis.
32
14
 
33
15
  METHODOLOGY:
@@ -51,21 +33,29 @@ Be dense with insights, light on filler. Use examples and citations.`;
51
33
  export async function handleDeepResearch(params, options = {}) {
52
34
  const { sessionId, logger } = options;
53
35
  const questions = params.questions || [];
54
- // Validation
55
- if (questions.length < MIN_QUESTIONS) {
36
+ const startTime = Date.now();
37
+ // Helper to create error response using standardized formatter
38
+ const createErrorResponse = (message, code = 'RESEARCH_ERROR') => {
39
+ const errorContent = formatError({
40
+ code,
41
+ message,
42
+ retryable: false,
43
+ toolName: 'Deep Research',
44
+ });
56
45
  return {
57
- content: `# ❌ Error\n\nMinimum ${MIN_QUESTIONS} research question(s) required. Received: ${questions.length}`,
58
- structuredContent: { error: true, message: `Minimum ${MIN_QUESTIONS} question(s) required` },
46
+ content: errorContent,
47
+ structuredContent: { error: true, message },
59
48
  };
49
+ };
50
+ // Validation
51
+ if (questions.length < MIN_QUESTIONS) {
52
+ return createErrorResponse(`Minimum ${MIN_QUESTIONS} research question(s) required. Received: ${questions.length}`, 'INVALID_INPUT');
60
53
  }
61
54
  if (questions.length > MAX_QUESTIONS) {
62
- return {
63
- content: `# ❌ Error\n\nMaximum ${MAX_QUESTIONS} research questions allowed. Received: ${questions.length}`,
64
- structuredContent: { error: true, message: `Maximum ${MAX_QUESTIONS} questions allowed` },
65
- };
55
+ return createErrorResponse(`Maximum ${MAX_QUESTIONS} research questions allowed. Received: ${questions.length}`, 'INVALID_INPUT');
66
56
  }
67
- const tokensPerQuestion = calculateTokenAllocation(questions.length);
68
- await safeLog(logger, sessionId, 'info', `Starting batch research: ${questions.length} questions, ${tokensPerQuestion.toLocaleString()} tokens/question`);
57
+ const tokensPerQuestion = calculateTokenAllocation(questions.length, TOKEN_BUDGETS.RESEARCH);
58
+ await safeLog(logger, sessionId, 'info', `Starting batch research: ${questions.length} questions, ${tokensPerQuestion.toLocaleString()} tokens/question`, 'Research');
69
59
  // Initialize client safely
70
60
  let client;
71
61
  try {
@@ -73,10 +63,7 @@ export async function handleDeepResearch(params, options = {}) {
73
63
  }
74
64
  catch (error) {
75
65
  const err = classifyError(error);
76
- return {
77
- content: `# ❌ Error\n\nFailed to initialize research client: ${err.message}`,
78
- structuredContent: { error: true, message: `Failed to initialize: ${err.message}` },
79
- };
66
+ return createErrorResponse(`Failed to initialize research client: ${err.message}`, 'INIT_ERROR');
80
67
  }
81
68
  const fileService = new FileAttachmentService();
82
69
  const results = [];
@@ -133,37 +120,63 @@ export async function handleDeepResearch(params, options = {}) {
133
120
  });
134
121
  const allResults = await Promise.all(researchPromises);
135
122
  results.push(...allResults);
136
- // Build markdown output
123
+ const executionTime = Date.now() - startTime;
124
+ // Build statistics
137
125
  const successful = results.filter(r => r.success);
138
126
  const failed = results.filter(r => !r.success);
139
127
  const totalTokens = successful.reduce((sum, r) => sum + (r.tokensUsed || 0), 0);
140
- let markdown = `# Deep Research Results (${questions.length} questions)\n\n`;
141
- markdown += `**Token Allocation:** ${tokensPerQuestion.toLocaleString()} tokens/question (${questions.length} questions, ${TOTAL_TOKEN_BUDGET.toLocaleString()} total budget)\n`;
142
- markdown += `**Status:** ✅ ${successful.length} successful | ❌ ${failed.length} failed | 📊 ${totalTokens.toLocaleString()} tokens used\n\n`;
143
- markdown += `---\n\n`;
144
- for (let i = 0; i < results.length; i++) {
145
- const r = results[i];
146
- markdown += `## Question ${i + 1}: ${r.question.substring(0, 100)}${r.question.length > 100 ? '...' : ''}\n\n`;
128
+ await safeLog(logger, sessionId, 'info', `Research completed: ${successful.length}/${questions.length} successful, ${totalTokens.toLocaleString()} tokens`, 'Research');
129
+ // Build header using standardized formatter
130
+ const headerInfo = formatBatchHeader({
131
+ title: 'Deep Research Results',
132
+ totalItems: questions.length,
133
+ successful: successful.length,
134
+ failed: failed.length,
135
+ tokensPerItem: tokensPerQuestion,
136
+ totalBudget: TOKEN_BUDGETS.RESEARCH,
137
+ extras: [`📊 ${totalTokens.toLocaleString()} tokens used`],
138
+ });
139
+ // Build data section with individual results
140
+ const dataSection = results.map((r, i) => {
141
+ const questionPreview = r.question.substring(0, 100) + (r.question.length > 100 ? '...' : '');
142
+ let section = `## Question ${i + 1}: ${questionPreview}\n\n`;
147
143
  if (r.success) {
148
- markdown += r.content + '\n\n';
144
+ section += r.content + '\n\n';
149
145
  if (r.tokensUsed) {
150
- markdown += `_Tokens used: ${r.tokensUsed.toLocaleString()}_\n\n`;
146
+ section += `_Tokens used: ${r.tokensUsed.toLocaleString()}_`;
151
147
  }
152
148
  }
153
149
  else {
154
- markdown += `**❌ Error:** ${r.error}\n\n`;
150
+ section += `**❌ Error:** ${r.error}`;
155
151
  }
156
- markdown += `---\n\n`;
152
+ return section;
153
+ }).join('\n\n---\n\n');
154
+ // Build next steps
155
+ const nextSteps = [];
156
+ if (successful.length > 0) {
157
+ nextSteps.push('Follow up with more specific questions on interesting findings');
158
+ nextSteps.push('Use `web_search()` to find additional sources on key topics');
159
+ nextSteps.push('Use `scrape_links()` to get full content from cited URLs');
157
160
  }
158
- await safeLog(logger, sessionId, 'info', `Research completed: ${successful.length}/${questions.length} successful, ${totalTokens.toLocaleString()} tokens`);
161
+ if (failed.length > 0) {
162
+ nextSteps.push('Retry failed questions with simpler phrasing');
163
+ nextSteps.push('Check API quota if multiple failures occurred');
164
+ }
165
+ const formattedContent = formatSuccess({
166
+ title: `Deep Research Results (${questions.length} questions)`,
167
+ summary: `${headerInfo}\n\n**Execution Time:** ${formatDuration(executionTime)}`,
168
+ data: dataSection,
169
+ nextSteps,
170
+ });
159
171
  return {
160
- content: markdown.trim(),
172
+ content: formattedContent,
161
173
  structuredContent: {
162
174
  totalQuestions: questions.length,
163
175
  successful: successful.length,
164
176
  failed: failed.length,
165
177
  tokensPerQuestion,
166
178
  totalTokensUsed: totalTokens,
179
+ executionTimeMs: executionTime,
167
180
  results,
168
181
  },
169
182
  };
@@ -1 +1 @@
1
- {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,7 @@
3
3
  * Implements robust error handling that NEVER crashes the MCP server
4
4
  */
5
5
  import type { ScrapeLinksParams, ScrapeLinksOutput } from '../schemas/scrape-links.js';
6
- interface ToolOptions {
7
- sessionId?: string;
8
- logger?: (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
9
- }
6
+ import { type ToolOptions } from './utils.js';
10
7
  /**
11
8
  * Handle scrape links request
12
9
  * NEVER throws - always returns a valid response with content and metadata
@@ -15,5 +12,4 @@ export declare function handleScrapeLinks(params: ScrapeLinksParams, options?: T
15
12
  content: string;
16
13
  structuredContent: ScrapeLinksOutput;
17
14
  }>;
18
- export {};
19
15
  //# sourceMappingURL=scrape.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAevF,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnG;AA8BD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAoKpE"}
1
+ {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQvF,OAAO,EAEL,KAAK,WAAW,EAOjB,MAAM,YAAY,CAAC;AAapB;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,iBAAiB,CAAA;CAAE,CAAC,CA0OpE"}
@@ -2,6 +2,7 @@
2
2
  * Scrape Links Tool Handler
3
3
  * Implements robust error handling that NEVER crashes the MCP server
4
4
  */
5
+ import pLimit from 'p-limit';
5
6
  import { ScraperClient } from '../clients/scraper.js';
6
7
  import { MarkdownCleaner } from '../services/markdown-cleaner.js';
7
8
  import { createLLMProcessor, processContentWithLLM } from '../services/llm-processor.js';
@@ -9,34 +10,16 @@ import { removeMetaTags } from '../utils/markdown-formatter.js';
9
10
  import { SCRAPER } from '../config/index.js';
10
11
  import { getToolConfig } from '../config/loader.js';
11
12
  import { classifyError } from '../utils/errors.js';
13
+ import { safeLog, calculateTokenAllocation, TOKEN_BUDGETS, formatSuccess, formatError, formatBatchHeader, formatDuration, } from './utils.js';
12
14
  // Get extraction suffix from YAML config (fallback to hardcoded if not found)
13
15
  function getExtractionSuffix() {
14
16
  const config = getToolConfig('scrape_links');
15
17
  return config?.limits?.extraction_suffix || SCRAPER.EXTRACTION_SUFFIX;
16
18
  }
17
- function calculateTokenAllocation(urlCount) {
18
- if (urlCount <= 0)
19
- return SCRAPER.MAX_TOKENS_BUDGET;
20
- return Math.floor(SCRAPER.MAX_TOKENS_BUDGET / urlCount);
21
- }
22
19
  function enhanceExtractionInstruction(instruction) {
23
20
  const base = instruction || 'Extract the main content and key information from this page.';
24
21
  return `${base}\n\n${getExtractionSuffix()}`;
25
22
  }
26
- /**
27
- * Safe logger wrapper - NEVER throws
28
- */
29
- async function safeLog(logger, sessionId, level, message) {
30
- if (!logger || !sessionId)
31
- return;
32
- try {
33
- await logger(level, message, sessionId);
34
- }
35
- catch {
36
- // Silently ignore logger errors - they should never crash the tool
37
- console.error(`[Scrape Tool] Logger failed: ${message}`);
38
- }
39
- }
40
23
  /**
41
24
  * Handle scrape links request
42
25
  * NEVER throws - always returns a valid response with content and metadata
@@ -44,23 +27,32 @@ async function safeLog(logger, sessionId, level, message) {
44
27
  export async function handleScrapeLinks(params, options = {}) {
45
28
  const { sessionId, logger } = options;
46
29
  const startTime = Date.now();
47
- // Helper to create error response
48
- const createErrorResponse = (message, executionTime) => ({
49
- content: `# Scraping Failed\n\n${message}`,
50
- structuredContent: {
51
- content: `# ❌ Scraping Failed\n\n${message}`,
52
- metadata: {
53
- total_urls: params.urls?.length || 0,
54
- successful: 0,
55
- failed: params.urls?.length || 0,
56
- total_credits: 0,
57
- execution_time_ms: executionTime,
30
+ // Helper to create error response using standardized formatter
31
+ const createErrorResponse = (message, code = 'SCRAPE_ERROR') => {
32
+ const executionTime = Date.now() - startTime;
33
+ const errorContent = formatError({
34
+ code,
35
+ message,
36
+ retryable: false,
37
+ toolName: 'Scrape Links',
38
+ });
39
+ return {
40
+ content: errorContent,
41
+ structuredContent: {
42
+ content: errorContent,
43
+ metadata: {
44
+ total_urls: params.urls?.length || 0,
45
+ successful: 0,
46
+ failed: params.urls?.length || 0,
47
+ total_credits: 0,
48
+ execution_time_ms: executionTime,
49
+ },
58
50
  },
59
- },
60
- });
51
+ };
52
+ };
61
53
  // Validate params
62
54
  if (!params.urls || params.urls.length === 0) {
63
- return createErrorResponse('No URLs provided', Date.now() - startTime);
55
+ return createErrorResponse('No URLs provided', 'INVALID_INPUT');
64
56
  }
65
57
  // Filter out invalid URLs early
66
58
  const validUrls = [];
@@ -75,11 +67,11 @@ export async function handleScrapeLinks(params, options = {}) {
75
67
  }
76
68
  }
77
69
  if (validUrls.length === 0) {
78
- return createErrorResponse(`All ${params.urls.length} URLs are invalid`, Date.now() - startTime);
70
+ return createErrorResponse(`All ${params.urls.length} URLs are invalid`, 'INVALID_INPUT');
79
71
  }
80
- const tokensPerUrl = calculateTokenAllocation(validUrls.length);
72
+ const tokensPerUrl = calculateTokenAllocation(validUrls.length, TOKEN_BUDGETS.SCRAPER);
81
73
  const totalBatches = Math.ceil(validUrls.length / SCRAPER.BATCH_SIZE);
82
- await safeLog(logger, sessionId, 'info', `Starting scrape: ${validUrls.length} URL(s), ${tokensPerUrl} tokens/URL, ${totalBatches} batch(es)`);
74
+ await safeLog(logger, sessionId, 'info', `Starting scrape: ${validUrls.length} URL(s), ${tokensPerUrl} tokens/URL, ${totalBatches} batch(es)`, 'Scrape');
83
75
  // Initialize clients safely
84
76
  let client;
85
77
  try {
@@ -87,7 +79,7 @@ export async function handleScrapeLinks(params, options = {}) {
87
79
  }
88
80
  catch (error) {
89
81
  const err = classifyError(error);
90
- return createErrorResponse(`Failed to initialize scraper: ${err.message}`, Date.now() - startTime);
82
+ return createErrorResponse(`Failed to initialize scraper: ${err.message}`, 'INIT_ERROR');
91
83
  }
92
84
  const markdownCleaner = new MarkdownCleaner();
93
85
  const llmProcessor = createLLMProcessor(); // Returns null if not configured
@@ -96,7 +88,7 @@ export async function handleScrapeLinks(params, options = {}) {
96
88
  : undefined;
97
89
  // Scrape URLs - scrapeMultiple NEVER throws
98
90
  const results = await client.scrapeMultiple(validUrls, { timeout: params.timeout });
99
- await safeLog(logger, sessionId, 'info', `Scraping complete. Processing ${results.length} results...`);
91
+ await safeLog(logger, sessionId, 'info', `Scraping complete. Processing ${results.length} results...`, 'Scrape');
100
92
  let successful = 0;
101
93
  let failed = 0;
102
94
  let totalCredits = 0;
@@ -107,7 +99,7 @@ export async function handleScrapeLinks(params, options = {}) {
107
99
  failed++;
108
100
  contents.push(`## ${invalidUrl}\n\n❌ Invalid URL format`);
109
101
  }
110
- // Process each result
102
+ const processed = [];
111
103
  for (let i = 0; i < results.length; i++) {
112
104
  const result = results[i];
113
105
  if (!result) {
@@ -115,13 +107,11 @@ export async function handleScrapeLinks(params, options = {}) {
115
107
  contents.push(`## Unknown URL\n\n❌ No result returned`);
116
108
  continue;
117
109
  }
118
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] Processing ${result.url}`);
119
110
  // Check for errors in result
120
111
  if (result.error || result.statusCode < 200 || result.statusCode >= 300) {
121
112
  failed++;
122
113
  const errorMsg = result.error?.message || result.content || `HTTP ${result.statusCode}`;
123
114
  contents.push(`## ${result.url}\n\n❌ Failed to scrape: ${errorMsg}`);
124
- await safeLog(logger, sessionId, 'error', `[${i + 1}/${results.length}] Failed: ${errorMsg}`);
125
115
  continue;
126
116
  }
127
117
  // Success case
@@ -133,38 +123,91 @@ export async function handleScrapeLinks(params, options = {}) {
133
123
  content = markdownCleaner.processContent(result.content);
134
124
  }
135
125
  catch {
136
- // If markdown cleaning fails, use raw content
137
126
  content = result.content;
138
127
  }
139
- // Apply LLM extraction if enabled - processContentWithLLM NEVER throws
140
- if (params.use_llm && llmProcessor) {
141
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] Applying LLM extraction (${tokensPerUrl} tokens)...`);
142
- const llmResult = await processContentWithLLM(content, { use_llm: params.use_llm, what_to_extract: enhancedInstruction, max_tokens: tokensPerUrl }, llmProcessor);
143
- if (llmResult.processed) {
144
- content = llmResult.content;
145
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] LLM extraction complete`);
128
+ processed.push({ url: result.url, content, isSuccess: true, index: i });
129
+ }
130
+ // Second pass: parallel LLM extraction for successful results
131
+ if (params.use_llm && llmProcessor && processed.length > 0) {
132
+ await safeLog(logger, sessionId, 'info', `Applying LLM extraction to ${processed.length} results (concurrency: 3)...`, 'Scrape');
133
+ const llmLimit = pLimit(3);
134
+ const llmResults = await Promise.allSettled(processed.map(p => llmLimit(async () => {
135
+ const llmResult = await processContentWithLLM(p.content, { use_llm: params.use_llm, what_to_extract: enhancedInstruction, max_tokens: tokensPerUrl }, llmProcessor);
136
+ return { ...p, llmResult };
137
+ })));
138
+ for (const entry of llmResults) {
139
+ if (entry.status === 'fulfilled') {
140
+ const { url, llmResult } = entry.value;
141
+ let content = entry.value.content;
142
+ if (llmResult.processed) {
143
+ content = llmResult.content;
144
+ }
145
+ else {
146
+ llmErrors++;
147
+ }
148
+ try {
149
+ content = removeMetaTags(content);
150
+ }
151
+ catch {
152
+ // If this fails, just use the content as-is
153
+ }
154
+ contents.push(`## ${url}\n\n${content}`);
146
155
  }
147
156
  else {
157
+ // Safety net — processContentWithLLM never throws, but handle anyway
148
158
  llmErrors++;
149
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] LLM extraction skipped: ${llmResult.error || 'unknown reason'}`);
150
- // Continue with original content - graceful degradation
159
+ // We can't easily recover the URL here, so this is a rare edge case
160
+ contents.push(`## Unknown URL\n\n❌ LLM processing failed unexpectedly`);
151
161
  }
152
162
  }
153
- // Remove meta tags safely
154
- try {
155
- content = removeMetaTags(content);
156
- }
157
- catch {
158
- // If this fails, just use the content as-is
163
+ }
164
+ else {
165
+ // No LLM — just finalize each successful result
166
+ for (const p of processed) {
167
+ let content = p.content;
168
+ try {
169
+ content = removeMetaTags(content);
170
+ }
171
+ catch {
172
+ // If this fails, just use the content as-is
173
+ }
174
+ contents.push(`## ${p.url}\n\n${content}`);
159
175
  }
160
- contents.push(`## ${result.url}\n\n${content}`);
161
176
  }
162
177
  const executionTime = Date.now() - startTime;
163
- await safeLog(logger, sessionId, 'info', `Completed: ${successful} successful, ${failed} failed, ${totalCredits} credits used`);
164
- // Build response
165
- const allocationHeader = `**Token Allocation:** ${tokensPerUrl.toLocaleString()} tokens/URL (${params.urls.length} URLs, ${SCRAPER.MAX_TOKENS_BUDGET.toLocaleString()} total budget)`;
166
- const statusHeader = `**Status:** ✅ ${successful} successful | ❌ ${failed} failed | 📦 ${totalBatches} batch(es)${llmErrors > 0 ? ` | ⚠️ ${llmErrors} LLM extraction failures` : ''}`;
167
- const formattedContent = `# Scraped Content (${params.urls.length} URLs)\n\n${allocationHeader}\n${statusHeader}\n\n---\n\n${contents.join('\n\n---\n\n')}`;
178
+ await safeLog(logger, sessionId, 'info', `Completed: ${successful} successful, ${failed} failed, ${totalCredits} credits used`, 'Scrape');
179
+ // Build response using standardized formatters
180
+ const headerInfo = formatBatchHeader({
181
+ title: 'Scraped Content',
182
+ totalItems: params.urls.length,
183
+ successful,
184
+ failed,
185
+ tokensPerItem: tokensPerUrl,
186
+ totalBudget: TOKEN_BUDGETS.SCRAPER,
187
+ batches: totalBatches,
188
+ extras: llmErrors > 0 ? [`⚠️ ${llmErrors} LLM extraction failures`] : undefined,
189
+ });
190
+ // Build next steps based on results
191
+ const nextSteps = [];
192
+ if (successful > 0) {
193
+ nextSteps.push('Use `deep_research()` for in-depth analysis of specific topics found');
194
+ nextSteps.push('Run `web_search()` to find related content');
195
+ }
196
+ if (failed > 0) {
197
+ nextSteps.push(`Retry failed URLs with increased timeout: \`scrape_links({urls: [...], timeout: 60})\``);
198
+ }
199
+ const formattedContent = formatSuccess({
200
+ title: `Scraped Content (${params.urls.length} URLs)`,
201
+ summary: `${headerInfo}\n\n**Execution Time:** ${formatDuration(executionTime)} | **Credits Used:** ${totalCredits}`,
202
+ data: contents.join('\n\n---\n\n'),
203
+ nextSteps,
204
+ metadata: {
205
+ 'Total URLs': params.urls.length,
206
+ 'Successful': successful,
207
+ 'Failed': failed,
208
+ 'Tokens/URL': tokensPerUrl,
209
+ },
210
+ });
168
211
  const metadata = {
169
212
  total_urls: params.urls.length,
170
213
  successful,
@@ -172,7 +215,7 @@ export async function handleScrapeLinks(params, options = {}) {
172
215
  total_credits: totalCredits,
173
216
  execution_time_ms: executionTime,
174
217
  tokens_per_url: tokensPerUrl,
175
- total_token_budget: SCRAPER.MAX_TOKENS_BUDGET,
218
+ total_token_budget: TOKEN_BUDGETS.SCRAPER,
176
219
  batches_processed: totalBatches,
177
220
  };
178
221
  return { content: formattedContent, structuredContent: { content: formattedContent, metadata } };
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,9 @@
3
3
  * NEVER throws - always returns structured response for graceful degradation
4
4
  */
5
5
  import type { WebSearchParams, WebSearchOutput } from '../schemas/web-search.js';
6
- interface ToolOptions {
7
- sessionId?: string;
8
- logger?: (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
9
- }
6
+ import { type ToolOptions } from './utils.js';
10
7
  export declare function handleWebSearch(params: WebSearchParams, options?: ToolOptions): Promise<{
11
8
  content: string;
12
9
  structuredContent: WebSearchOutput;
13
10
  }>;
14
- export {};
15
11
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAYjF,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnG;AASD,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,eAAe,CAAA;CAAE,CAAC,CAqJlE"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAWjF,OAAO,EAEL,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AASpB,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,eAAe,CAAA;CAAE,CAAC,CAgKlE"}