mcp-researchpowerpack 3.9.4 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/README.md +116 -208
  2. package/dist/index.js +280 -337
  3. package/dist/index.js.map +7 -1
  4. package/dist/mcp-use.json +7 -0
  5. package/dist/src/clients/reddit.js +278 -0
  6. package/dist/src/clients/reddit.js.map +7 -0
  7. package/dist/src/clients/scraper.js +326 -0
  8. package/dist/src/clients/scraper.js.map +7 -0
  9. package/dist/src/clients/search.js +217 -0
  10. package/dist/src/clients/search.js.map +7 -0
  11. package/dist/src/config/index.js +138 -0
  12. package/dist/src/config/index.js.map +7 -0
  13. package/dist/src/prompts/deep-research.js +41 -0
  14. package/dist/src/prompts/deep-research.js.map +7 -0
  15. package/dist/src/prompts/reddit-sentiment.js +47 -0
  16. package/dist/src/prompts/reddit-sentiment.js.map +7 -0
  17. package/dist/src/schemas/reddit.js +21 -0
  18. package/dist/src/schemas/reddit.js.map +7 -0
  19. package/dist/src/schemas/scrape-links.js +26 -0
  20. package/dist/src/schemas/scrape-links.js.map +7 -0
  21. package/dist/src/schemas/start-research.js +17 -0
  22. package/dist/src/schemas/start-research.js.map +7 -0
  23. package/dist/src/schemas/web-search.js +53 -0
  24. package/dist/src/schemas/web-search.js.map +7 -0
  25. package/dist/src/services/llm-processor.js +675 -0
  26. package/dist/src/services/llm-processor.js.map +7 -0
  27. package/dist/src/services/markdown-cleaner.js +62 -0
  28. package/dist/src/services/markdown-cleaner.js.map +7 -0
  29. package/dist/src/services/workflow-state.js +116 -0
  30. package/dist/src/services/workflow-state.js.map +7 -0
  31. package/dist/src/tools/mcp-helpers.js +50 -0
  32. package/dist/src/tools/mcp-helpers.js.map +7 -0
  33. package/dist/src/tools/reddit.js +277 -0
  34. package/dist/src/tools/reddit.js.map +7 -0
  35. package/dist/src/tools/registry.js +18 -0
  36. package/dist/src/tools/registry.js.map +7 -0
  37. package/dist/src/tools/scrape.js +334 -0
  38. package/dist/src/tools/scrape.js.map +7 -0
  39. package/dist/src/tools/search.js +423 -0
  40. package/dist/src/tools/search.js.map +7 -0
  41. package/dist/src/tools/start-research.js +199 -0
  42. package/dist/src/tools/start-research.js.map +7 -0
  43. package/dist/src/tools/utils.js +29 -0
  44. package/dist/src/tools/utils.js.map +7 -0
  45. package/dist/src/utils/bootstrap-guard.js +27 -0
  46. package/dist/src/utils/bootstrap-guard.js.map +7 -0
  47. package/dist/src/utils/concurrency.js +62 -0
  48. package/dist/src/utils/concurrency.js.map +7 -0
  49. package/dist/src/utils/content-extractor.js +61 -0
  50. package/dist/src/utils/content-extractor.js.map +7 -0
  51. package/dist/src/utils/errors.js +211 -0
  52. package/dist/src/utils/errors.js.map +7 -0
  53. package/dist/src/utils/logger.js +25 -0
  54. package/dist/src/utils/logger.js.map +7 -0
  55. package/dist/src/utils/markdown-formatter.js +15 -0
  56. package/dist/src/utils/markdown-formatter.js.map +7 -0
  57. package/dist/src/utils/reddit-keyword-guard.js +29 -0
  58. package/dist/src/utils/reddit-keyword-guard.js.map +7 -0
  59. package/dist/src/utils/response.js +81 -0
  60. package/dist/src/utils/response.js.map +7 -0
  61. package/dist/src/utils/retry.js +13 -0
  62. package/dist/src/utils/retry.js.map +7 -0
  63. package/dist/src/utils/sanitize.js +10 -0
  64. package/dist/src/utils/sanitize.js.map +7 -0
  65. package/dist/src/utils/source-type.js +41 -0
  66. package/dist/src/utils/source-type.js.map +7 -0
  67. package/dist/src/utils/url-aggregator.js +227 -0
  68. package/dist/src/utils/url-aggregator.js.map +7 -0
  69. package/dist/src/utils/workflow-key.js +14 -0
  70. package/dist/src/utils/workflow-key.js.map +7 -0
  71. package/dist/src/version.js +32 -0
  72. package/dist/src/version.js.map +7 -0
  73. package/package.json +33 -28
  74. package/dist/clients/reddit.d.ts +0 -69
  75. package/dist/clients/reddit.d.ts.map +0 -1
  76. package/dist/clients/reddit.js +0 -369
  77. package/dist/clients/reddit.js.map +0 -1
  78. package/dist/clients/research.d.ts +0 -67
  79. package/dist/clients/research.d.ts.map +0 -1
  80. package/dist/clients/research.js +0 -290
  81. package/dist/clients/research.js.map +0 -1
  82. package/dist/clients/scraper.d.ts +0 -72
  83. package/dist/clients/scraper.d.ts.map +0 -1
  84. package/dist/clients/scraper.js +0 -338
  85. package/dist/clients/scraper.js.map +0 -1
  86. package/dist/clients/search.d.ts +0 -57
  87. package/dist/clients/search.d.ts.map +0 -1
  88. package/dist/clients/search.js +0 -223
  89. package/dist/clients/search.js.map +0 -1
  90. package/dist/config/index.d.ts +0 -78
  91. package/dist/config/index.d.ts.map +0 -1
  92. package/dist/config/index.js +0 -201
  93. package/dist/config/index.js.map +0 -1
  94. package/dist/config/loader.d.ts +0 -40
  95. package/dist/config/loader.d.ts.map +0 -1
  96. package/dist/config/loader.js +0 -322
  97. package/dist/config/loader.js.map +0 -1
  98. package/dist/config/types.d.ts +0 -81
  99. package/dist/config/types.d.ts.map +0 -1
  100. package/dist/config/types.js +0 -6
  101. package/dist/config/types.js.map +0 -1
  102. package/dist/config/yaml/tools.yaml +0 -146
  103. package/dist/index.d.ts +0 -7
  104. package/dist/index.d.ts.map +0 -1
  105. package/dist/schemas/deep-research.d.ts +0 -64
  106. package/dist/schemas/deep-research.d.ts.map +0 -1
  107. package/dist/schemas/deep-research.js +0 -224
  108. package/dist/schemas/deep-research.js.map +0 -1
  109. package/dist/schemas/scrape-links.d.ts +0 -32
  110. package/dist/schemas/scrape-links.d.ts.map +0 -1
  111. package/dist/schemas/scrape-links.js +0 -34
  112. package/dist/schemas/scrape-links.js.map +0 -1
  113. package/dist/schemas/web-search.d.ts +0 -22
  114. package/dist/schemas/web-search.d.ts.map +0 -1
  115. package/dist/schemas/web-search.js +0 -21
  116. package/dist/schemas/web-search.js.map +0 -1
  117. package/dist/services/file-attachment.d.ts +0 -30
  118. package/dist/services/file-attachment.d.ts.map +0 -1
  119. package/dist/services/file-attachment.js +0 -207
  120. package/dist/services/file-attachment.js.map +0 -1
  121. package/dist/services/llm-processor.d.ts +0 -29
  122. package/dist/services/llm-processor.d.ts.map +0 -1
  123. package/dist/services/llm-processor.js +0 -244
  124. package/dist/services/llm-processor.js.map +0 -1
  125. package/dist/services/markdown-cleaner.d.ts +0 -8
  126. package/dist/services/markdown-cleaner.d.ts.map +0 -1
  127. package/dist/services/markdown-cleaner.js +0 -74
  128. package/dist/services/markdown-cleaner.js.map +0 -1
  129. package/dist/tools/definitions.d.ts +0 -16
  130. package/dist/tools/definitions.d.ts.map +0 -1
  131. package/dist/tools/definitions.js +0 -17
  132. package/dist/tools/definitions.js.map +0 -1
  133. package/dist/tools/reddit.d.ts +0 -14
  134. package/dist/tools/reddit.d.ts.map +0 -1
  135. package/dist/tools/reddit.js +0 -265
  136. package/dist/tools/reddit.js.map +0 -1
  137. package/dist/tools/registry.d.ts +0 -71
  138. package/dist/tools/registry.d.ts.map +0 -1
  139. package/dist/tools/registry.js +0 -252
  140. package/dist/tools/registry.js.map +0 -1
  141. package/dist/tools/research.d.ts +0 -14
  142. package/dist/tools/research.d.ts.map +0 -1
  143. package/dist/tools/research.js +0 -196
  144. package/dist/tools/research.js.map +0 -1
  145. package/dist/tools/scrape.d.ts +0 -14
  146. package/dist/tools/scrape.d.ts.map +0 -1
  147. package/dist/tools/scrape.js +0 -234
  148. package/dist/tools/scrape.js.map +0 -1
  149. package/dist/tools/search.d.ts +0 -10
  150. package/dist/tools/search.d.ts.map +0 -1
  151. package/dist/tools/search.js +0 -158
  152. package/dist/tools/search.js.map +0 -1
  153. package/dist/tools/utils.d.ts +0 -105
  154. package/dist/tools/utils.d.ts.map +0 -1
  155. package/dist/tools/utils.js +0 -159
  156. package/dist/tools/utils.js.map +0 -1
  157. package/dist/utils/concurrency.d.ts +0 -28
  158. package/dist/utils/concurrency.d.ts.map +0 -1
  159. package/dist/utils/concurrency.js +0 -92
  160. package/dist/utils/concurrency.js.map +0 -1
  161. package/dist/utils/errors.d.ts +0 -95
  162. package/dist/utils/errors.d.ts.map +0 -1
  163. package/dist/utils/errors.js +0 -390
  164. package/dist/utils/errors.js.map +0 -1
  165. package/dist/utils/logger.d.ts +0 -39
  166. package/dist/utils/logger.d.ts.map +0 -1
  167. package/dist/utils/logger.js +0 -57
  168. package/dist/utils/logger.js.map +0 -1
  169. package/dist/utils/markdown-formatter.d.ts +0 -5
  170. package/dist/utils/markdown-formatter.d.ts.map +0 -1
  171. package/dist/utils/markdown-formatter.js +0 -15
  172. package/dist/utils/markdown-formatter.js.map +0 -1
  173. package/dist/utils/response.d.ts +0 -93
  174. package/dist/utils/response.d.ts.map +0 -1
  175. package/dist/utils/response.js +0 -170
  176. package/dist/utils/response.js.map +0 -1
  177. package/dist/utils/retry.d.ts +0 -43
  178. package/dist/utils/retry.d.ts.map +0 -1
  179. package/dist/utils/retry.js +0 -57
  180. package/dist/utils/retry.js.map +0 -1
  181. package/dist/utils/url-aggregator.d.ts +0 -90
  182. package/dist/utils/url-aggregator.d.ts.map +0 -1
  183. package/dist/utils/url-aggregator.js +0 -538
  184. package/dist/utils/url-aggregator.js.map +0 -1
  185. package/dist/version.d.ts +0 -29
  186. package/dist/version.d.ts.map +0 -1
  187. package/dist/version.js +0 -55
  188. package/dist/version.js.map +0 -1
@@ -1,170 +0,0 @@
1
- /**
2
- * MCP Response Formatters - 70/20/10 Pattern
3
- *
4
- * All tool responses should follow this structure:
5
- * - 70% Summary: Key insights, status, metrics
6
- * - 20% Data: Structured results (lists, tables)
7
- * - 10% Next Steps: Actionable follow-up commands
8
- */
9
- /** Default maximum items to display in list formatting */
10
- export const DEFAULT_MAX_ITEMS = 20;
11
- /** Maximum snippet length before truncation in URL aggregator output */
12
- export const MAX_SNIPPET_LENGTH = 200;
13
- /** Duration thresholds in milliseconds */
14
- const SECONDS_MS = 1_000;
15
- const MINUTES_MS = 60_000;
16
- /**
17
- * Format a successful response using 70/20/10 pattern
18
- */
19
- export function formatSuccess(opts) {
20
- const parts = [];
21
- // Title
22
- parts.push(`✓ ${opts.title}`);
23
- parts.push('');
24
- // Summary (70%)
25
- parts.push(opts.summary);
26
- // Data section (20%)
27
- if (opts.data) {
28
- parts.push('');
29
- parts.push('---');
30
- parts.push(opts.data);
31
- }
32
- // Next steps (10%)
33
- if (opts.nextSteps?.length) {
34
- parts.push('');
35
- parts.push('---');
36
- parts.push('**Next Steps:**');
37
- opts.nextSteps.forEach(step => parts.push(`→ ${step}`));
38
- }
39
- // Metadata footer
40
- if (opts.metadata && Object.keys(opts.metadata).length > 0) {
41
- parts.push('');
42
- parts.push('---');
43
- const metaStr = Object.entries(opts.metadata)
44
- .map(([k, v]) => `${k}: ${v}`)
45
- .join(' | ');
46
- parts.push(`*${metaStr}*`);
47
- }
48
- return parts.join('\n');
49
- }
50
- /** Maximum length for error messages before truncation */
51
- const MAX_ERROR_MSG_LENGTH = 500;
52
- /**
53
- * Format an error response with recovery guidance
54
- * Designed to keep agents moving — every error includes actionable alternatives
55
- */
56
- export function formatError(opts) {
57
- const parts = [];
58
- // Truncate error message to prevent unbounded output
59
- const message = opts.message.length > MAX_ERROR_MSG_LENGTH
60
- ? opts.message.slice(0, MAX_ERROR_MSG_LENGTH - 3) + '...'
61
- : opts.message;
62
- // Error header
63
- const prefix = opts.toolName ? `[${opts.toolName}] ` : '';
64
- parts.push(`❌ ${prefix}${opts.code}: ${message}`);
65
- // Retryable hint — be specific about what to do while waiting
66
- if (opts.retryable) {
67
- parts.push('');
68
- parts.push('*This error is retryable. Wait a moment and try again — but use the alternatives below in the meantime so research continues.*');
69
- }
70
- // How to fix
71
- if (opts.howToFix?.length) {
72
- parts.push('');
73
- parts.push('**How to Fix:**');
74
- opts.howToFix.forEach((step, i) => parts.push(`${i + 1}. ${step}`));
75
- }
76
- // Alternatives — directive, not optional
77
- if (opts.alternatives?.length) {
78
- parts.push('');
79
- parts.push('**DO THIS INSTEAD (don\'t stop researching):**');
80
- opts.alternatives.forEach((alt, i) => parts.push(`${i + 1}. ${alt}`));
81
- }
82
- // Continuation footer — push agents to keep going
83
- if (opts.alternatives?.length) {
84
- parts.push('');
85
- parts.push('> This tool failed but your research should NOT stop. Use the alternatives above to continue gathering information from other sources.');
86
- }
87
- return parts.join('\n');
88
- }
89
- /**
90
- * Format a batch operation header with stats
91
- */
92
- export function formatBatchHeader(opts) {
93
- const parts = [];
94
- // Title with emoji based on success rate
95
- const successRate = opts.totalItems > 0 ? opts.successful / opts.totalItems : 0;
96
- const emoji = successRate === 1 ? '✓' : successRate >= 0.5 ? '⚠️' : '❌';
97
- parts.push(`${emoji} ${opts.title}`);
98
- parts.push('');
99
- // Stats
100
- parts.push(`• Total: ${opts.totalItems}`);
101
- parts.push(`• Successful: ${opts.successful}`);
102
- if (opts.failed > 0) {
103
- parts.push(`• Failed: ${opts.failed}`);
104
- }
105
- if (opts.tokensPerItem) {
106
- parts.push(`• Tokens/item: ~${opts.tokensPerItem.toLocaleString()}`);
107
- }
108
- if (opts.batches) {
109
- parts.push(`• Batches: ${opts.batches}`);
110
- }
111
- // Extra stats
112
- if (opts.extras) {
113
- Object.entries(opts.extras).forEach(([key, val]) => {
114
- parts.push(`• ${key}: ${val}`);
115
- });
116
- }
117
- return parts.join('\n');
118
- }
119
- /**
120
- * Format a numbered list with optional metadata
121
- */
122
- export function formatList(items, options) {
123
- const max = options?.maxItems ?? DEFAULT_MAX_ITEMS;
124
- const numbered = options?.numbered ?? true;
125
- const toShow = items.slice(0, max);
126
- const remaining = items.length - max;
127
- const lines = toShow.map((item, i) => {
128
- const prefix = numbered ? `${i + 1}. ` : '• ';
129
- let line = `${prefix}**${item.title}**`;
130
- if (item.meta) {
131
- line += ` (${item.meta})`;
132
- }
133
- if (item.description) {
134
- line += `\n ${item.description}`;
135
- }
136
- if (item.url) {
137
- line += `\n ${item.url}`;
138
- }
139
- return line;
140
- });
141
- if (remaining > 0) {
142
- lines.push(`\n*...and ${remaining} more*`);
143
- }
144
- return lines.join('\n');
145
- }
146
- // ============================================================================
147
- // Duration Formatter
148
- // ============================================================================
149
- /**
150
- * Format duration in human-readable form
151
- */
152
- export function formatDuration(ms) {
153
- if (ms < SECONDS_MS)
154
- return `${ms}ms`;
155
- if (ms < MINUTES_MS)
156
- return `${(ms / SECONDS_MS).toFixed(1)}s`;
157
- return `${(ms / MINUTES_MS).toFixed(1)}m`;
158
- }
159
- // ============================================================================
160
- // Text Truncation
161
- // ============================================================================
162
- /**
163
- * Truncate text to max length with ellipsis
164
- */
165
- export function truncateText(text, maxLength) {
166
- if (text.length <= maxLength)
167
- return text;
168
- return text.slice(0, maxLength - 3) + '...';
169
- }
170
- //# sourceMappingURL=response.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- /**
2
- * Shared retry and backoff utilities
3
- * Eliminates duplication across client modules
4
- */
5
- /** Base delay for exponential backoff (ms) */
6
- export declare const RETRY_BASE_DELAY_MS: 1000;
7
- /** Maximum backoff delay cap (ms) */
8
- export declare const RETRY_MAX_DELAY_MS: 30000;
9
- /** Jitter factor to prevent thundering herd */
10
- export declare const JITTER_FACTOR: 0.3;
11
- /** Exponential base for backoff calculation */
12
- export declare const EXPONENTIAL_BASE: 2;
13
- /** HTTP status codes that indicate a retryable server error */
14
- export declare const RETRYABLE_STATUS_CODES: readonly [429, 500, 502, 503, 504];
15
- export type RetryableStatusCode = typeof RETRYABLE_STATUS_CODES[number];
16
- /** Network-level error codes that are retryable */
17
- export declare const NETWORK_ERROR_CODES: readonly ["ECONNREFUSED", "ENOTFOUND", "ECONNRESET", "ECONNABORTED", "ETIMEDOUT", "EPIPE", "EAI_AGAIN"];
18
- export type NetworkErrorCode = typeof NETWORK_ERROR_CODES[number];
19
- /** Timeout-related error message substrings */
20
- export declare const TIMEOUT_ERROR_PATTERNS: readonly ["timeout", "timed out", "deadline exceeded"];
21
- /**
22
- * Calculate exponential backoff delay with jitter.
23
- * Formula: min(base * 2^attempt + random_jitter, maxDelay)
24
- *
25
- * @param attempt - Zero-based retry attempt number
26
- * @param baseDelayMs - Base delay in milliseconds (default: 1000)
27
- * @param maxDelayMs - Maximum delay cap in milliseconds (default: 30000)
28
- * @returns Delay in milliseconds with jitter applied
29
- */
30
- export declare function calculateBackoff(attempt: number, baseDelayMs?: number, maxDelayMs?: number): number;
31
- /**
32
- * Check if an HTTP status code is retryable
33
- */
34
- export declare function isRetryableStatus(status: number): boolean;
35
- /**
36
- * Check if an error code indicates a network-level failure
37
- */
38
- export declare function isNetworkError(code: string | undefined): boolean;
39
- /**
40
- * Check if an error message indicates a timeout
41
- */
42
- export declare function isTimeoutError(message: string): boolean;
43
- //# sourceMappingURL=retry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,EAAG,IAAc,CAAC;AAElD,qCAAqC;AACrC,eAAO,MAAM,kBAAkB,EAAG,KAAe,CAAC;AAElD,+CAA+C;AAC/C,eAAO,MAAM,aAAa,EAAG,GAAY,CAAC;AAE1C,+CAA+C;AAC/C,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAI3C,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,oCAAqC,CAAC;AACzE,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,mDAAmD;AACnD,eAAO,MAAM,mBAAmB,yGAA0G,CAAC;AAC3I,MAAM,MAAM,gBAAgB,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAElE,+CAA+C;AAC/C,eAAO,MAAM,sBAAsB,wDAAyD,CAAC;AAI7F;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAA4B,EACzC,UAAU,GAAE,MAA2B,GACtC,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGvD"}
@@ -1,57 +0,0 @@
1
- /**
2
- * Shared retry and backoff utilities
3
- * Eliminates duplication across client modules
4
- */
5
- // ── Retry Constants ──
6
- /** Base delay for exponential backoff (ms) */
7
- export const RETRY_BASE_DELAY_MS = 1_000;
8
- /** Maximum backoff delay cap (ms) */
9
- export const RETRY_MAX_DELAY_MS = 30_000;
10
- /** Jitter factor to prevent thundering herd */
11
- export const JITTER_FACTOR = 0.3;
12
- /** Exponential base for backoff calculation */
13
- export const EXPONENTIAL_BASE = 2;
14
- // ── HTTP Status Constants ──
15
- /** HTTP status codes that indicate a retryable server error */
16
- export const RETRYABLE_STATUS_CODES = [429, 500, 502, 503, 504];
17
- /** Network-level error codes that are retryable */
18
- export const NETWORK_ERROR_CODES = ['ECONNREFUSED', 'ENOTFOUND', 'ECONNRESET', 'ECONNABORTED', 'ETIMEDOUT', 'EPIPE', 'EAI_AGAIN'];
19
- /** Timeout-related error message substrings */
20
- export const TIMEOUT_ERROR_PATTERNS = ['timeout', 'timed out', 'deadline exceeded'];
21
- // ── Backoff Calculation ──
22
- /**
23
- * Calculate exponential backoff delay with jitter.
24
- * Formula: min(base * 2^attempt + random_jitter, maxDelay)
25
- *
26
- * @param attempt - Zero-based retry attempt number
27
- * @param baseDelayMs - Base delay in milliseconds (default: 1000)
28
- * @param maxDelayMs - Maximum delay cap in milliseconds (default: 30000)
29
- * @returns Delay in milliseconds with jitter applied
30
- */
31
- export function calculateBackoff(attempt, baseDelayMs = RETRY_BASE_DELAY_MS, maxDelayMs = RETRY_MAX_DELAY_MS) {
32
- const exponentialDelay = baseDelayMs * Math.pow(EXPONENTIAL_BASE, attempt);
33
- const jitter = JITTER_FACTOR * exponentialDelay * Math.random();
34
- return Math.min(exponentialDelay + jitter, maxDelayMs);
35
- }
36
- /**
37
- * Check if an HTTP status code is retryable
38
- */
39
- export function isRetryableStatus(status) {
40
- return RETRYABLE_STATUS_CODES.includes(status);
41
- }
42
- /**
43
- * Check if an error code indicates a network-level failure
44
- */
45
- export function isNetworkError(code) {
46
- if (!code)
47
- return false;
48
- return NETWORK_ERROR_CODES.includes(code);
49
- }
50
- /**
51
- * Check if an error message indicates a timeout
52
- */
53
- export function isTimeoutError(message) {
54
- const lower = message.toLowerCase();
55
- return TIMEOUT_ERROR_PATTERNS.some(pattern => lower.includes(pattern));
56
- }
57
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAwB;AAExB,8CAA8C;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAc,CAAC;AAElD,qCAAqC;AACrC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAe,CAAC;AAElD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,CAAC;AAE1C,+CAA+C;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAE3C,8BAA8B;AAE9B,+DAA+D;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAGzE,mDAAmD;AACnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAU,CAAC;AAG3I,+CAA+C;AAC/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,mBAAmB,CAAU,CAAC;AAE7F,4BAA4B;AAE5B;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,cAAsB,mBAAmB,EACzC,aAAqB,kBAAkB;IAEvC,MAAM,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAChE,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAQ,sBAA4C,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAwB;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAQ,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -1,90 +0,0 @@
1
- /**
2
- * URL Aggregator Utility
3
- * Aggregates search results across multiple queries, calculates CTR-weighted scores,
4
- * and generates consensus-based rankings.
5
- */
6
- import type { KeywordSearchResult, RedditSearchResult } from '../clients/search.js';
7
- /**
8
- * Ranked URL with normalized score
9
- */
10
- interface RankedUrl {
11
- readonly url: string;
12
- readonly title: string;
13
- readonly snippet: string;
14
- readonly rank: number;
15
- readonly score: number;
16
- readonly frequency: number;
17
- readonly positions: number[];
18
- readonly queries: string[];
19
- readonly bestPosition: number;
20
- readonly isConsensus: boolean;
21
- }
22
- /**
23
- * Aggregation result containing all processed data
24
- */
25
- interface AggregationResult {
26
- readonly rankedUrls: RankedUrl[];
27
- readonly totalUniqueUrls: number;
28
- readonly totalQueries: number;
29
- readonly frequencyThreshold: number;
30
- readonly thresholdNote?: string;
31
- }
32
- /**
33
- * Mark consensus status for a URL
34
- * Returns "✓" if frequency >= threshold, else "✗"
35
- */
36
- export declare function markConsensus(frequency: number): string;
37
- /**
38
- * Generate enhanced narrative output for consensus URLs
39
- */
40
- export declare function generateEnhancedOutput(rankedUrls: RankedUrl[], allKeywords: string[], totalUniqueUrls: number, frequencyThreshold: number, thresholdNote?: string): string;
41
- /**
42
- * Full aggregation pipeline with fallback thresholds
43
- * Tries ≥3, falls back to ≥2, then ≥1 if needed
44
- */
45
- export declare function aggregateAndRank(searches: KeywordSearchResult[], minConsensusUrls?: number): AggregationResult;
46
- /**
47
- * Build URL lookup map for quick consensus checking during result formatting
48
- */
49
- export declare function buildUrlLookup(rankedUrls: RankedUrl[]): Map<string, RankedUrl>;
50
- /**
51
- * Look up a URL in the ranked results
52
- */
53
- export declare function lookupUrl(url: string, lookup: Map<string, RankedUrl>): RankedUrl | undefined;
54
- /**
55
- * Ranked Reddit URL with normalized score
56
- */
57
- interface RankedRedditUrl {
58
- readonly url: string;
59
- readonly title: string;
60
- readonly snippet: string;
61
- readonly date?: string;
62
- readonly rank: number;
63
- readonly score: number;
64
- readonly frequency: number;
65
- readonly positions: number[];
66
- readonly queries: string[];
67
- readonly bestPosition: number;
68
- readonly isConsensus: boolean;
69
- }
70
- /**
71
- * Reddit aggregation result
72
- */
73
- interface RedditAggregationResult {
74
- readonly rankedUrls: RankedRedditUrl[];
75
- readonly totalUniqueUrls: number;
76
- readonly totalQueries: number;
77
- readonly frequencyThreshold: number;
78
- readonly thresholdNote?: string;
79
- }
80
- /**
81
- * Full Reddit aggregation pipeline with fallback thresholds
82
- */
83
- export declare function aggregateAndRankReddit(searches: Map<string, RedditSearchResult[]>, minConsensusUrls?: number): RedditAggregationResult;
84
- /**
85
- * Generate enhanced output for Reddit aggregated results
86
- * Now includes both aggregated view AND per-query raw results
87
- */
88
- export declare function generateRedditEnhancedOutput(aggregation: RedditAggregationResult, allQueries: string[], rawResults?: Map<string, RedditSearchResult[]>): string;
89
- export {};
90
- //# sourceMappingURL=url-aggregator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"url-aggregator.d.ts","sourceRoot":"","sources":["../../src/utils/url-aggregator.ts"],"names":[],"mappings":"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"}