webpeel 0.8.1 → 0.9.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 (99) hide show
  1. package/README.md +39 -5
  2. package/dist/cli.js +1299 -85
  3. package/dist/cli.js.map +1 -1
  4. package/dist/core/application-tracker.d.ts +85 -0
  5. package/dist/core/application-tracker.d.ts.map +1 -0
  6. package/dist/core/application-tracker.js +184 -0
  7. package/dist/core/application-tracker.js.map +1 -0
  8. package/dist/core/apply.d.ts +163 -0
  9. package/dist/core/apply.d.ts.map +1 -0
  10. package/dist/core/apply.js +817 -0
  11. package/dist/core/apply.js.map +1 -0
  12. package/dist/core/branding.d.ts +1 -1
  13. package/dist/core/branding.d.ts.map +1 -1
  14. package/dist/core/budget.d.ts +43 -0
  15. package/dist/core/budget.d.ts.map +1 -0
  16. package/dist/core/budget.js +325 -0
  17. package/dist/core/budget.js.map +1 -0
  18. package/dist/core/challenge-detection.d.ts +27 -0
  19. package/dist/core/challenge-detection.d.ts.map +1 -0
  20. package/dist/core/challenge-detection.js +436 -0
  21. package/dist/core/challenge-detection.js.map +1 -0
  22. package/dist/core/change-tracking.d.ts.map +1 -1
  23. package/dist/core/change-tracking.js +10 -1
  24. package/dist/core/change-tracking.js.map +1 -1
  25. package/dist/core/crawler.d.ts.map +1 -1
  26. package/dist/core/crawler.js +17 -4
  27. package/dist/core/crawler.js.map +1 -1
  28. package/dist/core/diff.d.ts +62 -0
  29. package/dist/core/diff.d.ts.map +1 -0
  30. package/dist/core/diff.js +289 -0
  31. package/dist/core/diff.js.map +1 -0
  32. package/dist/core/extract-listings.d.ts +39 -0
  33. package/dist/core/extract-listings.d.ts.map +1 -0
  34. package/dist/core/extract-listings.js +331 -0
  35. package/dist/core/extract-listings.js.map +1 -0
  36. package/dist/core/extract.d.ts.map +1 -1
  37. package/dist/core/extract.js +15 -2
  38. package/dist/core/extract.js.map +1 -1
  39. package/dist/core/fetcher.d.ts +29 -3
  40. package/dist/core/fetcher.d.ts.map +1 -1
  41. package/dist/core/fetcher.js +158 -20
  42. package/dist/core/fetcher.js.map +1 -1
  43. package/dist/core/human.d.ts +176 -0
  44. package/dist/core/human.d.ts.map +1 -0
  45. package/dist/core/human.js +681 -0
  46. package/dist/core/human.js.map +1 -0
  47. package/dist/core/jobs.d.ts +12 -2
  48. package/dist/core/jobs.d.ts.map +1 -1
  49. package/dist/core/jobs.js +124 -2
  50. package/dist/core/jobs.js.map +1 -1
  51. package/dist/core/map.d.ts.map +1 -1
  52. package/dist/core/map.js +14 -2
  53. package/dist/core/map.js.map +1 -1
  54. package/dist/core/paginate.d.ts +32 -0
  55. package/dist/core/paginate.d.ts.map +1 -0
  56. package/dist/core/paginate.js +107 -0
  57. package/dist/core/paginate.js.map +1 -0
  58. package/dist/core/rate-governor.d.ts +81 -0
  59. package/dist/core/rate-governor.d.ts.map +1 -0
  60. package/dist/core/rate-governor.js +238 -0
  61. package/dist/core/rate-governor.js.map +1 -0
  62. package/dist/core/search-provider.d.ts +5 -0
  63. package/dist/core/search-provider.d.ts.map +1 -1
  64. package/dist/core/search-provider.js +81 -2
  65. package/dist/core/search-provider.js.map +1 -1
  66. package/dist/core/site-search.d.ts +45 -0
  67. package/dist/core/site-search.d.ts.map +1 -0
  68. package/dist/core/site-search.js +253 -0
  69. package/dist/core/site-search.js.map +1 -0
  70. package/dist/core/strategies.d.ts +8 -0
  71. package/dist/core/strategies.d.ts.map +1 -1
  72. package/dist/core/strategies.js +185 -45
  73. package/dist/core/strategies.js.map +1 -1
  74. package/dist/core/strategy-hooks.d.ts +6 -0
  75. package/dist/core/strategy-hooks.d.ts.map +1 -1
  76. package/dist/core/strategy-hooks.js.map +1 -1
  77. package/dist/core/table-format.d.ts +31 -0
  78. package/dist/core/table-format.d.ts.map +1 -0
  79. package/dist/core/table-format.js +147 -0
  80. package/dist/core/table-format.js.map +1 -0
  81. package/dist/core/user-agents.d.ts +58 -0
  82. package/dist/core/user-agents.d.ts.map +1 -0
  83. package/dist/core/user-agents.js +159 -0
  84. package/dist/core/user-agents.js.map +1 -0
  85. package/dist/core/watch.d.ts +100 -0
  86. package/dist/core/watch.d.ts.map +1 -0
  87. package/dist/core/watch.js +368 -0
  88. package/dist/core/watch.js.map +1 -0
  89. package/dist/index.d.ts +13 -2
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +41 -4
  92. package/dist/index.js.map +1 -1
  93. package/dist/mcp/server.js +3 -0
  94. package/dist/mcp/server.js.map +1 -1
  95. package/dist/types.d.ts +73 -0
  96. package/dist/types.d.ts.map +1 -1
  97. package/dist/types.js.map +1 -1
  98. package/llms.txt +1 -1
  99. package/package.json +3 -3
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Auto-extract repeated listing patterns from HTML pages.
3
+ *
4
+ * Given raw HTML (e.g. an eBay search results page), this module detects the
5
+ * largest group of sibling elements with a consistent internal structure and
6
+ * extracts structured fields (title, price, image, link, description, rating)
7
+ * from each item.
8
+ *
9
+ * @module extract-listings
10
+ */
11
+ import { load } from 'cheerio';
12
+ /* ------------------------------------------------------------------ */
13
+ /* Internal helpers */
14
+ /* ------------------------------------------------------------------ */
15
+ /** Tags we consider as potential listing containers. */
16
+ const CONTAINER_CHILD_TAGS = new Set(['li', 'div', 'article', 'section', 'tr', 'a']);
17
+ /** Return a normalised "child-tag signature" for a DOM element.
18
+ * Includes tag names **and their counts** so that elements with the same
19
+ * child-tag *names* but different *counts* (e.g. 3 `<td>` vs 2 `<td>`)
20
+ * produce distinct signatures. This is essential for table-based layouts
21
+ * like Hacker News where story rows (3 td) must be distinguished from
22
+ * subtext rows (2 td).
23
+ */
24
+ function childSignature($, el) {
25
+ const children = $(el).children();
26
+ if (children.length === 0)
27
+ return '';
28
+ const tagCounts = new Map();
29
+ children.each((_, child) => {
30
+ const tagName = child.tagName?.toLowerCase();
31
+ if (tagName)
32
+ tagCounts.set(tagName, (tagCounts.get(tagName) || 0) + 1);
33
+ });
34
+ return [...tagCounts.entries()]
35
+ .sort(([a], [b]) => a.localeCompare(b))
36
+ .map(([tag, count]) => `${tag}:${count}`)
37
+ .join(',');
38
+ }
39
+ /**
40
+ * Check whether two child-tag signatures are "similar enough" to be considered
41
+ * the same listing type.
42
+ *
43
+ * Compares full `tag:count` pairs so that elements with the same child tags
44
+ * but different counts are kept separate (critical for table-based layouts
45
+ * like Hacker News where story rows have 3 `<td>` and subtext rows have 2).
46
+ *
47
+ * Similarity is measured by Jaccard index on `tag:count` pairs, with a
48
+ * threshold of 0.5 or one being a subset of the other.
49
+ */
50
+ function signaturesAreSimilar(a, b) {
51
+ if (a === b)
52
+ return true;
53
+ if (!a || !b)
54
+ return false;
55
+ // Compare full "tag:count" pairs (e.g. "td:3" ≠ "td:2")
56
+ const pairsA = new Set(a.split(','));
57
+ const pairsB = new Set(b.split(','));
58
+ const intersection = [...pairsA].filter(p => pairsB.has(p)).length;
59
+ const union = new Set([...pairsA, ...pairsB]).size;
60
+ return intersection === pairsA.size || intersection === pairsB.size || (intersection / union) >= 0.5;
61
+ }
62
+ /**
63
+ * Walk the DOM and find the best "listing container" — the element whose
64
+ * direct children form the largest group of structurally-similar items.
65
+ */
66
+ function findListingContainer($) {
67
+ const candidates = [];
68
+ $('*').each((_, el) => {
69
+ const $el = $(el);
70
+ const children = $el.children();
71
+ if (children.length < 3)
72
+ return; // need at least 3 repeating items
73
+ // Group children by tag name
74
+ const byTag = new Map();
75
+ children.each((_, child) => {
76
+ const tag = child.tagName?.toLowerCase();
77
+ if (tag && CONTAINER_CHILD_TAGS.has(tag)) {
78
+ let arr = byTag.get(tag);
79
+ if (!arr) {
80
+ arr = [];
81
+ byTag.set(tag, arr);
82
+ }
83
+ arr.push(child);
84
+ }
85
+ });
86
+ for (const [tag, tagChildren] of byTag) {
87
+ if (tagChildren.length < 3)
88
+ continue;
89
+ // Compute child-structure signatures
90
+ const childSigs = [];
91
+ for (const child of tagChildren) {
92
+ const sig = childSignature($, child);
93
+ childSigs.push({ child, sig });
94
+ }
95
+ // Separate children with content vs empty
96
+ const withSig = childSigs.filter(c => c.sig.length > 0);
97
+ const withoutSig = childSigs.filter(c => c.sig.length === 0);
98
+ if (withSig.length === 0) {
99
+ // All children are text-only or empty — still consider if there are enough
100
+ const withContent = tagChildren.filter(c => $(c).text().trim().length > 3);
101
+ if (withContent.length >= 3) {
102
+ const score = withContent.length;
103
+ candidates.push({ parent: el, tag, children: withContent, score });
104
+ }
105
+ continue;
106
+ }
107
+ // Find the dominant signature (most common structure among children)
108
+ const sigCounts = new Map();
109
+ for (const { sig } of withSig) {
110
+ sigCounts.set(sig, (sigCounts.get(sig) || 0) + 1);
111
+ }
112
+ let dominantSig = '';
113
+ let dominantCount = 0;
114
+ for (const [sig, count] of sigCounts) {
115
+ if (count > dominantCount) {
116
+ dominantSig = sig;
117
+ dominantCount = count;
118
+ }
119
+ }
120
+ // Use *similarity* matching: include children whose signature is
121
+ // "similar enough" to the dominant one (handles optional sub-elements).
122
+ const matching = withSig
123
+ .filter(c => signaturesAreSimilar(c.sig, dominantSig))
124
+ .map(c => c.child);
125
+ // Also include text-only children that have meaningful content
126
+ for (const { child } of withoutSig) {
127
+ if ($(child).text().trim().length > 3) {
128
+ matching.push(child);
129
+ }
130
+ }
131
+ if (matching.length < 3)
132
+ continue;
133
+ const consistency = matching.length / tagChildren.length;
134
+ const score = matching.length * consistency;
135
+ candidates.push({ parent: el, tag, children: matching, score });
136
+ }
137
+ });
138
+ if (candidates.length === 0)
139
+ return null;
140
+ // Sort by initial structural score descending.
141
+ candidates.sort((a, b) => b.score - a.score || b.children.length - a.children.length);
142
+ // Take top candidates and re-rank by content quality.
143
+ // This ensures containers with actual titles/prices beat those with
144
+ // usernames or boilerplate (e.g. HN subtext rows vs title rows).
145
+ const topN = candidates.slice(0, Math.min(candidates.length, 8));
146
+ let best = null;
147
+ let bestContentScore = -1;
148
+ for (const cand of topN) {
149
+ let titleLenSum = 0;
150
+ let titlesFound = 0;
151
+ let linksFound = 0;
152
+ const sample = cand.children.slice(0, 5);
153
+ for (const child of sample) {
154
+ const item = extractItem($, child);
155
+ if (item.title && item.title.length >= 3) {
156
+ titleLenSum += item.title.length;
157
+ titlesFound++;
158
+ }
159
+ if (item.link)
160
+ linksFound++;
161
+ }
162
+ // Content score: average title length × title hit rate × structural score
163
+ const avgTitleLen = titlesFound > 0 ? titleLenSum / titlesFound : 0;
164
+ const titleRate = titlesFound / sample.length;
165
+ const contentScore = avgTitleLen * titleRate * cand.score;
166
+ if (contentScore > bestContentScore) {
167
+ bestContentScore = contentScore;
168
+ best = cand;
169
+ }
170
+ }
171
+ return best;
172
+ }
173
+ /** Price-matching regex — $12.34, £99, €5,00, etc. */
174
+ const PRICE_RE = /(?:[\$£€¥₹])\s*[\d,]+(?:\.\d{1,2})?|[\d,]+(?:\.\d{1,2})?\s*(?:USD|EUR|GBP|JPY|INR)/i;
175
+ /**
176
+ * Resolve a potentially relative URL against a base URL.
177
+ * Returns the original string if resolution fails.
178
+ */
179
+ function resolveUrl(href, baseUrl) {
180
+ if (!href)
181
+ return undefined;
182
+ if (href.startsWith('data:') || href.startsWith('javascript:'))
183
+ return undefined;
184
+ if (!baseUrl)
185
+ return href;
186
+ try {
187
+ return new URL(href, baseUrl).href;
188
+ }
189
+ catch {
190
+ return href;
191
+ }
192
+ }
193
+ /**
194
+ * Extract a single ListingItem from a DOM element.
195
+ */
196
+ function extractItem($, el, baseUrl) {
197
+ const $el = $(el);
198
+ const item = {};
199
+ // --- Title ---
200
+ // Priority: heading > [class*="title"]/[class*="name"] text or inner link text > first <a> text
201
+ const heading = $el.find('h1, h2, h3, h4, h5, h6').first();
202
+ if (heading.length && heading.text().trim().length >= 3) {
203
+ item.title = heading.text().trim();
204
+ }
205
+ else {
206
+ // Iterate ALL title/name class matches (not just .first()) — some sites
207
+ // have multiple elements with "title" in their class (e.g. HN has a rank
208
+ // cell and a title cell both with class="title").
209
+ const titleCandidates = $el.find('[class*="title"], [class*="name"], [class*="Title"], [class*="Name"]');
210
+ titleCandidates.each((_, tc) => {
211
+ if (item.title)
212
+ return; // already found
213
+ const $tc = $(tc);
214
+ const innerLink = $tc.find('a').first();
215
+ const candidateText = (innerLink.length ? innerLink.text() : $tc.text()).trim();
216
+ if (candidateText.length >= 3) {
217
+ item.title = candidateText;
218
+ }
219
+ });
220
+ if (!item.title) {
221
+ // Fall back to first <a> with meaningful text
222
+ $el.find('a').each((_, a) => {
223
+ if (item.title)
224
+ return;
225
+ const text = $(a).text().trim();
226
+ if (text.length >= 3) {
227
+ item.title = text;
228
+ }
229
+ });
230
+ }
231
+ }
232
+ // --- Price ---
233
+ const priceEl = $el.find('[class*="price"], [class*="Price"], [data-price]').first();
234
+ if (priceEl.length) {
235
+ const priceText = priceEl.text().trim();
236
+ const match = priceText.match(PRICE_RE);
237
+ item.price = match ? match[0] : priceText;
238
+ }
239
+ else {
240
+ // Scan entire element text for a price pattern
241
+ const fullText = $el.text();
242
+ const match = fullText.match(PRICE_RE);
243
+ if (match) {
244
+ item.price = match[0];
245
+ }
246
+ }
247
+ // --- Image ---
248
+ const img = $el.find('img').first();
249
+ if (img.length) {
250
+ const src = img.attr('src') || img.attr('data-src') || img.attr('data-lazy-src');
251
+ item.image = resolveUrl(src, baseUrl);
252
+ }
253
+ // --- Link ---
254
+ // Prefer the link associated with the title (inside a title-class element
255
+ // or heading), falling back to the first <a> in the listing.
256
+ const titleContainer = $el.find('[class*="title"], [class*="Title"], h1, h2, h3, h4, h5, h6').first();
257
+ const titleLink = titleContainer.length ? titleContainer.find('a[href]').first() : null;
258
+ const primaryLink = (titleLink && titleLink.length) ? titleLink : $el.find('a[href]').first();
259
+ if (primaryLink && primaryLink.length) {
260
+ item.link = resolveUrl(primaryLink.attr('href'), baseUrl);
261
+ }
262
+ // If the element itself is an <a>, use its href
263
+ if (!item.link && $el.prop('tagName')?.toLowerCase() === 'a') {
264
+ item.link = resolveUrl($el.attr('href'), baseUrl);
265
+ }
266
+ // --- Rating ---
267
+ const ratingEl = $el.find('[class*="rating"], [class*="Rating"], [class*="star"], [class*="Star"], [aria-label*="star"], [aria-label*="rating"]').first();
268
+ if (ratingEl.length) {
269
+ const ariaLabel = ratingEl.attr('aria-label');
270
+ item.rating = ariaLabel || ratingEl.text().trim() || undefined;
271
+ }
272
+ // --- Description ---
273
+ // Gather remaining text that isn't the title or price
274
+ const usedTexts = new Set();
275
+ if (item.title)
276
+ usedTexts.add(item.title);
277
+ if (item.price)
278
+ usedTexts.add(item.price);
279
+ if (item.rating)
280
+ usedTexts.add(item.rating);
281
+ const descParts = [];
282
+ $el.find('p, span, [class*="desc"], [class*="Desc"], [class*="subtitle"], [class*="snippet"]').each((_, descEl) => {
283
+ const text = $(descEl).text().trim();
284
+ if (text.length > 5 && !usedTexts.has(text) && text !== item.title) {
285
+ descParts.push(text);
286
+ usedTexts.add(text);
287
+ }
288
+ });
289
+ if (descParts.length > 0) {
290
+ item.description = descParts.slice(0, 2).join(' ');
291
+ }
292
+ return item;
293
+ }
294
+ /* ------------------------------------------------------------------ */
295
+ /* Public API */
296
+ /* ------------------------------------------------------------------ */
297
+ /**
298
+ * Automatically detect repeated listing patterns in raw HTML and extract
299
+ * structured items.
300
+ *
301
+ * @param html - Raw HTML string to parse.
302
+ * @param url - Optional base URL for resolving relative links and images.
303
+ * @returns Array of extracted listing items (may be empty).
304
+ *
305
+ * @example
306
+ * ```typescript
307
+ * import { extractListings } from 'webpeel';
308
+ *
309
+ * const items = extractListings(ebayHtml, 'https://ebay.com/sch?q=card');
310
+ * console.log(items[0].title); // "Charizard VMAX 020/189"
311
+ * console.log(items[0].price); // "$24.99"
312
+ * ```
313
+ */
314
+ export function extractListings(html, url) {
315
+ if (!html || html.trim().length === 0)
316
+ return [];
317
+ const $ = load(html);
318
+ const container = findListingContainer($);
319
+ if (!container)
320
+ return [];
321
+ const items = [];
322
+ for (const child of container.children) {
323
+ const item = extractItem($, child, url);
324
+ // Filter out empty / too-short titles
325
+ if (!item.title || item.title.length < 3)
326
+ continue;
327
+ items.push(item);
328
+ }
329
+ return items;
330
+ }
331
+ //# sourceMappingURL=extract-listings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-listings.js","sourceRoot":"","sources":["../../src/core/extract-listings.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAoD9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAuE5F"}
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAoD9B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAmF5F"}
@@ -57,11 +57,24 @@ export function extractStructured(html, options) {
57
57
  const result = {};
58
58
  if (options.selectors) {
59
59
  // Direct CSS selector extraction
60
- for (const [field, selector] of Object.entries(options.selectors)) {
61
- const elements = $(selector);
60
+ for (const [field, selectorRaw] of Object.entries(options.selectors)) {
61
+ // Support @attr syntax: "a@href" extracts the href attribute from <a> elements
62
+ const attrMatch = selectorRaw.match(/^(.+?)@([a-zA-Z-]+)$/);
63
+ const cssSelector = attrMatch ? attrMatch[1] : selectorRaw;
64
+ const attrName = attrMatch ? attrMatch[2] : null;
65
+ const elements = $(cssSelector);
62
66
  if (elements.length === 0) {
63
67
  result[field] = null;
64
68
  }
69
+ else if (attrName) {
70
+ // Extract attribute value(s)
71
+ if (elements.length === 1) {
72
+ result[field] = elements.first().attr(attrName) ?? null;
73
+ }
74
+ else {
75
+ result[field] = elements.map((_, el) => $(el).attr(attrName) ?? null).get();
76
+ }
77
+ }
65
78
  else if (elements.length === 1) {
66
79
  result[field] = elements.first().text().trim();
67
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/core/extract.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Core fetching logic: simple HTTP and browser-based fetching
3
3
  */
4
+ import { type Page } from 'playwright';
4
5
  import type { PageAction } from '../types.js';
5
6
  export interface FetchResult {
6
7
  /** Text content (HTML/JSON/XML/plain text). For binary documents, this may be an empty string. */
@@ -13,9 +14,9 @@ export interface FetchResult {
13
14
  /** Raw Content-Type header from the response (may include charset). */
14
15
  contentType?: string;
15
16
  /** Playwright page object (only available in browser/stealth mode, must be closed by caller) */
16
- page?: import('playwright-core').Page;
17
+ page?: import('playwright').Page;
17
18
  /** Playwright browser object (only available in browser/stealth mode, must be closed by caller) */
18
- browser?: import('playwright-core').Browser;
19
+ browser?: import('playwright').Browser;
19
20
  }
20
21
  /**
21
22
  * Simple HTTP fetch using native fetch + Cheerio
@@ -43,6 +44,14 @@ export declare function browserFetch(url: string, options?: {
43
44
  keepPageOpen?: boolean;
44
45
  /** Abort signal for internal races/cancellation */
45
46
  signal?: AbortSignal;
47
+ /**
48
+ * Path to a persistent Chrome user-data-dir.
49
+ * When set, bypasses the shared browser pool and keeps the browser alive
50
+ * between fetches so cookies / session data persist.
51
+ */
52
+ profileDir?: string;
53
+ /** Launch browser in headed (visible) mode. Only meaningful with profileDir or for debugging. */
54
+ headed?: boolean;
46
55
  }): Promise<FetchResult>;
47
56
  /**
48
57
  * Retry a fetch operation with exponential backoff
@@ -74,7 +83,24 @@ export declare function browserScreenshot(url: string, options?: {
74
83
  }>;
75
84
  export declare function retryFetch<T>(fn: () => Promise<T>, maxAttempts?: number, baseDelayMs?: number): Promise<T>;
76
85
  /**
77
- * Clean up browser resources
86
+ * Scroll to the bottom of the page N times, waiting for the network to
87
+ * settle between each scroll. Useful for triggering lazy-loaded content
88
+ * (infinite scroll, deferred images, etc.).
89
+ *
90
+ * @param page - Playwright Page instance.
91
+ * @param times - Number of scroll-and-wait cycles (default: 3).
92
+ * @returns The final page HTML after all scrolls complete.
93
+ */
94
+ export declare function scrollAndWait(page: Page, times?: number): Promise<string>;
95
+ /**
96
+ * Clean up browser resources (shared pool, stealth browser, and all profile browsers).
78
97
  */
79
98
  export declare function cleanup(): Promise<void>;
99
+ /**
100
+ * Close a specific persistent profile browser (e.g. when done with a session).
101
+ * Safe to call even if the browser has already been closed.
102
+ *
103
+ * @param profileDir Path to the profile directory used when launching
104
+ */
105
+ export declare function closeProfileBrowser(profileDir: string): Promise<void>;
80
106
  //# sourceMappingURL=fetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/core/fetcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../src/core/fetcher.ts"],"names":[],"mappings":"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"}