research-powerpack-mcp 3.5.0 → 3.6.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 (67) hide show
  1. package/README.md +674 -63
  2. package/dist/clients/reddit.d.ts +6 -1
  3. package/dist/clients/reddit.d.ts.map +1 -1
  4. package/dist/clients/reddit.js +60 -24
  5. package/dist/clients/reddit.js.map +1 -1
  6. package/dist/clients/scraper.d.ts +6 -1
  7. package/dist/clients/scraper.d.ts.map +1 -1
  8. package/dist/clients/scraper.js +71 -33
  9. package/dist/clients/scraper.js.map +1 -1
  10. package/dist/clients/search.d.ts +2 -2
  11. package/dist/clients/search.d.ts.map +1 -1
  12. package/dist/clients/search.js +11 -6
  13. package/dist/clients/search.js.map +1 -1
  14. package/dist/config/index.d.ts.map +1 -1
  15. package/dist/config/index.js +5 -1
  16. package/dist/config/index.js.map +1 -1
  17. package/dist/config/loader.d.ts.map +1 -1
  18. package/dist/config/loader.js +6 -1
  19. package/dist/config/loader.js.map +1 -1
  20. package/dist/index.js +28 -86
  21. package/dist/index.js.map +1 -1
  22. package/dist/schemas/web-search.js +1 -1
  23. package/dist/schemas/web-search.js.map +1 -1
  24. package/dist/services/file-attachment.d.ts.map +1 -1
  25. package/dist/services/file-attachment.js +25 -22
  26. package/dist/services/file-attachment.js.map +1 -1
  27. package/dist/tools/reddit.d.ts.map +1 -1
  28. package/dist/tools/reddit.js +43 -55
  29. package/dist/tools/reddit.js.map +1 -1
  30. package/dist/tools/registry.js +2 -2
  31. package/dist/tools/registry.js.map +1 -1
  32. package/dist/tools/research.d.ts +1 -2
  33. package/dist/tools/research.d.ts.map +1 -1
  34. package/dist/tools/research.js +69 -59
  35. package/dist/tools/research.js.map +1 -1
  36. package/dist/tools/scrape.d.ts +1 -2
  37. package/dist/tools/scrape.d.ts.map +1 -1
  38. package/dist/tools/scrape.js +63 -94
  39. package/dist/tools/scrape.js.map +1 -1
  40. package/dist/tools/search.d.ts +1 -2
  41. package/dist/tools/search.d.ts.map +1 -1
  42. package/dist/tools/search.js +19 -21
  43. package/dist/tools/search.js.map +1 -1
  44. package/dist/tools/utils.d.ts +68 -16
  45. package/dist/tools/utils.d.ts.map +1 -1
  46. package/dist/tools/utils.js +75 -22
  47. package/dist/tools/utils.js.map +1 -1
  48. package/dist/utils/concurrency.d.ts +29 -0
  49. package/dist/utils/concurrency.d.ts.map +1 -0
  50. package/dist/utils/concurrency.js +73 -0
  51. package/dist/utils/concurrency.js.map +1 -0
  52. package/dist/utils/logger.d.ts +21 -25
  53. package/dist/utils/logger.d.ts.map +1 -1
  54. package/dist/utils/logger.js +27 -24
  55. package/dist/utils/logger.js.map +1 -1
  56. package/dist/utils/mcp-logger.d.ts +8 -0
  57. package/dist/utils/mcp-logger.d.ts.map +1 -0
  58. package/dist/utils/mcp-logger.js +14 -0
  59. package/dist/utils/mcp-logger.js.map +1 -0
  60. package/dist/utils/response.d.ts +49 -62
  61. package/dist/utils/response.d.ts.map +1 -1
  62. package/dist/utils/response.js +102 -134
  63. package/dist/utils/response.js.map +1 -1
  64. package/dist/utils/url-aggregator.d.ts.map +1 -1
  65. package/dist/utils/url-aggregator.js +6 -4
  66. package/dist/utils/url-aggregator.js.map +1 -1
  67. package/package.json +2 -8
@@ -2,7 +2,6 @@
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';
6
5
  import { ScraperClient } from '../clients/scraper.js';
7
6
  import { MarkdownCleaner } from '../services/markdown-cleaner.js';
8
7
  import { createLLMProcessor, processContentWithLLM } from '../services/llm-processor.js';
@@ -10,7 +9,9 @@ import { removeMetaTags } from '../utils/markdown-formatter.js';
10
9
  import { SCRAPER } from '../config/index.js';
11
10
  import { getToolConfig } from '../config/loader.js';
12
11
  import { classifyError } from '../utils/errors.js';
13
- import { safeLog, calculateTokenAllocation, TOKEN_BUDGETS, formatSuccess, formatError, formatBatchHeader, formatDuration, } from './utils.js';
12
+ import { mcpLog, formatSuccess, formatError, formatBatchHeader, formatDuration, TOKEN_BUDGETS, calculateTokenAllocation, } from './utils.js';
13
+ // Module-level singleton - MarkdownCleaner is stateless
14
+ const markdownCleaner = new MarkdownCleaner();
14
15
  // Get extraction suffix from YAML config (fallback to hardcoded if not found)
15
16
  function getExtractionSuffix() {
16
17
  const config = getToolConfig('scrape_links');
@@ -24,35 +25,31 @@ function enhanceExtractionInstruction(instruction) {
24
25
  * Handle scrape links request
25
26
  * NEVER throws - always returns a valid response with content and metadata
26
27
  */
27
- export async function handleScrapeLinks(params, options = {}) {
28
- const { sessionId, logger } = options;
28
+ export async function handleScrapeLinks(params) {
29
29
  const startTime = Date.now();
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({
30
+ // Helper to create error response
31
+ const createErrorResponse = (code, message, retryable = false) => ({
32
+ content: formatError({
34
33
  code,
35
34
  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
- },
35
+ retryable,
36
+ toolName: 'scrape_links',
37
+ howToFix: code === 'NO_URLS' ? ['Provide at least one valid URL'] : undefined,
38
+ }),
39
+ structuredContent: {
40
+ content: message,
41
+ metadata: {
42
+ total_urls: params.urls?.length || 0,
43
+ successful: 0,
44
+ failed: params.urls?.length || 0,
45
+ total_credits: 0,
46
+ execution_time_ms: Date.now() - startTime,
50
47
  },
51
- };
52
- };
48
+ },
49
+ });
53
50
  // Validate params
54
51
  if (!params.urls || params.urls.length === 0) {
55
- return createErrorResponse('No URLs provided', 'INVALID_INPUT');
52
+ return createErrorResponse('NO_URLS', 'No URLs provided');
56
53
  }
57
54
  // Filter out invalid URLs early
58
55
  const validUrls = [];
@@ -67,11 +64,11 @@ export async function handleScrapeLinks(params, options = {}) {
67
64
  }
68
65
  }
69
66
  if (validUrls.length === 0) {
70
- return createErrorResponse(`All ${params.urls.length} URLs are invalid`, 'INVALID_INPUT');
67
+ return createErrorResponse('INVALID_URLS', `All ${params.urls.length} URLs are invalid`);
71
68
  }
72
69
  const tokensPerUrl = calculateTokenAllocation(validUrls.length, TOKEN_BUDGETS.SCRAPER);
73
70
  const totalBatches = Math.ceil(validUrls.length / SCRAPER.BATCH_SIZE);
74
- await safeLog(logger, sessionId, 'info', `Starting scrape: ${validUrls.length} URL(s), ${tokensPerUrl} tokens/URL, ${totalBatches} batch(es)`, 'Scrape');
71
+ mcpLog('info', `Starting scrape: ${validUrls.length} URL(s), ${tokensPerUrl} tokens/URL, ${totalBatches} batch(es)`, 'scrape');
75
72
  // Initialize clients safely
76
73
  let client;
77
74
  try {
@@ -79,16 +76,15 @@ export async function handleScrapeLinks(params, options = {}) {
79
76
  }
80
77
  catch (error) {
81
78
  const err = classifyError(error);
82
- return createErrorResponse(`Failed to initialize scraper: ${err.message}`, 'INIT_ERROR');
79
+ return createErrorResponse('CLIENT_INIT_FAILED', `Failed to initialize scraper: ${err.message}`);
83
80
  }
84
- const markdownCleaner = new MarkdownCleaner();
85
81
  const llmProcessor = createLLMProcessor(); // Returns null if not configured
86
82
  const enhancedInstruction = params.use_llm
87
83
  ? enhanceExtractionInstruction(params.what_to_extract)
88
84
  : undefined;
89
85
  // Scrape URLs - scrapeMultiple NEVER throws
90
86
  const results = await client.scrapeMultiple(validUrls, { timeout: params.timeout });
91
- await safeLog(logger, sessionId, 'info', `Scraping complete. Processing ${results.length} results...`, 'Scrape');
87
+ mcpLog('info', `Scraping complete. Processing ${results.length} results...`, 'scrape');
92
88
  let successful = 0;
93
89
  let failed = 0;
94
90
  let totalCredits = 0;
@@ -99,7 +95,7 @@ export async function handleScrapeLinks(params, options = {}) {
99
95
  failed++;
100
96
  contents.push(`## ${invalidUrl}\n\n❌ Invalid URL format`);
101
97
  }
102
- const processed = [];
98
+ // Process each result
103
99
  for (let i = 0; i < results.length; i++) {
104
100
  const result = results[i];
105
101
  if (!result) {
@@ -107,11 +103,13 @@ export async function handleScrapeLinks(params, options = {}) {
107
103
  contents.push(`## Unknown URL\n\n❌ No result returned`);
108
104
  continue;
109
105
  }
106
+ mcpLog('debug', `[${i + 1}/${results.length}] Processing ${result.url}`, 'scrape');
110
107
  // Check for errors in result
111
108
  if (result.error || result.statusCode < 200 || result.statusCode >= 300) {
112
109
  failed++;
113
110
  const errorMsg = result.error?.message || result.content || `HTTP ${result.statusCode}`;
114
111
  contents.push(`## ${result.url}\n\n❌ Failed to scrape: ${errorMsg}`);
112
+ mcpLog('warning', `[${i + 1}/${results.length}] Failed: ${errorMsg}`, 'scrape');
115
113
  continue;
116
114
  }
117
115
  // Success case
@@ -123,89 +121,60 @@ export async function handleScrapeLinks(params, options = {}) {
123
121
  content = markdownCleaner.processContent(result.content);
124
122
  }
125
123
  catch {
124
+ // If markdown cleaning fails, use raw content
126
125
  content = result.content;
127
126
  }
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}`);
127
+ // Apply LLM extraction if enabled - processContentWithLLM NEVER throws
128
+ if (params.use_llm && llmProcessor) {
129
+ mcpLog('debug', `[${i + 1}/${results.length}] Applying LLM extraction (${tokensPerUrl} tokens)...`, 'scrape');
130
+ const llmResult = await processContentWithLLM(content, { use_llm: params.use_llm, what_to_extract: enhancedInstruction, max_tokens: tokensPerUrl }, llmProcessor);
131
+ if (llmResult.processed) {
132
+ content = llmResult.content;
133
+ mcpLog('debug', `[${i + 1}/${results.length}] LLM extraction complete`, 'scrape');
155
134
  }
156
135
  else {
157
- // Safety net — processContentWithLLM never throws, but handle anyway
158
136
  llmErrors++;
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`);
137
+ mcpLog('warning', `[${i + 1}/${results.length}] LLM extraction skipped: ${llmResult.error || 'unknown reason'}`, 'scrape');
138
+ // Continue with original content - graceful degradation
161
139
  }
162
140
  }
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}`);
141
+ // Remove meta tags safely
142
+ try {
143
+ content = removeMetaTags(content);
175
144
  }
145
+ catch {
146
+ // If this fails, just use the content as-is
147
+ }
148
+ contents.push(`## ${result.url}\n\n${content}`);
176
149
  }
177
150
  const executionTime = Date.now() - startTime;
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',
151
+ mcpLog('info', `Completed: ${successful} successful, ${failed} failed, ${totalCredits} credits used`, 'scrape');
152
+ // Build 70/20/10 response
153
+ const batchHeader = formatBatchHeader({
154
+ title: `Scraped Content (${params.urls.length} URLs)`,
182
155
  totalItems: params.urls.length,
183
156
  successful,
184
157
  failed,
185
158
  tokensPerItem: tokensPerUrl,
186
- totalBudget: TOKEN_BUDGETS.SCRAPER,
187
159
  batches: totalBatches,
188
- extras: llmErrors > 0 ? [`⚠️ ${llmErrors} LLM extraction failures`] : undefined,
160
+ extras: {
161
+ 'Credits used': totalCredits,
162
+ ...(llmErrors > 0 ? { 'LLM extraction failures': llmErrors } : {}),
163
+ },
189
164
  });
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
- }
165
+ const nextSteps = [
166
+ successful > 0 ? `Extract specific data: scrape_links(urls=[...], use_llm=true, what_to_extract="Extract pricing | features | testimonials")` : null,
167
+ failed > 0 ? `Retry failed URLs with longer timeout: scrape_links(urls=[...], timeout=60)` : null,
168
+ 'Research further: deep_research(questions=[{question: "Based on scraped content..."}])',
169
+ ].filter(Boolean);
199
170
  const formattedContent = formatSuccess({
200
- title: `Scraped Content (${params.urls.length} URLs)`,
201
- summary: `${headerInfo}\n\n**Execution Time:** ${formatDuration(executionTime)} | **Credits Used:** ${totalCredits}`,
171
+ title: 'Scraping Complete',
172
+ summary: batchHeader,
202
173
  data: contents.join('\n\n---\n\n'),
203
174
  nextSteps,
204
175
  metadata: {
205
- 'Total URLs': params.urls.length,
206
- 'Successful': successful,
207
- 'Failed': failed,
208
- 'Tokens/URL': tokensPerUrl,
176
+ 'Execution time': formatDuration(executionTime),
177
+ 'Token budget': TOKEN_BUDGETS.SCRAPER.toLocaleString(),
209
178
  },
210
179
  });
211
180
  const 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,8 +3,7 @@
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
- import { type ToolOptions } from './utils.js';
7
- export declare function handleWebSearch(params: WebSearchParams, options?: ToolOptions): Promise<{
6
+ export declare function handleWebSearch(params: WebSearchParams): Promise<{
8
7
  content: string;
9
8
  structuredContent: WebSearchOutput;
10
9
  }>;
@@ -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;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"}
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;AAyBjF,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,eAAe,CAAA;CAAE,CAAC,CA2JlE"}
@@ -6,18 +6,17 @@ import { SearchClient } from '../clients/search.js';
6
6
  import { aggregateAndRank, buildUrlLookup, lookupUrl, generateEnhancedOutput, markConsensus, } from '../utils/url-aggregator.js';
7
7
  import { CTR_WEIGHTS } from '../config/index.js';
8
8
  import { classifyError } from '../utils/errors.js';
9
- import { safeLog, formatSuccess, formatError, formatDuration, } from './utils.js';
9
+ import { mcpLog, formatError, formatDuration, } from './utils.js';
10
10
  function getPositionScore(position) {
11
11
  if (position >= 1 && position <= 10) {
12
12
  return CTR_WEIGHTS[position] ?? 0;
13
13
  }
14
14
  return Math.max(0, 10 - (position - 10) * 0.5);
15
15
  }
16
- export async function handleWebSearch(params, options = {}) {
17
- const { sessionId, logger } = options;
16
+ export async function handleWebSearch(params) {
18
17
  const startTime = Date.now();
19
18
  try {
20
- await safeLog(logger, sessionId, 'info', `Searching for ${params.keywords.length} keyword(s)`, 'WebSearch');
19
+ mcpLog('info', `Searching for ${params.keywords.length} keyword(s)`, 'search');
21
20
  const client = new SearchClient();
22
21
  const response = await client.searchMultiple(params.keywords);
23
22
  const aggregation = aggregateAndRank(response.searches, 5);
@@ -86,19 +85,16 @@ export async function handleWebSearch(params, options = {}) {
86
85
  markdown += `\n---\n\n> *${queriesOmitted} additional queries not shown. Consensus URLs above include all ${response.searches.length} queries.*\n`;
87
86
  }
88
87
  const executionTime = Date.now() - startTime;
89
- await safeLog(logger, sessionId, 'info', `Search completed: ${totalResults} results, ${aggregation.totalUniqueUrls} unique URLs, ${consensusUrls.length} consensus URLs in ${executionTime}ms`, 'WebSearch');
90
- // Add next steps section
88
+ mcpLog('info', `Search completed: ${totalResults} results, ${aggregation.totalUniqueUrls} unique URLs, ${consensusUrls.length} consensus`, 'search');
89
+ // Add Next Steps section
91
90
  const nextSteps = [
92
- `Scrape top URLs: \`scrape_links({urls: [${consensusUrls.slice(0, 3).map(u => `"${u.url}"`).join(', ')}], use_llm: true})\``,
93
- 'Use `deep_research()` for in-depth analysis of specific topics',
94
- 'Refine search with more specific keywords based on results',
95
- ];
96
- const formattedContent = formatSuccess({
97
- title: `Web Search Results (${params.keywords.length} keywords)`,
98
- summary: `**Found ${totalResults} results** across ${response.totalKeywords} queries\n• ${aggregation.totalUniqueUrls} unique URLs\n• ${consensusUrls.length} consensus URLs (appeared in ${aggregation.frequencyThreshold}+ searches)\n• Execution time: ${formatDuration(executionTime)}`,
99
- data: markdown,
100
- nextSteps,
101
- });
91
+ consensusUrls.length > 0 ? `Scrape top consensus URLs: scrape_links(urls=[${consensusUrls.slice(0, 3).map(u => `"${u.url}"`).join(', ')}], use_llm=true)` : null,
92
+ 'Get Reddit perspective: search_reddit(queries=[...related terms...])',
93
+ 'Deep research: deep_research(questions=[{question: "Based on search results..."}])',
94
+ ].filter(Boolean);
95
+ markdown += '\n\n---\n\n**Next Steps:**\n';
96
+ nextSteps.forEach(step => { markdown += `→ ${step}\n`; });
97
+ markdown += `\n---\n*${formatDuration(executionTime)} | ${aggregation.totalUniqueUrls} unique URLs | ${consensusUrls.length} consensus*`;
102
98
  const metadata = {
103
99
  total_keywords: response.totalKeywords,
104
100
  total_results: totalResults,
@@ -107,20 +103,22 @@ export async function handleWebSearch(params, options = {}) {
107
103
  consensus_url_count: consensusUrls.length,
108
104
  frequency_threshold: aggregation.frequencyThreshold,
109
105
  };
110
- return { content: formattedContent, structuredContent: { content: formattedContent, metadata } };
106
+ return { content: markdown, structuredContent: { content: markdown, metadata } };
111
107
  }
112
108
  catch (error) {
113
- // Classify error for better reporting
114
109
  const structuredError = classifyError(error);
115
- await safeLog(logger, sessionId, 'error', `web_search: ${structuredError.message}`, 'WebSearch');
116
110
  const executionTime = Date.now() - startTime;
111
+ mcpLog('error', `web_search: ${structuredError.message}`, 'search');
117
112
  const errorContent = formatError({
118
113
  code: structuredError.code,
119
114
  message: structuredError.message,
120
115
  retryable: structuredError.retryable,
121
116
  toolName: 'web_search',
122
- howToFix: ['Make sure SERPER_API_KEY is set in your environment variables'],
123
- alternatives: ['Try search_reddit() for community discussions', 'Use deep_research() for AI-powered research'],
117
+ howToFix: ['Verify SERPER_API_KEY is set correctly'],
118
+ alternatives: [
119
+ 'search_reddit(queries=[...]) for Reddit-specific results',
120
+ 'deep_research(questions=[...]) for AI-synthesized research',
121
+ ],
124
122
  });
125
123
  return {
126
124
  content: errorContent,
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -1,53 +1,105 @@
1
1
  /**
2
2
  * Shared Tool Utilities
3
- * Central module for common tool functionality
4
- * Re-exports from specialized utility modules for backwards compatibility
3
+ * Extracted from individual handlers to eliminate duplication
5
4
  */
6
- export { safeLog, createToolLogger, type ToolLogger, type ToolOptions } from '../utils/logger.js';
7
- export { formatSuccess, formatError, formatBatchHeader, formatList, formatKeyValues, formatDuration, truncateText, type SuccessResponseOptions, type ErrorResponseOptions, type BatchResultOptions, } from '../utils/response.js';
5
+ export { mcpLog, safeLog as safeLogSimple, createToolLogger, type LogLevel, type ToolLogger as SimpleToolLogger, } from '../utils/logger.js';
6
+ export { formatSuccess, formatError, formatBatchHeader, formatList, formatDuration, truncateText, type SuccessOptions, type ErrorOptions, type BatchHeaderOptions, type ListItem, } from '../utils/response.js';
8
7
  /**
9
- * Token budgets for different tools
10
- * Centralized here to ensure consistency
8
+ * Centralized token budgets for all tools
11
9
  */
12
10
  export declare const TOKEN_BUDGETS: {
13
- /** Total token budget for deep research */
11
+ /** Deep research total budget */
14
12
  readonly RESEARCH: 32000;
15
- /** Total token budget for web scraping */
13
+ /** Web scraper total budget */
16
14
  readonly SCRAPER: 32000;
17
- /** Total token budget for Reddit post fetching */
18
- readonly REDDIT: 1000;
15
+ /** Reddit comment budget per batch */
16
+ readonly REDDIT_COMMENTS: 1000;
19
17
  };
18
+ /**
19
+ * Logger function type used by tools
20
+ */
21
+ export type ToolLogger = (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
22
+ /**
23
+ * Standard tool options passed to handlers
24
+ */
25
+ export interface ToolOptions {
26
+ sessionId?: string;
27
+ logger?: ToolLogger;
28
+ }
29
+ /**
30
+ * Safe logger wrapper - NEVER throws
31
+ * Logs to provided logger or falls back to console.error
32
+ *
33
+ * @param logger - Optional logger function
34
+ * @param sessionId - Session ID for logging context
35
+ * @param level - Log level
36
+ * @param message - Message to log
37
+ * @param toolName - Name of the tool for prefixing
38
+ */
39
+ export declare function safeLog(logger: ToolLogger | undefined, sessionId: string | undefined, level: 'info' | 'error' | 'debug', message: string, toolName: string): Promise<void>;
20
40
  /**
21
41
  * Calculate token allocation for batch operations
22
42
  * Distributes a fixed budget across multiple items
23
43
  *
24
44
  * @param count - Number of items to distribute budget across
25
- * @param budget - Total token budget (defaults to RESEARCH budget)
45
+ * @param budget - Total token budget
26
46
  * @returns Tokens per item
27
47
  */
28
- export declare function calculateTokenAllocation(count: number, budget?: number): number;
48
+ export declare function calculateTokenAllocation(count: number, budget: number): number;
29
49
  /**
30
- * @deprecated Use formatError from response.ts instead
50
+ * Format retry hint based on error retryability
51
+ *
52
+ * @param retryable - Whether the error is retryable
53
+ * @returns Hint string or empty string
31
54
  */
32
55
  export declare function formatRetryHint(retryable: boolean): string;
33
56
  /**
34
- * @deprecated Use formatError from response.ts instead
57
+ * Create a standard error markdown response
58
+ *
59
+ * @param toolName - Name of the tool that errored
60
+ * @param errorCode - Error code
61
+ * @param message - Error message
62
+ * @param retryable - Whether error is retryable
63
+ * @param tip - Optional tip for resolution
64
+ * @returns Formatted markdown error string
35
65
  */
36
66
  export declare function formatToolError(toolName: string, errorCode: string, message: string, retryable: boolean, tip?: string): string;
37
67
  /**
38
68
  * Validate that a value is a non-empty array
69
+ *
70
+ * @param value - Value to check
71
+ * @param fieldName - Field name for error message
72
+ * @returns Error message or undefined if valid
39
73
  */
40
74
  export declare function validateNonEmptyArray(value: unknown, fieldName: string): string | undefined;
41
75
  /**
42
76
  * Validate array length is within bounds
77
+ *
78
+ * @param arr - Array to check
79
+ * @param min - Minimum length
80
+ * @param max - Maximum length
81
+ * @param fieldName - Field name for error message
82
+ * @returns Error message or undefined if valid
43
83
  */
44
84
  export declare function validateArrayBounds(arr: unknown[], min: number, max: number, fieldName: string): string | undefined;
45
85
  /**
46
- * @deprecated Use formatBatchHeader from response.ts instead
86
+ * Build standard header for batch operation results
87
+ *
88
+ * @param title - Title of the results section
89
+ * @param count - Number of items processed
90
+ * @param tokensPerItem - Tokens allocated per item
91
+ * @param totalBudget - Total token budget
92
+ * @returns Formatted header string
47
93
  */
48
94
  export declare function buildBatchHeader(title: string, count: number, tokensPerItem: number, totalBudget: number): string;
49
95
  /**
50
- * @deprecated Use formatBatchHeader from response.ts instead
96
+ * Build status line for batch results
97
+ *
98
+ * @param successful - Number of successful items
99
+ * @param failed - Number of failed items
100
+ * @param batches - Number of batches processed
101
+ * @param extras - Optional extra status items
102
+ * @returns Formatted status line
51
103
  */
52
104
  export declare function buildStatusLine(successful: number, failed: number, batches: number, extras?: string[]): string;
53
105
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlG,OAAO,EACL,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,cAAc,EACd,YAAY,EACZ,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAM9B;;;GAGG;AACH,eAAO,MAAM,aAAa;IACxB,2CAA2C;;IAE3C,0CAA0C;;IAE1C,kDAAkD;;CAE1C,CAAC;AAMX;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAA+B,GAAG,MAAM,CAGvG;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAI1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAIR;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAQpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EAAE,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAQpB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,MAAM,CAMR"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,MAAM,EACN,OAAO,IAAI,aAAa,EACxB,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,IAAI,gBAAgB,GACpC,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,GACd,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB,iCAAiC;;IAEjC,+BAA+B;;IAE/B,sCAAsC;;CAE9B,CAAC;AAMX;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EACjC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAMD;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAMD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG9E;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAI1D;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,OAAO,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAIR;AAMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,OAAO,EAAE,EACd,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAQpB;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EAAE,GAChB,MAAM,CAMR"}