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,252 +0,0 @@
1
- /**
2
- * Handler Registry - Central tool registration and execution
3
- * Eliminates repetitive if/else routing with declarative registration
4
- */
5
- import { z, ZodError } from 'zod';
6
- import { McpError, ErrorCode as McpErrorCode } from '@modelcontextprotocol/sdk/types.js';
7
- import { parseEnv, getCapabilities, getMissingEnvMessage } from '../config/index.js';
8
- import { classifyError, createToolErrorFromStructured } from '../utils/errors.js';
9
- // Import schemas
10
- import { deepResearchParamsSchema } from '../schemas/deep-research.js';
11
- import { scrapeLinksParamsSchema } from '../schemas/scrape-links.js';
12
- import { webSearchParamsSchema } from '../schemas/web-search.js';
13
- // Import handlers
14
- import { handleSearchReddit, handleGetRedditPosts } from './reddit.js';
15
- import { handleDeepResearch } from './research.js';
16
- import { handleScrapeLinks } from './scrape.js';
17
- import { handleWebSearch } from './search.js';
18
- // ============================================================================
19
- // Schemas for Simple Tools (inline definitions)
20
- // ============================================================================
21
- const searchRedditParamsSchema = z.object({
22
- queries: z.array(z.string()).min(3, 'search_reddit: MINIMUM 3 queries required. Add more diverse queries covering different perspectives.').max(50),
23
- date_after: z.string().optional(),
24
- });
25
- const getRedditPostParamsSchema = z.object({
26
- urls: z.array(z.string()).min(2).max(50)
27
- .describe('2-50 Reddit URLs. More = broader consensus. Get from search_reddit.'),
28
- fetch_comments: z.boolean().default(true)
29
- .describe('Fetch comments (true recommended - best insights in comments)'),
30
- max_comments: z.number().default(100)
31
- .describe('Override auto allocation. Leave empty for smart allocation.'),
32
- use_llm: z.boolean().default(false)
33
- .describe('Default false — DO NOT enable unless user explicitly requests synthesis. Raw comments preserve exact quotes, code snippets, and nuanced opinions that LLM summarization loses.'),
34
- what_to_extract: z.string().optional()
35
- .describe('Only used when use_llm=true. Extraction instructions for AI synthesis.'),
36
- });
37
- // ============================================================================
38
- // Handler Wrappers
39
- // ============================================================================
40
- const env = parseEnv();
41
- /**
42
- * Wrapper for search_reddit handler
43
- */
44
- async function searchRedditHandler(params) {
45
- const p = params;
46
- return handleSearchReddit(p.queries, env.SEARCH_API_KEY || '', p.date_after);
47
- }
48
- /**
49
- * Wrapper for get_reddit_post handler
50
- */
51
- async function getRedditPostHandler(params) {
52
- const p = params;
53
- return handleGetRedditPosts(p.urls, env.REDDIT_CLIENT_ID || '', env.REDDIT_CLIENT_SECRET || '', p.max_comments, {
54
- fetchComments: p.fetch_comments,
55
- maxCommentsOverride: p.max_comments !== 100 ? p.max_comments : undefined,
56
- use_llm: p.use_llm,
57
- what_to_extract: p.what_to_extract,
58
- });
59
- }
60
- /**
61
- * Wrapper for deep_research handler
62
- */
63
- async function deepResearchHandler(params) {
64
- const { content } = await handleDeepResearch(params);
65
- return content;
66
- }
67
- /**
68
- * Wrapper for scrape_links handler
69
- */
70
- async function scrapeLinksHandler(params) {
71
- const { content } = await handleScrapeLinks(params);
72
- return content;
73
- }
74
- /**
75
- * Wrapper for web_search handler
76
- */
77
- async function webSearchHandler(params) {
78
- const { content } = await handleWebSearch(params);
79
- return content;
80
- }
81
- // ============================================================================
82
- // Tool Registry
83
- // ============================================================================
84
- /**
85
- * Central registry of all MCP tools
86
- */
87
- export const toolRegistry = {
88
- search_reddit: {
89
- name: 'search_reddit',
90
- capability: 'search',
91
- schema: searchRedditParamsSchema,
92
- handler: searchRedditHandler,
93
- },
94
- get_reddit_post: {
95
- name: 'get_reddit_post',
96
- capability: 'reddit',
97
- schema: getRedditPostParamsSchema,
98
- handler: getRedditPostHandler,
99
- },
100
- deep_research: {
101
- name: 'deep_research',
102
- capability: 'deepResearch',
103
- schema: deepResearchParamsSchema,
104
- handler: deepResearchHandler,
105
- transformResponse: (result) => ({
106
- content: result,
107
- isError: result.includes('# ❌ Error'),
108
- }),
109
- },
110
- scrape_links: {
111
- name: 'scrape_links',
112
- capability: 'scraping',
113
- schema: scrapeLinksParamsSchema,
114
- handler: scrapeLinksHandler,
115
- transformResponse: (result) => ({
116
- content: result,
117
- isError: result.includes('# ❌ Scraping Failed'),
118
- }),
119
- },
120
- web_search: {
121
- name: 'web_search',
122
- capability: 'search',
123
- schema: webSearchParamsSchema,
124
- handler: webSearchHandler,
125
- transformResponse: (result) => ({
126
- content: result,
127
- isError: result.includes('# ❌ web_search'),
128
- }),
129
- },
130
- };
131
- // ============================================================================
132
- // Execute Tool Helpers
133
- // ============================================================================
134
- /**
135
- * Validate params with Zod schema and optional post-validation.
136
- * Returns validated params or a CallToolResult error.
137
- */
138
- function validateToolParams(tool, args) {
139
- let validatedParams;
140
- try {
141
- validatedParams = tool.schema.parse(args);
142
- }
143
- catch (error) {
144
- if (error instanceof ZodError) {
145
- const issues = error.issues
146
- .map((i) => `- **${i.path.join('.') || 'root'}**: ${i.message}`)
147
- .join('\n');
148
- throw new McpError(McpErrorCode.InvalidParams, `Validation Error:\n${issues}`);
149
- }
150
- const structured = classifyError(error);
151
- return createToolErrorFromStructured(structured);
152
- }
153
- if (tool.postValidate) {
154
- const postError = tool.postValidate(validatedParams);
155
- if (postError) {
156
- return {
157
- content: [{ type: 'text', text: `# ❌ Validation Error\n\n${postError}` }],
158
- isError: true,
159
- };
160
- }
161
- }
162
- return { params: validatedParams };
163
- }
164
- /**
165
- * Build the final CallToolResult from a handler result string,
166
- * applying the tool's transformResponse if present.
167
- */
168
- function buildToolResult(result, tool) {
169
- if (tool.transformResponse) {
170
- const transformed = tool.transformResponse(result);
171
- return {
172
- content: [{ type: 'text', text: transformed.content }],
173
- isError: transformed.isError,
174
- };
175
- }
176
- return {
177
- content: [{ type: 'text', text: result }],
178
- };
179
- }
180
- // ============================================================================
181
- // Execute Tool (Main Entry Point)
182
- // ============================================================================
183
- /**
184
- * Execute a tool by name with full middleware chain
185
- *
186
- * Middleware steps:
187
- * 1. Lookup tool in registry (throw McpError if not found)
188
- * 2. Check capability (return error response if missing)
189
- * 3. Validate params with Zod (return error response if invalid)
190
- * 4. Execute handler (catch and format any errors)
191
- * 5. Transform response if needed
192
- *
193
- * @param name - Tool name from request
194
- * @param args - Raw arguments from request
195
- * @param capabilities - Current capabilities from getCapabilities()
196
- * @returns MCP-compliant tool result
197
- */
198
- export async function executeTool(name, args, capabilities) {
199
- const tool = toolRegistry[name];
200
- if (!tool) {
201
- throw new McpError(McpErrorCode.MethodNotFound, `Method not found: ${name}. Available tools: ${Object.keys(toolRegistry).join(', ')}`);
202
- }
203
- if (tool.capability && !capabilities[tool.capability]) {
204
- throw new McpError(McpErrorCode.InvalidRequest, getMissingEnvMessage(tool.capability));
205
- }
206
- const validation = validateToolParams(tool, args);
207
- if ('content' in validation)
208
- return validation;
209
- let result;
210
- try {
211
- result = await tool.handler(validation.params);
212
- }
213
- catch (error) {
214
- const structured = classifyError(error);
215
- return createToolErrorFromStructured(structured);
216
- }
217
- return buildToolResult(result, tool);
218
- }
219
- // ============================================================================
220
- // Utility Functions
221
- // ============================================================================
222
- /**
223
- * Get list of all registered tool names
224
- */
225
- export function getRegisteredToolNames() {
226
- return Object.keys(toolRegistry);
227
- }
228
- /**
229
- * Check if a tool is registered
230
- */
231
- export function isToolRegistered(name) {
232
- return name in toolRegistry;
233
- }
234
- /**
235
- * Get tool capabilities for logging
236
- */
237
- export function getToolCapabilities() {
238
- const caps = getCapabilities();
239
- const enabled = [];
240
- const disabled = [];
241
- for (const [name, tool] of Object.entries(toolRegistry)) {
242
- const capKey = tool.capability;
243
- if (!capKey || caps[capKey]) {
244
- enabled.push(name);
245
- }
246
- else {
247
- disabled.push(name);
248
- }
249
- }
250
- return { enabled, disabled };
251
- }
252
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Deep Research Tool Handler - Batch processing with dynamic token allocation
3
- * Implements robust error handling that NEVER crashes
4
- */
5
- import type { DeepResearchParams } from '../schemas/deep-research.js';
6
- /**
7
- * Handle deep research request
8
- * NEVER throws - always returns a valid response
9
- */
10
- export declare function handleDeepResearch(params: DeepResearchParams): Promise<{
11
- content: string;
12
- structuredContent: object;
13
- }>;
14
- //# sourceMappingURL=research.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAsMtE;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CzD"}
@@ -1,196 +0,0 @@
1
- /**
2
- * Deep Research Tool Handler - Batch processing with dynamic token allocation
3
- * Implements robust error handling that NEVER crashes
4
- */
5
- import { ResearchClient } from '../clients/research.js';
6
- import { FileAttachmentService } from '../services/file-attachment.js';
7
- import { RESEARCH, RESEARCH_PROMPTS } from '../config/index.js';
8
- import { getToolConfig } from '../config/loader.js';
9
- import { classifyError } from '../utils/errors.js';
10
- import { pMap } from '../utils/concurrency.js';
11
- import { mcpLog, formatSuccess, formatError, formatBatchHeader, formatDuration, truncateText, TOKEN_BUDGETS, calculateTokenAllocation, } from './utils.js';
12
- // Constants
13
- const MIN_QUESTIONS = 1; // Allow single question for flexibility
14
- const MAX_QUESTIONS = 10;
15
- const SYSTEM_PROMPT = `Expert research engine. Multi-source: docs, papers, blogs, case studies. Cite inline [source].
16
-
17
- FORMAT RULES:
18
- - For comparisons/features/structured data → use markdown table |Col|Col|Col|
19
- - For narrative/diagnostic/explanation → tight numbered bullets, no prose paragraphs
20
- - No intro, no greeting, no conclusion, no meta-commentary
21
- - No filler phrases: "it is worth noting", "overall", "in conclusion", "importantly"
22
- - Every sentence = fact, data point, or actionable insight
23
- - First line of output = content (never a preamble)`;
24
- // Get research suffix from YAML config (fallback to hardcoded)
25
- function getResearchSuffix() {
26
- const config = getToolConfig('deep_research');
27
- const suffix = config?.limits?.research_suffix;
28
- return typeof suffix === 'string' ? suffix : RESEARCH_PROMPTS.SUFFIX;
29
- }
30
- function wrapQuestionWithCompression(question) {
31
- return `${question}\n\n${getResearchSuffix()}`;
32
- }
33
- // --- Helpers ---
34
- function validateQuestionCount(count) {
35
- if (count < MIN_QUESTIONS) {
36
- return {
37
- code: 'MIN_QUESTIONS',
38
- message: `Minimum ${MIN_QUESTIONS} research question(s) required. Received: ${count}`,
39
- howToFix: ['Add at least one question with detailed context following the template: WHAT I NEED, WHY, WHAT I KNOW, SPECIFIC QUESTIONS'],
40
- };
41
- }
42
- if (count > MAX_QUESTIONS) {
43
- return {
44
- code: 'MAX_QUESTIONS',
45
- message: `Maximum ${MAX_QUESTIONS} research questions allowed. Received: ${count}`,
46
- howToFix: [`Remove ${count - MAX_QUESTIONS} question(s)`],
47
- };
48
- }
49
- return null;
50
- }
51
- async function enhanceQuestionWithAttachments(question, fileAttachments, fileService, index) {
52
- if (!fileAttachments || fileAttachments.length === 0)
53
- return question;
54
- try {
55
- const attachmentsMarkdown = await fileService.formatAttachments(fileAttachments);
56
- return question + attachmentsMarkdown;
57
- }
58
- catch {
59
- mcpLog('warning', `Failed to process attachments for question ${index + 1}`, 'research');
60
- return question;
61
- }
62
- }
63
- async function executeResearchQuestions(questions, client, fileService, tokensPerQuestion) {
64
- return pMap(questions, async (q, index) => {
65
- try {
66
- let enhancedQuestion = await enhanceQuestionWithAttachments(q.question, q.file_attachments, fileService, index);
67
- enhancedQuestion = wrapQuestionWithCompression(enhancedQuestion);
68
- const response = await client.research({
69
- question: enhancedQuestion,
70
- systemPrompt: SYSTEM_PROMPT,
71
- reasoningEffort: RESEARCH.REASONING_EFFORT,
72
- maxSearchResults: Math.min(RESEARCH.MAX_URLS, 20),
73
- maxTokens: tokensPerQuestion,
74
- });
75
- if (response.error) {
76
- return { question: q.question, content: response.content || '', success: false, error: response.error.message };
77
- }
78
- return {
79
- question: q.question,
80
- content: response.content || '',
81
- success: !!response.content,
82
- tokensUsed: response.usage?.totalTokens,
83
- error: response.content ? undefined : 'Empty response received',
84
- };
85
- }
86
- catch (error) {
87
- const structuredError = classifyError(error);
88
- return { question: q.question, content: '', success: false, error: structuredError.message };
89
- }
90
- }, 3);
91
- }
92
- function buildQuestionsData(results) {
93
- const sections = [];
94
- for (let i = 0; i < results.length; i++) {
95
- const r = results[i];
96
- if (!r)
97
- continue;
98
- const preview = truncateText(r.question, 100);
99
- sections.push(`## Question ${i + 1}: ${preview}\n`);
100
- if (r.success) {
101
- sections.push(r.content);
102
- if (r.tokensUsed)
103
- sections.push(`\n*Tokens used: ${r.tokensUsed.toLocaleString()}*`);
104
- }
105
- else {
106
- sections.push(`**❌ Error:** ${r.error}`);
107
- }
108
- sections.push('\n---\n');
109
- }
110
- return sections.join('\n');
111
- }
112
- function formatResearchOutput(results, totalQuestions, tokensPerQuestion, executionTime) {
113
- const successful = results.filter(r => r.success);
114
- const failed = results.filter(r => !r.success);
115
- const totalTokens = successful.reduce((sum, r) => sum + (r.tokensUsed || 0), 0);
116
- const batchHeader = formatBatchHeader({
117
- title: `Deep Research Results`,
118
- totalItems: totalQuestions,
119
- successful: successful.length,
120
- failed: failed.length,
121
- tokensPerItem: tokensPerQuestion,
122
- extras: { 'Total tokens used': totalTokens.toLocaleString() },
123
- });
124
- const nextSteps = [
125
- successful.length > 0 ? 'SCRAPE CITED SOURCES: scrape_links(urls=[...URLs cited in research above...], use_llm=true, what_to_extract="Extract evidence | data | methodology | conclusions") — verify research citations with primary sources' : null,
126
- successful.length > 0 ? 'COMMUNITY VALIDATION: search_reddit(queries=["topic findings", "topic real experience", "topic criticism"]) — check if community agrees with research findings' : null,
127
- successful.length > 0 ? 'ITERATE: If research revealed gaps or new questions, run deep_research again with refined questions targeting those gaps' : null,
128
- successful.length > 0 ? 'WEB VERIFY: web_search(keywords=["specific claim from research", "topic latest data 2025"]) — if claims need independent verification' : null,
129
- failed.length > 0 ? 'Retry failed questions with more specific context' : null,
130
- ].filter(Boolean);
131
- const formattedContent = formatSuccess({
132
- title: `Research Complete (${successful.length}/${totalQuestions})`,
133
- summary: batchHeader,
134
- data: buildQuestionsData(results),
135
- nextSteps,
136
- metadata: {
137
- 'Execution time': formatDuration(executionTime),
138
- 'Token budget': TOKEN_BUDGETS.RESEARCH.toLocaleString(),
139
- },
140
- });
141
- return {
142
- content: formattedContent,
143
- structuredContent: {
144
- totalQuestions,
145
- successful: successful.length,
146
- failed: failed.length,
147
- tokensPerQuestion,
148
- totalTokensUsed: totalTokens,
149
- results,
150
- },
151
- };
152
- }
153
- /**
154
- * Handle deep research request
155
- * NEVER throws - always returns a valid response
156
- */
157
- export async function handleDeepResearch(params) {
158
- const startTime = Date.now();
159
- const questions = params.questions || [];
160
- const validationError = validateQuestionCount(questions.length);
161
- if (validationError) {
162
- return {
163
- content: formatError({ ...validationError, toolName: 'deep_research' }),
164
- structuredContent: { error: true, message: validationError.message },
165
- };
166
- }
167
- const tokensPerQuestion = calculateTokenAllocation(questions.length, TOKEN_BUDGETS.RESEARCH);
168
- mcpLog('info', `Starting batch research: ${questions.length} questions, ${tokensPerQuestion.toLocaleString()} tokens/question`, 'research');
169
- let client;
170
- try {
171
- client = new ResearchClient();
172
- }
173
- catch (error) {
174
- const err = classifyError(error);
175
- return {
176
- content: formatError({
177
- code: 'CLIENT_INIT_FAILED',
178
- message: `Failed to initialize research client: ${err.message}`,
179
- toolName: 'deep_research',
180
- howToFix: ['Check OPENROUTER_API_KEY is set'],
181
- alternatives: [
182
- 'web_search(keywords=["topic best practices", "topic guide", "topic comparison 2025"]) — uses Serper API (different key), search for information directly',
183
- 'search_reddit(queries=["topic recommendations", "topic experience", "topic discussion"]) — uses Serper API, get community perspective',
184
- 'scrape_links(urls=[...any relevant URLs...], use_llm=true) — if you have URLs, scrape them for content (uses Firecrawl + OpenRouter, may also fail if OpenRouter key is the issue)',
185
- ],
186
- }),
187
- structuredContent: { error: true, message: `Failed to initialize: ${err.message}` },
188
- };
189
- }
190
- const fileService = new FileAttachmentService();
191
- const results = await executeResearchQuestions(questions, client, fileService, tokensPerQuestion);
192
- const executionTime = Date.now() - startTime;
193
- mcpLog('info', `Research completed: ${results.filter(r => r.success).length}/${questions.length} successful, ${results.filter(r => r.success).reduce((s, r) => s + (r.tokensUsed || 0), 0).toLocaleString()} tokens`, 'research');
194
- return formatResearchOutput(results, questions.length, tokensPerQuestion, executionTime);
195
- }
196
- //# sourceMappingURL=research.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAyB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,aAAa,EACb,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,YAAY;AACZ,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC,wCAAwC;AACjE,MAAM,aAAa,GAAG,EAAE,CAAC;AAUzB,MAAM,aAAa,GAAG;;;;;;;;oDAQ8B,CAAC;AAErD,+DAA+D;AAC/D,SAAS,iBAAiB;IACxB,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC;IAC/C,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACvE,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgB;IACnD,OAAO,GAAG,QAAQ,OAAO,iBAAiB,EAAE,EAAE,CAAC;AACjD,CAAC;AAED,kBAAkB;AAElB,SAAS,qBAAqB,CAC5B,KAAa;IAEb,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,WAAW,aAAa,6CAA6C,KAAK,EAAE;YACrF,QAAQ,EAAE,CAAC,2HAA2H,CAAC;SACxI,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,WAAW,aAAa,0CAA0C,KAAK,EAAE;YAClF,QAAQ,EAAE,CAAC,UAAU,KAAK,GAAG,aAAa,cAAc,CAAC;SAC1D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,QAAgB,EAChB,eAA4E,EAC5E,WAAkC,EAClC,KAAa;IAEb,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,mBAAmB,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QACjF,OAAO,QAAQ,GAAG,mBAAmB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,SAAS,EAAE,8CAA8C,KAAK,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACzF,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,SAA0C,EAC1C,MAAsB,EACtB,WAAkC,EAClC,iBAAyB;IAEzB,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAA2B,EAAE;QACjE,IAAI,CAAC;YACH,IAAI,gBAAgB,GAAG,MAAM,8BAA8B,CACzD,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,CACnD,CAAC;YACF,gBAAgB,GAAG,2BAA2B,CAAC,gBAAgB,CAAC,CAAC;YAEjE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;gBACrC,QAAQ,EAAE,gBAAgB;gBAC1B,YAAY,EAAE,aAAa;gBAC3B,eAAe,EAAE,QAAQ,CAAC,gBAAgB;gBAC1C,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACjD,SAAS,EAAE,iBAAiB;aAC7B,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAClH,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;gBAC/B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAC3B,UAAU,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW;gBACvC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB;aAChE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAyB;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;QAEpD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAyB,EACzB,cAAsB,EACtB,iBAAyB,EACzB,aAAqB;IAErB,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhF,MAAM,WAAW,GAAG,iBAAiB,CAAC;QACpC,KAAK,EAAE,uBAAuB;QAC9B,UAAU,EAAE,cAAc;QAC1B,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,aAAa,EAAE,iBAAiB;QAChC,MAAM,EAAE,EAAE,mBAAmB,EAAE,WAAW,CAAC,cAAc,EAAE,EAAE;KAC9D,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG;QAChB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qNAAqN,CAAC,CAAC,CAAC,IAAI;QACpP,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gKAAgK,CAAC,CAAC,CAAC,IAAI;QAC/L,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,0HAA0H,CAAC,CAAC,CAAC,IAAI;QACzJ,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uIAAuI,CAAC,CAAC,CAAC,IAAI;QACtK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,IAAI;KAC/E,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;IAE9B,MAAM,gBAAgB,GAAG,aAAa,CAAC;QACrC,KAAK,EAAE,sBAAsB,UAAU,CAAC,MAAM,IAAI,cAAc,GAAG;QACnE,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC;QACjC,SAAS;QACT,QAAQ,EAAE;YACR,gBAAgB,EAAE,cAAc,CAAC,aAAa,CAAC;YAC/C,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,cAAc,EAAE;SACxD;KACF,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,gBAAgB;QACzB,iBAAiB,EAAE;YACjB,cAAc;YACd,UAAU,EAAE,UAAU,CAAC,MAAM;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB;YACjB,eAAe,EAAE,WAAW;YAC5B,OAAO;SACR;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAA0B;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAEzC,MAAM,eAAe,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChE,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,WAAW,CAAC,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;YACvE,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE;SACrE,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC7F,MAAM,CAAC,MAAM,EAAE,4BAA4B,SAAS,CAAC,MAAM,eAAe,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAE5I,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,WAAW,CAAC;gBACnB,IAAI,EAAE,oBAAoB;gBAC1B,OAAO,EAAE,yCAAyC,GAAG,CAAC,OAAO,EAAE;gBAC/D,QAAQ,EAAE,eAAe;gBACzB,QAAQ,EAAE,CAAC,iCAAiC,CAAC;gBAC7C,YAAY,EAAE;oBACZ,0JAA0J;oBAC1J,uIAAuI;oBACvI,oLAAoL;iBACrL;aACF,CAAC;YACF,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,GAAG,CAAC,OAAO,EAAE,EAAE;SACpF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAClG,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE7C,MAAM,CAAC,MAAM,EAAE,uBAAuB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAElO,OAAO,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;AAC3F,CAAC"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Scrape Links Tool Handler
3
- * Implements robust error handling that NEVER crashes the MCP server
4
- */
5
- import type { ScrapeLinksParams, ScrapeLinksOutput } from '../schemas/scrape-links.js';
6
- /**
7
- * Handle scrape links request
8
- * NEVER throws - always returns a valid response with content and metadata
9
- */
10
- export declare function handleScrapeLinks(params: ScrapeLinksParams): Promise<{
11
- content: string;
12
- structuredContent: ScrapeLinksOutput;
13
- }>;
14
- //# sourceMappingURL=scrape.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AA2RvF;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAoDpE"}