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,390 +0,0 @@
1
- /**
2
- * Robust error handling utilities for MCP server
3
- * Ensures the server NEVER crashes and always returns structured responses
4
- */
5
- import { mcpLog } from './logger.js';
6
- // ============================================================================
7
- // Error Codes (MCP-compliant)
8
- // ============================================================================
9
- export const ErrorCode = {
10
- // Retryable errors
11
- RATE_LIMITED: 'RATE_LIMITED',
12
- TIMEOUT: 'TIMEOUT',
13
- NETWORK_ERROR: 'NETWORK_ERROR',
14
- SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',
15
- // Non-retryable errors
16
- AUTH_ERROR: 'AUTH_ERROR',
17
- INVALID_INPUT: 'INVALID_INPUT',
18
- NOT_FOUND: 'NOT_FOUND',
19
- QUOTA_EXCEEDED: 'QUOTA_EXCEEDED',
20
- // Internal errors
21
- INTERNAL_ERROR: 'INTERNAL_ERROR',
22
- PARSE_ERROR: 'PARSE_ERROR',
23
- UNKNOWN_ERROR: 'UNKNOWN_ERROR',
24
- };
25
- // ============================================================================
26
- // Constants
27
- // ============================================================================
28
- const MAX_ERROR_MSG_LENGTH = 500;
29
- const DEFAULT_RETRY_OPTIONS = {
30
- maxRetries: 3,
31
- baseDelayMs: 1000,
32
- maxDelayMs: 30000,
33
- retryableStatuses: [408, 429, 500, 502, 503, 504, 510],
34
- };
35
- // ============================================================================
36
- // Error Classification — Atomic Classifiers
37
- // ============================================================================
38
- /**
39
- * Classify DOMException (AbortError from AbortController timeouts)
40
- */
41
- function classifyDomException(error) {
42
- if (error.name === 'AbortError') {
43
- return { code: ErrorCode.TIMEOUT, message: 'Request timed out', retryable: true };
44
- }
45
- return { code: ErrorCode.UNKNOWN_ERROR, message: error.message.substring(0, MAX_ERROR_MSG_LENGTH), retryable: false };
46
- }
47
- /**
48
- * Classify by Node.js error codes (ECONNREFUSED, ENOTFOUND, etc.)
49
- * Returns null if no matching code is found.
50
- */
51
- function classifyByErrorCode(error) {
52
- const errCode = error.code;
53
- if (!errCode)
54
- return null;
55
- const networkErrorMessages = {
56
- ECONNREFUSED: 'Connection refused — service may be down',
57
- ECONNRESET: 'Connection was reset — please retry',
58
- ECONNABORTED: 'Connection aborted — please retry',
59
- ENOTFOUND: 'Service not reachable — check your network',
60
- EPIPE: 'Connection lost — please retry',
61
- EAI_AGAIN: 'DNS lookup failed — check your network',
62
- };
63
- if (errCode === 'ECONNREFUSED' || errCode === 'ENOTFOUND' || errCode === 'ECONNRESET') {
64
- return { code: ErrorCode.NETWORK_ERROR, message: networkErrorMessages[errCode] || 'Network connection failed', retryable: true, cause: error.message };
65
- }
66
- if (errCode === 'ECONNABORTED' || errCode === 'ETIMEDOUT') {
67
- return { code: ErrorCode.TIMEOUT, message: networkErrorMessages[errCode] || 'Request timed out', retryable: true, cause: error.message };
68
- }
69
- return null;
70
- }
71
- /**
72
- * Classify by HTTP status code extracted from error objects (axios-style, fetch-style, etc.)
73
- * Returns null if no status code is found.
74
- */
75
- function classifyByStatusCode(error) {
76
- const status = error.response?.status || error.status || error.statusCode;
77
- if (!status)
78
- return null;
79
- return classifyHttpError(status, error.message || String(error));
80
- }
81
- /**
82
- * Classify by error message patterns (timeout, rate-limit, auth, parse errors)
83
- * Returns null if no pattern matches.
84
- */
85
- function classifyByMessage(message) {
86
- const lower = message.toLowerCase();
87
- // Timeout patterns
88
- if (lower.includes('timeout') || lower.includes('timed out') || lower.includes('aborterror')) {
89
- return { code: ErrorCode.TIMEOUT, message: 'Request timed out', retryable: true, cause: message };
90
- }
91
- // Rate-limit patterns
92
- if (lower.includes('rate limit') || lower.includes('too many requests')) {
93
- return { code: ErrorCode.RATE_LIMITED, message: 'Rate limit exceeded', retryable: true, cause: message };
94
- }
95
- // API key errors
96
- if (message.includes('API_KEY') || message.includes('api_key') || message.includes('Invalid API')) {
97
- return { code: ErrorCode.AUTH_ERROR, message: 'API key missing or invalid', retryable: false, cause: message };
98
- }
99
- // Parse errors
100
- if (message.includes('JSON') || message.includes('parse') || message.includes('Unexpected token')) {
101
- return { code: ErrorCode.PARSE_ERROR, message: 'Failed to parse response', retryable: false, cause: message };
102
- }
103
- return null;
104
- }
105
- /**
106
- * Catch-all fallback classification when no other classifier matches.
107
- */
108
- function classifyFallback(message, cause) {
109
- return {
110
- code: ErrorCode.UNKNOWN_ERROR,
111
- message: message.substring(0, MAX_ERROR_MSG_LENGTH),
112
- retryable: false,
113
- cause: cause ? String(cause) : undefined,
114
- };
115
- }
116
- // ============================================================================
117
- // Main Error Classification Pipeline
118
- // ============================================================================
119
- /**
120
- * Classify any error into a structured format.
121
- * NEVER throws — always returns a valid StructuredError.
122
- */
123
- export function classifyError(error) {
124
- if (error == null) {
125
- return { code: ErrorCode.UNKNOWN_ERROR, message: 'An unknown error occurred', retryable: false };
126
- }
127
- if (error instanceof DOMException)
128
- return classifyDomException(error);
129
- if (!isErrorLike(error)) {
130
- return { code: ErrorCode.UNKNOWN_ERROR, message: String(error).substring(0, MAX_ERROR_MSG_LENGTH), retryable: false };
131
- }
132
- return classifyByErrorCode(error)
133
- ?? classifyByStatusCode(error)
134
- ?? classifyByMessage(error.message ?? String(error))
135
- ?? classifyFallback(error.message ?? String(error), error.cause);
136
- }
137
- /**
138
- * Type guard for error-like objects with common error properties
139
- */
140
- function isErrorLike(value) {
141
- return typeof value === 'object' && value !== null;
142
- }
143
- /**
144
- * Classify HTTP status codes into structured errors.
145
- * Exhaustive switch with grouped default handling for unknown ranges.
146
- */
147
- function classifyHttpError(status, message) {
148
- switch (status) {
149
- case 400:
150
- return { code: ErrorCode.INVALID_INPUT, message: 'Bad request', retryable: false, statusCode: status };
151
- case 401:
152
- return { code: ErrorCode.AUTH_ERROR, message: 'Invalid API key', retryable: false, statusCode: status };
153
- case 403:
154
- return { code: ErrorCode.QUOTA_EXCEEDED, message: 'Access forbidden or quota exceeded', retryable: false, statusCode: status };
155
- case 404:
156
- return { code: ErrorCode.NOT_FOUND, message: 'Resource not found', retryable: false, statusCode: status };
157
- case 408:
158
- return { code: ErrorCode.TIMEOUT, message: 'Request timeout', retryable: true, statusCode: status };
159
- case 429:
160
- return { code: ErrorCode.RATE_LIMITED, message: 'Rate limit exceeded', retryable: true, statusCode: status };
161
- case 500:
162
- return { code: ErrorCode.INTERNAL_ERROR, message: 'Server error', retryable: true, statusCode: status };
163
- case 502:
164
- return { code: ErrorCode.SERVICE_UNAVAILABLE, message: 'Bad gateway', retryable: true, statusCode: status };
165
- case 503:
166
- return { code: ErrorCode.SERVICE_UNAVAILABLE, message: 'Service unavailable', retryable: true, statusCode: status };
167
- case 504:
168
- return { code: ErrorCode.TIMEOUT, message: 'Gateway timeout', retryable: true, statusCode: status };
169
- case 510:
170
- return { code: ErrorCode.SERVICE_UNAVAILABLE, message: 'Request canceled', retryable: true, statusCode: status };
171
- default:
172
- if (status >= 500) {
173
- return { code: ErrorCode.SERVICE_UNAVAILABLE, message: `Server error: ${status}`, retryable: true, statusCode: status };
174
- }
175
- if (status >= 400) {
176
- return { code: ErrorCode.INVALID_INPUT, message: `Client error: ${status}`, retryable: false, statusCode: status };
177
- }
178
- return { code: ErrorCode.UNKNOWN_ERROR, message: `HTTP ${status}: ${message.substring(0, MAX_ERROR_MSG_LENGTH)}`, retryable: false, statusCode: status };
179
- }
180
- }
181
- // ============================================================================
182
- // Retry Logic with Exponential Backoff
183
- // ============================================================================
184
- /**
185
- * Calculate delay with exponential backoff and jitter
186
- */
187
- function calculateBackoff(attempt, options) {
188
- const exponentialDelay = options.baseDelayMs * Math.pow(2, attempt);
189
- const jitter = Math.random() * 0.3 * exponentialDelay; // 0-30% jitter
190
- return Math.min(exponentialDelay + jitter, options.maxDelayMs);
191
- }
192
- /**
193
- * Sleep utility that respects abort signals
194
- */
195
- export function sleep(ms, signal) {
196
- return new Promise((resolve, reject) => {
197
- if (signal?.aborted) {
198
- reject(new DOMException('Aborted', 'AbortError'));
199
- return;
200
- }
201
- function onAbort() {
202
- clearTimeout(timeout);
203
- reject(new DOMException('Aborted', 'AbortError'));
204
- }
205
- const timeout = setTimeout(() => {
206
- if (signal)
207
- signal.removeEventListener('abort', onAbort);
208
- resolve();
209
- }, ms);
210
- signal?.addEventListener('abort', onAbort, { once: true });
211
- // Re-check: signal may have aborted between initial check and listener registration
212
- if (signal?.aborted) {
213
- onAbort();
214
- }
215
- });
216
- }
217
- /**
218
- * Wrap a fetch call with timeout via AbortController
219
- */
220
- export function fetchWithTimeout(url, options = {}) {
221
- const { timeoutMs = 30000, signal: externalSignal, ...fetchOptions } = options;
222
- const controller = new AbortController();
223
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
224
- let onExternalAbort;
225
- if (externalSignal) {
226
- onExternalAbort = () => controller.abort();
227
- externalSignal.addEventListener('abort', onExternalAbort, { once: true });
228
- if (externalSignal.aborted) {
229
- controller.abort();
230
- }
231
- }
232
- return fetch(url, { ...fetchOptions, signal: controller.signal }).finally(() => {
233
- clearTimeout(timeoutId);
234
- if (externalSignal && onExternalAbort) {
235
- externalSignal.removeEventListener('abort', onExternalAbort);
236
- }
237
- });
238
- }
239
- // ============================================================================
240
- // MCP Tool Error Response Types (for client-facing error responses)
241
- // ============================================================================
242
- /**
243
- * MCP-compliant error codes for tool responses
244
- * These codes are exposed to clients for programmatic error handling
245
- */
246
- export const MCP_ERROR_CODES = {
247
- RATE_LIMITED: 'RATE_LIMITED',
248
- NETWORK_ERROR: 'NETWORK_ERROR',
249
- TIMEOUT: 'TIMEOUT',
250
- VALIDATION_ERROR: 'VALIDATION_ERROR',
251
- AUTH_ERROR: 'AUTH_ERROR',
252
- NOT_FOUND: 'NOT_FOUND',
253
- INTERNAL_ERROR: 'INTERNAL_ERROR',
254
- SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',
255
- };
256
- /**
257
- * Map internal ErrorCode to client-facing MCP_ERROR_CODES
258
- */
259
- function mapErrorCodeToMCP(code) {
260
- switch (code) {
261
- case ErrorCode.RATE_LIMITED:
262
- case ErrorCode.QUOTA_EXCEEDED:
263
- return MCP_ERROR_CODES.RATE_LIMITED;
264
- case ErrorCode.TIMEOUT:
265
- return MCP_ERROR_CODES.TIMEOUT;
266
- case ErrorCode.NETWORK_ERROR:
267
- return MCP_ERROR_CODES.NETWORK_ERROR;
268
- case ErrorCode.SERVICE_UNAVAILABLE:
269
- return MCP_ERROR_CODES.SERVICE_UNAVAILABLE;
270
- case ErrorCode.AUTH_ERROR:
271
- return MCP_ERROR_CODES.AUTH_ERROR;
272
- case ErrorCode.NOT_FOUND:
273
- return MCP_ERROR_CODES.NOT_FOUND;
274
- case ErrorCode.INVALID_INPUT:
275
- case ErrorCode.PARSE_ERROR:
276
- return MCP_ERROR_CODES.VALIDATION_ERROR;
277
- case ErrorCode.INTERNAL_ERROR:
278
- case ErrorCode.UNKNOWN_ERROR:
279
- default:
280
- return MCP_ERROR_CODES.INTERNAL_ERROR;
281
- }
282
- }
283
- /**
284
- * Create a standardized MCP tool error response
285
- * @param message - Human-readable error message
286
- * @param errorCode - Optional MCP error code for programmatic handling
287
- * @param retryAfter - Optional seconds to wait before retry (for rate limits)
288
- */
289
- function createToolError(message, errorCode, retryAfter) {
290
- const response = {
291
- content: [{ type: 'text', text: message }],
292
- isError: true,
293
- };
294
- if (errorCode) {
295
- response.errorCode = errorCode;
296
- }
297
- if (retryAfter !== undefined && retryAfter > 0) {
298
- response.retryAfter = retryAfter;
299
- }
300
- return response;
301
- }
302
- /**
303
- * Create a tool error response from a StructuredError
304
- * Automatically maps error codes and calculates retryAfter for rate limits
305
- */
306
- export function createToolErrorFromStructured(structuredError, attempt = 0) {
307
- const errorCode = mapErrorCodeToMCP(structuredError.code);
308
- // Calculate retryAfter for rate-limited errors
309
- let retryAfter;
310
- if (structuredError.retryable && errorCode === MCP_ERROR_CODES.RATE_LIMITED) {
311
- retryAfter = Math.ceil(calculateBackoff(attempt, DEFAULT_RETRY_OPTIONS) / 1000);
312
- }
313
- // Format user-friendly error message
314
- const retryHint = structuredError.retryable
315
- ? '\n\n💡 This error may be temporary. Try again in a moment.'
316
- : '';
317
- const errorText = `## ❌ Error\n\n**${structuredError.code}:** ${structuredError.message}${retryHint}\n\nPlease check your input parameters and try again.`;
318
- return createToolError(errorText, errorCode, retryAfter);
319
- }
320
- // ============================================================================
321
- // Stability Wrappers — Network resilience for LLM API calls
322
- // ============================================================================
323
- /**
324
- * Wrap a promise with a hard deadline timeout.
325
- * If the promise doesn't resolve/reject within `timeoutMs`, it rejects with a timeout error.
326
- * Uses AbortController to signal cancellation to the underlying request.
327
- */
328
- export function withRequestTimeout(fn, timeoutMs, label = 'request') {
329
- const controller = new AbortController();
330
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
331
- return fn(controller.signal).finally(() => clearTimeout(timeoutId)).catch((err) => {
332
- if (controller.signal.aborted && err instanceof DOMException && err.name === 'AbortError') {
333
- throw Object.assign(new Error('Request timed out — please try again'), {
334
- code: 'ETIMEDOUT',
335
- retryable: true,
336
- });
337
- }
338
- throw err;
339
- });
340
- }
341
- /**
342
- * Wrap a non-streaming API call with activity-based timeout detection.
343
- * If the call hasn't completed within `stallMs`, abort and retry.
344
- * This catches "stuck" connections where TCP stays open but no data flows.
345
- *
346
- * @param fn - Async function that accepts an AbortSignal
347
- * @param stallMs - Max milliseconds to wait for the call to complete before considering it stuck
348
- * @param maxAttempts - Max retry attempts for stalled requests
349
- * @param label - Label for log messages
350
- * @returns The result of the function
351
- */
352
- export async function withStallProtection(fn, stallMs, maxAttempts = 2, label = 'request') {
353
- for (let attempt = 0; attempt < maxAttempts; attempt++) {
354
- const controller = new AbortController();
355
- let stallTimer;
356
- const stallPromise = new Promise((_, reject) => {
357
- stallTimer = setTimeout(() => {
358
- controller.abort();
359
- reject(Object.assign(new Error(`Service temporarily unavailable — no response received (attempt ${attempt + 1}/${maxAttempts})`), {
360
- code: 'ESTALLED',
361
- retryable: attempt < maxAttempts - 1,
362
- }));
363
- }, stallMs);
364
- });
365
- let fnPromise;
366
- try {
367
- fnPromise = fn(controller.signal);
368
- const result = await Promise.race([fnPromise, stallPromise]);
369
- clearTimeout(stallTimer);
370
- return result;
371
- }
372
- catch (err) {
373
- // Suppress unhandled rejection from the losing promise
374
- // (e.g. fnPromise rejects after stallPromise wins the race)
375
- fnPromise?.catch(() => { });
376
- clearTimeout(stallTimer);
377
- const isStall = err instanceof Error && err.code === 'ESTALLED';
378
- if (isStall && attempt < maxAttempts - 1) {
379
- const backoff = calculateBackoff(attempt, DEFAULT_RETRY_OPTIONS);
380
- mcpLog('warning', `${label} stalled, retrying in ${backoff}ms (attempt ${attempt + 1})`, 'stability');
381
- await sleep(backoff);
382
- continue;
383
- }
384
- throw err;
385
- }
386
- }
387
- // Should never reach here, but TypeScript needs it
388
- throw new Error(`${label} failed after ${maxAttempts} stall-protection attempts`);
389
- }
390
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,mBAAmB;IACnB,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,SAAS;IAClB,aAAa,EAAE,eAAe;IAC9B,mBAAmB,EAAE,qBAAqB;IAE1C,uBAAuB;IACvB,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,eAAe;IAC9B,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,gBAAgB;IAEhC,kBAAkB;IAClB,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;CACtB,CAAC;AAIX,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,oBAAoB,GAAG,GAAY,CAAC;AAsB1C,MAAM,qBAAqB,GAAiB;IAC1C,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,KAAK;IACjB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACvD,CAAC;AAEF,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAmB;IAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACxH,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,KAA0C;IACrE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,oBAAoB,GAA2B;QACnD,YAAY,EAAE,0CAA0C;QACxD,UAAU,EAAE,qCAAqC;QACjD,YAAY,EAAE,mCAAmC;QACjD,SAAS,EAAE,4CAA4C;QACvD,KAAK,EAAE,gCAAgC;QACvC,SAAS,EAAE,wCAAwC;KACpD,CAAC;IAEF,IAAI,OAAO,KAAK,cAAc,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QACtF,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,IAAI,2BAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACzJ,CAAC;IAED,IAAI,OAAO,KAAK,cAAc,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,IAAI,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3I,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,KAAiG;IAC7H,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC1E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,mBAAmB;IACnB,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7F,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACpG,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC3G,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAClG,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,4BAA4B,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACjH,CAAC;IAED,eAAe;IACf,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAClG,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAChH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAe;IACxD,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,aAAa;QAC7B,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,CAAC;QACnD,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KACzC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,2BAA2B,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnG,CAAC;IAED,IAAI,KAAK,YAAY,YAAY;QAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAEtE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACxH,CAAC;IAED,OAAO,mBAAmB,CAAC,KAAK,CAAC;WAC5B,oBAAoB,CAAC,KAAK,CAAC;WAC3B,iBAAiB,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;WACjD,gBAAgB,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAc;IASjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,OAAe;IACxD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACzG,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC1G,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,oCAAoC,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACjI,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC5G,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACtG,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC/G,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC1G,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAC9G,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACtH,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACtG,KAAK,GAAG;YACN,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACnH;YACE,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClB,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,iBAAiB,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAC1H,CAAC;YACD,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClB,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,iBAAiB,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACrH,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC7J,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,uCAAuC;AACvC,+EAA+E;AAE/E;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,OAAqB;IAC9D,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,gBAAgB,CAAC,CAAC,eAAe;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,SAAS,OAAO;YACd,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,MAAM;gBAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,oFAAoF;QACpF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,UAAgD,EAAE;IAElD,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAE/E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAElE,IAAI,eAAyC,CAAC;IAC9C,IAAI,cAAc,EAAE,CAAC;QACnB,eAAe,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3C,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QAC7E,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;YACtC,cAAc,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,oEAAoE;AACpE,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,OAAO,EAAE,SAAS;IAClB,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,YAAY;IACxB,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,gBAAgB;IAChC,mBAAmB,EAAE,qBAAqB;CAClC,CAAC;AAiBX;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC,YAAY,CAAC;QAC5B,KAAK,SAAS,CAAC,cAAc;YAC3B,OAAO,eAAe,CAAC,YAAY,CAAC;QACtC,KAAK,SAAS,CAAC,OAAO;YACpB,OAAO,eAAe,CAAC,OAAO,CAAC;QACjC,KAAK,SAAS,CAAC,aAAa;YAC1B,OAAO,eAAe,CAAC,aAAa,CAAC;QACvC,KAAK,SAAS,CAAC,mBAAmB;YAChC,OAAO,eAAe,CAAC,mBAAmB,CAAC;QAC7C,KAAK,SAAS,CAAC,UAAU;YACvB,OAAO,eAAe,CAAC,UAAU,CAAC;QACpC,KAAK,SAAS,CAAC,SAAS;YACtB,OAAO,eAAe,CAAC,SAAS,CAAC;QACnC,KAAK,SAAS,CAAC,aAAa,CAAC;QAC7B,KAAK,SAAS,CAAC,WAAW;YACxB,OAAO,eAAe,CAAC,gBAAgB,CAAC;QAC1C,KAAK,SAAS,CAAC,cAAc,CAAC;QAC9B,KAAK,SAAS,CAAC,aAAa,CAAC;QAC7B;YACE,OAAO,eAAe,CAAC,cAAc,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,eAAe,CACtB,OAAe,EACf,SAA4B,EAC5B,UAAmB;IAEnB,MAAM,QAAQ,GAAsB;QAClC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI;KACd,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;IACnC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAC3C,eAAgC,EAChC,UAAkB,CAAC;IAEnB,MAAM,SAAS,GAAG,iBAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAE1D,+CAA+C;IAC/C,IAAI,UAA8B,CAAC;IACnC,IAAI,eAAe,CAAC,SAAS,IAAI,SAAS,KAAK,eAAe,CAAC,YAAY,EAAE,CAAC;QAC5E,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,CAAC,GAAG,IAAI,CAAC,CAAC;IAClF,CAAC;IAED,qCAAqC;IACrC,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS;QACzC,CAAC,CAAC,4DAA4D;QAC9D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,SAAS,GAAG,mBAAmB,eAAe,CAAC,IAAI,OAAO,eAAe,CAAC,OAAO,GAAG,SAAS,uDAAuD,CAAC;IAE3J,OAAO,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAC/E,4DAA4D;AAC5D,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAuC,EACvC,SAAiB,EACjB,QAAgB,SAAS;IAEzB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAElE,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAChF,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1F,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,EAAE;gBACrE,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAuC,EACvC,OAAe,EACf,cAAsB,CAAC,EACvB,QAAgB,SAAS;IAEzB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,UAAqD,CAAC;QAE1D,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACpD,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mEAAmE,OAAO,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE;oBAChI,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE,OAAO,GAAG,WAAW,GAAG,CAAC;iBACrC,CAAC,CAAC,CAAC;YACN,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,SAAiC,CAAC;QACtC,IAAI,CAAC;YACH,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAC7D,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,uDAAuD;YACvD,4DAA4D;YAC5D,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3B,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,IAAK,GAA6B,CAAC,IAAI,KAAK,UAAU,CAAC;YAC3F,IAAI,OAAO,IAAI,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;gBACjE,MAAM,CAAC,SAAS,EAAE,GAAG,KAAK,yBAAyB,OAAO,eAAe,OAAO,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBACtG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,mDAAmD;IACnD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iBAAiB,WAAW,4BAA4B,CAAC,CAAC;AACpF,CAAC"}
@@ -1,39 +0,0 @@
1
- /**
2
- * MCP SDK Structured Logging Utility
3
- *
4
- * Sends log messages to MCP clients via server.sendLoggingMessage().
5
- * Falls back to stderr before the server is initialized.
6
- */
7
- import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
- export type LogLevel = 'debug' | 'info' | 'warning' | 'error';
9
- /**
10
- * Initialize the logger with an MCP server reference.
11
- * Must be called after server creation and before any tool execution.
12
- */
13
- export declare function initLogger(server: Server): void;
14
- /**
15
- * Log message via MCP SDK structured logging.
16
- * Falls back to stderr if the server isn't initialized yet.
17
- * @param level - Log level
18
- * @param message - Message to log
19
- * @param tool - Tool/logger name for context
20
- */
21
- export declare function mcpLog(level: LogLevel, message: string, tool?: string): void;
22
- /**
23
- * Safe log that catches any errors (never crashes)
24
- * @param level - Log level
25
- * @param message - Message to log
26
- * @param tool - Tool name for context
27
- */
28
- export declare function safeLog(level: LogLevel, message: string, tool?: string): void;
29
- /**
30
- * Create a bound logger for a specific tool
31
- */
32
- export declare function createToolLogger(tool: string): {
33
- debug: (msg: string) => void;
34
- info: (msg: string) => void;
35
- warning: (msg: string) => void;
36
- error: (msg: string) => void;
37
- };
38
- export type ToolLogger = ReturnType<typeof createToolLogger>;
39
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAI9D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAQ5E;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAM7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM;iBAE5B,MAAM;gBACP,MAAM;mBACH,MAAM;iBACR,MAAM;EAEtB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * MCP SDK Structured Logging Utility
3
- *
4
- * Sends log messages to MCP clients via server.sendLoggingMessage().
5
- * Falls back to stderr before the server is initialized.
6
- */
7
- let serverRef = null;
8
- /**
9
- * Initialize the logger with an MCP server reference.
10
- * Must be called after server creation and before any tool execution.
11
- */
12
- export function initLogger(server) {
13
- serverRef = server;
14
- }
15
- /**
16
- * Log message via MCP SDK structured logging.
17
- * Falls back to stderr if the server isn't initialized yet.
18
- * @param level - Log level
19
- * @param message - Message to log
20
- * @param tool - Tool/logger name for context
21
- */
22
- export function mcpLog(level, message, tool) {
23
- const logger = tool ?? 'research-powerpack';
24
- if (serverRef) {
25
- serverRef.sendLoggingMessage({ level, data: message, logger }).catch(() => { });
26
- }
27
- else {
28
- // Fallback to stderr before MCP transport is connected
29
- console.error(`[${logger}] ${message}`);
30
- }
31
- }
32
- /**
33
- * Safe log that catches any errors (never crashes)
34
- * @param level - Log level
35
- * @param message - Message to log
36
- * @param tool - Tool name for context
37
- */
38
- export function safeLog(level, message, tool) {
39
- try {
40
- mcpLog(level, message, tool);
41
- }
42
- catch {
43
- // Swallow logging errors - never crash
44
- }
45
- }
46
- /**
47
- * Create a bound logger for a specific tool
48
- */
49
- export function createToolLogger(tool) {
50
- return {
51
- debug: (msg) => safeLog('debug', msg, tool),
52
- info: (msg) => safeLog('info', msg, tool),
53
- warning: (msg) => safeLog('warning', msg, tool),
54
- error: (msg) => safeLog('error', msg, tool),
55
- };
56
- }
57
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,IAAI,SAAS,GAAkB,IAAI,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,SAAS,GAAG,MAAM,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,KAAe,EAAE,OAAe,EAAE,IAAa;IACpE,MAAM,MAAM,GAAG,IAAI,IAAI,oBAAoB,CAAC;IAC5C,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,uDAAuD;QACvD,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,KAAe,EAAE,OAAe,EAAE,IAAa;IACrE,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO;QACL,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;QACnD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACjD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC;QACvD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;KACpD,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Markdown formatting utilities
3
- */
4
- export declare function removeMetaTags(content: string): string;
5
- //# sourceMappingURL=markdown-formatter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdown-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYtD"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Markdown formatting utilities
3
- */
4
- export function removeMetaTags(content) {
5
- if (!content || typeof content !== 'string') {
6
- return content;
7
- }
8
- const lines = content.split('\n');
9
- const filteredLines = lines.filter(line => {
10
- const trimmed = line.trim();
11
- return !trimmed.startsWith('- Meta:') && !trimmed.startsWith('Meta:');
12
- });
13
- return filteredLines.join('\n');
14
- }
15
- //# sourceMappingURL=markdown-formatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdown-formatter.js","sourceRoot":"","sources":["../../src/utils/markdown-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -1,93 +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 declare const DEFAULT_MAX_ITEMS: 20;
11
- /** Maximum snippet length before truncation in URL aggregator output */
12
- export declare const MAX_SNIPPET_LENGTH: 200;
13
- export interface SuccessOptions {
14
- /** Title/header for the response */
15
- readonly title: string;
16
- /** Summary section (70% of content) */
17
- readonly summary: string;
18
- /** Optional data section (20% of content) */
19
- readonly data?: string;
20
- /** Optional next steps (10% of content) */
21
- readonly nextSteps?: string[];
22
- /** Optional metadata footer */
23
- readonly metadata?: Record<string, string | number>;
24
- }
25
- /**
26
- * Format a successful response using 70/20/10 pattern
27
- */
28
- export declare function formatSuccess(opts: SuccessOptions): string;
29
- export interface ErrorOptions {
30
- /** Error code (e.g., RATE_LIMITED, TIMEOUT) */
31
- readonly code: string;
32
- /** Human-readable error message */
33
- readonly message: string;
34
- /** Is this error retryable? */
35
- readonly retryable?: boolean;
36
- /** How to fix the error */
37
- readonly howToFix?: string[];
38
- /** Alternative actions */
39
- readonly alternatives?: string[];
40
- /** Tool name for context */
41
- readonly toolName?: string;
42
- }
43
- /**
44
- * Format an error response with recovery guidance
45
- * Designed to keep agents moving — every error includes actionable alternatives
46
- */
47
- export declare function formatError(opts: ErrorOptions): string;
48
- export interface BatchHeaderOptions {
49
- /** Batch operation title */
50
- readonly title: string;
51
- /** Total items attempted */
52
- readonly totalItems: number;
53
- /** Successfully processed count */
54
- readonly successful: number;
55
- /** Failed count */
56
- readonly failed: number;
57
- /** Optional tokens per item */
58
- readonly tokensPerItem?: number;
59
- /** Optional batch count */
60
- readonly batches?: number;
61
- /** Extra stats to include */
62
- readonly extras?: Record<string, string | number>;
63
- }
64
- /**
65
- * Format a batch operation header with stats
66
- */
67
- export declare function formatBatchHeader(opts: BatchHeaderOptions): string;
68
- export interface ListItem {
69
- /** Item title/name */
70
- readonly title: string;
71
- /** Optional description */
72
- readonly description?: string;
73
- /** Optional metadata */
74
- readonly meta?: string;
75
- /** Optional URL */
76
- readonly url?: string;
77
- }
78
- /**
79
- * Format a numbered list with optional metadata
80
- */
81
- export declare function formatList(items: ListItem[], options?: {
82
- maxItems?: number;
83
- numbered?: boolean;
84
- }): string;
85
- /**
86
- * Format duration in human-readable form
87
- */
88
- export declare function formatDuration(ms: number): string;
89
- /**
90
- * Truncate text to max length with ellipsis
91
- */
92
- export declare function truncateText(text: string, maxLength: number): string;
93
- //# sourceMappingURL=response.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,EAAG,EAAW,CAAC;AAE7C,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,EAAG,GAAY,CAAC;AAU/C,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAoC1D;AAMD,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,0BAA0B;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,4BAA4B;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAKD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAuCtD;AAMD,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mBAAmB;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;CACnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CA8BlE;AAMD,MAAM,WAAW,QAAQ;IACvB,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CA0BzG;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGpE"}