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,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"}
@@ -1,31 +1,27 @@
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
+ // Re-export logging utilities from centralized module
7
+ export { safeLog, createToolLogger } from '../utils/logger.js';
8
+ // Re-export response formatting utilities
9
+ export { formatSuccess, formatError, formatBatchHeader, formatList, formatKeyValues, formatDuration, truncateText, } from '../utils/response.js';
5
10
  // ============================================================================
6
- // Logging Utilities
11
+ // Token Budget Constants
7
12
  // ============================================================================
8
13
  /**
9
- * Safe logger wrapper - NEVER throws
10
- * Logs to provided logger or falls back to console.error
11
- *
12
- * @param logger - Optional logger function
13
- * @param sessionId - Session ID for logging context
14
- * @param level - Log level
15
- * @param message - Message to log
16
- * @param toolName - Name of the tool for prefixing
14
+ * Token budgets for different tools
15
+ * Centralized here to ensure consistency
17
16
  */
18
- export async function safeLog(logger, sessionId, level, message, toolName) {
19
- if (!logger || !sessionId)
20
- return;
21
- try {
22
- await logger(level, `[${toolName}] ${message}`, sessionId);
23
- }
24
- catch {
25
- // Silently ignore logger errors - they should never crash the tool
26
- console.error(`[${toolName}] Logger failed: ${message}`);
27
- }
28
- }
17
+ export const TOKEN_BUDGETS = {
18
+ /** Total token budget for deep research */
19
+ RESEARCH: 32000,
20
+ /** Total token budget for web scraping */
21
+ SCRAPER: 32000,
22
+ /** Total token budget for Reddit post fetching */
23
+ REDDIT: 1000, // Comments budget
24
+ };
29
25
  // ============================================================================
30
26
  // Token Allocation
31
27
  // ============================================================================
@@ -34,22 +30,19 @@ export async function safeLog(logger, sessionId, level, message, toolName) {
34
30
  * Distributes a fixed budget across multiple items
35
31
  *
36
32
  * @param count - Number of items to distribute budget across
37
- * @param budget - Total token budget
33
+ * @param budget - Total token budget (defaults to RESEARCH budget)
38
34
  * @returns Tokens per item
39
35
  */
40
- export function calculateTokenAllocation(count, budget) {
36
+ export function calculateTokenAllocation(count, budget = TOKEN_BUDGETS.RESEARCH) {
41
37
  if (count <= 0)
42
38
  return budget;
43
39
  return Math.floor(budget / count);
44
40
  }
45
41
  // ============================================================================
46
- // Error Formatting
42
+ // Legacy Error Formatting (deprecated - use response.ts instead)
47
43
  // ============================================================================
48
44
  /**
49
- * Format retry hint based on error retryability
50
- *
51
- * @param retryable - Whether the error is retryable
52
- * @returns Hint string or empty string
45
+ * @deprecated Use formatError from response.ts instead
53
46
  */
54
47
  export function formatRetryHint(retryable) {
55
48
  return retryable
@@ -57,14 +50,7 @@ export function formatRetryHint(retryable) {
57
50
  : '';
58
51
  }
59
52
  /**
60
- * Create a standard error markdown response
61
- *
62
- * @param toolName - Name of the tool that errored
63
- * @param errorCode - Error code
64
- * @param message - Error message
65
- * @param retryable - Whether error is retryable
66
- * @param tip - Optional tip for resolution
67
- * @returns Formatted markdown error string
53
+ * @deprecated Use formatError from response.ts instead
68
54
  */
69
55
  export function formatToolError(toolName, errorCode, message, retryable, tip) {
70
56
  const retryHint = formatRetryHint(retryable);
@@ -76,10 +62,6 @@ export function formatToolError(toolName, errorCode, message, retryable, tip) {
76
62
  // ============================================================================
77
63
  /**
78
64
  * Validate that a value is a non-empty array
79
- *
80
- * @param value - Value to check
81
- * @param fieldName - Field name for error message
82
- * @returns Error message or undefined if valid
83
65
  */
84
66
  export function validateNonEmptyArray(value, fieldName) {
85
67
  if (!Array.isArray(value)) {
@@ -92,12 +74,6 @@ export function validateNonEmptyArray(value, fieldName) {
92
74
  }
93
75
  /**
94
76
  * Validate array length is within bounds
95
- *
96
- * @param arr - Array to check
97
- * @param min - Minimum length
98
- * @param max - Maximum length
99
- * @param fieldName - Field name for error message
100
- * @returns Error message or undefined if valid
101
77
  */
102
78
  export function validateArrayBounds(arr, min, max, fieldName) {
103
79
  if (arr.length < min) {
@@ -109,28 +85,16 @@ export function validateArrayBounds(arr, min, max, fieldName) {
109
85
  return undefined;
110
86
  }
111
87
  // ============================================================================
112
- // Response Builders
88
+ // Legacy Response Builders (deprecated - use response.ts instead)
113
89
  // ============================================================================
114
90
  /**
115
- * Build standard header for batch operation results
116
- *
117
- * @param title - Title of the results section
118
- * @param count - Number of items processed
119
- * @param tokensPerItem - Tokens allocated per item
120
- * @param totalBudget - Total token budget
121
- * @returns Formatted header string
91
+ * @deprecated Use formatBatchHeader from response.ts instead
122
92
  */
123
93
  export function buildBatchHeader(title, count, tokensPerItem, totalBudget) {
124
94
  return `# ${title} (${count} items)\n\n**Token Allocation:** ${tokensPerItem.toLocaleString()} tokens/item (${count} items, ${totalBudget.toLocaleString()} total budget)`;
125
95
  }
126
96
  /**
127
- * Build status line for batch results
128
- *
129
- * @param successful - Number of successful items
130
- * @param failed - Number of failed items
131
- * @param batches - Number of batches processed
132
- * @param extras - Optional extra status items
133
- * @returns Formatted status line
97
+ * @deprecated Use formatBatchHeader from response.ts instead
134
98
  */
135
99
  export function buildStatusLine(successful, failed, batches, extras) {
136
100
  let status = `**Status:** ✅ ${successful} successful | ❌ ${failed} failed | 📦 ${batches} batch(es)`;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Centralized Logger Utilities
3
+ * Provides safe logging that NEVER throws - extracted from tool handlers
4
+ */
5
+ /**
6
+ * Logger function type used across all tools
7
+ */
8
+ export type ToolLogger = (level: 'info' | 'error' | 'debug', message: string, sessionId: string) => Promise<void>;
9
+ /**
10
+ * Standard options passed to tool 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 ('info' | 'error' | 'debug')
23
+ * @param message - Message to log
24
+ * @param toolName - Name of the tool for prefixing (optional)
25
+ */
26
+ export declare function safeLog(logger: ToolLogger | undefined, sessionId: string | undefined, level: 'info' | 'error' | 'debug', message: string, toolName?: string): Promise<void>;
27
+ /**
28
+ * Create a bound logger for a specific tool
29
+ * Returns a simpler function that only needs level and message
30
+ *
31
+ * @param options - Tool options containing logger and sessionId
32
+ * @param toolName - Name of the tool for log prefixing
33
+ * @returns Bound log function
34
+ */
35
+ export declare function createToolLogger(options: ToolOptions, toolName: string): (level: 'info' | 'error' | 'debug', message: string) => Promise<void>;
36
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;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;AAED;;;;;;;;;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,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,GACf,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAIvE"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Centralized Logger Utilities
3
+ * Provides safe logging that NEVER throws - extracted from tool handlers
4
+ */
5
+ /**
6
+ * Safe logger wrapper - NEVER throws
7
+ * Logs to provided logger or falls back to console.error
8
+ *
9
+ * @param logger - Optional logger function
10
+ * @param sessionId - Session ID for logging context
11
+ * @param level - Log level ('info' | 'error' | 'debug')
12
+ * @param message - Message to log
13
+ * @param toolName - Name of the tool for prefixing (optional)
14
+ */
15
+ export async function safeLog(logger, sessionId, level, message, toolName) {
16
+ if (!logger || !sessionId)
17
+ return;
18
+ const prefix = toolName ? `[${toolName}] ` : '';
19
+ try {
20
+ await logger(level, `${prefix}${message}`, sessionId);
21
+ }
22
+ catch {
23
+ // Silently ignore logger errors - they should never crash the tool
24
+ console.error(`${prefix}Logger failed: ${message}`);
25
+ }
26
+ }
27
+ /**
28
+ * Create a bound logger for a specific tool
29
+ * Returns a simpler function that only needs level and message
30
+ *
31
+ * @param options - Tool options containing logger and sessionId
32
+ * @param toolName - Name of the tool for log prefixing
33
+ * @returns Bound log function
34
+ */
35
+ export function createToolLogger(options, toolName) {
36
+ return async (level, message) => {
37
+ await safeLog(options.logger, options.sessionId, level, message, toolName);
38
+ };
39
+ }
40
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAA8B,EAC9B,SAA6B,EAC7B,KAAiC,EACjC,OAAe,EACf,QAAiB;IAEjB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;QAAE,OAAO;IAElC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,GAAG,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,kBAAkB,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAoB,EACpB,QAAgB;IAEhB,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Standardized Response Formatting for MCP Tools
3
+ * Implements the 70/20/10 pattern for agent-optimized responses
4
+ *
5
+ * 70% Summary - Key insights, status, metrics
6
+ * 20% Data - Structured results
7
+ * 10% Next Steps - Actionable follow-ups
8
+ */
9
+ export interface SuccessResponseOptions {
10
+ /** Main title for the response */
11
+ title: string;
12
+ /** Summary section (70% of response) */
13
+ summary: string;
14
+ /** Optional data section (20% of response) */
15
+ data?: string;
16
+ /** Optional next steps (10% of response) */
17
+ nextSteps?: string[];
18
+ /** Optional metadata to append */
19
+ metadata?: Record<string, string | number>;
20
+ }
21
+ export interface ErrorResponseOptions {
22
+ /** Error code (e.g., RATE_LIMITED, TIMEOUT) */
23
+ code: string;
24
+ /** Human-readable error message */
25
+ message: string;
26
+ /** Whether the error is retryable */
27
+ retryable?: boolean;
28
+ /** Steps to fix the error */
29
+ howToFix?: string[];
30
+ /** Alternative actions to try */
31
+ alternatives?: string[];
32
+ /** Tool name for context */
33
+ toolName?: string;
34
+ }
35
+ export interface BatchResultOptions {
36
+ /** Title for the batch results */
37
+ title: string;
38
+ /** Number of items processed */
39
+ totalItems: number;
40
+ /** Number of successful items */
41
+ successful: number;
42
+ /** Number of failed items */
43
+ failed: number;
44
+ /** Tokens allocated per item */
45
+ tokensPerItem?: number;
46
+ /** Total token budget */
47
+ totalBudget?: number;
48
+ /** Number of batches processed */
49
+ batches?: number;
50
+ /** Additional status items */
51
+ extras?: string[];
52
+ }
53
+ /**
54
+ * Format a successful tool response using the 70/20/10 pattern
55
+ *
56
+ * @example
57
+ * formatSuccess({
58
+ * title: 'Web Search Results',
59
+ * summary: '**Found 45 unique URLs** across 5 queries\n• 12 consensus results (appeared 3+ times)\n• Top domains: github.com, stackoverflow.com',
60
+ * data: '## Top Results\n1. [Title](url) - snippet\n2. ...',
61
+ * nextSteps: ['Scrape top URLs: scrape_links({urls: [...]})', 'Deep dive: deep_research({...})']
62
+ * })
63
+ */
64
+ export declare function formatSuccess(options: SuccessResponseOptions): string;
65
+ /**
66
+ * Format an error response with recovery guidance
67
+ *
68
+ * @example
69
+ * formatError({
70
+ * code: 'RATE_LIMITED',
71
+ * message: 'API rate limit exceeded',
72
+ * retryable: true,
73
+ * howToFix: ['Wait 60 seconds', 'Reduce batch size'],
74
+ * alternatives: ['Use cached results', 'Try different API']
75
+ * })
76
+ */
77
+ export declare function formatError(options: ErrorResponseOptions): string;
78
+ /**
79
+ * Format batch operation header with status
80
+ */
81
+ export declare function formatBatchHeader(options: BatchResultOptions): string;
82
+ /**
83
+ * Format a list of items with optional truncation
84
+ */
85
+ export declare function formatList(items: string[], options?: {
86
+ maxItems?: number;
87
+ ordered?: boolean;
88
+ }): string;
89
+ /**
90
+ * Format key-value pairs as a compact list
91
+ */
92
+ export declare function formatKeyValues(data: Record<string, unknown>): string;
93
+ /**
94
+ * Format execution time
95
+ */
96
+ export declare function formatDuration(ms: number): string;
97
+ /**
98
+ * Truncate text with ellipsis
99
+ */
100
+ export declare function truncateText(text: string, maxLength: number): string;
101
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,WAAW,sBAAsB;IACrC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAyCrE;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAwCjE;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAwBrE;AAMD;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GACjD,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAKrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGpE"}