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,78 +0,0 @@
1
- /**
2
- * Consolidated configuration
3
- * All environment variables, constants, and LLM config in one place
4
- */
5
- interface EnvConfig {
6
- SCRAPER_API_KEY: string;
7
- SEARCH_API_KEY: string | undefined;
8
- REDDIT_CLIENT_ID: string | undefined;
9
- REDDIT_CLIENT_SECRET: string | undefined;
10
- CEREBRAS_API_KEY: string | undefined;
11
- }
12
- export declare function resetEnvCache(): void;
13
- export declare function parseEnv(): EnvConfig;
14
- interface ResearchConfig {
15
- readonly BASE_URL: string;
16
- readonly MODEL: string;
17
- readonly FALLBACK_MODEL: string;
18
- readonly API_KEY: string;
19
- readonly TIMEOUT_MS: number;
20
- readonly REASONING_EFFORT: 'low' | 'medium' | 'high';
21
- readonly MAX_URLS: number;
22
- }
23
- export declare const RESEARCH: ResearchConfig;
24
- export declare const SERVER: {
25
- readonly NAME: string;
26
- readonly VERSION: string;
27
- readonly DESCRIPTION: string;
28
- };
29
- export interface Capabilities {
30
- reddit: boolean;
31
- search: boolean;
32
- scraping: boolean;
33
- deepResearch: boolean;
34
- llmExtraction: boolean;
35
- cerebras: boolean;
36
- }
37
- export declare function getCapabilities(): Capabilities;
38
- export declare function getMissingEnvMessage(capability: keyof Capabilities): string;
39
- export declare const SCRAPER: {
40
- readonly MAX_CONCURRENT: 30;
41
- readonly BATCH_SIZE: 30;
42
- readonly MAX_TOKENS_BUDGET: 32000;
43
- readonly MIN_URLS: 3;
44
- readonly MAX_URLS: 50;
45
- readonly RETRY_COUNT: 3;
46
- readonly RETRY_DELAYS: readonly [2000, 4000, 8000];
47
- readonly EXTRACTION_PREFIX: "Extract ONLY from document — never hallucinate. For structured data (pricing, specs, features) → markdown table. Otherwise → tight bullet points. No intro, no confirmation message, no meta-commentary.";
48
- readonly EXTRACTION_SUFFIX: "Output grounded info only. First line = content, not preamble.";
49
- };
50
- export declare const RESEARCH_PROMPTS: {
51
- readonly SUFFIX: "CONSTRAINTS: No restating the question. No hedging preambles. Cite sources inline [source]. NEVER hallucinate — only report what sources confirm.";
52
- };
53
- export declare const REDDIT: {
54
- readonly MAX_CONCURRENT: 10;
55
- readonly BATCH_SIZE: 10;
56
- readonly MAX_COMMENT_BUDGET: 1000;
57
- readonly MAX_COMMENTS_PER_POST: 200;
58
- readonly MIN_POSTS: 2;
59
- readonly MAX_POSTS: 50;
60
- readonly RETRY_COUNT: 5;
61
- readonly RETRY_DELAYS: readonly [2000, 4000, 8000, 16000, 32000];
62
- };
63
- export declare const CTR_WEIGHTS: Record<number, number>;
64
- interface LlmExtractionConfig {
65
- readonly MODEL: string;
66
- readonly MAX_TOKENS: number;
67
- readonly ENABLE_REASONING: boolean;
68
- }
69
- export declare const LLM_EXTRACTION: LlmExtractionConfig;
70
- interface CerebrasConfig {
71
- readonly ENABLED: boolean;
72
- readonly API_KEY: string;
73
- readonly BASE_URL: string;
74
- readonly MODEL: string;
75
- }
76
- export declare const CEREBRAS: CerebrasConfig;
77
- export {};
78
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkEH,UAAU,SAAS;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAID,wBAAgB,aAAa,IAAI,IAAI,CAKpC;AAED,wBAAgB,QAAQ,IAAI,SAAS,CAUpC;AAMD,UAAU,cAAc;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAmBD,eAAO,MAAM,QAAQ,EAAE,cAIrB,CAAC;AAQH,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAMX,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,eAAe,IAAI,YAAY,CAU9C;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,YAAY,GAAG,MAAM,CAU3E;AAMD,eAAO,MAAM,OAAO;;;;;;;;;;CAUV,CAAC;AAMX,eAAO,MAAM,gBAAgB;;CAEnB,CAAC;AAMX,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAC;AAMX,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWrC,CAAC;AAMX,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;CACpC;AAcD,eAAO,MAAM,cAAc,EAAE,mBAI3B,CAAC;AAMH,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAgBD,eAAO,MAAM,QAAQ,EAAE,cAIrB,CAAC"}
@@ -1,201 +0,0 @@
1
- /**
2
- * Consolidated configuration
3
- * All environment variables, constants, and LLM config in one place
4
- */
5
- import { VERSION, PACKAGE_NAME, PACKAGE_DESCRIPTION } from '../version.js';
6
- // Import version utilities (not re-exported - use directly from version.ts if needed externally)
7
- // ============================================================================
8
- // Safe Integer Parsing Helper
9
- // ============================================================================
10
- /**
11
- * Safely parse an integer from environment variable with bounds checking
12
- * @param value - The string value to parse (from process.env)
13
- * @param defaultVal - Default value if parsing fails or value is undefined
14
- * @param min - Minimum allowed value (clamped if below)
15
- * @param max - Maximum allowed value (clamped if above)
16
- * @returns Parsed integer within bounds, or default value
17
- */
18
- function safeParseInt(value, defaultVal, min, max) {
19
- if (!value) {
20
- return defaultVal;
21
- }
22
- const parsed = parseInt(value, 10);
23
- if (isNaN(parsed)) {
24
- console.warn(`[Config] Invalid number "${value}", using default ${defaultVal}`);
25
- return defaultVal;
26
- }
27
- if (parsed < min) {
28
- console.warn(`[Config] Value ${parsed} below minimum ${min}, clamping to ${min}`);
29
- return min;
30
- }
31
- if (parsed > max) {
32
- console.warn(`[Config] Value ${parsed} above maximum ${max}, clamping to ${max}`);
33
- return max;
34
- }
35
- return parsed;
36
- }
37
- // ============================================================================
38
- // Reasoning Effort Validation
39
- // ============================================================================
40
- const VALID_REASONING_EFFORTS = ['low', 'medium', 'high'];
41
- function parseReasoningEffort(value) {
42
- if (value && VALID_REASONING_EFFORTS.includes(value)) {
43
- return value;
44
- }
45
- return 'high';
46
- }
47
- let cachedEnv = null;
48
- export function resetEnvCache() {
49
- cachedEnv = null;
50
- cachedResearch = null;
51
- cachedLlmExtraction = null;
52
- cachedCerebras = null;
53
- }
54
- export function parseEnv() {
55
- if (cachedEnv)
56
- return cachedEnv;
57
- cachedEnv = {
58
- SCRAPER_API_KEY: process.env.SCRAPEDO_API_KEY || '',
59
- SEARCH_API_KEY: process.env.SERPER_API_KEY || undefined,
60
- REDDIT_CLIENT_ID: process.env.REDDIT_CLIENT_ID || undefined,
61
- REDDIT_CLIENT_SECRET: process.env.REDDIT_CLIENT_SECRET || undefined,
62
- CEREBRAS_API_KEY: process.env.CEREBRAS_API_KEY || undefined,
63
- };
64
- return cachedEnv;
65
- }
66
- let cachedResearch = null;
67
- function getResearch() {
68
- if (cachedResearch)
69
- return cachedResearch;
70
- cachedResearch = {
71
- BASE_URL: process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1',
72
- MODEL: process.env.RESEARCH_MODEL || 'x-ai/grok-4-fast',
73
- FALLBACK_MODEL: process.env.RESEARCH_FALLBACK_MODEL || 'google/gemini-2.5-flash',
74
- API_KEY: process.env.OPENROUTER_API_KEY || '',
75
- TIMEOUT_MS: safeParseInt(process.env.API_TIMEOUT_MS, 1800000, 1000, 3600000),
76
- REASONING_EFFORT: parseReasoningEffort(process.env.DEFAULT_REASONING_EFFORT),
77
- MAX_URLS: safeParseInt(process.env.DEFAULT_MAX_URLS, 100, 10, 200),
78
- };
79
- return cachedResearch;
80
- }
81
- // Lazy proxy so existing code using RESEARCH.X still works
82
- export const RESEARCH = new Proxy({}, {
83
- get(_target, prop) {
84
- return getResearch()[prop];
85
- },
86
- });
87
- // ============================================================================
88
- // MCP Server Configuration
89
- // ============================================================================
90
- // Version is now automatically read from package.json via version.ts
91
- // No need to manually update version strings anymore!
92
- export const SERVER = {
93
- NAME: PACKAGE_NAME,
94
- VERSION: VERSION,
95
- DESCRIPTION: PACKAGE_DESCRIPTION,
96
- };
97
- export function getCapabilities() {
98
- const env = parseEnv();
99
- return {
100
- reddit: !!(env.REDDIT_CLIENT_ID && env.REDDIT_CLIENT_SECRET),
101
- search: !!env.SEARCH_API_KEY,
102
- scraping: !!env.SCRAPER_API_KEY,
103
- deepResearch: !!RESEARCH.API_KEY,
104
- llmExtraction: !!RESEARCH.API_KEY || CEREBRAS.ENABLED,
105
- cerebras: CEREBRAS.ENABLED,
106
- };
107
- }
108
- export function getMissingEnvMessage(capability) {
109
- const messages = {
110
- reddit: '❌ **Reddit tools unavailable.** Set `REDDIT_CLIENT_ID` and `REDDIT_CLIENT_SECRET` to enable.\n\n👉 Create a Reddit app at: https://www.reddit.com/prefs/apps (select "script" type)',
111
- search: '❌ **Search unavailable.** Set `SERPER_API_KEY` to enable web search and Reddit search.\n\n👉 Get your free API key at: https://serper.dev (2,500 free queries)',
112
- scraping: '❌ **Web scraping unavailable.** Set `SCRAPEDO_API_KEY` to enable URL content extraction.\n\n👉 Sign up at: https://scrape.do (1,000 free credits)',
113
- deepResearch: '❌ **Deep research unavailable.** Set `OPENROUTER_API_KEY` to enable AI-powered research.\n\n👉 Get your API key at: https://openrouter.ai/keys',
114
- llmExtraction: '⚠️ **AI extraction disabled.** The `use_llm` and `what_to_extract` features require `OPENROUTER_API_KEY`.\n\nScraping will work but without intelligent content filtering.',
115
- cerebras: '⚠️ **Cerebras not configured.** Set `USE_CEREBRAS=true` and `CEREBRAS_API_KEY` to use Cerebras for LLM extraction.\n\n👉 Get your API key at: https://cloud.cerebras.ai',
116
- };
117
- return messages[capability];
118
- }
119
- // ============================================================================
120
- // Scraper Configuration (Scrape.do implementation)
121
- // ============================================================================
122
- export const SCRAPER = {
123
- MAX_CONCURRENT: 30,
124
- BATCH_SIZE: 30,
125
- MAX_TOKENS_BUDGET: 32000,
126
- MIN_URLS: 3,
127
- MAX_URLS: 50,
128
- RETRY_COUNT: 3,
129
- RETRY_DELAYS: [2000, 4000, 8000],
130
- EXTRACTION_PREFIX: 'Extract ONLY from document — never hallucinate. For structured data (pricing, specs, features) → markdown table. Otherwise → tight bullet points. No intro, no confirmation message, no meta-commentary.',
131
- EXTRACTION_SUFFIX: 'Output grounded info only. First line = content, not preamble.',
132
- };
133
- // ============================================================================
134
- // Research Compression Prefix/Suffix
135
- // ============================================================================
136
- export const RESEARCH_PROMPTS = {
137
- SUFFIX: `CONSTRAINTS: No restating the question. No hedging preambles. Cite sources inline [source]. NEVER hallucinate — only report what sources confirm.`,
138
- };
139
- // ============================================================================
140
- // Reddit Configuration
141
- // ============================================================================
142
- export const REDDIT = {
143
- MAX_CONCURRENT: 10,
144
- BATCH_SIZE: 10,
145
- MAX_COMMENT_BUDGET: 1000,
146
- MAX_COMMENTS_PER_POST: 200,
147
- MIN_POSTS: 2,
148
- MAX_POSTS: 50,
149
- RETRY_COUNT: 5,
150
- RETRY_DELAYS: [2000, 4000, 8000, 16000, 32000],
151
- };
152
- // ============================================================================
153
- // CTR Weights for URL Ranking (inspired from CTR research)
154
- // ============================================================================
155
- export const CTR_WEIGHTS = {
156
- 1: 100.00,
157
- 2: 60.00,
158
- 3: 48.89,
159
- 4: 33.33,
160
- 5: 28.89,
161
- 6: 26.44,
162
- 7: 24.44,
163
- 8: 17.78,
164
- 9: 13.33,
165
- 10: 12.56,
166
- };
167
- let cachedLlmExtraction = null;
168
- function getLlmExtraction() {
169
- if (cachedLlmExtraction)
170
- return cachedLlmExtraction;
171
- cachedLlmExtraction = {
172
- MODEL: process.env.LLM_EXTRACTION_MODEL || 'openai/gpt-oss-120b:nitro',
173
- MAX_TOKENS: 8000,
174
- ENABLE_REASONING: process.env.LLM_ENABLE_REASONING !== 'false',
175
- };
176
- return cachedLlmExtraction;
177
- }
178
- export const LLM_EXTRACTION = new Proxy({}, {
179
- get(_target, prop) {
180
- return getLlmExtraction()[prop];
181
- },
182
- });
183
- let cachedCerebras = null;
184
- function getCerebras() {
185
- if (cachedCerebras)
186
- return cachedCerebras;
187
- const env = parseEnv();
188
- cachedCerebras = {
189
- ENABLED: process.env.USE_CEREBRAS === 'true' && !!env.CEREBRAS_API_KEY,
190
- API_KEY: env.CEREBRAS_API_KEY || '',
191
- BASE_URL: 'https://api.cerebras.ai/v1',
192
- MODEL: 'zai-glm-4.7',
193
- };
194
- return cachedCerebras;
195
- }
196
- export const CEREBRAS = new Proxy({}, {
197
- get(_target, prop) {
198
- return getCerebras()[prop];
199
- },
200
- });
201
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- /**
2
- * YAML Configuration Loader
3
- * Loads tools.yaml and generates MCP-compatible tool definitions
4
- */
5
- import { z } from 'zod';
6
- import type { YamlConfig, YamlToolConfig, YamlParameter, McpTool, LoadedTool } from './types.js';
7
- /**
8
- * Recursively convert YAML parameter to Zod schema
9
- */
10
- declare function yamlParamToZod(param: YamlParameter): z.ZodTypeAny;
11
- /**
12
- * Convert YAML parameters to Zod object schema
13
- */
14
- declare function yamlParamsToZodSchema(params: Record<string, YamlParameter>): z.ZodObject<Record<string, z.ZodTypeAny>>;
15
- /**
16
- * Load and parse tools.yaml
17
- */
18
- export declare function loadYamlConfig(): YamlConfig;
19
- /**
20
- * Load all tools from YAML configuration
21
- */
22
- export declare function loadToolsFromYaml(): LoadedTool[];
23
- /**
24
- * Get tool configuration by name
25
- */
26
- export declare function getToolConfig(name: string): YamlToolConfig | undefined;
27
- /**
28
- * Get schema descriptions for a tool (for injecting into existing Zod schemas)
29
- */
30
- export declare function getSchemaDescriptions(name: string): Record<string, string> | undefined;
31
- /**
32
- * Get Zod schema by reference name
33
- */
34
- export declare function getZodSchemaByRef(ref: string): z.ZodTypeAny | undefined;
35
- /**
36
- * Generate complete MCP tools list with all schemas resolved
37
- */
38
- export declare function generateMcpTools(): McpTool[];
39
- export { yamlParamsToZodSchema, yamlParamToZod };
40
- //# sourceMappingURL=loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,aAAa,EAEb,OAAO,EACP,UAAU,EACX,MAAM,YAAY,CAAC;AAsEpB;;GAEG;AACH,iBAAS,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC,UAAU,CAqE1D;AAED;;GAEG;AACH,iBAAS,qBAAqB,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAU3C;AAyBD;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,CAS3C;AAwCD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CAYhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAOtE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAGtF;AAmBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAEvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,EAAE,CA+B5C;AAMD,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC"}
@@ -1,322 +0,0 @@
1
- /**
2
- * YAML Configuration Loader
3
- * Loads tools.yaml and generates MCP-compatible tool definitions
4
- */
5
- import { readFileSync } from 'fs';
6
- import { fileURLToPath } from 'url';
7
- import { dirname, join } from 'path';
8
- import { parse as parseYaml } from 'yaml';
9
- import { z } from 'zod';
10
- import { zodToJsonSchema } from 'zod-to-json-schema';
11
- // Get directory of this file for relative YAML path.
12
- // Guarded so the module can be imported in Cloudflare Workers where
13
- // import.meta.url is not a file: URL.
14
- let __configDir;
15
- try {
16
- if (typeof import.meta.url === 'string' && import.meta.url.startsWith('file:')) {
17
- __configDir = dirname(fileURLToPath(import.meta.url));
18
- }
19
- }
20
- catch {
21
- // Workers runtime – leave undefined
22
- }
23
- // Cached YAML config - loaded once, reused for all subsequent calls
24
- let cachedYamlConfig = null;
25
- // ============================================================================
26
- // YAML to Zod Schema Conversion
27
- // ============================================================================
28
- /**
29
- * Convert YAML validation rules to Zod string schema
30
- */
31
- function applyStringValidation(schema, validation) {
32
- if (!validation)
33
- return schema;
34
- let result = schema;
35
- if (validation.minLength !== undefined)
36
- result = result.min(validation.minLength);
37
- if (validation.maxLength !== undefined)
38
- result = result.max(validation.maxLength);
39
- if (validation.pattern)
40
- result = result.regex(new RegExp(validation.pattern));
41
- if (validation.format === 'uri')
42
- result = result.url();
43
- if (validation.format === 'email')
44
- result = result.email();
45
- if (validation.format === 'uuid')
46
- result = result.uuid();
47
- return result;
48
- }
49
- /**
50
- * Convert YAML validation rules to Zod number schema
51
- */
52
- function applyNumberValidation(schema, validation) {
53
- if (!validation)
54
- return schema;
55
- let result = schema;
56
- if (validation.min !== undefined)
57
- result = result.min(validation.min);
58
- if (validation.max !== undefined)
59
- result = result.max(validation.max);
60
- if (validation.int)
61
- result = result.int();
62
- if (validation.positive)
63
- result = result.positive();
64
- if (validation.negative)
65
- result = result.negative();
66
- return result;
67
- }
68
- /**
69
- * Convert YAML validation rules to Zod array schema
70
- */
71
- function applyArrayValidation(schema, validation) {
72
- if (!validation)
73
- return schema;
74
- let result = schema;
75
- if (validation.minItems !== undefined)
76
- result = result.min(validation.minItems);
77
- if (validation.maxItems !== undefined)
78
- result = result.max(validation.maxItems);
79
- return result;
80
- }
81
- /**
82
- * Recursively convert YAML parameter to Zod schema
83
- */
84
- function yamlParamToZod(param) {
85
- let schema;
86
- switch (param.type) {
87
- case 'string': {
88
- let strSchema = z.string();
89
- strSchema = applyStringValidation(strSchema, param.validation);
90
- if (param.description)
91
- strSchema = strSchema.describe(param.description);
92
- schema = strSchema;
93
- break;
94
- }
95
- case 'number': {
96
- let numSchema = z.number();
97
- numSchema = applyNumberValidation(numSchema, param.validation);
98
- if (param.description)
99
- numSchema = numSchema.describe(param.description);
100
- schema = numSchema;
101
- break;
102
- }
103
- case 'boolean': {
104
- let boolSchema = z.boolean();
105
- if (param.description)
106
- boolSchema = boolSchema.describe(param.description);
107
- schema = boolSchema;
108
- break;
109
- }
110
- case 'array': {
111
- if (!param.items) {
112
- throw new Error('Array parameter must have items definition');
113
- }
114
- const itemSchema = yamlParamToZod(param.items);
115
- let arrSchema = z.array(itemSchema);
116
- arrSchema = applyArrayValidation(arrSchema, param.validation);
117
- if (param.description)
118
- arrSchema = arrSchema.describe(param.description);
119
- schema = arrSchema;
120
- break;
121
- }
122
- case 'object': {
123
- if (!param.properties) {
124
- throw new Error('Object parameter must have properties definition');
125
- }
126
- const shape = {};
127
- for (const [key, propDef] of Object.entries(param.properties)) {
128
- let propSchema = yamlParamToZod(propDef);
129
- if (propDef.required === false) {
130
- propSchema = propSchema.optional();
131
- }
132
- shape[key] = propSchema;
133
- }
134
- let objSchema = z.object(shape);
135
- if (param.description)
136
- objSchema = objSchema.describe(param.description);
137
- schema = objSchema;
138
- break;
139
- }
140
- default:
141
- throw new Error(`Unknown parameter type: ${param.type}`);
142
- }
143
- // Apply optional/default
144
- if (param.required === false && param.default !== undefined) {
145
- schema = schema.default(param.default);
146
- }
147
- else if (param.required === false) {
148
- schema = schema.optional();
149
- }
150
- return schema;
151
- }
152
- /**
153
- * Convert YAML parameters to Zod object schema
154
- */
155
- function yamlParamsToZodSchema(params) {
156
- const shape = {};
157
- for (const [key, param] of Object.entries(params)) {
158
- let schema = yamlParamToZod(param);
159
- // Note: required is handled in yamlParamToZod via optional()
160
- shape[key] = schema;
161
- }
162
- return z.object(shape);
163
- }
164
- /**
165
- * Convert Zod schema to JSON Schema for MCP inputSchema
166
- */
167
- function zodToMcpInputSchema(schema) {
168
- const jsonSchema = zodToJsonSchema(schema, { $refStrategy: 'none' });
169
- // Extract properties and required from JSON Schema
170
- if (typeof jsonSchema === 'object' && jsonSchema !== null) {
171
- const obj = jsonSchema;
172
- return {
173
- type: 'object',
174
- properties: obj.properties || {},
175
- required: obj.required,
176
- };
177
- }
178
- return { type: 'object', properties: {} };
179
- }
180
- // ============================================================================
181
- // Tool Loading
182
- // ============================================================================
183
- /**
184
- * Load and parse tools.yaml
185
- */
186
- export function loadYamlConfig() {
187
- if (cachedYamlConfig)
188
- return cachedYamlConfig;
189
- if (!__configDir) {
190
- throw new Error('YAML loader unavailable: not running in Node.js filesystem context');
191
- }
192
- const yamlPath = join(__configDir, 'yaml', 'tools.yaml');
193
- const yamlContent = readFileSync(yamlPath, 'utf8');
194
- cachedYamlConfig = parseYaml(yamlContent);
195
- return cachedYamlConfig;
196
- }
197
- /**
198
- * Convert a single YAML tool config to MCP Tool
199
- * For tools with inline parameters only
200
- */
201
- function yamlToolToMcpTool(toolConfig) {
202
- if (!toolConfig.parameters) {
203
- throw new Error(`Tool ${toolConfig.name} must have parameters or useZodSchema`);
204
- }
205
- const zodSchema = yamlParamsToZodSchema(toolConfig.parameters);
206
- const inputSchema = zodToMcpInputSchema(zodSchema);
207
- return {
208
- name: toolConfig.name,
209
- description: toolConfig.description.trim(),
210
- inputSchema,
211
- category: toolConfig.category,
212
- capability: toolConfig.capability,
213
- useZodSchema: false,
214
- };
215
- }
216
- /**
217
- * Create placeholder for tools using existing Zod schemas
218
- * These will be enriched with actual schemas at runtime
219
- */
220
- function createZodSchemaPlaceholder(toolConfig) {
221
- return {
222
- name: toolConfig.name,
223
- description: toolConfig.description.trim(),
224
- inputSchema: { type: 'object', properties: {} }, // Placeholder
225
- category: toolConfig.category,
226
- capability: toolConfig.capability,
227
- useZodSchema: true,
228
- zodSchemaRef: toolConfig.zodSchemaRef,
229
- };
230
- }
231
- /**
232
- * Load all tools from YAML configuration
233
- */
234
- export function loadToolsFromYaml() {
235
- const config = loadYamlConfig();
236
- return config.tools.map((toolConfig) => {
237
- if (toolConfig.useZodSchema) {
238
- // Tool uses existing Zod schema - return placeholder
239
- return createZodSchemaPlaceholder(toolConfig);
240
- }
241
- else {
242
- // Tool has inline parameters - generate schema from YAML
243
- return yamlToolToMcpTool(toolConfig);
244
- }
245
- });
246
- }
247
- /**
248
- * Get tool configuration by name
249
- */
250
- export function getToolConfig(name) {
251
- try {
252
- const config = loadYamlConfig();
253
- return config.tools.find((t) => t.name === name);
254
- }
255
- catch {
256
- return undefined;
257
- }
258
- }
259
- /**
260
- * Get schema descriptions for a tool (for injecting into existing Zod schemas)
261
- */
262
- export function getSchemaDescriptions(name) {
263
- const tool = getToolConfig(name);
264
- return tool?.schemaDescriptions;
265
- }
266
- // ============================================================================
267
- // Zod Schema Registry (for tools using existing schemas)
268
- // ============================================================================
269
- import { deepResearchParamsSchema } from '../schemas/deep-research.js';
270
- import { scrapeLinksParamsSchema } from '../schemas/scrape-links.js';
271
- import { webSearchParamsSchema } from '../schemas/web-search.js';
272
- /**
273
- * Registry of existing Zod schemas for complex tools
274
- */
275
- const zodSchemaRegistry = {
276
- deepResearchParamsSchema,
277
- scrapeLinksParamsSchema,
278
- webSearchParamsSchema,
279
- };
280
- /**
281
- * Get Zod schema by reference name
282
- */
283
- export function getZodSchemaByRef(ref) {
284
- return zodSchemaRegistry[ref];
285
- }
286
- /**
287
- * Generate complete MCP tools list with all schemas resolved
288
- */
289
- export function generateMcpTools() {
290
- const loadedTools = loadToolsFromYaml();
291
- return loadedTools.map((tool) => {
292
- if (tool.useZodSchema && tool.zodSchemaRef) {
293
- // Resolve the actual Zod schema
294
- const schema = getZodSchemaByRef(tool.zodSchemaRef);
295
- if (!schema) {
296
- console.error(`[Loader] Schema not found: ${tool.zodSchemaRef}`);
297
- return {
298
- name: tool.name,
299
- description: tool.description,
300
- inputSchema: { type: 'object', properties: {} },
301
- };
302
- }
303
- const inputSchema = zodToMcpInputSchema(schema);
304
- return {
305
- name: tool.name,
306
- description: tool.description,
307
- inputSchema,
308
- };
309
- }
310
- // Tool already has generated inputSchema
311
- return {
312
- name: tool.name,
313
- description: tool.description,
314
- inputSchema: tool.inputSchema,
315
- };
316
- });
317
- }
318
- // ============================================================================
319
- // Exports
320
- // ============================================================================
321
- export { yamlParamsToZodSchema, yamlParamToZod };
322
- //# sourceMappingURL=loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}