alterlab-mcp-server 1.8.0 → 1.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 (68) hide show
  1. package/README.md +68 -26
  2. package/dist/client.d.ts +2 -1
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +7 -4
  5. package/dist/client.js.map +1 -1
  6. package/dist/errors.js +2 -2
  7. package/dist/errors.js.map +1 -1
  8. package/dist/format.d.ts +5 -1
  9. package/dist/format.d.ts.map +1 -1
  10. package/dist/format.js +48 -0
  11. package/dist/format.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/tools/batch.d.ts +1213 -17
  16. package/dist/tools/batch.d.ts.map +1 -1
  17. package/dist/tools/batch.js +121 -33
  18. package/dist/tools/batch.js.map +1 -1
  19. package/dist/tools/common.d.ts +313 -0
  20. package/dist/tools/common.d.ts.map +1 -0
  21. package/dist/tools/common.js +336 -0
  22. package/dist/tools/common.js.map +1 -0
  23. package/dist/tools/crawl.d.ts +135 -18
  24. package/dist/tools/crawl.d.ts.map +1 -1
  25. package/dist/tools/crawl.js +141 -56
  26. package/dist/tools/crawl.js.map +1 -1
  27. package/dist/tools/estimate.d.ts +20 -5
  28. package/dist/tools/estimate.d.ts.map +1 -1
  29. package/dist/tools/estimate.js +25 -34
  30. package/dist/tools/estimate.js.map +1 -1
  31. package/dist/tools/extract.d.ts +4 -4
  32. package/dist/tools/extract.d.ts.map +1 -1
  33. package/dist/tools/extract.js +2 -0
  34. package/dist/tools/extract.js.map +1 -1
  35. package/dist/tools/job.d.ts +13 -0
  36. package/dist/tools/job.d.ts.map +1 -0
  37. package/dist/tools/job.js +62 -0
  38. package/dist/tools/job.js.map +1 -0
  39. package/dist/tools/map.d.ts.map +1 -1
  40. package/dist/tools/map.js +4 -1
  41. package/dist/tools/map.js.map +1 -1
  42. package/dist/tools/scrape.d.ts +362 -59
  43. package/dist/tools/scrape.d.ts.map +1 -1
  44. package/dist/tools/scrape.js +176 -215
  45. package/dist/tools/scrape.js.map +1 -1
  46. package/dist/tools/screenshot.d.ts +33 -0
  47. package/dist/tools/screenshot.d.ts.map +1 -1
  48. package/dist/tools/screenshot.js +46 -5
  49. package/dist/tools/screenshot.js.map +1 -1
  50. package/dist/tools/search.d.ts +8 -5
  51. package/dist/tools/search.d.ts.map +1 -1
  52. package/dist/tools/search.js +13 -5
  53. package/dist/tools/search.js.map +1 -1
  54. package/dist/tools/sessions.d.ts +180 -12
  55. package/dist/tools/sessions.d.ts.map +1 -1
  56. package/dist/tools/sessions.js +75 -21
  57. package/dist/tools/sessions.js.map +1 -1
  58. package/dist/tools/simple_batch.d.ts +3 -3
  59. package/dist/tools/simple_batch.d.ts.map +1 -1
  60. package/dist/tools/simple_batch.js +5 -4
  61. package/dist/tools/simple_batch.js.map +1 -1
  62. package/dist/tools/usage.js +9 -18
  63. package/dist/tools/usage.js.map +1 -1
  64. package/dist/types.d.ts +170 -52
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/types.js.map +1 -1
  67. package/package.json +5 -3
  68. package/server.json +9 -5
@@ -1,52 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.scrapeDescription = exports.scrapeSchema = void 0;
4
+ exports.buildScrapeRequest = buildScrapeRequest;
5
+ exports.buildEstimateRequest = buildEstimateRequest;
4
6
  exports.handleScrape = handleScrape;
5
7
  const zod_1 = require("zod");
6
8
  const errors_js_1 = require("../errors.js");
7
9
  const format_js_1 = require("../format.js");
8
- const tierEnum = zod_1.z.enum(["1", "2", "3", "3.5", "4"]);
9
- const costControlsSchema = zod_1.z
10
- .object({
11
- force_tier: tierEnum
12
- .optional()
13
- .describe("Pin execution to this exact tier, bypassing escalation " +
14
- "(1=curl $0.0002, 2=http $0.0003, 3=stealth $0.002, 3.5=lightjs $0.0025, 4=browser $0.004). " +
15
- "Use to guarantee a specific engine is used regardless of site difficulty."),
16
- max_tier: tierEnum
17
- .optional()
18
- .describe("Cap automatic escalation at this tier. Scrape will not escalate beyond it even if lower tiers fail. " +
19
- "Cannot exceed force_tier when both are set."),
20
- max_credits: zod_1.z
21
- .number()
22
- .positive()
23
- .optional()
24
- .describe("Hard spending cap for this request in credits. Request fails if cost would exceed this."),
25
- prefer_cost: zod_1.z
26
- .boolean()
27
- .optional()
28
- .describe("Optimize for cost — try cheaper tiers first, accept lower success probability."),
29
- prefer_speed: zod_1.z
30
- .boolean()
31
- .optional()
32
- .describe("Optimize for speed — skip to the most reliable tier for this domain."),
33
- fail_fast: zod_1.z
34
- .boolean()
35
- .optional()
36
- .describe("Return error instead of escalating to more expensive tiers on failure."),
37
- time_budget: zod_1.z
38
- .number()
39
- .min(5)
40
- .max(300)
41
- .optional()
42
- .describe("Total wall-clock budget in seconds for the entire tier escalation sequence (5–300s). " +
43
- "Escalation stops when remaining budget is insufficient for the next tier attempt."),
44
- })
45
- .optional()
46
- .describe("Fine-grained cost and tier controls. Use to cap spending, pin a tier, or trade off cost vs speed. " +
47
- "Prefer these over the top-level prefer_cost/prefer_speed/fail_fast fields for full control.");
10
+ const common_js_1 = require("./common.js");
48
11
  exports.scrapeSchema = zod_1.z.object({
49
- url: zod_1.z.string().url().describe("URL to scrape"),
12
+ url: zod_1.z.string().url().max(2083).describe("URL to scrape"),
50
13
  method: zod_1.z
51
14
  .enum(["GET", "POST"])
52
15
  .default("GET")
@@ -62,45 +25,39 @@ exports.scrapeSchema = zod_1.z.object({
62
25
  "For REST APIs: JSON-encoded payload string. " +
63
26
  "For form submissions: URL-encoded key=value pairs (e.g., 'name=Alice&email=alice@example.com'). " +
64
27
  "Omit for GET requests."),
65
- content_type: zod_1.z
66
- .enum([
67
- "application/json",
68
- "application/x-www-form-urlencoded",
69
- "text/plain",
70
- "application/graphql",
71
- ])
28
+ content_type: common_js_1.contentTypeEnum
72
29
  .optional()
73
30
  .describe("Content-Type header for the request body. " +
74
31
  "Defaults to 'application/json' when body is provided. " +
75
32
  "Use 'application/graphql' for raw GraphQL queries. " +
76
33
  "Use 'application/x-www-form-urlencoded' for HTML form submissions. " +
77
34
  "Requires body to be set."),
78
- mode: zod_1.z
79
- .enum(["auto", "html", "js", "pdf", "ocr"])
35
+ headers: zod_1.z
36
+ .record(zod_1.z.string(), zod_1.z.string())
37
+ .optional()
38
+ .describe("Custom HTTP headers to send to the target URL. " +
39
+ "Hop-by-hop headers (Connection, Transfer-Encoding, Host, etc.) are not allowed."),
40
+ mode: common_js_1.modeEnum
80
41
  .default("auto")
81
42
  .describe("Scraping mode: auto (recommended), html, js (headless browser), pdf, or ocr"),
82
43
  formats: zod_1.z
83
- .array(zod_1.z.enum(["text", "json", "json_v2", "html", "markdown", "rag", "raw", "content"]))
44
+ .array(common_js_1.allFormatEnum)
84
45
  .default(["markdown"])
85
- .describe("Output formats. 'markdown' is best for LLM consumption. " +
86
- "'json_v2' returns a structured section tree (headings + content blocks). " +
87
- "'rag' returns chunked text optimized for retrieval-augmented generation. " +
88
- "'raw' returns the raw response body without extraction. " +
89
- "'content' returns body_markdown + content_hash + images + links for AI/KB pipelines."),
46
+ .describe("Output formats. " + common_js_1.FORMATS_DESCRIPTION),
90
47
  extraction_schema: zod_1.z
91
48
  .record(zod_1.z.unknown())
92
49
  .optional()
93
50
  .describe("JSON schema for structured extraction. " +
94
- "The API extracts fields matching this schema from the scraped page using LLM. " +
51
+ "The API extracts fields matching this schema from the scraped page using LLM (+$0.001). " +
95
52
  "Result is returned in extraction_result. " +
96
53
  'Example: { "title": "string", "price": "number", "in_stock": "boolean" }'),
97
54
  extraction_model: zod_1.z
98
55
  .string()
56
+ .max(256)
99
57
  .nullish()
100
58
  .describe("Per-request LLM model override in provider-specific format (e.g. 'gpt-4o', 'claude-opus-4-5-20251101', 'llama3-70b-8192'). " +
101
59
  "Overrides the model saved in your BYOK key settings for this request only."),
102
- extraction_provider: zod_1.z
103
- .enum(["openai", "anthropic", "openrouter", "groq"])
60
+ extraction_provider: common_js_1.extractionProviderEnum
104
61
  .optional()
105
62
  .describe("LLM provider to use for extraction. Selects the matching BYOK key registered at " +
106
63
  "/dashboard/settings/llm-keys. When omitted, the most recently used registered key " +
@@ -112,32 +69,24 @@ exports.scrapeSchema = zod_1.z.object({
112
69
  .describe("Natural language extraction instruction. Describes what fields to extract from the page. " +
113
70
  "Mutually exclusive with extraction_schema. " +
114
71
  'Example: "Extract the product name, price, and availability".'),
115
- extraction_profile: zod_1.z
116
- .enum([
117
- "auto",
118
- "product",
119
- "article",
120
- "job_posting",
121
- "faq",
122
- "recipe",
123
- "event",
124
- "ecommerce_homepage",
125
- "directory_listing",
126
- ])
72
+ extraction_profile: common_js_1.extractionProfileEnum
127
73
  .optional()
128
74
  .describe("Pre-built extraction schema template. " +
129
- "auto: detect best template. product: e-commerce product details. " +
75
+ "auto: detect best template (API default). product: e-commerce product details. " +
130
76
  "article: news/blog article fields. job_posting: job listing fields. " +
131
77
  "faq: FAQ entries. recipe: recipe ingredients and instructions. " +
132
78
  "event: event details. ecommerce_homepage: homepage product listings. " +
133
- "directory_listing: directory/listing page entries."),
79
+ "directory_listing: directory/listing page entries. " +
80
+ "Mutually exclusive with extraction_template."),
81
+ extraction_template: common_js_1.extractionProfileEnum
82
+ .optional()
83
+ .describe("Shorthand alias for extraction_profile — selects the same pre-built template. " +
84
+ "Mutually exclusive with extraction_profile."),
134
85
  template: zod_1.z
135
86
  .string()
136
87
  .optional()
137
- .describe("Named extraction template to apply to the scrape result. " +
138
- "Accepts standard template names (e.g. 'product', 'article', 'job_posting') " +
139
- "or a custom template name registered in your account. " +
140
- "When provided, routes the request through template-based extraction."),
88
+ .describe("DEPRECATED alias for extraction_template, kept for backward compatibility. " +
89
+ "Sent to the API as extraction_template; prefer extraction_template."),
141
90
  evidence: zod_1.z
142
91
  .boolean()
143
92
  .optional()
@@ -149,6 +98,12 @@ exports.scrapeSchema = zod_1.z.object({
149
98
  .optional()
150
99
  .describe("Apply quality filtering to extracted content. When false (default), returns all parsed content " +
151
100
  "without quality thresholds (lossless mode). When true, filters low-quality boilerplate."),
101
+ promote_schema_org: zod_1.z
102
+ .boolean()
103
+ .optional()
104
+ .describe("Use Schema.org JSON-LD/Microdata as the primary structured-data source when present (API default true). " +
105
+ "Promotes machine-readable metadata embedded in the page over LLM extraction. " +
106
+ "Most effective on e-commerce, recipe, and news article pages."),
152
107
  cache: zod_1.z
153
108
  .boolean()
154
109
  .optional()
@@ -156,134 +111,99 @@ exports.scrapeSchema = zod_1.z.object({
156
111
  "return cached results. Only use for idempotent requests (GET pages, read-only POSTs)."),
157
112
  cache_ttl: zod_1.z
158
113
  .number()
114
+ .int()
159
115
  .min(60)
160
116
  .max(86400)
161
117
  .optional()
162
118
  .describe("Cache TTL in seconds (60–86400). Defaults to 3600 (60 min) when cache=true. " +
163
119
  "Requires cache=true."),
164
- render_js: zod_1.z
165
- .union([zod_1.z.boolean(), zod_1.z.literal("auto")])
166
- .default(false)
167
- .describe("Render JavaScript using headless browser (forces Tier 4 minimum — no separate add-on charge). " +
168
- "Required for JS-heavy sites. Set to 'auto' for smart detection (probes each page, " +
169
- "only renders JS-heavy pages with browser — saves 30-60% on mixed sites)."),
170
- use_proxy: zod_1.z
120
+ force_refresh: zod_1.z
171
121
  .boolean()
172
- .default(false)
173
- .describe("Route through premium proxy (+$0.0002). Helps bypass geo-restrictions and anti-bot"),
174
- proxy_country: zod_1.z
175
- .string()
176
122
  .optional()
177
- .describe("ISO country code for geo-targeting (e.g., 'US', 'DE'). Requires use_proxy=true"),
178
- wait_for: zod_1.z
179
- .string()
180
- .optional()
181
- .describe("CSS selector to wait for before extracting content (e.g., '#main-content')"),
182
- timeout: zod_1.z
183
- .number()
184
- .min(1)
185
- .max(300)
186
- .default(90)
187
- .describe("Request timeout in seconds (1-300)"),
123
+ .describe("Bypass the cache and always fetch a fresh copy of the page. " +
124
+ "Use when you need real-time content and a cached result would be stale."),
125
+ include_raw_html: zod_1.z
126
+ .boolean()
127
+ .default(false)
128
+ .describe("Include raw HTML in the response alongside formatted content"),
188
129
  max_response_bytes: zod_1.z
189
130
  .number()
190
131
  .int()
191
132
  .min(0)
192
133
  .max(52_428_800)
193
- .default(5_242_880)
194
134
  .optional()
195
135
  .describe("Soft cap on raw response body size in bytes. " +
196
136
  "When the downloaded HTML exceeds this value it is truncated before extraction. " +
197
137
  "Default: 5 MB (5242880). Set to 0 for no limit. Maximum: 50 MB (52428800). " +
198
138
  "Useful for very large pages where you only need the beginning of the content."),
199
- include_raw_html: zod_1.z
200
- .boolean()
201
- .default(false)
202
- .describe("Include raw HTML in the response alongside formatted content"),
203
- session_id: zod_1.z
204
- .string()
205
- .uuid()
206
- .optional()
207
- .describe("UUID of a stored session for authenticated scraping. " +
208
- "Use alterlab_list_sessions to find available sessions. " +
209
- "The session's cookies will be injected into the request."),
210
- cookies: zod_1.z
211
- .record(zod_1.z.string(), zod_1.z.string())
212
- .optional()
213
- .describe("Inline cookies as key-value pairs for authenticated scraping " +
214
- '(e.g., {"session_token": "abc123"}). ' +
215
- "Use this for one-off requests; use session_id for reusable sessions."),
216
- scroll_to_load: zod_1.z
217
- .boolean()
218
- .default(false)
219
- .describe("Scroll page to trigger lazy-loaded content (requires render_js). " +
220
- "Performs explicit viewport-height scrolls to load dynamic content. Adds ~2-3s latency."),
221
- scroll_count: zod_1.z
139
+ timeout: zod_1.z
222
140
  .number()
223
141
  .int()
224
142
  .min(1)
225
- .max(10)
226
- .default(3)
143
+ .max(300)
144
+ .default(90)
145
+ .describe("Request timeout in seconds (1-300)"),
146
+ wait_for: zod_1.z
147
+ .string()
148
+ .optional()
149
+ .describe("CSS selector to wait for before extracting content (e.g., '#main-content')"),
150
+ wait_until: zod_1.z
151
+ .string()
227
152
  .optional()
228
- .describe("Number of scroll iterations when scroll_to_load is enabled (1-10, default 3)"),
229
- remove_cookie_banners: zod_1.z
153
+ .describe("Page load event to wait for before extracting (networkidle, domcontentloaded or load; API default networkidle)"),
154
+ screenshot: zod_1.z
230
155
  .boolean()
231
- .default(true)
232
- .describe("Remove cookie consent banners from HTML before content extraction (free, enabled by default)"),
233
- block_images: zod_1.z
156
+ .optional()
157
+ .describe("Capture a full-page screenshot (+$0.0002, requires render_js). The URL is returned as screenshot_url. " +
158
+ "Use alterlab_screenshot to get the image inline."),
159
+ enable_scroll: zod_1.z
234
160
  .boolean()
235
- .default(false)
236
- .describe("Block image downloads during browser rendering. " +
237
- "Reduces proxy bandwidth and speeds up scrapes. Only effective with render_js=true."),
238
- location: zod_1.z
161
+ .nullish()
162
+ .describe("Force scrolling for lazy-load images. true: always scroll (+5-10s), false: never scroll, " +
163
+ "omit: auto (scroll unless social media site)."),
164
+ pdf_format: zod_1.z
165
+ .string()
166
+ .optional()
167
+ .describe("Output format for mode='pdf' extraction (API default 'markdown')"),
168
+ ocr_language: zod_1.z
169
+ .string()
170
+ .optional()
171
+ .describe("Tesseract language code for OCR (API default 'eng')"),
172
+ sync_policy: zod_1.z
173
+ .enum(["auto", "wait_until_deadline"])
174
+ .optional()
175
+ .describe("Synchronous wait policy. 'auto' (default) may return an early 202 with a job_id for predicted T3/T4 jobs; " +
176
+ "'wait_until_deadline' keeps the connection open until the terminal result or the safe sync deadline (~85s)."),
177
+ embeddings: zod_1.z
239
178
  .object({
240
- country: zod_1.z
241
- .string()
242
- .length(2)
243
- .optional()
244
- .describe("ISO 3166-1 alpha-2 country code for geo-targeting (e.g., 'US', 'DE', 'JP'). " +
245
- "Routes request through a proxy in the specified country."),
246
- language: zod_1.z
247
- .string()
248
- .min(2)
249
- .max(5)
250
- .optional()
251
- .describe("ISO 639-1 language code (e.g., 'en', 'de', 'ja'). " +
252
- "Sets the Accept-Language header and browser locale."),
179
+ enabled: zod_1.z.boolean().optional(),
180
+ model: zod_1.z
181
+ .enum(["text-embedding-3-small", "text-embedding-3-large"])
182
+ .optional(),
183
+ chunk_size: zod_1.z.number().int().min(64).max(8191).optional(),
184
+ chunk_overlap: zod_1.z.number().int().min(0).max(2048).optional(),
253
185
  })
254
186
  .optional()
255
- .describe("Geo-targeting parameters for localized content scraping. " +
256
- "Controls proxy country routing, Accept-Language header, and browser locale."),
187
+ .describe("Chunk the scraped text and embed it with OpenAI models (+$0.001 per page). " +
188
+ "Set enabled=true; model, chunk_size (64-8191) and chunk_overlap (0-2048) are optional."),
189
+ ...common_js_1.advancedShape,
190
+ location: common_js_1.locationSchema.optional(),
257
191
  prefer_cost: zod_1.z
258
192
  .boolean()
259
193
  .optional()
260
194
  .describe("Optimize for lowest cost — try cheaper tiers first before escalating. " +
261
- "Best for non-time-sensitive scrapes where minimizing credit spend matters. " +
262
- "Mutually exclusive intent with prefer_speed."),
195
+ "Shorthand for cost_controls.prefer_cost. Mutually exclusive intent with prefer_speed."),
263
196
  prefer_speed: zod_1.z
264
197
  .boolean()
265
198
  .optional()
266
199
  .describe("Optimize for speed — skip to a reliable tier immediately instead of escalating from Tier 1. " +
267
- "Best for time-sensitive scrapes where latency matters more than cost. " +
268
- "Mutually exclusive intent with prefer_cost."),
200
+ "Shorthand for cost_controls.prefer_speed. Mutually exclusive intent with prefer_cost."),
269
201
  fail_fast: zod_1.z
270
202
  .boolean()
271
203
  .optional()
272
204
  .describe("Fail immediately if the page requires an expensive tier (browser/captcha) instead of auto-escalating. " +
273
- "Use this to protect against unexpected credit spend on protected pages. " +
274
- "Returns an error with the required tier instead of automatically upgrading."),
275
- force_refresh: zod_1.z
276
- .boolean()
277
- .optional()
278
- .describe("Bypass the cache and always fetch a fresh copy of the page. " +
279
- "Use when you need real-time content and a cached result would be stale."),
280
- promote_schema_org: zod_1.z
281
- .boolean()
282
- .optional()
283
- .describe("Use Schema.org JSON-LD/Microdata as the primary structured-data source when present. " +
284
- "Promotes machine-readable metadata embedded in the page over LLM extraction. " +
285
- "Most effective on e-commerce, recipe, and news article pages."),
286
- cost_controls: costControlsSchema,
205
+ "Shorthand for cost_controls.fail_fast. Returns an error with the required tier instead of upgrading."),
206
+ cost_controls: common_js_1.costControlsSchema.optional(),
287
207
  estimate_first: zod_1.z
288
208
  .boolean()
289
209
  .default(false)
@@ -296,26 +216,34 @@ exports.scrapeDescription = "Get data from any website, bypass Cloudflare and an
296
216
  "or fetch content from dynamic single-page apps. " +
297
217
  "Turn any URL into clean, LLM-ready markdown — or get text, HTML, JSON, and structured sections. " +
298
218
  "Automatically bypasses anti-bot protection (Cloudflare, Akamai, DataDome, PerimeterX, hCaptcha) " +
299
- "with intelligent 4-tier escalation — no manual configuration needed. " +
300
- "Cost-efficient: starts at $0.0001/page for simple sites, auto-escalates only when protection is detected. " +
219
+ "with intelligent tier escalation — no manual configuration needed. " +
220
+ "Cost-efficient: tier 1 (curl) is $0.0002/page, tier 2 (http) $0.0003, tier 3 (stealth) $0.002, " +
221
+ "tier 3.5 (lightjs) $0.0025, tier 4 (browser) $0.004; you only pay for the tier that succeeds. " +
222
+ "Add-ons: screenshot +$0.0002, generate_pdf +$0.0004, ocr +$0.001, use_proxy +$0.0002, " +
223
+ "LLM extraction +$0.001, embeddings +$0.001; method='POST' costs 1.5x. " +
301
224
  "Returns markdown by default — optimized for LLM context. " +
302
225
  "Supports GET (default) and POST via the method parameter. " +
303
226
  "Use method='POST' with body for GraphQL APIs, REST endpoints, and form submissions. " +
304
227
  "Use content_type to set the POST body Content-Type (json, urlencoded, graphql, plain). " +
228
+ "Use headers to send custom HTTP headers to the target. " +
305
229
  "Use render_js=true to scrape dynamic pages, JavaScript-heavy sites (React, Angular, Vue, SPAs). " +
306
230
  "Use render_js='auto' for mixed sites to detect JS needs per-page (saves 30-60%). " +
307
- "Use use_proxy=true for geo-restricted or heavily protected sites. " +
231
+ "Use actions (click, fill, press, scroll, wait_for, evaluate, ...) to drive the page before extraction. " +
232
+ "Use use_proxy=true for geo-restricted or heavily protected sites; use_own_proxy for your own proxy integration. " +
233
+ "Use sticky_session to reuse cookies and exit IP across calls. " +
234
+ "Use skip_tls_verification only for sites with broken certificates. " +
308
235
  "Use formats=['json_v2'] for a structured section tree (headings + content blocks). " +
309
236
  "Use formats=['rag'] for chunked text optimized for RAG pipelines. " +
310
237
  "Use formats=['raw'] for the raw response body without extraction. " +
311
238
  "Use formats=['content'] for AI/KB pipelines — returns body_markdown, content_hash, images, links. " +
312
239
  "Use extraction_schema to extract structured fields from the page using LLM. " +
313
240
  "Use extraction_prompt for natural language extraction instructions. " +
314
- "Use extraction_profile for pre-built templates (product, article, job_posting, etc.). " +
241
+ "Use extraction_profile or extraction_template for pre-built templates (product, article, job_posting, etc.). " +
315
242
  "Use evidence=true to include source passages alongside extracted fields. " +
243
+ "Use embeddings to chunk and embed the scraped text. " +
316
244
  "Use cache=true and cache_ttl to enable response caching. " +
317
245
  "Use cost_controls to cap spending, pin a tier, or set a time budget. " +
318
- "Supports authenticated scraping via session_id or inline cookies. " +
246
+ "Supports authenticated scraping via session_id, inline cookies or session_headers. " +
319
247
  "Use scroll_to_load=true for infinite-scroll pages. " +
320
248
  "Use location.country to scrape geo-targeted content from any region. " +
321
249
  "Use prefer_cost=true to minimize credit spend (starts from cheapest tier). " +
@@ -323,72 +251,105 @@ exports.scrapeDescription = "Get data from any website, bypass Cloudflare and an
323
251
  "Use fail_fast=true to error instead of auto-escalating to expensive tiers. " +
324
252
  "Use force_refresh=true to bypass cache and always fetch live content. " +
325
253
  "Use promote_schema_org=true to prefer Schema.org JSON-LD over LLM extraction on structured pages. " +
326
- "Use estimate_first=true to run a free cost estimate before scraping (prepended to the result).";
327
- async function handleScrape(client, params) {
328
- // Optional pre-flight cost estimate — runs before the scrape, no credits charged.
329
- // On failure, degrade gracefully: prepend a warning and continue with the scrape.
330
- let estimatePrefix = "";
331
- if (params.estimate_first) {
332
- try {
333
- const estimate = await client.estimate({
334
- url: params.url,
335
- mode: params.mode,
336
- formats: params.formats,
337
- advanced: {
338
- render_js: typeof params.render_js === "boolean" ? params.render_js : false,
339
- use_proxy: params.use_proxy,
340
- },
341
- });
342
- estimatePrefix = (0, format_js_1.formatEstimateInline)(estimate) + "\n";
343
- }
344
- catch {
345
- estimatePrefix =
346
- "> **Pre-flight estimate**: unavailable (estimate API call failed — proceeding with scrape).\n\n";
347
- }
348
- }
349
- try {
350
- const response = await client.scrape({
254
+ "Use estimate_first=true to run a free cost estimate before scraping (prepended to the result). " +
255
+ "If a long-running scrape returns a job_id instead of content, the job continues server-side.";
256
+ /** Merge the top-level prefer_cost/prefer_speed/fail_fast shorthands into cost_controls (explicit cost_controls wins). */
257
+ function buildCostControls(params) {
258
+ const merged = (0, common_js_1.compact)({
259
+ prefer_cost: params.prefer_cost,
260
+ prefer_speed: params.prefer_speed,
261
+ fail_fast: params.fail_fast,
262
+ ...(params.cost_controls ?? {}),
263
+ });
264
+ return Object.keys(merged).length > 0 ? merged : undefined;
265
+ }
266
+ /**
267
+ * Translate flat tool parameters into the API's UnifiedScrapeRequest body.
268
+ * Exported for tests.
269
+ */
270
+ function buildScrapeRequest(params) {
271
+ const advanced = (0, common_js_1.pickAdvanced)(params, common_js_1.ADVANCED_KEYS);
272
+ advanced.markdown = params.formats.includes("markdown");
273
+ if (params.screenshot !== undefined)
274
+ advanced.screenshot = params.screenshot;
275
+ return {
276
+ ...(0, common_js_1.compact)({
351
277
  url: params.url,
352
278
  method: params.method,
353
279
  body: params.body,
354
280
  content_type: params.content_type,
281
+ headers: params.headers,
355
282
  mode: params.mode,
356
283
  formats: params.formats,
357
284
  sync: true,
285
+ sync_policy: params.sync_policy,
358
286
  timeout: params.timeout,
359
287
  max_response_bytes: params.max_response_bytes,
360
288
  include_raw_html: params.include_raw_html,
361
289
  wait_for: params.wait_for,
362
- session_id: params.session_id,
363
- cookies: params.cookies,
290
+ wait_until: params.wait_until,
291
+ screenshot: params.screenshot,
292
+ enable_scroll: params.enable_scroll ?? undefined,
293
+ pdf_format: params.pdf_format,
294
+ ocr_language: params.ocr_language,
364
295
  location: params.location,
365
296
  extraction_schema: params.extraction_schema,
366
297
  extraction_prompt: params.extraction_prompt,
367
298
  extraction_model: params.extraction_model ?? undefined,
368
299
  extraction_provider: params.extraction_provider,
369
300
  extraction_profile: params.extraction_profile,
370
- template: params.template,
301
+ extraction_template: params.extraction_template ??
302
+ params.template,
371
303
  evidence: params.evidence,
372
304
  filter_content: params.filter_content,
373
305
  cache: params.cache,
374
306
  cache_ttl: params.cache_ttl,
375
- prefer_cost: params.prefer_cost,
376
- prefer_speed: params.prefer_speed,
377
- fail_fast: params.fail_fast,
378
307
  force_refresh: params.force_refresh,
379
308
  promote_schema_org: params.promote_schema_org,
380
- cost_controls: params.cost_controls,
381
- advanced: {
382
- render_js: params.render_js,
383
- use_proxy: params.use_proxy,
384
- proxy_country: params.proxy_country,
385
- markdown: params.formats.includes("markdown"),
386
- scroll_to_load: params.scroll_to_load,
387
- scroll_count: params.scroll_count,
388
- remove_cookie_banners: params.remove_cookie_banners,
389
- block_images: params.block_images,
390
- },
391
- });
309
+ embeddings: params.embeddings,
310
+ cost_controls: buildCostControls(params),
311
+ }),
312
+ advanced,
313
+ };
314
+ }
315
+ /**
316
+ * Cost-estimate request for the same scrape. The estimate endpoint prices from
317
+ * url, mode, method, formats and the cost-bearing advanced flags only.
318
+ */
319
+ function buildEstimateRequest(params) {
320
+ return {
321
+ ...(0, common_js_1.compact)({
322
+ url: params.url,
323
+ mode: params.mode,
324
+ method: params.method,
325
+ formats: params.formats,
326
+ }),
327
+ advanced: (0, common_js_1.compact)({
328
+ render_js: params.render_js,
329
+ use_proxy: params.use_proxy,
330
+ use_own_proxy: params.use_own_proxy,
331
+ screenshot: params.screenshot,
332
+ generate_pdf: params.generate_pdf,
333
+ ocr: params.ocr,
334
+ }),
335
+ };
336
+ }
337
+ async function handleScrape(client, params) {
338
+ // Optional pre-flight cost estimate — runs before the scrape, no credits charged.
339
+ // On failure, degrade gracefully: prepend a warning and continue with the scrape.
340
+ let estimatePrefix = "";
341
+ if (params.estimate_first) {
342
+ try {
343
+ const estimate = await client.estimate(buildEstimateRequest(params));
344
+ estimatePrefix = (0, format_js_1.formatEstimateInline)(estimate) + "\n";
345
+ }
346
+ catch {
347
+ estimatePrefix =
348
+ "> **Pre-flight estimate**: unavailable (estimate API call failed — proceeding with scrape).\n\n";
349
+ }
350
+ }
351
+ try {
352
+ const response = await client.scrape(buildScrapeRequest(params));
392
353
  const balanceWarningSuffix = (0, format_js_1.formatBalanceWarning)(client.getLastBalanceWarning());
393
354
  return {
394
355
  content: [{ type: "text", text: estimatePrefix + (0, format_js_1.formatScrapeResponse)(response) + balanceWarningSuffix }],
@@ -1 +1 @@
1
- {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scrape.js","sourceRoot":"","sources":["../../src/tools/scrape.ts"],"names":[],"mappings":";;;AAwVA,gDA6CC;AAMD,oDA4BC;AAED,oCAkCC;AA3cD,6BAAwB;AAGxB,4CAAgE;AAChE,4CAAgG;AAEhG,2CAaqB;AAER,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;IACzD,MAAM,EAAE,OAAC;SACN,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACrB,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,qEAAqE;QACnE,wEAAwE;QACxE,0FAA0F,CAC7F;IACH,IAAI,EAAE,OAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,kCAAkC;QAChC,wEAAwE;QACxE,gDAAgD;QAChD,8CAA8C;QAC9C,kGAAkG;QAClG,wBAAwB,CAC3B;IACH,YAAY,EAAE,2BAAe;SAC1B,QAAQ,EAAE;SACV,QAAQ,CACP,4CAA4C;QAC1C,wDAAwD;QACxD,qDAAqD;QACrD,qEAAqE;QACrE,0BAA0B,CAC7B;IACH,OAAO,EAAE,OAAC;SACP,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC;SAC9B,QAAQ,EAAE;SACV,QAAQ,CACP,iDAAiD;QAC/C,iFAAiF,CACpF;IACH,IAAI,EAAE,oBAAQ;SACX,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CACP,6EAA6E,CAC9E;IACH,OAAO,EAAE,OAAC;SACP,KAAK,CAAC,yBAAa,CAAC;SACpB,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;SACrB,QAAQ,CAAC,kBAAkB,GAAG,+BAAmB,CAAC;IACrD,iBAAiB,EAAE,OAAC;SACjB,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CACP,yCAAyC;QACvC,0FAA0F;QAC1F,2CAA2C;QAC3C,0EAA0E,CAC7E;IACH,gBAAgB,EAAE,OAAC;SAChB,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,CACP,6HAA6H;QAC3H,4EAA4E,CAC/E;IACH,mBAAmB,EAAE,kCAAsB;SACxC,QAAQ,EAAE;SACV,QAAQ,CACP,kFAAkF;QAChF,oFAAoF;QACpF,yEAAyE,CAC5E;IACH,iBAAiB,EAAE,OAAC;SACjB,MAAM,EAAE;SACR,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,2FAA2F;QACzF,6CAA6C;QAC7C,+DAA+D,CAClE;IACH,kBAAkB,EAAE,iCAAqB;SACtC,QAAQ,EAAE;SACV,QAAQ,CACP,wCAAwC;QACtC,iFAAiF;QACjF,sEAAsE;QACtE,iEAAiE;QACjE,uEAAuE;QACvE,qDAAqD;QACrD,8CAA8C,CACjD;IACH,mBAAmB,EAAE,iCAAqB;SACvC,QAAQ,EAAE;SACV,QAAQ,CACP,gFAAgF;QAC9E,6CAA6C,CAChD;IACH,QAAQ,EAAE,OAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,6EAA6E;QAC3E,qEAAqE,CACxE;IACH,QAAQ,EAAE,OAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,mEAAmE;QACjE,iFAAiF;QACjF,kDAAkD,CACrD;IACH,cAAc,EAAE,OAAC;SACd,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,iGAAiG;QAC/F,yFAAyF,CAC5F;IACH,kBAAkB,EAAE,OAAC;SAClB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,0GAA0G;QACxG,+EAA+E;QAC/E,+DAA+D,CAClE;IACH,KAAK,EAAE,OAAC;SACL,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,4FAA4F;QAC1F,uFAAuF,CAC1F;IACH,SAAS,EAAE,OAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,EAAE,CAAC;SACP,GAAG,CAAC,KAAK,CAAC;SACV,QAAQ,EAAE;SACV,QAAQ,CACP,8EAA8E;QAC5E,sBAAsB,CACzB;IACH,aAAa,EAAE,OAAC;SACb,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,8DAA8D;QAC5D,yEAAyE,CAC5E;IACH,gBAAgB,EAAE,OAAC;SAChB,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,kBAAkB,EAAE,OAAC;SAClB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,UAAU,CAAC;SACf,QAAQ,EAAE;SACV,QAAQ,CACP,+CAA+C;QAC7C,iFAAiF;QACjF,6EAA6E;QAC7E,+EAA+E,CAClF;IACH,OAAO,EAAE,OAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,oCAAoC,CAAC;IACjD,QAAQ,EAAE,OAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4EAA4E,CAC7E;IACH,UAAU,EAAE,OAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,gHAAgH,CACjH;IACH,UAAU,EAAE,OAAC;SACV,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,wGAAwG;QACtG,kDAAkD,CACrD;IACH,aAAa,EAAE,OAAC;SACb,OAAO,EAAE;SACT,OAAO,EAAE;SACT,QAAQ,CACP,2FAA2F;QACzF,+CAA+C,CAClD;IACH,UAAU,EAAE,OAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kEAAkE,CAAC;IAC/E,YAAY,EAAE,OAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;IAClE,WAAW,EAAE,OAAC;SACX,IAAI,CAAC,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;SACrC,QAAQ,EAAE;SACV,QAAQ,CACP,4GAA4G;QAC1G,6GAA6G,CAChH;IACH,UAAU,EAAE,OAAC;SACV,MAAM,CAAC;QACN,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC/B,KAAK,EAAE,OAAC;aACL,IAAI,CAAC,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;aAC1D,QAAQ,EAAE;QACb,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QACzD,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;KAC5D,CAAC;SACD,QAAQ,EAAE;SACV,QAAQ,CACP,6EAA6E;QAC3E,wFAAwF,CAC3F;IACH,GAAG,yBAAa;IAChB,QAAQ,EAAE,0BAAc,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,OAAC;SACX,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,wEAAwE;QACtE,uFAAuF,CAC1F;IACH,YAAY,EAAE,OAAC;SACZ,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,8FAA8F;QAC5F,uFAAuF,CAC1F;IACH,SAAS,EAAE,OAAC;SACT,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CACP,wGAAwG;QACtG,sGAAsG,CACzG;IACH,aAAa,EAAE,8BAAkB,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,OAAC;SACd,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CACP,sEAAsE;QACpE,+DAA+D;QAC/D,+EAA+E;QAC/E,oFAAoF,CACvF;CACJ,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAC5B,0GAA0G;IAC1G,kDAAkD;IAClD,kGAAkG;IAClG,kGAAkG;IAClG,qEAAqE;IACrE,iGAAiG;IACjG,gGAAgG;IAChG,wFAAwF;IACxF,wEAAwE;IACxE,2DAA2D;IAC3D,4DAA4D;IAC5D,sFAAsF;IACtF,yFAAyF;IACzF,yDAAyD;IACzD,kGAAkG;IAClG,mFAAmF;IACnF,yGAAyG;IACzG,kHAAkH;IAClH,gEAAgE;IAChE,qEAAqE;IACrE,qFAAqF;IACrF,oEAAoE;IACpE,oEAAoE;IACpE,oGAAoG;IACpG,8EAA8E;IAC9E,sEAAsE;IACtE,+GAA+G;IAC/G,2EAA2E;IAC3E,sDAAsD;IACtD,2DAA2D;IAC3D,uEAAuE;IACvE,qFAAqF;IACrF,qDAAqD;IACrD,uEAAuE;IACvE,6EAA6E;IAC7E,qEAAqE;IACrE,6EAA6E;IAC7E,wEAAwE;IACxE,oGAAoG;IACpG,iGAAiG;IACjG,8FAA8F,CAAC;AAIjG,0HAA0H;AAC1H,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,MAAM,MAAM,GAAG,IAAA,mBAAO,EAAC;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,MAAoB;IACrD,MAAM,QAAQ,GAAG,IAAA,wBAAY,EAAC,MAAM,EAAE,yBAAa,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;QAAE,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE7E,OAAO;QACL,GAAG,IAAA,mBAAO,EAAC;YACT,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,SAAS;YAChD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,SAAS;YACtD,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,mBAAmB,EACjB,MAAM,CAAC,mBAAmB;gBACzB,MAAM,CAAC,QAAwD;YAClE,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,aAAa,EAAE,iBAAiB,CAAC,MAAM,CAAC;SACzC,CAAC;QACF,QAAQ;KACe,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,MAWpC;IACC,OAAO;QACL,GAAG,IAAA,mBAAO,EAAC;YACT,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QACF,QAAQ,EAAE,IAAA,mBAAO,EAAC;YAChB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,GAAG,EAAE,MAAM,CAAC,GAAG;SAChB,CAAC;KACqB,CAAC;AAC5B,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAsB,EACtB,MAAoB;IAEpB,kFAAkF;IAClF,kFAAkF;IAClF,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YACrE,cAAc,GAAG,IAAA,gCAAoB,EAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;gBACZ,iGAAiG,CAAC;QACtG,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjE,MAAM,oBAAoB,GAAG,IAAA,gCAAoB,EAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAClF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAA,gCAAoB,EAAC,QAAQ,CAAC,GAAG,oBAAoB,EAAE,CAAC;SAC1G,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,oBAAoB,GAAG,IAAA,gCAAoB,EAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC;YAC9B,CAAC,CAAC,IAAA,6BAAiB,EAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;YAC/C,CAAC,CAAC,IAAA,6BAAiB,EAAC,KAAc,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3D,IAAI,oBAAoB,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAoC,CAAC,IAAI,IAAI,oBAAoB,CAAC;QACrF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,OAAQ,KAAkB,CAAC,MAAM,KAAK,QAAQ,CAC/C,CAAC;AACJ,CAAC"}