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,159 +0,0 @@
1
- /**
2
- * Shared Tool Utilities
3
- * Extracted from individual handlers to eliminate duplication
4
- */
5
- // Re-export from centralized modules
6
- export { mcpLog, safeLog as safeLogSimple, createToolLogger, } from '../utils/logger.js';
7
- export { formatSuccess, formatError, formatBatchHeader, formatList, formatDuration, truncateText, } from '../utils/response.js';
8
- // ============================================================================
9
- // Token Budget Constants
10
- // ============================================================================
11
- /**
12
- * Centralized token budgets for all tools
13
- */
14
- export const TOKEN_BUDGETS = {
15
- /** Deep research total budget */
16
- RESEARCH: 32_000,
17
- /** Web scraper total budget */
18
- SCRAPER: 32_000,
19
- /** Reddit comment budget per batch */
20
- REDDIT_COMMENTS: 1_000,
21
- };
22
- // ============================================================================
23
- // Logging Utilities
24
- // ============================================================================
25
- /**
26
- * Safe logger wrapper - NEVER throws
27
- * Logs to provided logger or falls back to console.error
28
- *
29
- * @param logger - Optional logger function
30
- * @param sessionId - Session ID for logging context
31
- * @param level - Log level
32
- * @param message - Message to log
33
- * @param toolName - Name of the tool for prefixing
34
- */
35
- export async function safeLog(logger, sessionId, level, message, toolName) {
36
- if (!logger || !sessionId)
37
- return;
38
- try {
39
- await logger(level, `[${toolName}] ${message}`, sessionId);
40
- }
41
- catch {
42
- // Silently ignore logger errors - they should never crash the tool
43
- console.error(`[${toolName}] Logger failed: ${message}`);
44
- }
45
- }
46
- // ============================================================================
47
- // Token Allocation
48
- // ============================================================================
49
- /**
50
- * Calculate token allocation for batch operations
51
- * Distributes a fixed budget across multiple items
52
- *
53
- * @param count - Number of items to distribute budget across
54
- * @param budget - Total token budget
55
- * @returns Tokens per item
56
- */
57
- export function calculateTokenAllocation(count, budget) {
58
- if (count <= 0)
59
- return budget;
60
- return Math.floor(budget / count);
61
- }
62
- // ============================================================================
63
- // Error Formatting
64
- // ============================================================================
65
- /**
66
- * Format retry hint based on error retryability
67
- *
68
- * @param retryable - Whether the error is retryable
69
- * @returns Hint string or empty string
70
- */
71
- export function formatRetryHint(retryable) {
72
- return retryable
73
- ? '\n\n💡 This error may be temporary. Try again in a moment.'
74
- : '';
75
- }
76
- /**
77
- * Create a standard error markdown response
78
- *
79
- * @param toolName - Name of the tool that errored
80
- * @param errorCode - Error code
81
- * @param message - Error message
82
- * @param retryable - Whether error is retryable
83
- * @param tip - Optional tip for resolution
84
- * @returns Formatted markdown error string
85
- */
86
- export function formatToolError(toolName, errorCode, message, retryable, tip) {
87
- const retryHint = formatRetryHint(retryable);
88
- const tipSection = tip ? `\n\n**Tip:** ${tip}` : '';
89
- return `# ❌ ${toolName}: Operation Failed\n\n**${errorCode}:** ${message}${retryHint}${tipSection}`;
90
- }
91
- // ============================================================================
92
- // Validation Helpers
93
- // ============================================================================
94
- /**
95
- * Validate that a value is a non-empty array
96
- *
97
- * @param value - Value to check
98
- * @param fieldName - Field name for error message
99
- * @returns Error message or undefined if valid
100
- */
101
- export function validateNonEmptyArray(value, fieldName) {
102
- if (!Array.isArray(value)) {
103
- return `${fieldName} must be an array`;
104
- }
105
- if (value.length === 0) {
106
- return `${fieldName} must not be empty`;
107
- }
108
- return undefined;
109
- }
110
- /**
111
- * Validate array length is within bounds
112
- *
113
- * @param arr - Array to check
114
- * @param min - Minimum length
115
- * @param max - Maximum length
116
- * @param fieldName - Field name for error message
117
- * @returns Error message or undefined if valid
118
- */
119
- export function validateArrayBounds(arr, min, max, fieldName) {
120
- if (arr.length < min) {
121
- return `${fieldName} requires at least ${min} items. Received: ${arr.length}`;
122
- }
123
- if (arr.length > max) {
124
- return `${fieldName} allows at most ${max} items. Received: ${arr.length}. Please remove ${arr.length - max} item(s).`;
125
- }
126
- return undefined;
127
- }
128
- // ============================================================================
129
- // Response Builders
130
- // ============================================================================
131
- /**
132
- * Build standard header for batch operation results
133
- *
134
- * @param title - Title of the results section
135
- * @param count - Number of items processed
136
- * @param tokensPerItem - Tokens allocated per item
137
- * @param totalBudget - Total token budget
138
- * @returns Formatted header string
139
- */
140
- export function buildBatchHeader(title, count, tokensPerItem, totalBudget) {
141
- return `# ${title} (${count} items)\n\n**Token Allocation:** ${tokensPerItem.toLocaleString()} tokens/item (${count} items, ${totalBudget.toLocaleString()} total budget)`;
142
- }
143
- /**
144
- * Build status line for batch results
145
- *
146
- * @param successful - Number of successful items
147
- * @param failed - Number of failed items
148
- * @param batches - Number of batches processed
149
- * @param extras - Optional extra status items
150
- * @returns Formatted status line
151
- */
152
- export function buildStatusLine(successful, failed, batches, extras) {
153
- let status = `**Status:** ✅ ${successful} successful | ❌ ${failed} failed | 📦 ${batches} batch(es)`;
154
- if (extras && extras.length > 0) {
155
- status += ` | ${extras.join(' | ')}`;
156
- }
157
- return status;
158
- }
159
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qCAAqC;AACrC,OAAO,EACL,MAAM,EACN,OAAO,IAAI,aAAa,EACxB,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,YAAY,GAKb,MAAM,sBAAsB,CAAC;AAE9B,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iCAAiC;IACjC,QAAQ,EAAE,MAAM;IAChB,+BAA+B;IAC/B,OAAO,EAAE,MAAM;IACf,sCAAsC;IACtC,eAAe,EAAE,KAAK;CACd,CAAC;AAuBX,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAA8B,EAC9B,SAA6B,EAC7B,KAAiC,EACjC,OAAe,EACf,QAAgB;IAEhB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;QAAE,OAAO;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,EAAE,IAAI,QAAQ,KAAK,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;QACnE,OAAO,CAAC,KAAK,CAAC,IAAI,QAAQ,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAa,EAAE,MAAc;IACpE,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAAkB;IAChD,OAAO,SAAS;QACd,CAAC,CAAC,4DAA4D;QAC9D,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAgB,EAChB,SAAiB,EACjB,OAAe,EACf,SAAkB,EAClB,GAAY;IAEZ,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,OAAO,OAAO,QAAQ,2BAA2B,SAAS,OAAO,OAAO,GAAG,SAAS,GAAG,UAAU,EAAE,CAAC;AACtG,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,SAAiB;IAEjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,SAAS,mBAAmB,CAAC;IACzC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,SAAS,oBAAoB,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAc,EACd,GAAW,EACX,GAAW,EACX,SAAiB;IAEjB,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,OAAO,GAAG,SAAS,sBAAsB,GAAG,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC;IAChF,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,OAAO,GAAG,SAAS,mBAAmB,GAAG,qBAAqB,GAAG,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,GAAG,GAAG,WAAW,CAAC;IACzH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,KAAa,EACb,aAAqB,EACrB,WAAmB;IAEnB,OAAO,KAAK,KAAK,KAAK,KAAK,oCAAoC,aAAa,CAAC,cAAc,EAAE,iBAAiB,KAAK,WAAW,WAAW,CAAC,cAAc,EAAE,gBAAgB,CAAC;AAC7K,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,MAAc,EACd,OAAe,EACf,MAAiB;IAEjB,IAAI,MAAM,GAAG,iBAAiB,UAAU,mBAAmB,MAAM,gBAAgB,OAAO,YAAY,CAAC;IACrG,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,28 +0,0 @@
1
- /**
2
- * Concurrency utilities for bounded parallel execution
3
- * Prevents CPU spikes and API rate limiting from unbounded Promise.all
4
- */
5
- /**
6
- * Execute async tasks with a concurrency limit (like p-map).
7
- * Processes items from the input array through the mapper function,
8
- * running at most `concurrency` tasks simultaneously.
9
- *
10
- * @param items - Array of items to process
11
- * @param mapper - Async function to apply to each item
12
- * @param concurrency - Maximum number of concurrent tasks (default: 6)
13
- * @param signal - Optional AbortSignal to cancel remaining work
14
- * @returns Array of results in the same order as input items
15
- */
16
- export declare function pMap<T, R>(items: readonly T[], mapper: (item: T, index: number) => Promise<R>, concurrency?: number, signal?: AbortSignal): Promise<R[]>;
17
- /**
18
- * Like pMap but uses Promise.allSettled semantics — never rejects,
19
- * returns PromiseSettledResult for each item.
20
- *
21
- * @param items - Array of items to process
22
- * @param mapper - Async function to apply to each item
23
- * @param concurrency - Maximum number of concurrent tasks (default: 6)
24
- * @param signal - Optional AbortSignal to cancel remaining work
25
- * @returns Array of PromiseSettledResult in the same order as input items
26
- */
27
- export declare function pMapSettled<T, R>(items: readonly T[], mapper: (item: T, index: number) => Promise<R>, concurrency?: number, signal?: AbortSignal): Promise<PromiseSettledResult<R>[]>;
28
- //# sourceMappingURL=concurrency.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"concurrency.d.ts","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AACH,wBAAsB,IAAI,CAAC,CAAC,EAAE,CAAC,EAC7B,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9C,WAAW,GAAE,MAAU,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,EAAE,CAAC,CAkCd;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,CAAC,EACpC,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAC9C,WAAW,GAAE,MAAU,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAoCpC"}
@@ -1,92 +0,0 @@
1
- /**
2
- * Concurrency utilities for bounded parallel execution
3
- * Prevents CPU spikes and API rate limiting from unbounded Promise.all
4
- */
5
- /**
6
- * Execute async tasks with a concurrency limit (like p-map).
7
- * Processes items from the input array through the mapper function,
8
- * running at most `concurrency` tasks simultaneously.
9
- *
10
- * @param items - Array of items to process
11
- * @param mapper - Async function to apply to each item
12
- * @param concurrency - Maximum number of concurrent tasks (default: 6)
13
- * @param signal - Optional AbortSignal to cancel remaining work
14
- * @returns Array of results in the same order as input items
15
- */
16
- export async function pMap(items, mapper, concurrency = 6, signal) {
17
- if (items.length === 0)
18
- return [];
19
- // Clamp concurrency to reasonable bounds
20
- const limit = Math.max(1, Math.min(concurrency, items.length));
21
- const results = new Array(items.length);
22
- let nextIndex = 0;
23
- const internalAbort = new AbortController();
24
- async function worker() {
25
- while (true) {
26
- if (signal?.aborted || internalAbort.signal.aborted) {
27
- throw new DOMException('Aborted', 'AbortError');
28
- }
29
- const index = nextIndex++;
30
- if (index >= items.length)
31
- break;
32
- try {
33
- results[index] = await mapper(items[index], index);
34
- }
35
- catch (err) {
36
- internalAbort.abort(); // Signal other workers to stop picking up new work
37
- throw err;
38
- }
39
- }
40
- }
41
- // Spawn `limit` workers that pull from the shared index
42
- const workers = [];
43
- for (let i = 0; i < limit; i++) {
44
- workers.push(worker());
45
- }
46
- await Promise.all(workers);
47
- return results;
48
- }
49
- /**
50
- * Like pMap but uses Promise.allSettled semantics — never rejects,
51
- * returns PromiseSettledResult for each item.
52
- *
53
- * @param items - Array of items to process
54
- * @param mapper - Async function to apply to each item
55
- * @param concurrency - Maximum number of concurrent tasks (default: 6)
56
- * @param signal - Optional AbortSignal to cancel remaining work
57
- * @returns Array of PromiseSettledResult in the same order as input items
58
- */
59
- export async function pMapSettled(items, mapper, concurrency = 6, signal) {
60
- if (items.length === 0)
61
- return [];
62
- const limit = Math.max(1, Math.min(concurrency, items.length));
63
- const results = new Array(items.length);
64
- let nextIndex = 0;
65
- async function worker() {
66
- while (nextIndex < items.length) {
67
- if (signal?.aborted)
68
- break;
69
- const index = nextIndex++;
70
- try {
71
- const value = await mapper(items[index], index);
72
- results[index] = { status: 'fulfilled', value };
73
- }
74
- catch (reason) {
75
- results[index] = { status: 'rejected', reason };
76
- }
77
- }
78
- }
79
- const workers = [];
80
- for (let i = 0; i < limit; i++) {
81
- workers.push(worker());
82
- }
83
- await Promise.all(workers);
84
- // Fill any unprocessed items after abort
85
- for (let i = 0; i < items.length; i++) {
86
- if (results[i] === undefined) {
87
- results[i] = { status: 'rejected', reason: new DOMException('Aborted', 'AbortError') };
88
- }
89
- }
90
- return results;
91
- }
92
- //# sourceMappingURL=concurrency.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/utils/concurrency.ts"],"names":[],"mappings":"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"}
@@ -1,95 +0,0 @@
1
- /**
2
- * Robust error handling utilities for MCP server
3
- * Ensures the server NEVER crashes and always returns structured responses
4
- */
5
- export declare const ErrorCode: {
6
- readonly RATE_LIMITED: "RATE_LIMITED";
7
- readonly TIMEOUT: "TIMEOUT";
8
- readonly NETWORK_ERROR: "NETWORK_ERROR";
9
- readonly SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
10
- readonly AUTH_ERROR: "AUTH_ERROR";
11
- readonly INVALID_INPUT: "INVALID_INPUT";
12
- readonly NOT_FOUND: "NOT_FOUND";
13
- readonly QUOTA_EXCEEDED: "QUOTA_EXCEEDED";
14
- readonly INTERNAL_ERROR: "INTERNAL_ERROR";
15
- readonly PARSE_ERROR: "PARSE_ERROR";
16
- readonly UNKNOWN_ERROR: "UNKNOWN_ERROR";
17
- };
18
- type ErrorCodeType = typeof ErrorCode[keyof typeof ErrorCode];
19
- export interface StructuredError {
20
- code: ErrorCodeType;
21
- message: string;
22
- retryable: boolean;
23
- statusCode?: number;
24
- cause?: string;
25
- }
26
- /**
27
- * Classify any error into a structured format.
28
- * NEVER throws — always returns a valid StructuredError.
29
- */
30
- export declare function classifyError(error: unknown): StructuredError;
31
- /**
32
- * Sleep utility that respects abort signals
33
- */
34
- export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
35
- /**
36
- * Wrap a fetch call with timeout via AbortController
37
- */
38
- export declare function fetchWithTimeout(url: string, options?: RequestInit & {
39
- timeoutMs?: number;
40
- }): Promise<Response>;
41
- /**
42
- * MCP-compliant error codes for tool responses
43
- * These codes are exposed to clients for programmatic error handling
44
- */
45
- export declare const MCP_ERROR_CODES: {
46
- readonly RATE_LIMITED: "RATE_LIMITED";
47
- readonly NETWORK_ERROR: "NETWORK_ERROR";
48
- readonly TIMEOUT: "TIMEOUT";
49
- readonly VALIDATION_ERROR: "VALIDATION_ERROR";
50
- readonly AUTH_ERROR: "AUTH_ERROR";
51
- readonly NOT_FOUND: "NOT_FOUND";
52
- readonly INTERNAL_ERROR: "INTERNAL_ERROR";
53
- readonly SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
54
- };
55
- export type McpErrorCodeType = typeof MCP_ERROR_CODES[keyof typeof MCP_ERROR_CODES];
56
- /**
57
- * Structured response type for MCP tool errors
58
- * Per MCP spec: tools return isError:true for recoverable/tool-level failures
59
- * Uses index signature for SDK compatibility with additional fields
60
- */
61
- interface ToolErrorResponse {
62
- content: Array<{
63
- type: 'text';
64
- text: string;
65
- }>;
66
- isError: true;
67
- errorCode?: McpErrorCodeType;
68
- retryAfter?: number;
69
- [key: string]: unknown;
70
- }
71
- /**
72
- * Create a tool error response from a StructuredError
73
- * Automatically maps error codes and calculates retryAfter for rate limits
74
- */
75
- export declare function createToolErrorFromStructured(structuredError: StructuredError, attempt?: number): ToolErrorResponse;
76
- /**
77
- * Wrap a promise with a hard deadline timeout.
78
- * If the promise doesn't resolve/reject within `timeoutMs`, it rejects with a timeout error.
79
- * Uses AbortController to signal cancellation to the underlying request.
80
- */
81
- export declare function withRequestTimeout<T>(fn: (signal: AbortSignal) => Promise<T>, timeoutMs: number, label?: string): Promise<T>;
82
- /**
83
- * Wrap a non-streaming API call with activity-based timeout detection.
84
- * If the call hasn't completed within `stallMs`, abort and retry.
85
- * This catches "stuck" connections where TCP stays open but no data flows.
86
- *
87
- * @param fn - Async function that accepts an AbortSignal
88
- * @param stallMs - Max milliseconds to wait for the call to complete before considering it stuck
89
- * @param maxAttempts - Max retry attempts for stalled requests
90
- * @param label - Label for log messages
91
- * @returns The result of the function
92
- */
93
- export declare function withStallProtection<T>(fn: (signal: AbortSignal) => Promise<T>, stallMs: number, maxAttempts?: number, label?: string): Promise<T>;
94
- export {};
95
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,eAAO,MAAM,SAAS;;;;;;;;;;;;CAiBZ,CAAC;AAEX,KAAK,aAAa,GAAG,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAY9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmHD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAe7D;AAqED;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAMD;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAEpF;;;;GAIG;AACH,UAAU,iBAAiB;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAyDD;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,eAAe,EAChC,OAAO,GAAE,MAAU,GAClB,iBAAiB,CAgBnB;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACvC,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAkB,GACxB,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EACvC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAU,EACvB,KAAK,GAAE,MAAkB,GACxB,OAAO,CAAC,CAAC,CAAC,CAsCZ"}