research-powerpack-mcp 3.0.14 → 3.1.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 (37) hide show
  1. package/dist/clients/reddit.d.ts +9 -1
  2. package/dist/clients/reddit.d.ts.map +1 -1
  3. package/dist/clients/reddit.js +121 -41
  4. package/dist/clients/reddit.js.map +1 -1
  5. package/dist/clients/research.d.ts +16 -0
  6. package/dist/clients/research.d.ts.map +1 -1
  7. package/dist/clients/research.js +135 -31
  8. package/dist/clients/research.js.map +1 -1
  9. package/dist/clients/scraper.d.ts +27 -1
  10. package/dist/clients/scraper.d.ts.map +1 -1
  11. package/dist/clients/scraper.js +206 -101
  12. package/dist/clients/scraper.js.map +1 -1
  13. package/dist/clients/search.d.ts +15 -0
  14. package/dist/clients/search.d.ts.map +1 -1
  15. package/dist/clients/search.js +174 -52
  16. package/dist/clients/search.js.map +1 -1
  17. package/dist/index.d.ts +4 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +51 -6
  20. package/dist/index.js.map +1 -1
  21. package/dist/services/llm-processor.d.ts +18 -0
  22. package/dist/services/llm-processor.d.ts.map +1 -1
  23. package/dist/services/llm-processor.js +174 -24
  24. package/dist/services/llm-processor.js.map +1 -1
  25. package/dist/tools/research.d.ts +5 -0
  26. package/dist/tools/research.d.ts.map +1 -1
  27. package/dist/tools/research.js +63 -18
  28. package/dist/tools/research.js.map +1 -1
  29. package/dist/tools/scrape.d.ts +5 -0
  30. package/dist/tools/scrape.d.ts.map +1 -1
  31. package/dist/tools/scrape.js +144 -81
  32. package/dist/tools/scrape.js.map +1 -1
  33. package/dist/utils/errors.d.ts +79 -1
  34. package/dist/utils/errors.d.ts.map +1 -1
  35. package/dist/utils/errors.js +253 -22
  36. package/dist/utils/errors.js.map +1 -1
  37. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Reddit OAuth API Client
3
3
  * Fetches posts and comments sorted by score (most upvoted first)
4
+ * Implements robust error handling that NEVER crashes
4
5
  */
5
6
  export interface Post {
6
7
  title: string;
@@ -49,13 +50,20 @@ export declare class RedditClient {
49
50
  private tokenExpiry;
50
51
  private userAgent;
51
52
  constructor(clientId: string, clientSecret: string);
53
+ /**
54
+ * Authenticate with Reddit API with retry logic
55
+ * Returns null on failure instead of throwing
56
+ */
52
57
  private auth;
53
58
  private parseUrl;
59
+ /**
60
+ * Get a single Reddit post with comments
61
+ * Returns PostResult or throws Error (for use with Promise.allSettled)
62
+ */
54
63
  getPost(url: string, maxComments?: number): Promise<PostResult>;
55
64
  private formatBody;
56
65
  private extractComments;
57
66
  getPosts(urls: string[], maxComments?: number): Promise<Map<string, PostResult | Error>>;
58
67
  batchGetPosts(urls: string[], maxCommentsOverride?: number, fetchComments?: boolean, onBatchComplete?: (batchNum: number, totalBatches: number, processed: number) => void): Promise<BatchPostResult>;
59
- private delay;
60
68
  }
61
69
  //# sourceMappingURL=reddit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reddit.d.ts","sourceRoot":"","sources":["../../src/clients/reddit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAK/E;AAED,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ;IAAU,OAAO,CAAC,YAAY;IAJ1D,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAmE;gBAEhE,QAAQ,EAAE,MAAM,EAAU,YAAY,EAAE,MAAM;YAEpD,IAAI;IA0BlB,OAAO,CAAC,QAAQ;IAKV,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA8DlE,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,eAAe;IA4BjB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,SAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;IAUrF,aAAa,CACjB,IAAI,EAAE,MAAM,EAAE,EACd,mBAAmB,CAAC,EAAE,MAAM,EAC5B,aAAa,UAAO,EACpB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GACpF,OAAO,CAAC,eAAe,CAAC;IA0C3B,OAAO,CAAC,KAAK;CAGd"}
1
+ {"version":3,"file":"reddit.d.ts","sourceRoot":"","sources":["../../src/clients/reddit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,IAAI,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAK/E;AAED,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ;IAAU,OAAO,CAAC,YAAY;IAJ1D,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,SAAS,CAAmE;gBAEhE,QAAQ,EAAE,MAAM,EAAU,YAAY,EAAE,MAAM;IAElE;;;OAGG;YACW,IAAI;IAiElB,OAAO,CAAC,QAAQ;IAKhB;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,SAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2GlE,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,eAAe;IA4BjB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,SAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,CAAC;IAUrF,aAAa,CACjB,IAAI,EAAE,MAAM,EAAE,EACd,mBAAmB,CAAC,EAAE,MAAM,EAC5B,aAAa,UAAO,EACpB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GACpF,OAAO,CAAC,eAAe,CAAC;CAkD5B"}
@@ -1,8 +1,10 @@
1
1
  /**
2
2
  * Reddit OAuth API Client
3
3
  * Fetches posts and comments sorted by score (most upvoted first)
4
+ * Implements robust error handling that NEVER crashes
4
5
  */
5
6
  import { REDDIT } from '../config/index.js';
7
+ import { classifyError, fetchWithTimeout, sleep, } from '../utils/errors.js';
6
8
  export function calculateCommentAllocation(postCount) {
7
9
  const totalBudget = REDDIT.MAX_COMMENT_BUDGET;
8
10
  const perPostBase = Math.floor(totalBudget / postCount);
@@ -19,69 +21,137 @@ export class RedditClient {
19
21
  this.clientId = clientId;
20
22
  this.clientSecret = clientSecret;
21
23
  }
24
+ /**
25
+ * Authenticate with Reddit API with retry logic
26
+ * Returns null on failure instead of throwing
27
+ */
22
28
  async auth() {
23
- if (this.token && Date.now() < this.tokenExpiry - 60000)
29
+ // Return cached token if still valid
30
+ if (this.token && Date.now() < this.tokenExpiry - 60000) {
24
31
  return this.token;
32
+ }
25
33
  const credentials = Buffer.from(`${this.clientId}:${this.clientSecret}`).toString('base64');
26
- const res = await fetch('https://www.reddit.com/api/v1/access_token', {
27
- method: 'POST',
28
- headers: {
29
- 'Authorization': `Basic ${credentials}`,
30
- 'Content-Type': 'application/x-www-form-urlencoded',
31
- 'User-Agent': this.userAgent,
32
- },
33
- body: 'grant_type=client_credentials',
34
- });
35
- if (!res.ok) {
36
- const text = await res.text().catch(() => '');
37
- throw new Error(`Reddit auth failed: ${res.status} ${text}`);
34
+ for (let attempt = 0; attempt < 3; attempt++) {
35
+ try {
36
+ const res = await fetchWithTimeout('https://www.reddit.com/api/v1/access_token', {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Authorization': `Basic ${credentials}`,
40
+ 'Content-Type': 'application/x-www-form-urlencoded',
41
+ 'User-Agent': this.userAgent,
42
+ },
43
+ body: 'grant_type=client_credentials',
44
+ timeoutMs: 15000,
45
+ });
46
+ if (!res.ok) {
47
+ const text = await res.text().catch(() => '');
48
+ console.error(`[Reddit] Auth failed (${res.status}): ${text}`);
49
+ // 401/403 are not retryable
50
+ if (res.status === 401 || res.status === 403) {
51
+ return null;
52
+ }
53
+ // Retry on server errors
54
+ if (res.status >= 500 && attempt < 2) {
55
+ await sleep(REDDIT.RETRY_DELAYS[attempt] || 2000);
56
+ continue;
57
+ }
58
+ return null;
59
+ }
60
+ const data = await res.json();
61
+ if (!data.access_token) {
62
+ console.error('[Reddit] Auth response missing access_token');
63
+ return null;
64
+ }
65
+ this.token = data.access_token;
66
+ this.tokenExpiry = Date.now() + (data.expires_in || 3600) * 1000;
67
+ return this.token;
68
+ }
69
+ catch (error) {
70
+ const err = classifyError(error);
71
+ console.error(`[Reddit] Auth error (attempt ${attempt + 1}): ${err.message}`);
72
+ if (attempt < 2 && err.retryable) {
73
+ await sleep(REDDIT.RETRY_DELAYS[attempt] || 2000);
74
+ continue;
75
+ }
76
+ return null;
77
+ }
38
78
  }
39
- const data = await res.json();
40
- this.token = data.access_token;
41
- this.tokenExpiry = Date.now() + data.expires_in * 1000;
42
- return this.token;
79
+ return null;
43
80
  }
44
81
  parseUrl(url) {
45
82
  const m = url.match(/reddit\.com\/r\/([^\/]+)\/comments\/([a-z0-9]+)/i);
46
83
  return m ? { sub: m[1], id: m[2] } : null;
47
84
  }
85
+ /**
86
+ * Get a single Reddit post with comments
87
+ * Returns PostResult or throws Error (for use with Promise.allSettled)
88
+ */
48
89
  async getPost(url, maxComments = 100) {
49
90
  const parsed = this.parseUrl(url);
50
- if (!parsed)
51
- throw new Error(`Invalid Reddit URL: ${url}`);
91
+ if (!parsed) {
92
+ throw new Error(`Invalid Reddit URL format: ${url}`);
93
+ }
94
+ // Auth - returns null on failure
52
95
  const token = await this.auth();
96
+ if (!token) {
97
+ throw new Error('Reddit authentication failed - check credentials');
98
+ }
53
99
  const limit = Math.min(maxComments, 500);
54
100
  let lastError = null;
55
101
  for (let attempt = 0; attempt < REDDIT.RETRY_COUNT; attempt++) {
56
102
  try {
57
103
  const apiUrl = `https://oauth.reddit.com/r/${parsed.sub}/comments/${parsed.id}?sort=top&limit=${limit}&depth=10&raw_json=1`;
58
- const res = await fetch(apiUrl, {
104
+ const res = await fetchWithTimeout(apiUrl, {
59
105
  headers: {
60
106
  'Authorization': `Bearer ${token}`,
61
107
  'User-Agent': this.userAgent,
62
108
  },
109
+ timeoutMs: 30000,
63
110
  });
111
+ // Rate limited - always retry with backoff
64
112
  if (res.status === 429) {
65
113
  const delay = REDDIT.RETRY_DELAYS[attempt] || 32000;
66
114
  console.error(`[Reddit] Rate limited. Retry ${attempt + 1}/${REDDIT.RETRY_COUNT} after ${delay}ms`);
67
- await this.delay(delay);
115
+ await sleep(delay);
68
116
  continue;
69
117
  }
70
- if (!res.ok)
118
+ // 404 - Post doesn't exist
119
+ if (res.status === 404) {
120
+ throw new Error(`Post not found: ${url}`);
121
+ }
122
+ // Other errors
123
+ if (!res.ok) {
124
+ lastError = classifyError({ status: res.status });
125
+ if (lastError.retryable && attempt < REDDIT.RETRY_COUNT - 1) {
126
+ const delay = REDDIT.RETRY_DELAYS[attempt] || 2000;
127
+ console.error(`[Reddit] API error ${res.status}. Retry ${attempt + 1}/${REDDIT.RETRY_COUNT}`);
128
+ await sleep(delay);
129
+ continue;
130
+ }
71
131
  throw new Error(`Reddit API error: ${res.status}`);
72
- const [postListing, commentListing] = await res.json();
132
+ }
133
+ // Parse response safely
134
+ let data;
135
+ try {
136
+ data = await res.json();
137
+ }
138
+ catch (parseError) {
139
+ throw new Error('Failed to parse Reddit API response');
140
+ }
141
+ const [postListing, commentListing] = data;
73
142
  const p = postListing?.data?.children?.[0]?.data;
74
- if (!p)
75
- throw new Error(`Post not found: ${url}`);
143
+ if (!p) {
144
+ throw new Error(`Post data not found in response: ${url}`);
145
+ }
76
146
  const post = {
77
- title: p.title,
147
+ title: p.title || 'Untitled',
78
148
  author: p.author || '[deleted]',
79
- subreddit: p.subreddit,
149
+ subreddit: p.subreddit || parsed.sub,
80
150
  body: this.formatBody(p),
81
- score: p.score,
82
- commentCount: p.num_comments,
83
- url: `https://reddit.com${p.permalink}`,
84
- created: new Date(p.created_utc * 1000),
151
+ score: p.score || 0,
152
+ commentCount: p.num_comments || 0,
153
+ url: `https://reddit.com${p.permalink || ''}`,
154
+ created: new Date((p.created_utc || 0) * 1000),
85
155
  flair: p.link_flair_text || undefined,
86
156
  isNsfw: p.over_18 || false,
87
157
  isPinned: p.stickied || false,
@@ -90,15 +160,20 @@ export class RedditClient {
90
160
  return { post, comments, allocatedComments: maxComments, actualComments: post.commentCount };
91
161
  }
92
162
  catch (error) {
93
- lastError = error instanceof Error ? error : new Error(String(error));
163
+ lastError = classifyError(error);
164
+ // Don't retry non-retryable errors
165
+ if (!lastError.retryable) {
166
+ throw error instanceof Error ? error : new Error(lastError.message);
167
+ }
94
168
  if (attempt < REDDIT.RETRY_COUNT - 1) {
95
169
  const delay = REDDIT.RETRY_DELAYS[attempt] || 2000;
96
- console.error(`[Reddit] Error: ${lastError.message}. Retry ${attempt + 1}/${REDDIT.RETRY_COUNT}`);
97
- await this.delay(delay);
170
+ console.error(`[Reddit] ${lastError.code}: ${lastError.message}. Retry ${attempt + 1}/${REDDIT.RETRY_COUNT}`);
171
+ await sleep(delay);
98
172
  }
99
173
  }
100
174
  }
101
- throw lastError || new Error('Failed to fetch Reddit post');
175
+ // All retries exhausted
176
+ throw new Error(lastError?.message || 'Failed to fetch Reddit post after retries');
102
177
  }
103
178
  formatBody(p) {
104
179
  if (p.selftext?.trim())
@@ -165,15 +240,20 @@ export class RedditClient {
165
240
  allResults.set(url, new Error(errorMsg));
166
241
  }
167
242
  }
168
- onBatchComplete?.(batchNum + 1, totalBatches, allResults.size);
243
+ // Safe callback invocation
244
+ try {
245
+ onBatchComplete?.(batchNum + 1, totalBatches, allResults.size);
246
+ }
247
+ catch (callbackError) {
248
+ console.error(`[Reddit] onBatchComplete callback error:`, callbackError);
249
+ }
169
250
  console.error(`[Reddit] Batch ${batchNum + 1} complete (${allResults.size}/${urls.length})`);
170
- if (batchNum < totalBatches - 1)
171
- await this.delay(500);
251
+ // Small delay between batches
252
+ if (batchNum < totalBatches - 1) {
253
+ await sleep(500);
254
+ }
172
255
  }
173
256
  return { results: allResults, batchesProcessed: totalBatches, totalPosts: urls.length, rateLimitHits, commentAllocation: allocation };
174
257
  }
175
- delay(ms) {
176
- return new Promise(resolve => setTimeout(resolve, ms));
177
- }
178
258
  }
179
259
  //# sourceMappingURL=reddit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/clients/reddit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/clients/reddit.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Deep Research Client
3
3
  * Handles research API requests with web search capabilities
4
+ * Implements robust retry logic and NEVER crashes the server
4
5
  */
6
+ import { type StructuredError } from '../utils/errors.js';
5
7
  export interface ResearchParams {
6
8
  question: string;
7
9
  systemPrompt?: string;
@@ -32,10 +34,24 @@ export interface ResearchResponse {
32
34
  startIndex: number;
33
35
  endIndex: number;
34
36
  }>;
37
+ error?: StructuredError;
35
38
  }
36
39
  export declare class ResearchClient {
37
40
  private client;
38
41
  constructor();
42
+ /**
43
+ * Check if an error is retryable for research requests
44
+ */
45
+ private isRetryableError;
46
+ /**
47
+ * Calculate backoff for research retries
48
+ */
49
+ private calculateBackoff;
50
+ /**
51
+ * Perform research with retry logic
52
+ * Returns a ResearchResponse - may contain error field on failure
53
+ * NEVER throws - always returns a valid response object
54
+ */
39
55
  research(params: ResearchParams): Promise<ResearchResponse>;
40
56
  }
41
57
  //# sourceMappingURL=research.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/clients/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,cAAc,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;;IAcjB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAqElE"}
1
+ {"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/clients/research.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,cAAc,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAaD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;;IAevB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;IACG,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAyIlE"}
@@ -1,9 +1,20 @@
1
1
  /**
2
2
  * Deep Research Client
3
3
  * Handles research API requests with web search capabilities
4
+ * Implements robust retry logic and NEVER crashes the server
4
5
  */
5
6
  import OpenAI from 'openai';
6
7
  import { RESEARCH } from '../config/index.js';
8
+ import { classifyError, sleep, ErrorCode, } from '../utils/errors.js';
9
+ // Research-specific retry configuration
10
+ // Research requests can be long-running, so we use longer delays
11
+ const RESEARCH_RETRY_CONFIG = {
12
+ maxRetries: 2, // Fewer retries since requests are expensive
13
+ baseDelayMs: 5000, // Longer base delay
14
+ maxDelayMs: 60000,
15
+ };
16
+ // Retryable status codes for research API
17
+ const RETRYABLE_RESEARCH_CODES = new Set([429, 500, 502, 503, 504]);
7
18
  export class ResearchClient {
8
19
  client;
9
20
  constructor() {
@@ -14,10 +25,60 @@ export class ResearchClient {
14
25
  baseURL: RESEARCH.BASE_URL,
15
26
  apiKey: RESEARCH.API_KEY,
16
27
  timeout: RESEARCH.TIMEOUT_MS,
28
+ maxRetries: 0, // We handle retries ourselves
17
29
  });
18
30
  }
31
+ /**
32
+ * Check if an error is retryable for research requests
33
+ */
34
+ isRetryableError(error) {
35
+ if (!error)
36
+ return false;
37
+ const err = error;
38
+ // Check HTTP status codes
39
+ if (err.status && RETRYABLE_RESEARCH_CODES.has(err.status)) {
40
+ return true;
41
+ }
42
+ // Check message patterns
43
+ const message = (err.message || '').toLowerCase();
44
+ if (message.includes('rate limit') ||
45
+ message.includes('timeout') ||
46
+ message.includes('timed out') ||
47
+ message.includes('service unavailable') ||
48
+ message.includes('connection')) {
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ /**
54
+ * Calculate backoff for research retries
55
+ */
56
+ calculateBackoff(attempt) {
57
+ const exponentialDelay = RESEARCH_RETRY_CONFIG.baseDelayMs * Math.pow(2, attempt);
58
+ const jitter = Math.random() * 0.3 * exponentialDelay;
59
+ return Math.min(exponentialDelay + jitter, RESEARCH_RETRY_CONFIG.maxDelayMs);
60
+ }
61
+ /**
62
+ * Perform research with retry logic
63
+ * Returns a ResearchResponse - may contain error field on failure
64
+ * NEVER throws - always returns a valid response object
65
+ */
19
66
  async research(params) {
20
67
  const { question, systemPrompt, reasoningEffort = RESEARCH.REASONING_EFFORT, maxSearchResults = RESEARCH.MAX_URLS, maxTokens = 32000, temperature = 0.3, responseFormat, } = params;
68
+ // Validate input
69
+ if (!question?.trim()) {
70
+ return {
71
+ id: '',
72
+ model: RESEARCH.MODEL,
73
+ created: Date.now(),
74
+ content: '',
75
+ error: {
76
+ code: ErrorCode.INVALID_INPUT,
77
+ message: 'Research question cannot be empty',
78
+ retryable: false,
79
+ },
80
+ };
81
+ }
21
82
  const messages = [];
22
83
  if (systemPrompt) {
23
84
  messages.push({ role: 'system', content: systemPrompt });
@@ -39,39 +100,82 @@ export class ResearchClient {
39
100
  if (responseFormat) {
40
101
  requestPayload.response_format = responseFormat;
41
102
  }
42
- try {
43
- const response = await this.client.chat.completions.create(requestPayload);
44
- const choice = response.choices?.[0];
45
- const message = choice?.message;
46
- return {
47
- id: response.id,
48
- model: response.model,
49
- created: response.created,
50
- content: message?.content || '',
51
- finishReason: choice?.finish_reason,
52
- usage: response.usage ? {
53
- promptTokens: response.usage.prompt_tokens,
54
- completionTokens: response.usage.completion_tokens,
55
- totalTokens: response.usage.total_tokens,
56
- sourcesUsed: response.usage.num_sources_used,
57
- } : undefined,
58
- annotations: message?.annotations?.map((a) => ({
59
- type: 'url_citation',
60
- url: a.url_citation?.url,
61
- title: a.url_citation?.title,
62
- startIndex: a.url_citation?.start_index,
63
- endIndex: a.url_citation?.end_index,
64
- })),
65
- };
66
- }
67
- catch (error) {
68
- const err = error;
69
- console.error('[ERROR] Research request failed:', err.message);
70
- if (err.response) {
71
- console.error('[ERROR] Response:', JSON.stringify(err.response.data, null, 2));
103
+ let lastError;
104
+ // Retry loop
105
+ for (let attempt = 0; attempt <= RESEARCH_RETRY_CONFIG.maxRetries; attempt++) {
106
+ try {
107
+ if (attempt > 0) {
108
+ console.error(`[Research] Retry attempt ${attempt}/${RESEARCH_RETRY_CONFIG.maxRetries}`);
109
+ }
110
+ const response = await this.client.chat.completions.create(requestPayload);
111
+ const choice = response.choices?.[0];
112
+ const message = choice?.message;
113
+ // Validate response
114
+ if (!message?.content && !choice) {
115
+ lastError = {
116
+ code: ErrorCode.INTERNAL_ERROR,
117
+ message: 'Research API returned empty response',
118
+ retryable: true, // Might be a transient issue
119
+ };
120
+ if (attempt < RESEARCH_RETRY_CONFIG.maxRetries) {
121
+ const delayMs = this.calculateBackoff(attempt);
122
+ console.error(`[Research] Empty response, retrying in ${delayMs}ms...`);
123
+ await sleep(delayMs);
124
+ continue;
125
+ }
126
+ }
127
+ return {
128
+ id: response.id || '',
129
+ model: response.model || RESEARCH.MODEL,
130
+ created: response.created || Date.now(),
131
+ content: message?.content || '',
132
+ finishReason: choice?.finish_reason,
133
+ usage: response.usage ? {
134
+ promptTokens: response.usage.prompt_tokens,
135
+ completionTokens: response.usage.completion_tokens,
136
+ totalTokens: response.usage.total_tokens,
137
+ sourcesUsed: response.usage.num_sources_used,
138
+ } : undefined,
139
+ annotations: message?.annotations?.map((a) => ({
140
+ type: 'url_citation',
141
+ url: a.url_citation?.url || '',
142
+ title: a.url_citation?.title || '',
143
+ startIndex: a.url_citation?.start_index || 0,
144
+ endIndex: a.url_citation?.end_index || 0,
145
+ })),
146
+ };
147
+ }
148
+ catch (error) {
149
+ lastError = classifyError(error);
150
+ const err = error;
151
+ console.error(`[Research] Error (attempt ${attempt + 1}): ${lastError.message}`, {
152
+ status: err.status,
153
+ });
154
+ // Check if we should retry
155
+ if (this.isRetryableError(error) && attempt < RESEARCH_RETRY_CONFIG.maxRetries) {
156
+ const delayMs = this.calculateBackoff(attempt);
157
+ console.error(`[Research] Retrying in ${delayMs}ms...`);
158
+ await sleep(delayMs);
159
+ continue;
160
+ }
161
+ // Non-retryable or max retries reached
162
+ break;
72
163
  }
73
- throw error;
74
164
  }
165
+ // All attempts failed - return error response
166
+ const errorMessage = lastError?.message || 'Unknown research error';
167
+ console.error(`[Research] All attempts failed: ${errorMessage}`);
168
+ return {
169
+ id: '',
170
+ model: RESEARCH.MODEL,
171
+ created: Date.now(),
172
+ content: `Research failed: ${errorMessage}`,
173
+ error: lastError || {
174
+ code: ErrorCode.UNKNOWN_ERROR,
175
+ message: errorMessage,
176
+ retryable: false,
177
+ },
178
+ };
75
179
  }
76
180
  }
77
181
  //# sourceMappingURL=research.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/clients/research.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiC9C,MAAM,OAAO,cAAc;IACjB,MAAM,CAAS;IAEvB;QACE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,OAAO,EAAE,QAAQ,CAAC,QAAQ;YAC1B,MAAM,EAAE,QAAQ,CAAC,OAAO;YACxB,OAAO,EAAE,QAAQ,CAAC,UAAU;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,MAAM,EACJ,QAAQ,EACR,YAAY,EACZ,eAAe,GAAG,QAAQ,CAAC,gBAAgB,EAC3C,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,EACpC,SAAS,GAAG,KAAK,EACjB,WAAW,GAAG,GAAG,EACjB,cAAc,GACf,GAAG,MAAM,CAAC;QAEX,MAAM,QAAQ,GAAwD,EAAE,CAAC;QACzE,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnD,MAAM,cAAc,GAA4B;YAC9C,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,QAAQ;YACR,WAAW;YACX,gBAAgB,EAAE,eAAe;YACjC,qBAAqB,EAAE,SAAS;YAChC,iBAAiB,EAAE;gBACjB,IAAI,EAAE,IAAI;gBACV,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAClD,gBAAgB,EAAE,IAAI;gBACtB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;aAC3B;SACF,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,eAAe,GAAG,cAAc,CAAC;QAClD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAqB,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAc,CAAC;YAEvC,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC/B,YAAY,EAAE,MAAM,EAAE,aAAa;gBACnC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBACtB,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;oBAC1C,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,iBAAiB;oBAClD,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;oBACxC,WAAW,EAAG,QAAQ,CAAC,KAAa,CAAC,gBAAgB;iBACtD,CAAC,CAAC,CAAC,SAAS;gBACb,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;oBAClD,IAAI,EAAE,cAAuB;oBAC7B,GAAG,EAAE,CAAC,CAAC,YAAY,EAAE,GAAG;oBACxB,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK;oBAC5B,UAAU,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW;oBACvC,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,SAAS;iBACpC,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,KAA6E,CAAC;YAC1F,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/clients/research.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Web Scraper Client
3
3
  * Generic interface for URL scraping with automatic fallback modes
4
+ * Implements robust error handling that NEVER crashes
4
5
  */
6
+ import { type StructuredError } from '../utils/errors.js';
5
7
  export interface ScrapeRequest {
6
8
  url: string;
7
9
  mode?: 'basic' | 'javascript';
@@ -13,6 +15,7 @@ export interface ScrapeResponse {
13
15
  statusCode: number;
14
16
  credits: number;
15
17
  headers?: Record<string, string>;
18
+ error?: StructuredError;
16
19
  }
17
20
  export interface BatchScrapeResult {
18
21
  results: Array<ScrapeResponse & {
@@ -26,19 +29,42 @@ export declare class ScraperClient {
26
29
  private apiKey;
27
30
  private baseURL;
28
31
  constructor(apiKey?: string);
32
+ /**
33
+ * Scrape a single URL with retry logic
34
+ * NEVER throws - always returns a ScrapeResponse (possibly with error)
35
+ */
29
36
  scrape(request: ScrapeRequest, maxRetries?: 3): Promise<ScrapeResponse>;
37
+ /**
38
+ * Calculate exponential backoff with jitter
39
+ */
40
+ private calculateBackoff;
41
+ /**
42
+ * Scrape with automatic fallback through different modes
43
+ * NEVER throws - always returns a ScrapeResponse
44
+ */
30
45
  scrapeWithFallback(url: string, options?: {
31
46
  timeout?: number;
32
47
  }): Promise<ScrapeResponse>;
48
+ /**
49
+ * Scrape multiple URLs with batching
50
+ * NEVER throws - always returns results array
51
+ */
33
52
  scrapeMultiple(urls: string[], options?: {
34
53
  timeout?: number;
35
54
  }): Promise<Array<ScrapeResponse & {
36
55
  url: string;
37
56
  }>>;
57
+ /**
58
+ * Batch scrape with progress callback
59
+ * NEVER throws - uses Promise.allSettled internally
60
+ */
38
61
  batchScrape(urls: string[], options?: {
39
62
  timeout?: number;
40
63
  }, onBatchComplete?: (batchNum: number, totalBatches: number, processed: number) => void): Promise<BatchScrapeResult>;
64
+ /**
65
+ * Process a single batch of URLs
66
+ * NEVER throws
67
+ */
41
68
  private processBatch;
42
- private delay;
43
69
  }
44
70
  //# sourceMappingURL=scraper.d.ts.map