@stack0/sdk 0.2.8 → 0.2.9

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.
@@ -0,0 +1,453 @@
1
+ // src/lib/http-client.ts
2
+ var HttpClient = class {
3
+ apiKey;
4
+ baseUrl;
5
+ constructor(config) {
6
+ this.apiKey = config.apiKey;
7
+ this.baseUrl = config.baseUrl || "https://api.stack0.dev/v1";
8
+ }
9
+ getHeaders() {
10
+ return {
11
+ "Content-Type": "application/json",
12
+ Authorization: `Bearer ${this.apiKey}`
13
+ };
14
+ }
15
+ async request(method, path, body) {
16
+ const url = `${this.baseUrl}${path}`;
17
+ try {
18
+ const response = await fetch(url, {
19
+ method,
20
+ headers: this.getHeaders(),
21
+ body: body ? JSON.stringify(body) : void 0
22
+ });
23
+ if (!response.ok) {
24
+ await this.handleErrorResponse(response);
25
+ }
26
+ const data = await response.json();
27
+ return data;
28
+ } catch (error) {
29
+ if (error instanceof Error && "statusCode" in error) {
30
+ throw error;
31
+ }
32
+ throw this.createError("Network error", error);
33
+ }
34
+ }
35
+ async handleErrorResponse(response) {
36
+ let errorBody;
37
+ try {
38
+ errorBody = await response.json();
39
+ } catch {
40
+ errorBody = { message: response.statusText };
41
+ }
42
+ const error = new Error(errorBody?.message || `HTTP ${response.status}`);
43
+ error.statusCode = response.status;
44
+ error.code = errorBody?.code ?? "";
45
+ error.response = errorBody;
46
+ throw error;
47
+ }
48
+ createError(message, cause) {
49
+ const error = new Error(message);
50
+ error.cause = cause;
51
+ return error;
52
+ }
53
+ async get(path) {
54
+ return this.request("GET", path);
55
+ }
56
+ async post(path, body) {
57
+ return this.request("POST", path, body);
58
+ }
59
+ async put(path, body) {
60
+ return this.request("PUT", path, body);
61
+ }
62
+ async delete(path) {
63
+ return this.request("DELETE", path);
64
+ }
65
+ async patch(path, body) {
66
+ return this.request("PATCH", path, body);
67
+ }
68
+ };
69
+
70
+ // src/extraction/client.ts
71
+ var Extraction = class {
72
+ http;
73
+ constructor(config) {
74
+ this.http = new HttpClient(config);
75
+ }
76
+ // ==========================================================================
77
+ // EXTRACTIONS
78
+ // ==========================================================================
79
+ /**
80
+ * Extract content from a URL
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * const { id, status } = await extraction.extract({
85
+ * url: 'https://example.com/article',
86
+ * mode: 'markdown',
87
+ * includeMetadata: true,
88
+ * });
89
+ *
90
+ * // Poll for completion
91
+ * const result = await extraction.get({ id });
92
+ * console.log(result.markdown);
93
+ * ```
94
+ */
95
+ async extract(request) {
96
+ return this.http.post("/webdata/extractions", request);
97
+ }
98
+ /**
99
+ * Get an extraction by ID
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const extraction = await extraction.get({ id: 'extraction-id' });
104
+ * if (extraction.status === 'completed') {
105
+ * console.log(extraction.markdown);
106
+ * console.log(extraction.pageMetadata);
107
+ * }
108
+ * ```
109
+ */
110
+ async get(request) {
111
+ const params = new URLSearchParams();
112
+ if (request.environment) params.set("environment", request.environment);
113
+ if (request.projectId) params.set("projectId", request.projectId);
114
+ const query = params.toString();
115
+ const path = `/webdata/extractions/${request.id}${query ? `?${query}` : ""}`;
116
+ const response = await this.http.get(path);
117
+ return this.convertDates(response);
118
+ }
119
+ /**
120
+ * List extractions with pagination and filters
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const { items, nextCursor } = await extraction.list({
125
+ * status: 'completed',
126
+ * limit: 20,
127
+ * });
128
+ * ```
129
+ */
130
+ async list(request = {}) {
131
+ const params = new URLSearchParams();
132
+ if (request.environment) params.set("environment", request.environment);
133
+ if (request.projectId) params.set("projectId", request.projectId);
134
+ if (request.status) params.set("status", request.status);
135
+ if (request.url) params.set("url", request.url);
136
+ if (request.limit) params.set("limit", request.limit.toString());
137
+ if (request.cursor) params.set("cursor", request.cursor);
138
+ const query = params.toString();
139
+ const response = await this.http.get(
140
+ `/webdata/extractions${query ? `?${query}` : ""}`
141
+ );
142
+ return {
143
+ ...response,
144
+ items: response.items.map((item) => this.convertDates(item))
145
+ };
146
+ }
147
+ /**
148
+ * Delete an extraction
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * await extraction.delete({ id: 'extraction-id' });
153
+ * ```
154
+ */
155
+ async delete(request) {
156
+ const params = new URLSearchParams();
157
+ if (request.environment) params.set("environment", request.environment);
158
+ if (request.projectId) params.set("projectId", request.projectId);
159
+ const query = params.toString();
160
+ return this.http.delete(
161
+ `/webdata/extractions/${request.id}${query ? `?${query}` : ""}`
162
+ );
163
+ }
164
+ /**
165
+ * Extract content and wait for completion
166
+ *
167
+ * @example
168
+ * ```typescript
169
+ * const extraction = await extraction.extractAndWait({
170
+ * url: 'https://example.com/article',
171
+ * mode: 'markdown',
172
+ * });
173
+ * console.log(extraction.markdown);
174
+ * ```
175
+ */
176
+ async extractAndWait(request, options = {}) {
177
+ const { pollInterval = 1e3, timeout = 6e4 } = options;
178
+ const startTime = Date.now();
179
+ const { id } = await this.extract(request);
180
+ while (Date.now() - startTime < timeout) {
181
+ const extraction = await this.get({
182
+ id,
183
+ environment: request.environment,
184
+ projectId: request.projectId
185
+ });
186
+ if (extraction.status === "completed" || extraction.status === "failed") {
187
+ if (extraction.status === "failed") {
188
+ throw new Error(extraction.error || "Extraction failed");
189
+ }
190
+ return extraction;
191
+ }
192
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
193
+ }
194
+ throw new Error("Extraction timed out");
195
+ }
196
+ // ==========================================================================
197
+ // BATCH JOBS
198
+ // ==========================================================================
199
+ /**
200
+ * Create a batch extraction job for multiple URLs
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * const { id, totalUrls } = await extraction.batch({
205
+ * urls: [
206
+ * 'https://example.com/article1',
207
+ * 'https://example.com/article2',
208
+ * ],
209
+ * config: { mode: 'markdown' },
210
+ * });
211
+ * ```
212
+ */
213
+ async batch(request) {
214
+ return this.http.post("/webdata/batch/extractions", request);
215
+ }
216
+ /**
217
+ * Get a batch job by ID
218
+ */
219
+ async getBatchJob(request) {
220
+ const params = new URLSearchParams();
221
+ if (request.environment) params.set("environment", request.environment);
222
+ if (request.projectId) params.set("projectId", request.projectId);
223
+ const query = params.toString();
224
+ const path = `/webdata/batch/${request.id}${query ? `?${query}` : ""}`;
225
+ const response = await this.http.get(path);
226
+ return this.convertBatchJobDates(response);
227
+ }
228
+ /**
229
+ * List batch jobs with pagination and filters
230
+ */
231
+ async listBatchJobs(request = {}) {
232
+ const params = new URLSearchParams();
233
+ if (request.environment) params.set("environment", request.environment);
234
+ if (request.projectId) params.set("projectId", request.projectId);
235
+ if (request.status) params.set("status", request.status);
236
+ params.set("type", "extraction");
237
+ if (request.limit) params.set("limit", request.limit.toString());
238
+ if (request.cursor) params.set("cursor", request.cursor);
239
+ const query = params.toString();
240
+ const response = await this.http.get(
241
+ `/webdata/batch${query ? `?${query}` : ""}`
242
+ );
243
+ return {
244
+ ...response,
245
+ items: response.items.map((item) => this.convertBatchJobDates(item))
246
+ };
247
+ }
248
+ /**
249
+ * Cancel a batch job
250
+ */
251
+ async cancelBatchJob(request) {
252
+ const params = new URLSearchParams();
253
+ if (request.environment) params.set("environment", request.environment);
254
+ if (request.projectId) params.set("projectId", request.projectId);
255
+ const query = params.toString();
256
+ return this.http.post(
257
+ `/webdata/batch/${request.id}/cancel${query ? `?${query}` : ""}`,
258
+ {}
259
+ );
260
+ }
261
+ /**
262
+ * Create a batch extraction job and wait for completion
263
+ */
264
+ async batchAndWait(request, options = {}) {
265
+ const { pollInterval = 2e3, timeout = 3e5 } = options;
266
+ const startTime = Date.now();
267
+ const { id } = await this.batch(request);
268
+ while (Date.now() - startTime < timeout) {
269
+ const job = await this.getBatchJob({
270
+ id,
271
+ environment: request.environment,
272
+ projectId: request.projectId
273
+ });
274
+ if (job.status === "completed" || job.status === "failed" || job.status === "cancelled") {
275
+ return job;
276
+ }
277
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
278
+ }
279
+ throw new Error("Batch job timed out");
280
+ }
281
+ // ==========================================================================
282
+ // SCHEDULES
283
+ // ==========================================================================
284
+ /**
285
+ * Create a scheduled extraction job
286
+ *
287
+ * @example
288
+ * ```typescript
289
+ * const { id } = await extraction.createSchedule({
290
+ * name: 'Daily price monitoring',
291
+ * url: 'https://competitor.com/pricing',
292
+ * frequency: 'daily',
293
+ * config: { mode: 'schema', schema: { ... } },
294
+ * });
295
+ * ```
296
+ */
297
+ async createSchedule(request) {
298
+ return this.http.post("/webdata/schedules", {
299
+ ...request,
300
+ type: "extraction"
301
+ });
302
+ }
303
+ /**
304
+ * Update a schedule
305
+ */
306
+ async updateSchedule(request) {
307
+ const { id, environment, projectId, ...data } = request;
308
+ const params = new URLSearchParams();
309
+ if (environment) params.set("environment", environment);
310
+ if (projectId) params.set("projectId", projectId);
311
+ const query = params.toString();
312
+ return this.http.post(
313
+ `/webdata/schedules/${id}${query ? `?${query}` : ""}`,
314
+ data
315
+ );
316
+ }
317
+ /**
318
+ * Get a schedule by ID
319
+ */
320
+ async getSchedule(request) {
321
+ const params = new URLSearchParams();
322
+ if (request.environment) params.set("environment", request.environment);
323
+ if (request.projectId) params.set("projectId", request.projectId);
324
+ const query = params.toString();
325
+ const path = `/webdata/schedules/${request.id}${query ? `?${query}` : ""}`;
326
+ const response = await this.http.get(path);
327
+ return this.convertScheduleDates(response);
328
+ }
329
+ /**
330
+ * List schedules with pagination and filters
331
+ */
332
+ async listSchedules(request = {}) {
333
+ const params = new URLSearchParams();
334
+ if (request.environment) params.set("environment", request.environment);
335
+ if (request.projectId) params.set("projectId", request.projectId);
336
+ params.set("type", "extraction");
337
+ if (request.isActive !== void 0) params.set("isActive", request.isActive.toString());
338
+ if (request.limit) params.set("limit", request.limit.toString());
339
+ if (request.cursor) params.set("cursor", request.cursor);
340
+ const query = params.toString();
341
+ const response = await this.http.get(
342
+ `/webdata/schedules${query ? `?${query}` : ""}`
343
+ );
344
+ return {
345
+ ...response,
346
+ items: response.items.map((item) => this.convertScheduleDates(item))
347
+ };
348
+ }
349
+ /**
350
+ * Delete a schedule
351
+ */
352
+ async deleteSchedule(request) {
353
+ const params = new URLSearchParams();
354
+ if (request.environment) params.set("environment", request.environment);
355
+ if (request.projectId) params.set("projectId", request.projectId);
356
+ const query = params.toString();
357
+ return this.http.delete(
358
+ `/webdata/schedules/${request.id}${query ? `?${query}` : ""}`
359
+ );
360
+ }
361
+ /**
362
+ * Toggle a schedule on or off
363
+ */
364
+ async toggleSchedule(request) {
365
+ const params = new URLSearchParams();
366
+ if (request.environment) params.set("environment", request.environment);
367
+ if (request.projectId) params.set("projectId", request.projectId);
368
+ const query = params.toString();
369
+ return this.http.post(
370
+ `/webdata/schedules/${request.id}/toggle${query ? `?${query}` : ""}`,
371
+ {}
372
+ );
373
+ }
374
+ // ==========================================================================
375
+ // USAGE
376
+ // ==========================================================================
377
+ /**
378
+ * Get usage statistics
379
+ *
380
+ * @example
381
+ * ```typescript
382
+ * const usage = await extraction.getUsage({
383
+ * periodStart: '2024-01-01T00:00:00Z',
384
+ * periodEnd: '2024-01-31T23:59:59Z',
385
+ * });
386
+ * console.log(`Extractions: ${usage.extractionsTotal}`);
387
+ * console.log(`Tokens used: ${usage.extractionTokensUsed}`);
388
+ * ```
389
+ */
390
+ async getUsage(request = {}) {
391
+ const params = new URLSearchParams();
392
+ if (request.environment) params.set("environment", request.environment);
393
+ if (request.periodStart) params.set("periodStart", request.periodStart);
394
+ if (request.periodEnd) params.set("periodEnd", request.periodEnd);
395
+ const query = params.toString();
396
+ const response = await this.http.get(
397
+ `/webdata/usage${query ? `?${query}` : ""}`
398
+ );
399
+ return this.convertUsageDates(response);
400
+ }
401
+ // ==========================================================================
402
+ // HELPERS
403
+ // ==========================================================================
404
+ convertDates(extraction) {
405
+ if (typeof extraction.createdAt === "string") {
406
+ extraction.createdAt = new Date(extraction.createdAt);
407
+ }
408
+ if (extraction.completedAt && typeof extraction.completedAt === "string") {
409
+ extraction.completedAt = new Date(extraction.completedAt);
410
+ }
411
+ return extraction;
412
+ }
413
+ convertBatchJobDates(job) {
414
+ if (typeof job.createdAt === "string") {
415
+ job.createdAt = new Date(job.createdAt);
416
+ }
417
+ if (job.startedAt && typeof job.startedAt === "string") {
418
+ job.startedAt = new Date(job.startedAt);
419
+ }
420
+ if (job.completedAt && typeof job.completedAt === "string") {
421
+ job.completedAt = new Date(job.completedAt);
422
+ }
423
+ return job;
424
+ }
425
+ convertScheduleDates(schedule) {
426
+ if (typeof schedule.createdAt === "string") {
427
+ schedule.createdAt = new Date(schedule.createdAt);
428
+ }
429
+ if (typeof schedule.updatedAt === "string") {
430
+ schedule.updatedAt = new Date(schedule.updatedAt);
431
+ }
432
+ if (schedule.lastRunAt && typeof schedule.lastRunAt === "string") {
433
+ schedule.lastRunAt = new Date(schedule.lastRunAt);
434
+ }
435
+ if (schedule.nextRunAt && typeof schedule.nextRunAt === "string") {
436
+ schedule.nextRunAt = new Date(schedule.nextRunAt);
437
+ }
438
+ return schedule;
439
+ }
440
+ convertUsageDates(usage) {
441
+ if (typeof usage.periodStart === "string") {
442
+ usage.periodStart = new Date(usage.periodStart);
443
+ }
444
+ if (typeof usage.periodEnd === "string") {
445
+ usage.periodEnd = new Date(usage.periodEnd);
446
+ }
447
+ return usage;
448
+ }
449
+ };
450
+
451
+ export { Extraction };
452
+ //# sourceMappingURL=index.mjs.map
453
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/http-client.ts","../../src/extraction/client.ts"],"names":[],"mappings":";AAUO,IAAM,aAAN,MAAiB;AAAA,EACd,MAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,2BAAA;AAAA,EACnC;AAAA,EAEQ,UAAA,GAAqC;AAC3C,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,KACtC;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,EAA4B;AACzE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAElC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS,KAAK,UAAA,EAAW;AAAA,QACzB,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,OACrC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,YAAA,IAAgB,KAAA,EAAO;AACnD,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,eAAA,EAAiB,KAAK,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,QAAA,EAAoC;AACpE,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAa,MAAM,SAAS,IAAA,EAAK;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,EAAE,OAAA,EAAS,QAAA,CAAS,UAAA,EAAW;AAAA,IAC7C;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,SAAA,EAAW,WAAW,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAKvE,IAAA,KAAA,CAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,IAAA,KAAA,CAAM,IAAA,GAAQ,WAAuD,IAAA,IAAQ,EAAA;AAC7E,IAAA,KAAA,CAAM,QAAA,GAAW,SAAA;AACjB,IAAA,MAAM,KAAA;AAAA,EACR;AAAA,EAEQ,WAAA,CAAY,SAAiB,KAAA,EAAwB;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAO,IAAA,EAA0B;AACrC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAA2B;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,IAAA,EAA2B;AACpD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,OAAU,IAAA,EAA0B;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,IAAI,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,KAAA,CAAS,IAAA,EAAc,IAAA,EAA2B;AACtD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,OAAA,EAAS,IAAA,EAAM,IAAI,CAAA;AAAA,EAC5C;AACF,CAAA;;;AC9DO,IAAM,aAAN,MAAiB;AAAA,EACd,IAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,QAAQ,OAAA,EAAqE;AACjF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA+B,sBAAA,EAAwB,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,IAAI,OAAA,EAA0D;AAClE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,IAAA,GAAO,wBAAwB,OAAA,CAAQ,EAAE,GAAG,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAE1E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAsB,IAAI,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,aAAa,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,IAAA,CAAK,OAAA,GAAkC,EAAC,EAAqC;AACjF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChE,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAI,QAAQ,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,QAAQ,GAAG,CAAA;AAC9C,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAC/D,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AAEvD,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,oBAAA,EAAuB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KACjD;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,KAAA,EAAO,SAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,YAAA,CAAa,IAAI,CAAC;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAO,OAAA,EAA8D;AACzE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,qBAAA,EAAwB,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,cAAA,CACJ,OAAA,EACA,OAAA,GAAuD,EAAC,EAC7B;AAC3B,IAAA,MAAM,EAAE,YAAA,GAAe,GAAA,EAAM,OAAA,GAAU,KAAM,GAAI,OAAA;AACjD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAEzC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,OAAA,EAAS;AACvC,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI;AAAA,QAChC,EAAA;AAAA,QACA,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,UAAA,CAAW,MAAA,KAAW,WAAA,IAAe,UAAA,CAAW,WAAW,QAAA,EAAU;AACvE,QAAA,IAAI,UAAA,CAAW,WAAW,QAAA,EAAU;AAClC,UAAA,MAAM,IAAI,KAAA,CAAM,UAAA,CAAW,KAAA,IAAS,mBAAmB,CAAA;AAAA,QACzD;AACA,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,MAAM,OAAA,EAAsE;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA0B,4BAAA,EAA8B,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAA0D;AAC1E,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,IAAA,GAAO,kBAAkB,OAAA,CAAQ,EAAE,GAAG,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAEpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwB,IAAI,CAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAyC;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChE,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACvD,IAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,YAAY,CAAA;AAC/B,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAC/D,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AAEvD,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KAC3C;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,KAAA,EAAO,SAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAC;AAAA,KACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAA4D;AAC/E,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,QAAQ,EAAE,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA,CAAA;AAAA,MAC9D;AAAC,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,OAAA,EACA,OAAA,GAAuD,EAAC,EAC3B;AAC7B,IAAA,MAAM,EAAE,YAAA,GAAe,GAAA,EAAM,OAAA,GAAU,KAAO,GAAI,OAAA;AAClD,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAY,OAAA,EAAS;AACvC,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,WAAA,CAAY;AAAA,QACjC,EAAA;AAAA,QACA,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAED,MAAA,IAAI,GAAA,CAAI,WAAW,WAAA,IAAe,GAAA,CAAI,WAAW,QAAA,IAAY,GAAA,CAAI,WAAW,WAAA,EAAa;AACvF,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,eAAe,OAAA,EAA2E;AAC9F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA6B,oBAAA,EAAsB;AAAA,MAClE,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAAyE;AAC5F,IAAA,MAAM,EAAE,EAAA,EAAI,WAAA,EAAa,SAAA,EAAW,GAAG,MAAK,GAAI,OAAA;AAEhD,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,WAAW,CAAA;AACtD,IAAA,IAAI,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAEhD,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,sBAAsB,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAA0D;AAC1E,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,IAAA,GAAO,sBAAsB,OAAA,CAAQ,EAAE,GAAG,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAExE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAwB,IAAI,CAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAyC;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAChE,IAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,YAAY,CAAA;AAC/B,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW,MAAA,CAAO,IAAI,UAAA,EAAY,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,CAAA;AACtF,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAC/D,IAAA,IAAI,QAAQ,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AAEvD,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,kBAAA,EAAqB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KAC/C;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,KAAA,EAAO,SAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAC;AAAA,KACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAA4D;AAC/E,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,MACf,CAAA,mBAAA,EAAsB,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAA6D;AAChF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,mBAAA,EAAsB,QAAQ,EAAE,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA,CAAA;AAAA,MAClE;AAAC,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,QAAA,CAAS,OAAA,GAA2B,EAAC,EAA6B;AACtE,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,QAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,QAAQ,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,QAAQ,SAAS,CAAA;AAEhE,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,EAAS;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC/B,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KAC3C;AAEA,IAAA,OAAO,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,UAAA,EAAgD;AACnE,IAAA,IAAI,OAAO,UAAA,CAAW,SAAA,KAAc,QAAA,EAAU;AAC5C,MAAA,UAAA,CAAW,SAAA,GAAY,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,UAAA,CAAW,WAAA,IAAe,OAAO,UAAA,CAAW,gBAAgB,QAAA,EAAU;AACxE,MAAA,UAAA,CAAW,WAAA,GAAc,IAAI,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,GAAA,EAA6C;AACxE,IAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,EAAU;AACrC,MAAA,GAAA,CAAI,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,OAAO,GAAA,CAAI,cAAc,QAAA,EAAU;AACtD,MAAA,GAAA,CAAI,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,GAAA,CAAI,WAAA,IAAe,OAAO,GAAA,CAAI,gBAAgB,QAAA,EAAU;AAC1D,MAAA,GAAA,CAAI,WAAA,GAAc,IAAI,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB,QAAA,EAAkD;AAC7E,IAAA,IAAI,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,EAAU;AAC1C,MAAA,QAAA,CAAS,SAAA,GAAY,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,OAAO,QAAA,CAAS,SAAA,KAAc,QAAA,EAAU;AAC1C,MAAA,QAAA,CAAS,SAAA,GAAY,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,QAAA,CAAS,SAAA,IAAa,OAAO,QAAA,CAAS,cAAc,QAAA,EAAU;AAChE,MAAA,QAAA,CAAS,SAAA,GAAY,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,QAAA,CAAS,SAAA,IAAa,OAAO,QAAA,CAAS,cAAc,QAAA,EAAU;AAChE,MAAA,QAAA,CAAS,SAAA,GAAY,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,KAAA,EAAyC;AACjE,IAAA,IAAI,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,EAAU;AACzC,MAAA,KAAA,CAAM,WAAA,GAAc,IAAI,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAAA,IAChD;AACA,IAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU;AACvC,MAAA,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF","file":"index.mjs","sourcesContent":["/**\n * HTTP client for Stack0 API\n * Handles authentication, request/response formatting, and error handling\n */\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: HttpClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || \"https://api.stack0.dev/v1\";\n }\n\n private getHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n };\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json();\n return data as T;\n } catch (error) {\n if (error instanceof Error && \"statusCode\" in error) {\n throw error; // Re-throw our custom errors\n }\n throw this.createError(\"Network error\", error);\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorBody: { message: string } | undefined;\n try {\n errorBody = (await response.json()) as { message: string };\n } catch {\n errorBody = { message: response.statusText };\n }\n\n const error = new Error(errorBody?.message || `HTTP ${response.status}`) as Error & {\n statusCode: number;\n code: string;\n response: unknown;\n };\n error.statusCode = response.status;\n error.code = (errorBody as unknown as { code: string } | undefined)?.code ?? \"\";\n error.response = errorBody;\n throw error;\n }\n\n private createError(message: string, cause?: unknown): Error {\n const error = new Error(message) as Error & { cause: unknown };\n error.cause = cause;\n return error;\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n async put<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PUT\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n}\n","/**\n * Stack0 AI Extraction Client\n * Extract structured data from any webpage using AI\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n CreateBatchResponse,\n GetBatchJobRequest,\n ListBatchJobsRequest,\n CreateScheduleResponse,\n GetScheduleRequest,\n ListSchedulesRequest,\n} from \"../lib/shared-types\";\nimport type {\n ExtractionResult,\n CreateExtractionRequest,\n CreateExtractionResponse,\n GetExtractionRequest,\n ListExtractionsRequest,\n ListExtractionsResponse,\n BatchExtractionJob,\n CreateBatchExtractionsRequest,\n ExtractionBatchJobsResponse,\n ExtractionSchedule,\n CreateExtractionScheduleRequest,\n UpdateExtractionScheduleRequest,\n ExtractionSchedulesResponse,\n ExtractionUsage,\n GetUsageRequest,\n} from \"./types\";\n\nexport class Extraction {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n // ==========================================================================\n // EXTRACTIONS\n // ==========================================================================\n\n /**\n * Extract content from a URL\n *\n * @example\n * ```typescript\n * const { id, status } = await extraction.extract({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * includeMetadata: true,\n * });\n *\n * // Poll for completion\n * const result = await extraction.get({ id });\n * console.log(result.markdown);\n * ```\n */\n async extract(request: CreateExtractionRequest): Promise<CreateExtractionResponse> {\n return this.http.post<CreateExtractionResponse>(\"/webdata/extractions\", request);\n }\n\n /**\n * Get an extraction by ID\n *\n * @example\n * ```typescript\n * const extraction = await extraction.get({ id: 'extraction-id' });\n * if (extraction.status === 'completed') {\n * console.log(extraction.markdown);\n * console.log(extraction.pageMetadata);\n * }\n * ```\n */\n async get(request: GetExtractionRequest): Promise<ExtractionResult> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/extractions/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<ExtractionResult>(path);\n return this.convertDates(response);\n }\n\n /**\n * List extractions with pagination and filters\n *\n * @example\n * ```typescript\n * const { items, nextCursor } = await extraction.list({\n * status: 'completed',\n * limit: 20,\n * });\n * ```\n */\n async list(request: ListExtractionsRequest = {}): Promise<ListExtractionsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.url) params.set(\"url\", request.url);\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ListExtractionsResponse>(\n `/webdata/extractions${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertDates(item)),\n };\n }\n\n /**\n * Delete an extraction\n *\n * @example\n * ```typescript\n * await extraction.delete({ id: 'extraction-id' });\n * ```\n */\n async delete(request: GetExtractionRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(\n `/webdata/extractions/${request.id}${query ? `?${query}` : \"\"}`\n );\n }\n\n /**\n * Extract content and wait for completion\n *\n * @example\n * ```typescript\n * const extraction = await extraction.extractAndWait({\n * url: 'https://example.com/article',\n * mode: 'markdown',\n * });\n * console.log(extraction.markdown);\n * ```\n */\n async extractAndWait(\n request: CreateExtractionRequest,\n options: { pollInterval?: number; timeout?: number } = {}\n ): Promise<ExtractionResult> {\n const { pollInterval = 1000, timeout = 60000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.extract(request);\n\n while (Date.now() - startTime < timeout) {\n const extraction = await this.get({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (extraction.status === \"completed\" || extraction.status === \"failed\") {\n if (extraction.status === \"failed\") {\n throw new Error(extraction.error || \"Extraction failed\");\n }\n return extraction;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Extraction timed out\");\n }\n\n // ==========================================================================\n // BATCH JOBS\n // ==========================================================================\n\n /**\n * Create a batch extraction job for multiple URLs\n *\n * @example\n * ```typescript\n * const { id, totalUrls } = await extraction.batch({\n * urls: [\n * 'https://example.com/article1',\n * 'https://example.com/article2',\n * ],\n * config: { mode: 'markdown' },\n * });\n * ```\n */\n async batch(request: CreateBatchExtractionsRequest): Promise<CreateBatchResponse> {\n return this.http.post<CreateBatchResponse>(\"/webdata/batch/extractions\", request);\n }\n\n /**\n * Get a batch job by ID\n */\n async getBatchJob(request: GetBatchJobRequest): Promise<BatchExtractionJob> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/batch/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<BatchExtractionJob>(path);\n return this.convertBatchJobDates(response);\n }\n\n /**\n * List batch jobs with pagination and filters\n */\n async listBatchJobs(request: ListBatchJobsRequest = {}): Promise<ExtractionBatchJobsResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n params.set(\"type\", \"extraction\");\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ExtractionBatchJobsResponse>(\n `/webdata/batch${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertBatchJobDates(item)),\n };\n }\n\n /**\n * Cancel a batch job\n */\n async cancelBatchJob(request: GetBatchJobRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.post<{ success: boolean }>(\n `/webdata/batch/${request.id}/cancel${query ? `?${query}` : \"\"}`,\n {}\n );\n }\n\n /**\n * Create a batch extraction job and wait for completion\n */\n async batchAndWait(\n request: CreateBatchExtractionsRequest,\n options: { pollInterval?: number; timeout?: number } = {}\n ): Promise<BatchExtractionJob> {\n const { pollInterval = 2000, timeout = 300000 } = options;\n const startTime = Date.now();\n\n const { id } = await this.batch(request);\n\n while (Date.now() - startTime < timeout) {\n const job = await this.getBatchJob({\n id,\n environment: request.environment,\n projectId: request.projectId,\n });\n\n if (job.status === \"completed\" || job.status === \"failed\" || job.status === \"cancelled\") {\n return job;\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error(\"Batch job timed out\");\n }\n\n // ==========================================================================\n // SCHEDULES\n // ==========================================================================\n\n /**\n * Create a scheduled extraction job\n *\n * @example\n * ```typescript\n * const { id } = await extraction.createSchedule({\n * name: 'Daily price monitoring',\n * url: 'https://competitor.com/pricing',\n * frequency: 'daily',\n * config: { mode: 'schema', schema: { ... } },\n * });\n * ```\n */\n async createSchedule(request: CreateExtractionScheduleRequest): Promise<CreateScheduleResponse> {\n return this.http.post<CreateScheduleResponse>(\"/webdata/schedules\", {\n ...request,\n type: \"extraction\",\n });\n }\n\n /**\n * Update a schedule\n */\n async updateSchedule(request: UpdateExtractionScheduleRequest): Promise<{ success: boolean }> {\n const { id, environment, projectId, ...data } = request;\n\n const params = new URLSearchParams();\n if (environment) params.set(\"environment\", environment);\n if (projectId) params.set(\"projectId\", projectId);\n\n const query = params.toString();\n return this.http.post<{ success: boolean }>(\n `/webdata/schedules/${id}${query ? `?${query}` : \"\"}`,\n data\n );\n }\n\n /**\n * Get a schedule by ID\n */\n async getSchedule(request: GetScheduleRequest): Promise<ExtractionSchedule> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n const path = `/webdata/schedules/${request.id}${query ? `?${query}` : \"\"}`;\n\n const response = await this.http.get<ExtractionSchedule>(path);\n return this.convertScheduleDates(response);\n }\n\n /**\n * List schedules with pagination and filters\n */\n async listSchedules(request: ListSchedulesRequest = {}): Promise<ExtractionSchedulesResponse> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n params.set(\"type\", \"extraction\");\n if (request.isActive !== undefined) params.set(\"isActive\", request.isActive.toString());\n if (request.limit) params.set(\"limit\", request.limit.toString());\n if (request.cursor) params.set(\"cursor\", request.cursor);\n\n const query = params.toString();\n const response = await this.http.get<ExtractionSchedulesResponse>(\n `/webdata/schedules${query ? `?${query}` : \"\"}`\n );\n\n return {\n ...response,\n items: response.items.map((item) => this.convertScheduleDates(item)),\n };\n }\n\n /**\n * Delete a schedule\n */\n async deleteSchedule(request: GetScheduleRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.delete<{ success: boolean }>(\n `/webdata/schedules/${request.id}${query ? `?${query}` : \"\"}`\n );\n }\n\n /**\n * Toggle a schedule on or off\n */\n async toggleSchedule(request: GetScheduleRequest): Promise<{ isActive: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n\n const query = params.toString();\n return this.http.post<{ isActive: boolean }>(\n `/webdata/schedules/${request.id}/toggle${query ? `?${query}` : \"\"}`,\n {}\n );\n }\n\n // ==========================================================================\n // USAGE\n // ==========================================================================\n\n /**\n * Get usage statistics\n *\n * @example\n * ```typescript\n * const usage = await extraction.getUsage({\n * periodStart: '2024-01-01T00:00:00Z',\n * periodEnd: '2024-01-31T23:59:59Z',\n * });\n * console.log(`Extractions: ${usage.extractionsTotal}`);\n * console.log(`Tokens used: ${usage.extractionTokensUsed}`);\n * ```\n */\n async getUsage(request: GetUsageRequest = {}): Promise<ExtractionUsage> {\n const params = new URLSearchParams();\n\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.periodStart) params.set(\"periodStart\", request.periodStart);\n if (request.periodEnd) params.set(\"periodEnd\", request.periodEnd);\n\n const query = params.toString();\n const response = await this.http.get<ExtractionUsage>(\n `/webdata/usage${query ? `?${query}` : \"\"}`\n );\n\n return this.convertUsageDates(response);\n }\n\n // ==========================================================================\n // HELPERS\n // ==========================================================================\n\n private convertDates(extraction: ExtractionResult): ExtractionResult {\n if (typeof extraction.createdAt === \"string\") {\n extraction.createdAt = new Date(extraction.createdAt);\n }\n if (extraction.completedAt && typeof extraction.completedAt === \"string\") {\n extraction.completedAt = new Date(extraction.completedAt);\n }\n return extraction;\n }\n\n private convertBatchJobDates(job: BatchExtractionJob): BatchExtractionJob {\n if (typeof job.createdAt === \"string\") {\n job.createdAt = new Date(job.createdAt);\n }\n if (job.startedAt && typeof job.startedAt === \"string\") {\n job.startedAt = new Date(job.startedAt);\n }\n if (job.completedAt && typeof job.completedAt === \"string\") {\n job.completedAt = new Date(job.completedAt);\n }\n return job;\n }\n\n private convertScheduleDates(schedule: ExtractionSchedule): ExtractionSchedule {\n if (typeof schedule.createdAt === \"string\") {\n schedule.createdAt = new Date(schedule.createdAt);\n }\n if (typeof schedule.updatedAt === \"string\") {\n schedule.updatedAt = new Date(schedule.updatedAt);\n }\n if (schedule.lastRunAt && typeof schedule.lastRunAt === \"string\") {\n schedule.lastRunAt = new Date(schedule.lastRunAt);\n }\n if (schedule.nextRunAt && typeof schedule.nextRunAt === \"string\") {\n schedule.nextRunAt = new Date(schedule.nextRunAt);\n }\n return schedule;\n }\n\n private convertUsageDates(usage: ExtractionUsage): ExtractionUsage {\n if (typeof usage.periodStart === \"string\") {\n usage.periodStart = new Date(usage.periodStart);\n }\n if (typeof usage.periodEnd === \"string\") {\n usage.periodEnd = new Date(usage.periodEnd);\n }\n return usage;\n }\n}\n"]}
package/dist/index.d.mts CHANGED
@@ -2,9 +2,13 @@ import { Mail } from './mail/index.mjs';
2
2
  export { Attachment, EmailAddress, EmailRecipient, GetEmailResponse, SendEmailRequest, SendEmailResponse, Stack0Error } from './mail/index.mjs';
3
3
  import { CDN } from './cdn/index.mjs';
4
4
  export { Asset, AssetStatus, AssetType, ConfirmUploadRequest, ConfirmUploadResponse, CreateFolderRequest, DeleteAssetRequest, DeleteAssetsRequest, DeleteAssetsResponse, Folder, FolderTreeNode, GetAssetRequest, GetFolderTreeRequest, GetTransformUrlRequest, GetTransformUrlResponse, ListAssetsRequest, ListAssetsResponse, MoveAssetsRequest, MoveAssetsResponse, TransformOptions, UpdateAssetRequest, UploadUrlRequest, UploadUrlResponse } from './cdn/index.mjs';
5
+ import { Screenshots } from './screenshots/index.mjs';
6
+ export { BatchScreenshotJob, Clip, CreateBatchScreenshotsRequest, CreateScreenshotRequest, CreateScreenshotResponse, CreateScreenshotScheduleRequest, DeviceType, GetScreenshotRequest, ListScreenshotsRequest, ListScreenshotsResponse, ResourceType, Screenshot, ScreenshotBatchJobsResponse, ScreenshotFormat, ScreenshotSchedule, ScreenshotSchedulesResponse, ScreenshotStatus, UpdateScreenshotScheduleRequest } from './screenshots/index.mjs';
7
+ import { Extraction } from './extraction/index.mjs';
8
+ export { BatchExtractionJob, CreateBatchExtractionsRequest, CreateExtractionRequest, CreateExtractionResponse, CreateExtractionScheduleRequest, ExtractionBatchJobsResponse, ExtractionMode, ExtractionResult, ExtractionSchedule, ExtractionSchedulesResponse, ExtractionStatus, ExtractionUsage, GetExtractionRequest, GetUsageRequest, ListExtractionsRequest, ListExtractionsResponse, PageMetadata, UpdateExtractionScheduleRequest } from './extraction/index.mjs';
5
9
  import { Webdata } from './webdata/index.mjs';
6
- export { BatchJob, BatchJobStatus, BatchJobType, Clip, CreateBatchExtractionsRequest, CreateBatchResponse, CreateBatchScreenshotsRequest, CreateExtractionRequest, CreateExtractionResponse, CreateScheduleRequest, CreateScheduleResponse, CreateScreenshotRequest, CreateScreenshotResponse, DeviceType, Environment, Extraction, ExtractionMode, ExtractionStatus, GetBatchJobRequest, GetExtractionRequest, GetScheduleRequest, GetScreenshotRequest, GetUsageRequest, ListBatchJobsRequest, ListBatchJobsResponse, ListExtractionsRequest, ListExtractionsResponse, ListSchedulesRequest, ListSchedulesResponse, ListScreenshotsRequest, ListScreenshotsResponse, PageMetadata, ResourceType, Schedule, ScheduleFrequency, ScheduleType, Screenshot, ScreenshotFormat, ScreenshotStatus, UpdateScheduleRequest, Usage } from './webdata/index.mjs';
7
10
  import { H as HttpClientConfig } from './http-client-Wr9lXo9_.mjs';
11
+ export { B as BatchJobStatus, C as CreateBatchResponse, c as CreateScheduleResponse, E as Environment, G as GetBatchJobRequest, a as GetScheduleRequest, L as ListBatchJobsRequest, b as ListSchedulesRequest, S as ScheduleFrequency } from './shared-types-B0PyC7cF.mjs';
8
12
 
9
13
  /**
10
14
  * Stack0 SDK
@@ -33,14 +37,14 @@ import { H as HttpClientConfig } from './http-client-Wr9lXo9_.mjs';
33
37
  * });
34
38
  *
35
39
  * // Capture a screenshot
36
- * const screenshot = await stack0.webdata.screenshotAndWait({
40
+ * const screenshot = await stack0.screenshots.captureAndWait({
37
41
  * url: 'https://example.com',
38
42
  * format: 'png',
39
43
  * fullPage: true,
40
44
  * });
41
45
  *
42
46
  * // Extract content from a page
43
- * const extraction = await stack0.webdata.extractAndWait({
47
+ * const extraction = await stack0.extraction.extractAndWait({
44
48
  * url: 'https://example.com/article',
45
49
  * mode: 'markdown',
46
50
  * });
@@ -58,8 +62,13 @@ interface Stack0Config extends HttpClientConfig {
58
62
  declare class Stack0 {
59
63
  mail: Mail;
60
64
  cdn: CDN;
65
+ screenshots: Screenshots;
66
+ extraction: Extraction;
67
+ /**
68
+ * @deprecated Use `screenshots` and `extraction` instead. Will be removed in a future version.
69
+ */
61
70
  webdata: Webdata;
62
71
  constructor(config: Stack0Config);
63
72
  }
64
73
 
65
- export { CDN, Mail, Stack0, type Stack0Config, Webdata, Stack0 as default };
74
+ export { CDN, Extraction, Mail, Screenshots, Stack0, type Stack0Config, Webdata, Stack0 as default };
package/dist/index.d.ts CHANGED
@@ -2,9 +2,13 @@ import { Mail } from './mail/index.js';
2
2
  export { Attachment, EmailAddress, EmailRecipient, GetEmailResponse, SendEmailRequest, SendEmailResponse, Stack0Error } from './mail/index.js';
3
3
  import { CDN } from './cdn/index.js';
4
4
  export { Asset, AssetStatus, AssetType, ConfirmUploadRequest, ConfirmUploadResponse, CreateFolderRequest, DeleteAssetRequest, DeleteAssetsRequest, DeleteAssetsResponse, Folder, FolderTreeNode, GetAssetRequest, GetFolderTreeRequest, GetTransformUrlRequest, GetTransformUrlResponse, ListAssetsRequest, ListAssetsResponse, MoveAssetsRequest, MoveAssetsResponse, TransformOptions, UpdateAssetRequest, UploadUrlRequest, UploadUrlResponse } from './cdn/index.js';
5
+ import { Screenshots } from './screenshots/index.js';
6
+ export { BatchScreenshotJob, Clip, CreateBatchScreenshotsRequest, CreateScreenshotRequest, CreateScreenshotResponse, CreateScreenshotScheduleRequest, DeviceType, GetScreenshotRequest, ListScreenshotsRequest, ListScreenshotsResponse, ResourceType, Screenshot, ScreenshotBatchJobsResponse, ScreenshotFormat, ScreenshotSchedule, ScreenshotSchedulesResponse, ScreenshotStatus, UpdateScreenshotScheduleRequest } from './screenshots/index.js';
7
+ import { Extraction } from './extraction/index.js';
8
+ export { BatchExtractionJob, CreateBatchExtractionsRequest, CreateExtractionRequest, CreateExtractionResponse, CreateExtractionScheduleRequest, ExtractionBatchJobsResponse, ExtractionMode, ExtractionResult, ExtractionSchedule, ExtractionSchedulesResponse, ExtractionStatus, ExtractionUsage, GetExtractionRequest, GetUsageRequest, ListExtractionsRequest, ListExtractionsResponse, PageMetadata, UpdateExtractionScheduleRequest } from './extraction/index.js';
5
9
  import { Webdata } from './webdata/index.js';
6
- export { BatchJob, BatchJobStatus, BatchJobType, Clip, CreateBatchExtractionsRequest, CreateBatchResponse, CreateBatchScreenshotsRequest, CreateExtractionRequest, CreateExtractionResponse, CreateScheduleRequest, CreateScheduleResponse, CreateScreenshotRequest, CreateScreenshotResponse, DeviceType, Environment, Extraction, ExtractionMode, ExtractionStatus, GetBatchJobRequest, GetExtractionRequest, GetScheduleRequest, GetScreenshotRequest, GetUsageRequest, ListBatchJobsRequest, ListBatchJobsResponse, ListExtractionsRequest, ListExtractionsResponse, ListSchedulesRequest, ListSchedulesResponse, ListScreenshotsRequest, ListScreenshotsResponse, PageMetadata, ResourceType, Schedule, ScheduleFrequency, ScheduleType, Screenshot, ScreenshotFormat, ScreenshotStatus, UpdateScheduleRequest, Usage } from './webdata/index.js';
7
10
  import { H as HttpClientConfig } from './http-client-Wr9lXo9_.js';
11
+ export { B as BatchJobStatus, C as CreateBatchResponse, c as CreateScheduleResponse, E as Environment, G as GetBatchJobRequest, a as GetScheduleRequest, L as ListBatchJobsRequest, b as ListSchedulesRequest, S as ScheduleFrequency } from './shared-types-B0PyC7cF.js';
8
12
 
9
13
  /**
10
14
  * Stack0 SDK
@@ -33,14 +37,14 @@ import { H as HttpClientConfig } from './http-client-Wr9lXo9_.js';
33
37
  * });
34
38
  *
35
39
  * // Capture a screenshot
36
- * const screenshot = await stack0.webdata.screenshotAndWait({
40
+ * const screenshot = await stack0.screenshots.captureAndWait({
37
41
  * url: 'https://example.com',
38
42
  * format: 'png',
39
43
  * fullPage: true,
40
44
  * });
41
45
  *
42
46
  * // Extract content from a page
43
- * const extraction = await stack0.webdata.extractAndWait({
47
+ * const extraction = await stack0.extraction.extractAndWait({
44
48
  * url: 'https://example.com/article',
45
49
  * mode: 'markdown',
46
50
  * });
@@ -58,8 +62,13 @@ interface Stack0Config extends HttpClientConfig {
58
62
  declare class Stack0 {
59
63
  mail: Mail;
60
64
  cdn: CDN;
65
+ screenshots: Screenshots;
66
+ extraction: Extraction;
67
+ /**
68
+ * @deprecated Use `screenshots` and `extraction` instead. Will be removed in a future version.
69
+ */
61
70
  webdata: Webdata;
62
71
  constructor(config: Stack0Config);
63
72
  }
64
73
 
65
- export { CDN, Mail, Stack0, type Stack0Config, Webdata, Stack0 as default };
74
+ export { CDN, Extraction, Mail, Screenshots, Stack0, type Stack0Config, Webdata, Stack0 as default };