research-powerpack-mcp 3.4.8 → 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 (70) hide show
  1. package/README.md +63 -674
  2. package/dist/clients/reddit.d.ts +1 -6
  3. package/dist/clients/reddit.d.ts.map +1 -1
  4. package/dist/clients/reddit.js +24 -60
  5. package/dist/clients/reddit.js.map +1 -1
  6. package/dist/clients/scraper.d.ts +1 -6
  7. package/dist/clients/scraper.d.ts.map +1 -1
  8. package/dist/clients/scraper.js +33 -71
  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 +6 -11
  13. package/dist/clients/search.js.map +1 -1
  14. package/dist/config/env.d.ts +75 -0
  15. package/dist/config/env.d.ts.map +1 -0
  16. package/dist/config/env.js +87 -0
  17. package/dist/config/env.js.map +1 -0
  18. package/dist/config/index.d.ts.map +1 -1
  19. package/dist/config/index.js +1 -5
  20. package/dist/config/index.js.map +1 -1
  21. package/dist/config/loader.d.ts.map +1 -1
  22. package/dist/config/loader.js +1 -6
  23. package/dist/config/loader.js.map +1 -1
  24. package/dist/config/yaml/tools-enhanced.yaml +0 -0
  25. package/dist/index.js +85 -25
  26. package/dist/index.js.map +1 -1
  27. package/dist/schemas/web-search.js +1 -1
  28. package/dist/schemas/web-search.js.map +1 -1
  29. package/dist/services/file-attachment.d.ts.map +1 -1
  30. package/dist/services/file-attachment.js +22 -25
  31. package/dist/services/file-attachment.js.map +1 -1
  32. package/dist/services/llm-processor.js +0 -25
  33. package/dist/services/llm-processor.js.map +1 -1
  34. package/dist/tools/reddit.d.ts.map +1 -1
  35. package/dist/tools/reddit.js +77 -29
  36. package/dist/tools/reddit.js.map +1 -1
  37. package/dist/tools/registry.js +2 -2
  38. package/dist/tools/registry.js.map +1 -1
  39. package/dist/tools/research.d.ts +2 -6
  40. package/dist/tools/research.d.ts.map +1 -1
  41. package/dist/tools/research.js +64 -53
  42. package/dist/tools/research.js.map +1 -1
  43. package/dist/tools/scrape.d.ts +1 -5
  44. package/dist/tools/scrape.d.ts.map +1 -1
  45. package/dist/tools/scrape.js +108 -66
  46. package/dist/tools/scrape.js.map +1 -1
  47. package/dist/tools/search.d.ts +1 -5
  48. package/dist/tools/search.d.ts.map +1 -1
  49. package/dist/tools/search.js +26 -16
  50. package/dist/tools/search.js.map +1 -1
  51. package/dist/tools/utils.d.ts +20 -59
  52. package/dist/tools/utils.d.ts.map +1 -1
  53. package/dist/tools/utils.js +25 -61
  54. package/dist/tools/utils.js.map +1 -1
  55. package/dist/utils/logger.d.ts +36 -0
  56. package/dist/utils/logger.d.ts.map +1 -0
  57. package/dist/utils/logger.js +40 -0
  58. package/dist/utils/logger.js.map +1 -0
  59. package/dist/utils/response.d.ts +101 -0
  60. package/dist/utils/response.d.ts.map +1 -0
  61. package/dist/utils/response.js +183 -0
  62. package/dist/utils/response.js.map +1 -0
  63. package/dist/utils/url-aggregator.d.ts.map +1 -1
  64. package/dist/utils/url-aggregator.js +4 -6
  65. package/dist/utils/url-aggregator.js.map +1 -1
  66. package/package.json +8 -2
  67. package/dist/utils/concurrency.d.ts +0 -29
  68. package/dist/utils/concurrency.d.ts.map +0 -1
  69. package/dist/utils/concurrency.js +0 -73
  70. package/dist/utils/concurrency.js.map +0 -1
@@ -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,36 +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';
12
- // Module-level singleton - MarkdownCleaner is stateless
13
- const markdownCleaner = new MarkdownCleaner();
13
+ import { safeLog, calculateTokenAllocation, TOKEN_BUDGETS, formatSuccess, formatError, formatBatchHeader, formatDuration, } from './utils.js';
14
14
  // Get extraction suffix from YAML config (fallback to hardcoded if not found)
15
15
  function getExtractionSuffix() {
16
16
  const config = getToolConfig('scrape_links');
17
17
  return config?.limits?.extraction_suffix || SCRAPER.EXTRACTION_SUFFIX;
18
18
  }
19
- function calculateTokenAllocation(urlCount) {
20
- if (urlCount <= 0)
21
- return SCRAPER.MAX_TOKENS_BUDGET;
22
- return Math.floor(SCRAPER.MAX_TOKENS_BUDGET / urlCount);
23
- }
24
19
  function enhanceExtractionInstruction(instruction) {
25
20
  const base = instruction || 'Extract the main content and key information from this page.';
26
21
  return `${base}\n\n${getExtractionSuffix()}`;
27
22
  }
28
- /**
29
- * Safe logger wrapper - NEVER throws
30
- */
31
- async function safeLog(logger, sessionId, level, message) {
32
- if (!logger || !sessionId)
33
- return;
34
- try {
35
- await logger(level, message, sessionId);
36
- }
37
- catch {
38
- // Silently ignore logger errors - they should never crash the tool
39
- console.error(`[Scrape Tool] Logger failed: ${message}`);
40
- }
41
- }
42
23
  /**
43
24
  * Handle scrape links request
44
25
  * NEVER throws - always returns a valid response with content and metadata
@@ -46,23 +27,32 @@ async function safeLog(logger, sessionId, level, message) {
46
27
  export async function handleScrapeLinks(params, options = {}) {
47
28
  const { sessionId, logger } = options;
48
29
  const startTime = Date.now();
49
- // Helper to create error response
50
- const createErrorResponse = (message, executionTime) => ({
51
- content: `# Scraping Failed\n\n${message}`,
52
- structuredContent: {
53
- content: `# ❌ Scraping Failed\n\n${message}`,
54
- metadata: {
55
- total_urls: params.urls?.length || 0,
56
- successful: 0,
57
- failed: params.urls?.length || 0,
58
- total_credits: 0,
59
- 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
+ },
60
50
  },
61
- },
62
- });
51
+ };
52
+ };
63
53
  // Validate params
64
54
  if (!params.urls || params.urls.length === 0) {
65
- return createErrorResponse('No URLs provided', Date.now() - startTime);
55
+ return createErrorResponse('No URLs provided', 'INVALID_INPUT');
66
56
  }
67
57
  // Filter out invalid URLs early
68
58
  const validUrls = [];
@@ -77,11 +67,11 @@ export async function handleScrapeLinks(params, options = {}) {
77
67
  }
78
68
  }
79
69
  if (validUrls.length === 0) {
80
- return createErrorResponse(`All ${params.urls.length} URLs are invalid`, Date.now() - startTime);
70
+ return createErrorResponse(`All ${params.urls.length} URLs are invalid`, 'INVALID_INPUT');
81
71
  }
82
- const tokensPerUrl = calculateTokenAllocation(validUrls.length);
72
+ const tokensPerUrl = calculateTokenAllocation(validUrls.length, TOKEN_BUDGETS.SCRAPER);
83
73
  const totalBatches = Math.ceil(validUrls.length / SCRAPER.BATCH_SIZE);
84
- 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');
85
75
  // Initialize clients safely
86
76
  let client;
87
77
  try {
@@ -89,15 +79,16 @@ export async function handleScrapeLinks(params, options = {}) {
89
79
  }
90
80
  catch (error) {
91
81
  const err = classifyError(error);
92
- return createErrorResponse(`Failed to initialize scraper: ${err.message}`, Date.now() - startTime);
82
+ return createErrorResponse(`Failed to initialize scraper: ${err.message}`, 'INIT_ERROR');
93
83
  }
84
+ const markdownCleaner = new MarkdownCleaner();
94
85
  const llmProcessor = createLLMProcessor(); // Returns null if not configured
95
86
  const enhancedInstruction = params.use_llm
96
87
  ? enhanceExtractionInstruction(params.what_to_extract)
97
88
  : undefined;
98
89
  // Scrape URLs - scrapeMultiple NEVER throws
99
90
  const results = await client.scrapeMultiple(validUrls, { timeout: params.timeout });
100
- await safeLog(logger, sessionId, 'info', `Scraping complete. Processing ${results.length} results...`);
91
+ await safeLog(logger, sessionId, 'info', `Scraping complete. Processing ${results.length} results...`, 'Scrape');
101
92
  let successful = 0;
102
93
  let failed = 0;
103
94
  let totalCredits = 0;
@@ -108,7 +99,7 @@ export async function handleScrapeLinks(params, options = {}) {
108
99
  failed++;
109
100
  contents.push(`## ${invalidUrl}\n\n❌ Invalid URL format`);
110
101
  }
111
- // Process each result
102
+ const processed = [];
112
103
  for (let i = 0; i < results.length; i++) {
113
104
  const result = results[i];
114
105
  if (!result) {
@@ -116,13 +107,11 @@ export async function handleScrapeLinks(params, options = {}) {
116
107
  contents.push(`## Unknown URL\n\n❌ No result returned`);
117
108
  continue;
118
109
  }
119
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] Processing ${result.url}`);
120
110
  // Check for errors in result
121
111
  if (result.error || result.statusCode < 200 || result.statusCode >= 300) {
122
112
  failed++;
123
113
  const errorMsg = result.error?.message || result.content || `HTTP ${result.statusCode}`;
124
114
  contents.push(`## ${result.url}\n\n❌ Failed to scrape: ${errorMsg}`);
125
- await safeLog(logger, sessionId, 'error', `[${i + 1}/${results.length}] Failed: ${errorMsg}`);
126
115
  continue;
127
116
  }
128
117
  // Success case
@@ -134,38 +123,91 @@ export async function handleScrapeLinks(params, options = {}) {
134
123
  content = markdownCleaner.processContent(result.content);
135
124
  }
136
125
  catch {
137
- // If markdown cleaning fails, use raw content
138
126
  content = result.content;
139
127
  }
140
- // Apply LLM extraction if enabled - processContentWithLLM NEVER throws
141
- if (params.use_llm && llmProcessor) {
142
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] Applying LLM extraction (${tokensPerUrl} tokens)...`);
143
- const llmResult = await processContentWithLLM(content, { use_llm: params.use_llm, what_to_extract: enhancedInstruction, max_tokens: tokensPerUrl }, llmProcessor);
144
- if (llmResult.processed) {
145
- content = llmResult.content;
146
- 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}`);
147
155
  }
148
156
  else {
157
+ // Safety net — processContentWithLLM never throws, but handle anyway
149
158
  llmErrors++;
150
- await safeLog(logger, sessionId, 'info', `[${i + 1}/${results.length}] LLM extraction skipped: ${llmResult.error || 'unknown reason'}`);
151
- // 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`);
152
161
  }
153
162
  }
154
- // Remove meta tags safely
155
- try {
156
- content = removeMetaTags(content);
157
- }
158
- catch {
159
- // 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}`);
160
175
  }
161
- contents.push(`## ${result.url}\n\n${content}`);
162
176
  }
163
177
  const executionTime = Date.now() - startTime;
164
- await safeLog(logger, sessionId, 'info', `Completed: ${successful} successful, ${failed} failed, ${totalCredits} credits used`);
165
- // Build response
166
- const allocationHeader = `**Token Allocation:** ${tokensPerUrl.toLocaleString()} tokens/URL (${params.urls.length} URLs, ${SCRAPER.MAX_TOKENS_BUDGET.toLocaleString()} total budget)`;
167
- const statusHeader = `**Status:** ✅ ${successful} successful | ❌ ${failed} failed | 📦 ${totalBatches} batch(es)${llmErrors > 0 ? ` | ⚠️ ${llmErrors} LLM extraction failures` : ''}`;
168
- 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
+ });
169
211
  const metadata = {
170
212
  total_urls: params.urls.length,
171
213
  successful,
@@ -173,7 +215,7 @@ export async function handleScrapeLinks(params, options = {}) {
173
215
  total_credits: totalCredits,
174
216
  execution_time_ms: executionTime,
175
217
  tokens_per_url: tokensPerUrl,
176
- total_token_budget: SCRAPER.MAX_TOKENS_BUDGET,
218
+ total_token_budget: TOKEN_BUDGETS.SCRAPER,
177
219
  batches_processed: totalBatches,
178
220
  };
179
221
  return { content: formattedContent, structuredContent: { content: formattedContent, metadata } };
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,wDAAwD;AACxD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;AAE9C,8EAA8E;AAC9E,SAAS,mBAAmB;IAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAC7C,OAAO,MAAM,EAAE,MAAM,EAAE,iBAA2B,IAAI,OAAO,CAAC,iBAAiB,CAAC;AAClF,CAAC;AAOD,SAAS,wBAAwB,CAAC,QAAgB;IAChD,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,iBAAiB,CAAC;IACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,GAAG,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,4BAA4B,CAAC,WAA+B;IACnE,MAAM,IAAI,GAAG,WAAW,IAAI,8DAA8D,CAAC;IAC3F,OAAO,GAAG,IAAI,OAAO,mBAAmB,EAAE,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CACpB,MAA6B,EAC7B,SAA6B,EAC7B,KAAiC,EACjC,OAAe;IAEf,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;QAAE,OAAO;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,OAAO,CAAC,KAAK,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAyB,EACzB,UAAuB,EAAE;IAEzB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,kCAAkC;IAClC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,aAAqB,EAA6D,EAAE,CAAC,CAAC;QAClI,OAAO,EAAE,0BAA0B,OAAO,EAAE;QAC5C,iBAAiB,EAAE;YACjB,OAAO,EAAE,0BAA0B,OAAO,EAAE;YAC5C,QAAQ,EAAE;gBACR,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;gBACpC,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;gBAChC,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,aAAa;aACjC;SACF;KACF,CAAC,CAAC;IAEH,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACb,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,mBAAmB,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,mBAAmB,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IACnG,CAAC;IAED,MAAM,YAAY,GAAG,wBAAwB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAEtE,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,SAAS,CAAC,MAAM,YAAY,YAAY,gBAAgB,YAAY,YAAY,CAAC,CAAC;IAE/I,4BAA4B;IAC5B,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,mBAAmB,CAAC,iCAAiC,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC,CAAC,iCAAiC;IAE5E,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO;QACxC,CAAC,CAAC,4BAA4B,CAAC,MAAM,CAAC,eAAe,CAAC;QACtD,CAAC,CAAC,SAAS,CAAC;IAEd,4CAA4C;IAC5C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAEpF,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iCAAiC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;IAEvG,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,mCAAmC;IACnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC;QACT,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,0BAA0B,CAAC,CAAC;IAC5D,CAAC;IAED,sBAAsB;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;YACxD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,gBAAgB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAElG,6BAA6B;QAC7B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;YACxE,MAAM,EAAE,CAAC;YACT,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,MAAM,CAAC,UAAU,EAAE,CAAC;YACxF,QAAQ,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YAErE,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,aAAa,QAAQ,EAAE,CAAC,CAAC;YAC9F,SAAS;QACX,CAAC;QAED,eAAe;QACf,UAAU,EAAE,CAAC;QACb,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC;QAE/B,yBAAyB;QACzB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;YAC9C,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;QAED,uEAAuE;QACvE,IAAI,MAAM,CAAC,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,8BAA8B,YAAY,aAAa,CAAC,CAAC;YAE7H,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAC3C,OAAO,EACP,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,EAC3F,YAAY,CACb,CAAC;YAEF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;gBACxB,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;gBAC5B,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,2BAA2B,CAAC,CAAC;YACnG,CAAC;iBAAM,CAAC;gBACN,SAAS,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,6BAA6B,SAAS,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC;gBACxI,wDAAwD;YAC1D,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC;YACH,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,GAAG,OAAO,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE7C,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,UAAU,gBAAgB,MAAM,YAAY,YAAY,eAAe,CAAC,CAAC;IAEhI,iBAAiB;IACjB,MAAM,gBAAgB,GAAG,yBAAyB,YAAY,CAAC,cAAc,EAAE,gBAAgB,MAAM,CAAC,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC,iBAAiB,CAAC,cAAc,EAAE,gBAAgB,CAAC;IACtL,MAAM,YAAY,GAAG,iBAAiB,UAAU,mBAAmB,MAAM,gBAAgB,YAAY,aAAa,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,0BAA0B,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACtL,MAAM,gBAAgB,GAAG,sBAAsB,MAAM,CAAC,IAAI,CAAC,MAAM,aAAa,gBAAgB,KAAK,YAAY,cAAc,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IAE5J,MAAM,QAAQ,GAAG;QACf,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC9B,UAAU;QACV,MAAM;QACN,aAAa,EAAE,YAAY;QAC3B,iBAAiB,EAAE,aAAa;QAChC,cAAc,EAAE,YAAY;QAC5B,kBAAkB,EAAE,OAAO,CAAC,iBAAiB;QAC7C,iBAAiB,EAAE,YAAY;KAChC,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,CAAC;AACnG,CAAC"}
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"}
@@ -6,6 +6,7 @@ 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
10
  function getPositionScore(position) {
10
11
  if (position >= 1 && position <= 10) {
11
12
  return CTR_WEIGHTS[position] ?? 0;
@@ -16,9 +17,7 @@ export async function handleWebSearch(params, options = {}) {
16
17
  const { sessionId, logger } = options;
17
18
  const startTime = Date.now();
18
19
  try {
19
- if (sessionId && logger) {
20
- await logger('info', `Searching for ${params.keywords.length} keyword(s)`, sessionId);
21
- }
20
+ await safeLog(logger, sessionId, 'info', `Searching for ${params.keywords.length} keyword(s)`, 'WebSearch');
22
21
  const client = new SearchClient();
23
22
  const response = await client.searchMultiple(params.keywords);
24
23
  const aggregation = aggregateAndRank(response.searches, 5);
@@ -87,9 +86,19 @@ export async function handleWebSearch(params, options = {}) {
87
86
  markdown += `\n---\n\n> *${queriesOmitted} additional queries not shown. Consensus URLs above include all ${response.searches.length} queries.*\n`;
88
87
  }
89
88
  const executionTime = Date.now() - startTime;
90
- if (sessionId && logger) {
91
- await logger('info', `Search completed: ${totalResults} results, ${aggregation.totalUniqueUrls} unique URLs, ${consensusUrls.length} consensus URLs in ${executionTime}ms`, sessionId);
92
- }
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
91
+ 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
+ });
93
102
  const metadata = {
94
103
  total_keywords: response.totalKeywords,
95
104
  total_results: totalResults,
@@ -98,20 +107,21 @@ export async function handleWebSearch(params, options = {}) {
98
107
  consensus_url_count: consensusUrls.length,
99
108
  frequency_threshold: aggregation.frequencyThreshold,
100
109
  };
101
- return { content: markdown, structuredContent: { content: markdown, metadata } };
110
+ return { content: formattedContent, structuredContent: { content: formattedContent, metadata } };
102
111
  }
103
112
  catch (error) {
104
113
  // Classify error for better reporting
105
114
  const structuredError = classifyError(error);
106
- const errorCode = structuredError.code;
107
- if (sessionId && logger) {
108
- await logger('error', `web_search: ${structuredError.message}`, sessionId);
109
- }
115
+ await safeLog(logger, sessionId, 'error', `web_search: ${structuredError.message}`, 'WebSearch');
110
116
  const executionTime = Date.now() - startTime;
111
- const retryHint = structuredError.retryable
112
- ? '\n\n💡 This error may be temporary. Try again in a moment.'
113
- : '';
114
- const errorContent = `# ❌ web_search: Search Failed\n\n**${errorCode}:** ${structuredError.message}${retryHint}\n\n**Tip:** Make sure SERPER_API_KEY is set in your environment variables.`;
117
+ const errorContent = formatError({
118
+ code: structuredError.code,
119
+ message: structuredError.message,
120
+ retryable: structuredError.retryable,
121
+ 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'],
124
+ });
115
125
  return {
116
126
  content: errorContent,
117
127
  structuredContent: {
@@ -120,7 +130,7 @@ export async function handleWebSearch(params, options = {}) {
120
130
  total_keywords: params.keywords.length,
121
131
  total_results: 0,
122
132
  execution_time_ms: executionTime,
123
- errorCode, // Include error code for programmatic handling
133
+ errorCode: structuredError.code,
124
134
  },
125
135
  },
126
136
  };
@@ -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,92 +1,53 @@
1
1
  /**
2
2
  * Shared Tool Utilities
3
- * Extracted from individual handlers to eliminate duplication
3
+ * Central module for common tool functionality
4
+ * Re-exports from specialized utility modules for backwards compatibility
4
5
  */
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
8
  /**
6
- * Logger function type used by tools
9
+ * Token budgets for different tools
10
+ * Centralized here to ensure consistency
7
11
  */
8
- export type ToolLogger = (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
9
- /**
10
- * Standard tool options passed to handlers
11
- */
12
- export interface ToolOptions {
13
- sessionId?: string;
14
- logger?: ToolLogger;
15
- }
16
- /**
17
- * Safe logger wrapper - NEVER throws
18
- * Logs to provided logger or falls back to console.error
19
- *
20
- * @param logger - Optional logger function
21
- * @param sessionId - Session ID for logging context
22
- * @param level - Log level
23
- * @param message - Message to log
24
- * @param toolName - Name of the tool for prefixing
25
- */
26
- export declare function safeLog(logger: ToolLogger | undefined, sessionId: string | undefined, level: 'info' | 'error' | 'debug', message: string, toolName: string): Promise<void>;
12
+ export declare const TOKEN_BUDGETS: {
13
+ /** Total token budget for deep research */
14
+ readonly RESEARCH: 32000;
15
+ /** Total token budget for web scraping */
16
+ readonly SCRAPER: 32000;
17
+ /** Total token budget for Reddit post fetching */
18
+ readonly REDDIT: 1000;
19
+ };
27
20
  /**
28
21
  * Calculate token allocation for batch operations
29
22
  * Distributes a fixed budget across multiple items
30
23
  *
31
24
  * @param count - Number of items to distribute budget across
32
- * @param budget - Total token budget
25
+ * @param budget - Total token budget (defaults to RESEARCH budget)
33
26
  * @returns Tokens per item
34
27
  */
35
- export declare function calculateTokenAllocation(count: number, budget: number): number;
28
+ export declare function calculateTokenAllocation(count: number, budget?: number): number;
36
29
  /**
37
- * Format retry hint based on error retryability
38
- *
39
- * @param retryable - Whether the error is retryable
40
- * @returns Hint string or empty string
30
+ * @deprecated Use formatError from response.ts instead
41
31
  */
42
32
  export declare function formatRetryHint(retryable: boolean): string;
43
33
  /**
44
- * Create a standard error markdown response
45
- *
46
- * @param toolName - Name of the tool that errored
47
- * @param errorCode - Error code
48
- * @param message - Error message
49
- * @param retryable - Whether error is retryable
50
- * @param tip - Optional tip for resolution
51
- * @returns Formatted markdown error string
34
+ * @deprecated Use formatError from response.ts instead
52
35
  */
53
36
  export declare function formatToolError(toolName: string, errorCode: string, message: string, retryable: boolean, tip?: string): string;
54
37
  /**
55
38
  * Validate that a value is a non-empty array
56
- *
57
- * @param value - Value to check
58
- * @param fieldName - Field name for error message
59
- * @returns Error message or undefined if valid
60
39
  */
61
40
  export declare function validateNonEmptyArray(value: unknown, fieldName: string): string | undefined;
62
41
  /**
63
42
  * Validate array length is within bounds
64
- *
65
- * @param arr - Array to check
66
- * @param min - Minimum length
67
- * @param max - Maximum length
68
- * @param fieldName - Field name for error message
69
- * @returns Error message or undefined if valid
70
43
  */
71
44
  export declare function validateArrayBounds(arr: unknown[], min: number, max: number, fieldName: string): string | undefined;
72
45
  /**
73
- * Build standard header for batch operation results
74
- *
75
- * @param title - Title of the results section
76
- * @param count - Number of items processed
77
- * @param tokensPerItem - Tokens allocated per item
78
- * @param totalBudget - Total token budget
79
- * @returns Formatted header string
46
+ * @deprecated Use formatBatchHeader from response.ts instead
80
47
  */
81
48
  export declare function buildBatchHeader(title: string, count: number, tokensPerItem: number, totalBudget: number): string;
82
49
  /**
83
- * Build status line for batch results
84
- *
85
- * @param successful - Number of successful items
86
- * @param failed - Number of failed items
87
- * @param batches - Number of batches processed
88
- * @param extras - Optional extra status items
89
- * @returns Formatted status line
50
+ * @deprecated Use formatBatchHeader from response.ts instead
90
51
  */
91
52
  export declare function buildStatusLine(successful: number, failed: number, batches: number, extras?: string[]): string;
92
53
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;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"}
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"}