@stack0/sdk 0.5.11 → 0.5.14

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 (43) hide show
  1. package/dist/cdn/index.d.mts +62 -3
  2. package/dist/cdn/index.d.ts +62 -3
  3. package/dist/cdn/index.js +16 -0
  4. package/dist/cdn/index.js.map +1 -1
  5. package/dist/cdn/index.mjs +16 -0
  6. package/dist/cdn/index.mjs.map +1 -1
  7. package/dist/crawl/index.d.mts +206 -0
  8. package/dist/crawl/index.d.ts +206 -0
  9. package/dist/crawl/index.js +179 -0
  10. package/dist/crawl/index.js.map +1 -0
  11. package/dist/crawl/index.mjs +176 -0
  12. package/dist/crawl/index.mjs.map +1 -0
  13. package/dist/documents/index.d.mts +84 -0
  14. package/dist/documents/index.d.ts +84 -0
  15. package/dist/documents/index.js +144 -0
  16. package/dist/documents/index.js.map +1 -0
  17. package/dist/documents/index.mjs +142 -0
  18. package/dist/documents/index.mjs.map +1 -0
  19. package/dist/extraction/index.d.mts +1 -1
  20. package/dist/extraction/index.d.ts +1 -1
  21. package/dist/index.d.mts +40 -410
  22. package/dist/index.d.ts +40 -410
  23. package/dist/index.js +323 -271
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +319 -268
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/mail/index.d.mts +35 -2
  28. package/dist/mail/index.d.ts +35 -2
  29. package/dist/mail/index.js +46 -0
  30. package/dist/mail/index.js.map +1 -1
  31. package/dist/mail/index.mjs +46 -0
  32. package/dist/mail/index.mjs.map +1 -1
  33. package/dist/map/index.d.mts +93 -0
  34. package/dist/map/index.d.ts +93 -0
  35. package/dist/map/index.js +151 -0
  36. package/dist/map/index.js.map +1 -0
  37. package/dist/map/index.mjs +148 -0
  38. package/dist/map/index.mjs.map +1 -0
  39. package/dist/screenshots/index.d.mts +1 -1
  40. package/dist/screenshots/index.d.ts +1 -1
  41. package/dist/{shared-types-CjKSP5Xc.d.mts → shared-types-DKqZbnMq.d.mts} +1 -1
  42. package/dist/{shared-types-CjKSP5Xc.d.ts → shared-types-DKqZbnMq.d.ts} +1 -1
  43. package/package.json +21 -4
@@ -0,0 +1,206 @@
1
+ import { a as HttpClientConfig } from '../http-client-Cgie_Rv6.mjs';
2
+ import { E as Environment } from '../shared-types-DKqZbnMq.mjs';
3
+
4
+ type CrawlStatus = "pending" | "processing" | "completed" | "failed" | "cancelled";
5
+ type ScrapeActionType = "click" | "type" | "press" | "scroll" | "wait" | "screenshot" | "execute_js" | "extract";
6
+ type ScrapeAction = {
7
+ type: "click";
8
+ selector: string;
9
+ waitAfter?: number;
10
+ } | {
11
+ type: "type";
12
+ selector: string;
13
+ text: string;
14
+ delay?: number;
15
+ } | {
16
+ type: "press";
17
+ key: string;
18
+ } | {
19
+ type: "scroll";
20
+ direction?: "up" | "down";
21
+ pixels?: number;
22
+ } | {
23
+ type: "wait";
24
+ selector?: string;
25
+ timeout?: number;
26
+ } | {
27
+ type: "screenshot";
28
+ fullPage?: boolean;
29
+ } | {
30
+ type: "execute_js";
31
+ script: string;
32
+ } | {
33
+ type: "extract";
34
+ schema?: Record<string, unknown>;
35
+ prompt?: string;
36
+ };
37
+ type ProxyType = "none" | "auto" | "residential" | "datacenter";
38
+ type ScrapeFormat = "markdown" | "html" | "rawHtml" | "links" | "screenshot" | "metadata" | "extract";
39
+ interface ScrapeOptions {
40
+ formats?: ScrapeFormat[];
41
+ onlyMainContent?: boolean;
42
+ includeLinks?: boolean;
43
+ includeImages?: boolean;
44
+ includeMetadata?: boolean;
45
+ waitForSelector?: string;
46
+ waitForTimeout?: number;
47
+ actions?: ScrapeAction[];
48
+ headers?: Record<string, string>;
49
+ cookies?: Array<{
50
+ name: string;
51
+ value: string;
52
+ domain?: string;
53
+ }>;
54
+ proxy?: ProxyType;
55
+ proxyLocation?: string;
56
+ stealth?: boolean;
57
+ extractSchema?: Record<string, unknown>;
58
+ extractPrompt?: string;
59
+ }
60
+ interface CreateCrawlRequest {
61
+ environment?: Environment;
62
+ projectId?: string;
63
+ url: string;
64
+ maxDepth?: number;
65
+ maxPages?: number;
66
+ limit?: number;
67
+ includePaths?: string[];
68
+ excludePaths?: string[];
69
+ allowSubdomains?: boolean;
70
+ allowBackwardLinks?: boolean;
71
+ respectRobotsTxt?: boolean;
72
+ scrapeOptions?: ScrapeOptions;
73
+ formats?: Array<"markdown" | "html" | "links" | "screenshot">;
74
+ proxy?: ProxyType;
75
+ proxyLocation?: string;
76
+ stealth?: boolean;
77
+ webhookUrl?: string;
78
+ webhookSecret?: string;
79
+ metadata?: Record<string, unknown>;
80
+ }
81
+ interface CreateCrawlResponse {
82
+ id: string;
83
+ status: CrawlStatus;
84
+ }
85
+ interface CrawlPage {
86
+ id: string;
87
+ crawlId: string;
88
+ url: string;
89
+ depth: number;
90
+ status: "pending" | "processing" | "completed" | "failed";
91
+ markdown?: string;
92
+ html?: string;
93
+ links?: string[];
94
+ pageMetadata?: Record<string, unknown>;
95
+ screenshotUrl?: string;
96
+ error?: string;
97
+ processingTimeMs?: number;
98
+ createdAt: Date | string;
99
+ completedAt?: Date | string;
100
+ }
101
+ interface Crawl {
102
+ id: string;
103
+ organizationId: string;
104
+ projectId?: string;
105
+ environment: Environment;
106
+ url: string;
107
+ maxDepth: number;
108
+ maxPages: number;
109
+ includePaths?: string[];
110
+ excludePaths?: string[];
111
+ allowSubdomains: boolean;
112
+ respectRobotsTxt: boolean;
113
+ formats: string[];
114
+ proxy: ProxyType;
115
+ stealth: boolean;
116
+ status: CrawlStatus;
117
+ pagesDiscovered: number;
118
+ pagesScraped: number;
119
+ pagesFailed: number;
120
+ error?: string;
121
+ pages?: CrawlPage[];
122
+ createdAt: Date | string;
123
+ startedAt?: Date | string;
124
+ completedAt?: Date | string;
125
+ }
126
+ interface GetCrawlRequest {
127
+ id: string;
128
+ environment?: Environment;
129
+ projectId?: string;
130
+ includePages?: boolean;
131
+ }
132
+ interface ListCrawlsRequest {
133
+ environment?: Environment;
134
+ projectId?: string;
135
+ status?: CrawlStatus;
136
+ url?: string;
137
+ limit?: number;
138
+ cursor?: string;
139
+ }
140
+ interface ListCrawlsResponse {
141
+ items: Crawl[];
142
+ nextCursor?: string;
143
+ }
144
+ interface ListCrawlPagesRequest {
145
+ crawlId: string;
146
+ environment?: Environment;
147
+ projectId?: string;
148
+ limit?: number;
149
+ cursor?: string;
150
+ }
151
+ interface ListCrawlPagesResponse {
152
+ items: CrawlPage[];
153
+ nextCursor?: string;
154
+ }
155
+ interface CancelCrawlRequest {
156
+ id: string;
157
+ environment?: Environment;
158
+ projectId?: string;
159
+ }
160
+
161
+ /**
162
+ * Stack0 Crawl Client
163
+ * Recursively crawl a website and extract content from every page.
164
+ */
165
+
166
+ declare class Crawl$ {
167
+ private http;
168
+ constructor(config: HttpClientConfig);
169
+ /**
170
+ * Start a crawl.
171
+ *
172
+ * @example
173
+ * ```typescript
174
+ * const { id } = await stack0.crawl.start({
175
+ * url: 'https://docs.example.com',
176
+ * maxDepth: 3,
177
+ * maxPages: 200,
178
+ * formats: ['markdown', 'links'],
179
+ * });
180
+ * ```
181
+ */
182
+ start(request: CreateCrawlRequest): Promise<CreateCrawlResponse>;
183
+ /**
184
+ * Get a crawl by ID. Pass `includePages: true` to include the scraped pages.
185
+ */
186
+ get(request: GetCrawlRequest): Promise<Crawl>;
187
+ list(request?: ListCrawlsRequest): Promise<ListCrawlsResponse>;
188
+ listPages(request: ListCrawlPagesRequest): Promise<ListCrawlPagesResponse>;
189
+ cancel(request: CancelCrawlRequest): Promise<{
190
+ success: boolean;
191
+ }>;
192
+ delete(request: CancelCrawlRequest): Promise<{
193
+ success: boolean;
194
+ }>;
195
+ /**
196
+ * Start a crawl and poll until it completes. Returns the full Crawl record
197
+ * with pages included.
198
+ */
199
+ startAndWait(request: CreateCrawlRequest, options?: {
200
+ pollInterval?: number;
201
+ timeout?: number;
202
+ includePages?: boolean;
203
+ }): Promise<Crawl>;
204
+ }
205
+
206
+ export { type CancelCrawlRequest, Crawl$ as Crawl, Crawl$, type CrawlPage, type CrawlStatus, type CreateCrawlRequest, type CreateCrawlResponse, type GetCrawlRequest, type ListCrawlPagesRequest, type ListCrawlPagesResponse, type ListCrawlsRequest, type ListCrawlsResponse, type ProxyType, type ScrapeAction, type ScrapeActionType, type ScrapeFormat, type ScrapeOptions };
@@ -0,0 +1,206 @@
1
+ import { a as HttpClientConfig } from '../http-client-Cgie_Rv6.js';
2
+ import { E as Environment } from '../shared-types-DKqZbnMq.js';
3
+
4
+ type CrawlStatus = "pending" | "processing" | "completed" | "failed" | "cancelled";
5
+ type ScrapeActionType = "click" | "type" | "press" | "scroll" | "wait" | "screenshot" | "execute_js" | "extract";
6
+ type ScrapeAction = {
7
+ type: "click";
8
+ selector: string;
9
+ waitAfter?: number;
10
+ } | {
11
+ type: "type";
12
+ selector: string;
13
+ text: string;
14
+ delay?: number;
15
+ } | {
16
+ type: "press";
17
+ key: string;
18
+ } | {
19
+ type: "scroll";
20
+ direction?: "up" | "down";
21
+ pixels?: number;
22
+ } | {
23
+ type: "wait";
24
+ selector?: string;
25
+ timeout?: number;
26
+ } | {
27
+ type: "screenshot";
28
+ fullPage?: boolean;
29
+ } | {
30
+ type: "execute_js";
31
+ script: string;
32
+ } | {
33
+ type: "extract";
34
+ schema?: Record<string, unknown>;
35
+ prompt?: string;
36
+ };
37
+ type ProxyType = "none" | "auto" | "residential" | "datacenter";
38
+ type ScrapeFormat = "markdown" | "html" | "rawHtml" | "links" | "screenshot" | "metadata" | "extract";
39
+ interface ScrapeOptions {
40
+ formats?: ScrapeFormat[];
41
+ onlyMainContent?: boolean;
42
+ includeLinks?: boolean;
43
+ includeImages?: boolean;
44
+ includeMetadata?: boolean;
45
+ waitForSelector?: string;
46
+ waitForTimeout?: number;
47
+ actions?: ScrapeAction[];
48
+ headers?: Record<string, string>;
49
+ cookies?: Array<{
50
+ name: string;
51
+ value: string;
52
+ domain?: string;
53
+ }>;
54
+ proxy?: ProxyType;
55
+ proxyLocation?: string;
56
+ stealth?: boolean;
57
+ extractSchema?: Record<string, unknown>;
58
+ extractPrompt?: string;
59
+ }
60
+ interface CreateCrawlRequest {
61
+ environment?: Environment;
62
+ projectId?: string;
63
+ url: string;
64
+ maxDepth?: number;
65
+ maxPages?: number;
66
+ limit?: number;
67
+ includePaths?: string[];
68
+ excludePaths?: string[];
69
+ allowSubdomains?: boolean;
70
+ allowBackwardLinks?: boolean;
71
+ respectRobotsTxt?: boolean;
72
+ scrapeOptions?: ScrapeOptions;
73
+ formats?: Array<"markdown" | "html" | "links" | "screenshot">;
74
+ proxy?: ProxyType;
75
+ proxyLocation?: string;
76
+ stealth?: boolean;
77
+ webhookUrl?: string;
78
+ webhookSecret?: string;
79
+ metadata?: Record<string, unknown>;
80
+ }
81
+ interface CreateCrawlResponse {
82
+ id: string;
83
+ status: CrawlStatus;
84
+ }
85
+ interface CrawlPage {
86
+ id: string;
87
+ crawlId: string;
88
+ url: string;
89
+ depth: number;
90
+ status: "pending" | "processing" | "completed" | "failed";
91
+ markdown?: string;
92
+ html?: string;
93
+ links?: string[];
94
+ pageMetadata?: Record<string, unknown>;
95
+ screenshotUrl?: string;
96
+ error?: string;
97
+ processingTimeMs?: number;
98
+ createdAt: Date | string;
99
+ completedAt?: Date | string;
100
+ }
101
+ interface Crawl {
102
+ id: string;
103
+ organizationId: string;
104
+ projectId?: string;
105
+ environment: Environment;
106
+ url: string;
107
+ maxDepth: number;
108
+ maxPages: number;
109
+ includePaths?: string[];
110
+ excludePaths?: string[];
111
+ allowSubdomains: boolean;
112
+ respectRobotsTxt: boolean;
113
+ formats: string[];
114
+ proxy: ProxyType;
115
+ stealth: boolean;
116
+ status: CrawlStatus;
117
+ pagesDiscovered: number;
118
+ pagesScraped: number;
119
+ pagesFailed: number;
120
+ error?: string;
121
+ pages?: CrawlPage[];
122
+ createdAt: Date | string;
123
+ startedAt?: Date | string;
124
+ completedAt?: Date | string;
125
+ }
126
+ interface GetCrawlRequest {
127
+ id: string;
128
+ environment?: Environment;
129
+ projectId?: string;
130
+ includePages?: boolean;
131
+ }
132
+ interface ListCrawlsRequest {
133
+ environment?: Environment;
134
+ projectId?: string;
135
+ status?: CrawlStatus;
136
+ url?: string;
137
+ limit?: number;
138
+ cursor?: string;
139
+ }
140
+ interface ListCrawlsResponse {
141
+ items: Crawl[];
142
+ nextCursor?: string;
143
+ }
144
+ interface ListCrawlPagesRequest {
145
+ crawlId: string;
146
+ environment?: Environment;
147
+ projectId?: string;
148
+ limit?: number;
149
+ cursor?: string;
150
+ }
151
+ interface ListCrawlPagesResponse {
152
+ items: CrawlPage[];
153
+ nextCursor?: string;
154
+ }
155
+ interface CancelCrawlRequest {
156
+ id: string;
157
+ environment?: Environment;
158
+ projectId?: string;
159
+ }
160
+
161
+ /**
162
+ * Stack0 Crawl Client
163
+ * Recursively crawl a website and extract content from every page.
164
+ */
165
+
166
+ declare class Crawl$ {
167
+ private http;
168
+ constructor(config: HttpClientConfig);
169
+ /**
170
+ * Start a crawl.
171
+ *
172
+ * @example
173
+ * ```typescript
174
+ * const { id } = await stack0.crawl.start({
175
+ * url: 'https://docs.example.com',
176
+ * maxDepth: 3,
177
+ * maxPages: 200,
178
+ * formats: ['markdown', 'links'],
179
+ * });
180
+ * ```
181
+ */
182
+ start(request: CreateCrawlRequest): Promise<CreateCrawlResponse>;
183
+ /**
184
+ * Get a crawl by ID. Pass `includePages: true` to include the scraped pages.
185
+ */
186
+ get(request: GetCrawlRequest): Promise<Crawl>;
187
+ list(request?: ListCrawlsRequest): Promise<ListCrawlsResponse>;
188
+ listPages(request: ListCrawlPagesRequest): Promise<ListCrawlPagesResponse>;
189
+ cancel(request: CancelCrawlRequest): Promise<{
190
+ success: boolean;
191
+ }>;
192
+ delete(request: CancelCrawlRequest): Promise<{
193
+ success: boolean;
194
+ }>;
195
+ /**
196
+ * Start a crawl and poll until it completes. Returns the full Crawl record
197
+ * with pages included.
198
+ */
199
+ startAndWait(request: CreateCrawlRequest, options?: {
200
+ pollInterval?: number;
201
+ timeout?: number;
202
+ includePages?: boolean;
203
+ }): Promise<Crawl>;
204
+ }
205
+
206
+ export { type CancelCrawlRequest, Crawl$ as Crawl, Crawl$, type CrawlPage, type CrawlStatus, type CreateCrawlRequest, type CreateCrawlResponse, type GetCrawlRequest, type ListCrawlPagesRequest, type ListCrawlPagesResponse, type ListCrawlsRequest, type ListCrawlsResponse, type ProxyType, type ScrapeAction, type ScrapeActionType, type ScrapeFormat, type ScrapeOptions };
@@ -0,0 +1,179 @@
1
+ 'use strict';
2
+
3
+ // src/lib/http-client.ts
4
+ var HttpClient = class {
5
+ apiKey;
6
+ baseUrl;
7
+ constructor(config) {
8
+ this.apiKey = config.apiKey;
9
+ this.baseUrl = config.baseUrl || "https://api.stack0.dev/v1";
10
+ }
11
+ getHeaders(includeContentType = true) {
12
+ const headers = {
13
+ Authorization: `Bearer ${this.apiKey}`
14
+ };
15
+ if (includeContentType) {
16
+ headers["Content-Type"] = "application/json";
17
+ }
18
+ return headers;
19
+ }
20
+ async request(method, path, body) {
21
+ const url = `${this.baseUrl}${path}`;
22
+ const bodyString = body === void 0 ? void 0 : JSON.stringify(body);
23
+ const hasBody = bodyString !== void 0;
24
+ try {
25
+ const response = await fetch(url, {
26
+ method,
27
+ headers: this.getHeaders(hasBody),
28
+ body: hasBody ? bodyString : void 0
29
+ });
30
+ if (!response.ok) {
31
+ await this.handleErrorResponse(response);
32
+ }
33
+ const data = await response.json();
34
+ return data;
35
+ } catch (error) {
36
+ if (error instanceof Error && "statusCode" in error) {
37
+ throw error;
38
+ }
39
+ throw this.createError("Network error", error);
40
+ }
41
+ }
42
+ async handleErrorResponse(response) {
43
+ let errorBody;
44
+ try {
45
+ errorBody = await response.json();
46
+ } catch {
47
+ errorBody = { message: response.statusText };
48
+ }
49
+ const error = new Error(errorBody?.message || `HTTP ${response.status}`);
50
+ error.statusCode = response.status;
51
+ error.code = errorBody?.code ?? "";
52
+ error.response = errorBody;
53
+ throw error;
54
+ }
55
+ createError(message, cause) {
56
+ const error = new Error(message);
57
+ error.cause = cause;
58
+ return error;
59
+ }
60
+ async get(path) {
61
+ return this.request("GET", path);
62
+ }
63
+ async post(path, body) {
64
+ return this.request("POST", path, body);
65
+ }
66
+ async put(path, body) {
67
+ return this.request("PUT", path, body);
68
+ }
69
+ async delete(path) {
70
+ return this.request("DELETE", path);
71
+ }
72
+ async deleteWithBody(path, body) {
73
+ return this.request("DELETE", path, body);
74
+ }
75
+ async patch(path, body) {
76
+ return this.request("PATCH", path, body);
77
+ }
78
+ };
79
+
80
+ // src/crawl/client.ts
81
+ var Crawl$ = class {
82
+ http;
83
+ constructor(config) {
84
+ this.http = new HttpClient(config);
85
+ }
86
+ /**
87
+ * Start a crawl.
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const { id } = await stack0.crawl.start({
92
+ * url: 'https://docs.example.com',
93
+ * maxDepth: 3,
94
+ * maxPages: 200,
95
+ * formats: ['markdown', 'links'],
96
+ * });
97
+ * ```
98
+ */
99
+ async start(request) {
100
+ return this.http.post("/webdata/crawl", request);
101
+ }
102
+ /**
103
+ * Get a crawl by ID. Pass `includePages: true` to include the scraped pages.
104
+ */
105
+ async get(request) {
106
+ const params = new URLSearchParams();
107
+ if (request.environment) params.set("environment", request.environment);
108
+ if (request.projectId) params.set("projectId", request.projectId);
109
+ if (request.includePages) params.set("includePages", "true");
110
+ const query = params.toString();
111
+ return this.http.get(`/webdata/crawl/${request.id}${query ? `?${query}` : ""}`);
112
+ }
113
+ async list(request = {}) {
114
+ const params = new URLSearchParams();
115
+ if (request.environment) params.set("environment", request.environment);
116
+ if (request.projectId) params.set("projectId", request.projectId);
117
+ if (request.status) params.set("status", request.status);
118
+ if (request.url) params.set("url", request.url);
119
+ if (request.limit) params.set("limit", String(request.limit));
120
+ if (request.cursor) params.set("cursor", request.cursor);
121
+ const query = params.toString();
122
+ return this.http.get(`/webdata/crawl${query ? `?${query}` : ""}`);
123
+ }
124
+ async listPages(request) {
125
+ const params = new URLSearchParams();
126
+ if (request.environment) params.set("environment", request.environment);
127
+ if (request.projectId) params.set("projectId", request.projectId);
128
+ if (request.limit) params.set("limit", String(request.limit));
129
+ if (request.cursor) params.set("cursor", request.cursor);
130
+ const query = params.toString();
131
+ return this.http.get(
132
+ `/webdata/crawl/${request.crawlId}/pages${query ? `?${query}` : ""}`
133
+ );
134
+ }
135
+ async cancel(request) {
136
+ return this.http.post(`/webdata/crawl/${request.id}/cancel`, {
137
+ environment: request.environment,
138
+ projectId: request.projectId
139
+ });
140
+ }
141
+ async delete(request) {
142
+ const params = new URLSearchParams();
143
+ if (request.environment) params.set("environment", request.environment);
144
+ if (request.projectId) params.set("projectId", request.projectId);
145
+ const query = params.toString();
146
+ return this.http.deleteWithBody(
147
+ `/webdata/crawl/${request.id}${query ? `?${query}` : ""}`,
148
+ request
149
+ );
150
+ }
151
+ /**
152
+ * Start a crawl and poll until it completes. Returns the full Crawl record
153
+ * with pages included.
154
+ */
155
+ async startAndWait(request, options = {}) {
156
+ const { pollInterval = 2e3, timeout = 6e5, includePages = true } = options;
157
+ const { id } = await this.start(request);
158
+ const start = Date.now();
159
+ while (Date.now() - start < timeout) {
160
+ const crawl = await this.get({
161
+ id,
162
+ environment: request.environment,
163
+ projectId: request.projectId,
164
+ includePages
165
+ });
166
+ if (crawl.status === "completed" || crawl.status === "failed" || crawl.status === "cancelled") {
167
+ if (crawl.status === "failed") throw new Error(crawl.error || "Crawl failed");
168
+ return crawl;
169
+ }
170
+ await new Promise((r) => setTimeout(r, pollInterval));
171
+ }
172
+ throw new Error("Crawl timed out");
173
+ }
174
+ };
175
+
176
+ exports.Crawl = Crawl$;
177
+ exports.Crawl$ = Crawl$;
178
+ //# sourceMappingURL=index.js.map
179
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/http-client.ts","../../src/crawl/client.ts"],"names":[],"mappings":"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","file":"index.js","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(includeContentType = true): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return headers;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const bodyString = body === undefined ? undefined : JSON.stringify(body);\n const hasBody = bodyString !== undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(hasBody),\n body: hasBody ? bodyString : 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 deleteWithBody<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"DELETE\", path, body);\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 Crawl Client\n * Recursively crawl a website and extract content from every page.\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n CancelCrawlRequest,\n Crawl,\n CreateCrawlRequest,\n CreateCrawlResponse,\n GetCrawlRequest,\n ListCrawlPagesRequest,\n ListCrawlPagesResponse,\n ListCrawlsRequest,\n ListCrawlsResponse,\n} from \"./types\";\n\nexport class Crawl$ {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Start a crawl.\n *\n * @example\n * ```typescript\n * const { id } = await stack0.crawl.start({\n * url: 'https://docs.example.com',\n * maxDepth: 3,\n * maxPages: 200,\n * formats: ['markdown', 'links'],\n * });\n * ```\n */\n async start(request: CreateCrawlRequest): Promise<CreateCrawlResponse> {\n return this.http.post<CreateCrawlResponse>(\"/webdata/crawl\", request);\n }\n\n /**\n * Get a crawl by ID. Pass `includePages: true` to include the scraped pages.\n */\n async get(request: GetCrawlRequest): Promise<Crawl> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.includePages) params.set(\"includePages\", \"true\");\n const query = params.toString();\n return this.http.get<Crawl>(`/webdata/crawl/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n async list(request: ListCrawlsRequest = {}): Promise<ListCrawlsResponse> {\n const params = new URLSearchParams();\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\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const query = params.toString();\n return this.http.get<ListCrawlsResponse>(`/webdata/crawl${query ? `?${query}` : \"\"}`);\n }\n\n async listPages(request: ListCrawlPagesRequest): Promise<ListCrawlPagesResponse> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.limit) params.set(\"limit\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const query = params.toString();\n return this.http.get<ListCrawlPagesResponse>(\n `/webdata/crawl/${request.crawlId}/pages${query ? `?${query}` : \"\"}`,\n );\n }\n\n async cancel(request: CancelCrawlRequest): Promise<{ success: boolean }> {\n return this.http.post<{ success: boolean }>(`/webdata/crawl/${request.id}/cancel`, {\n environment: request.environment,\n projectId: request.projectId,\n });\n }\n\n async delete(request: CancelCrawlRequest): 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 const query = params.toString();\n return this.http.deleteWithBody<{ success: boolean }>(\n `/webdata/crawl/${request.id}${query ? `?${query}` : \"\"}`,\n request,\n );\n }\n\n /**\n * Start a crawl and poll until it completes. Returns the full Crawl record\n * with pages included.\n */\n async startAndWait(\n request: CreateCrawlRequest,\n options: { pollInterval?: number; timeout?: number; includePages?: boolean } = {},\n ): Promise<Crawl> {\n const { pollInterval = 2000, timeout = 600_000, includePages = true } = options;\n const { id } = await this.start(request);\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n const crawl = await this.get({\n id,\n environment: request.environment,\n projectId: request.projectId,\n includePages,\n });\n if (crawl.status === \"completed\" || crawl.status === \"failed\" || crawl.status === \"cancelled\") {\n if (crawl.status === \"failed\") throw new Error(crawl.error || \"Crawl failed\");\n return crawl;\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n throw new Error(\"Crawl timed out\");\n }\n}\n\nexport { Crawl$ as Crawl };\n"]}