simplex-ts 1.1.3 → 1.1.4

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,38 @@
1
+ /**
2
+ * Example function to demonstrate package usage
3
+ * @param name - The name to greet
4
+ * @returns A greeting message
5
+ */
6
+ declare function greet(name: string): string;
7
+ interface SessionData {
8
+ [key: string]: any;
9
+ }
10
+ declare class Simplex {
11
+ private apiKey;
12
+ private sessionId;
13
+ private connectUrl;
14
+ constructor(apiKey: string);
15
+ private makeRequest;
16
+ createSession(showInConsole?: boolean, proxies?: boolean, workflowName?: string, sessionData?: SessionData | string): Promise<[string, string]>;
17
+ goto(url: string, cdpUrl?: string): Promise<void>;
18
+ click(elementDescription: string, cdpUrl?: string): Promise<string>;
19
+ hover(elementDescription: string, cdpUrl?: string): Promise<void>;
20
+ scrollToElement(elementDescription: string, cdpUrl?: string): Promise<void>;
21
+ getNetworkResponse(url: string, cdpUrl?: string): Promise<string>;
22
+ type(text: string, cdpUrl?: string): Promise<void>;
23
+ pressEnter(cdpUrl?: string): Promise<void>;
24
+ pressTab(cdpUrl?: string): Promise<void>;
25
+ deleteText(cdpUrl?: string): Promise<void>;
26
+ extractBbox(elementDescription: string, cdpUrl?: string): Promise<any>;
27
+ extractText(elementDescription: string, cdpUrl?: string): Promise<string>;
28
+ scroll(pixels: number, cdpUrl?: string): Promise<void>;
29
+ wait(milliseconds: number, cdpUrl?: string): Promise<void>;
30
+ clickAndUpload(elementDescription: string, filePathOrCallable: string | (() => Blob)): Promise<void>;
31
+ clickAndDownload(elementDescription: string): Promise<[string, string]>;
32
+ exists(elementDescription: string, cdpUrl?: string): Promise<[boolean, string]>;
33
+ getPageURL(cdpUrl?: string): Promise<string>;
34
+ captureLoginSession(cdpUrl?: string): Promise<string>;
35
+ closeSession(): Promise<void>;
36
+ }
37
+
38
+ export { Simplex, greet };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Example function to demonstrate package usage
3
+ * @param name - The name to greet
4
+ * @returns A greeting message
5
+ */
6
+ declare function greet(name: string): string;
7
+ interface SessionData {
8
+ [key: string]: any;
9
+ }
10
+ declare class Simplex {
11
+ private apiKey;
12
+ private sessionId;
13
+ private connectUrl;
14
+ constructor(apiKey: string);
15
+ private makeRequest;
16
+ createSession(showInConsole?: boolean, proxies?: boolean, workflowName?: string, sessionData?: SessionData | string): Promise<[string, string]>;
17
+ goto(url: string, cdpUrl?: string): Promise<void>;
18
+ click(elementDescription: string, cdpUrl?: string): Promise<string>;
19
+ hover(elementDescription: string, cdpUrl?: string): Promise<void>;
20
+ scrollToElement(elementDescription: string, cdpUrl?: string): Promise<void>;
21
+ getNetworkResponse(url: string, cdpUrl?: string): Promise<string>;
22
+ type(text: string, cdpUrl?: string): Promise<void>;
23
+ pressEnter(cdpUrl?: string): Promise<void>;
24
+ pressTab(cdpUrl?: string): Promise<void>;
25
+ deleteText(cdpUrl?: string): Promise<void>;
26
+ extractBbox(elementDescription: string, cdpUrl?: string): Promise<any>;
27
+ extractText(elementDescription: string, cdpUrl?: string): Promise<string>;
28
+ scroll(pixels: number, cdpUrl?: string): Promise<void>;
29
+ wait(milliseconds: number, cdpUrl?: string): Promise<void>;
30
+ clickAndUpload(elementDescription: string, filePathOrCallable: string | (() => Blob)): Promise<void>;
31
+ clickAndDownload(elementDescription: string): Promise<[string, string]>;
32
+ exists(elementDescription: string, cdpUrl?: string): Promise<[boolean, string]>;
33
+ getPageURL(cdpUrl?: string): Promise<string>;
34
+ captureLoginSession(cdpUrl?: string): Promise<string>;
35
+ closeSession(): Promise<void>;
36
+ }
37
+
38
+ export { Simplex, greet };
package/dist/index.js ADDED
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ Simplex: () => Simplex,
34
+ greet: () => greet
35
+ });
36
+ module.exports = __toCommonJS(index_exports);
37
+ var import_axios = __toESM(require("axios"));
38
+ function greet(name) {
39
+ return `Hello, ${name}!`;
40
+ }
41
+ var BASE_URL = "https://api.simplex.sh";
42
+ var Simplex = class {
43
+ constructor(apiKey) {
44
+ this.sessionId = null;
45
+ this.connectUrl = null;
46
+ this.apiKey = apiKey;
47
+ }
48
+ async makeRequest(method, endpoint, data, params) {
49
+ try {
50
+ console.log(`Making ${method.toUpperCase()} request to ${endpoint}`);
51
+ const formData = new FormData();
52
+ if (data) {
53
+ Object.entries(data).forEach(([key, value]) => {
54
+ if (value !== void 0 && value !== null) {
55
+ formData.append(key, value.toString());
56
+ }
57
+ });
58
+ }
59
+ const response = await (0, import_axios.default)({
60
+ method,
61
+ url: `${BASE_URL}${endpoint}`,
62
+ data: method === "post" ? formData : void 0,
63
+ params: method === "get" ? params : void 0,
64
+ headers: {
65
+ "x-api-key": this.apiKey,
66
+ ...method === "post" ? { "Content-Type": "multipart/form-data" } : {}
67
+ }
68
+ });
69
+ const responseData = response.data;
70
+ if (endpoint === "/goto" || endpoint === "/hover") {
71
+ if (!("succeeded" in responseData)) {
72
+ throw new Error('Response data is missing the "succeeded" field');
73
+ }
74
+ return responseData;
75
+ }
76
+ if (endpoint === "/get_network_response") {
77
+ if (!("status" in responseData)) {
78
+ throw new Error("It looks like the get_network_response action failed to return a response. Did you set your api_key when creating the Simplex class?");
79
+ } else if (responseData.status == "success") {
80
+ return responseData;
81
+ } else {
82
+ throw new Error(`Failed to get network response: ${responseData.error}`);
83
+ }
84
+ }
85
+ if (!responseData.succeeded && !(endpoint === "/create_session" && responseData.session_id)) {
86
+ const errorMessage = responseData.error || "Request failed";
87
+ console.error("API request failed:", errorMessage);
88
+ throw new Error(errorMessage);
89
+ }
90
+ return responseData;
91
+ } catch (error) {
92
+ const axiosError = error;
93
+ if (axiosError.response) {
94
+ const errorMessage = axiosError.response.data?.error || String(error);
95
+ console.error("Axios error:", {
96
+ status: axiosError.response.status,
97
+ statusText: axiosError.response.statusText,
98
+ data: axiosError.response.data,
99
+ message: errorMessage
100
+ });
101
+ throw new Error(`Request failed: ${errorMessage}`);
102
+ }
103
+ console.error("Unexpected error:", error);
104
+ throw error;
105
+ }
106
+ }
107
+ async createSession(showInConsole = true, proxies = true, workflowName, sessionData) {
108
+ const data = {
109
+ proxies,
110
+ workflow_name: workflowName
111
+ };
112
+ if (this.sessionId) {
113
+ throw new Error("A session is already active. Please close the current session before creating a new one.");
114
+ }
115
+ if (sessionData) {
116
+ if (typeof sessionData === "string") {
117
+ try {
118
+ data.session_data = JSON.stringify(JSON.parse(sessionData));
119
+ } catch {
120
+ throw new Error("File system operations are not supported in this environment");
121
+ }
122
+ } else {
123
+ data.session_data = JSON.stringify(sessionData);
124
+ }
125
+ }
126
+ const response = await this.makeRequest("post", "/create_session", data);
127
+ if (!response.session_id) {
128
+ throw new Error("Session creation failed: No session ID returned");
129
+ }
130
+ this.sessionId = response.session_id;
131
+ this.connectUrl = response.connect_url || null;
132
+ if (showInConsole && response.livestream_url) {
133
+ console.log(`Livestream URL: ${response.livestream_url}`);
134
+ }
135
+ return [response.session_id, response.livestream_url || ""];
136
+ }
137
+ async goto(url, cdpUrl) {
138
+ if (!cdpUrl && !this.sessionId) {
139
+ throw new Error(`Must call createSession before calling goto with url='${url}'`);
140
+ }
141
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
142
+ url = "https://" + url;
143
+ }
144
+ const data = {
145
+ url,
146
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
147
+ };
148
+ await this.makeRequest("post", "/goto", data);
149
+ }
150
+ async click(elementDescription, cdpUrl) {
151
+ if (!cdpUrl && !this.sessionId) {
152
+ throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);
153
+ }
154
+ const data = {
155
+ element_description: elementDescription,
156
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
157
+ };
158
+ const response = await this.makeRequest("post", "/click", data);
159
+ return response.element_clicked || "";
160
+ }
161
+ async hover(elementDescription, cdpUrl) {
162
+ if (!cdpUrl && !this.sessionId) {
163
+ throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);
164
+ }
165
+ const data = {
166
+ element_description: elementDescription,
167
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
168
+ };
169
+ await this.makeRequest("post", "/hover", data);
170
+ }
171
+ async scrollToElement(elementDescription, cdpUrl) {
172
+ if (!cdpUrl && !this.sessionId) {
173
+ throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);
174
+ }
175
+ const data = {
176
+ element_description: elementDescription,
177
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
178
+ };
179
+ await this.makeRequest("post", "/scroll_to_element", data);
180
+ }
181
+ async getNetworkResponse(url, cdpUrl) {
182
+ if (!cdpUrl && !this.sessionId) {
183
+ throw new Error(`Must call createSession before calling getNetworkResponse with url='${url}'`);
184
+ }
185
+ const data = {
186
+ url,
187
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
188
+ };
189
+ const response = await this.makeRequest("post", "/get_network_response", data);
190
+ return response.response || "";
191
+ }
192
+ async type(text, cdpUrl) {
193
+ if (!cdpUrl && !this.sessionId) {
194
+ throw new Error(`Must call createSession before calling type with text='${text}'`);
195
+ }
196
+ const data = {
197
+ text,
198
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
199
+ };
200
+ await this.makeRequest("post", "/type", data);
201
+ }
202
+ async pressEnter(cdpUrl) {
203
+ if (!cdpUrl && !this.sessionId) {
204
+ throw new Error("Must call createSession before calling pressEnter");
205
+ }
206
+ const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };
207
+ await this.makeRequest("post", "/press_enter", data);
208
+ }
209
+ async pressTab(cdpUrl) {
210
+ if (!cdpUrl && !this.sessionId) {
211
+ throw new Error("Must call createSession before calling pressTab");
212
+ }
213
+ const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };
214
+ await this.makeRequest("post", "/press_tab", data);
215
+ }
216
+ async deleteText(cdpUrl) {
217
+ if (!cdpUrl && !this.sessionId) {
218
+ throw new Error("Must call createSession before calling deleteText");
219
+ }
220
+ const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };
221
+ await this.makeRequest("post", "/delete_text", data);
222
+ }
223
+ async extractBbox(elementDescription, cdpUrl) {
224
+ if (!cdpUrl && !this.sessionId) {
225
+ throw new Error(`Must call createSession before calling extractBbox with elementDescription='${elementDescription}'`);
226
+ }
227
+ const params = {
228
+ element_description: elementDescription,
229
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
230
+ };
231
+ const response = await this.makeRequest("get", "/extract-bbox", void 0, params);
232
+ return response.bbox;
233
+ }
234
+ async extractText(elementDescription, cdpUrl) {
235
+ if (!cdpUrl && !this.sessionId) {
236
+ throw new Error(`Must call createSession before calling extractText with elementDescription='${elementDescription}'`);
237
+ }
238
+ const data = {
239
+ element_description: elementDescription,
240
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
241
+ };
242
+ const response = await this.makeRequest("post", "/extract-text", data);
243
+ return response.text || "";
244
+ }
245
+ async scroll(pixels, cdpUrl) {
246
+ if (!cdpUrl && !this.sessionId) {
247
+ throw new Error(`Must call createSession before calling scroll with pixels=${pixels}`);
248
+ }
249
+ const data = {
250
+ pixels,
251
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
252
+ };
253
+ await this.makeRequest("post", "/scroll", data);
254
+ }
255
+ async wait(milliseconds, cdpUrl) {
256
+ if (!cdpUrl && !this.sessionId) {
257
+ throw new Error(`Must call createSession before calling wait with milliseconds=${milliseconds}`);
258
+ }
259
+ const data = {
260
+ milliseconds,
261
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
262
+ };
263
+ await this.makeRequest("post", "/wait", data);
264
+ }
265
+ async clickAndUpload(elementDescription, filePathOrCallable) {
266
+ if (!this.sessionId) {
267
+ throw new Error(`Must call createSession before calling clickAndUpload with elementDescription='${elementDescription}'`);
268
+ }
269
+ if (typeof filePathOrCallable !== "string" && typeof filePathOrCallable !== "function") {
270
+ throw new TypeError(`filePathOrCallable must be either a string or a callable, not a ${typeof filePathOrCallable}`);
271
+ }
272
+ const formData = new FormData();
273
+ formData.append("element_description", elementDescription);
274
+ formData.append("session_id", this.sessionId);
275
+ if (typeof filePathOrCallable === "string") {
276
+ throw new Error("File system operations are not supported in this environment");
277
+ } else {
278
+ const blob = filePathOrCallable();
279
+ formData.append("file", blob, "file");
280
+ }
281
+ await this.makeRequest("post", "/click_and_upload", formData, void 0);
282
+ }
283
+ async clickAndDownload(elementDescription) {
284
+ if (!this.sessionId) {
285
+ throw new Error(`Must call createSession before calling clickAndDownload with elementDescription='${elementDescription}'`);
286
+ }
287
+ const data = {
288
+ element_description: elementDescription,
289
+ session_id: this.sessionId
290
+ };
291
+ const response = await this.makeRequest("post", "/click_and_download", data);
292
+ return [response.b64 || "", response.filename || ""];
293
+ }
294
+ async exists(elementDescription, cdpUrl) {
295
+ if (!cdpUrl && !this.sessionId) {
296
+ throw new Error(`Must call createSession before calling exists with elementDescription='${elementDescription}'`);
297
+ }
298
+ const data = {
299
+ element_description: elementDescription,
300
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
301
+ };
302
+ const response = await this.makeRequest("post", "/exists", data);
303
+ return [response.exists || false, response.reasoning || ""];
304
+ }
305
+ async getPageURL(cdpUrl) {
306
+ if (!cdpUrl && !this.sessionId) {
307
+ throw new Error(`Must call createSession before calling getPageURL`);
308
+ }
309
+ const data = {
310
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
311
+ };
312
+ const response = await this.makeRequest("post", "/get_page_url", data);
313
+ return response.url || "";
314
+ }
315
+ async captureLoginSession(cdpUrl) {
316
+ if (!cdpUrl && !this.sessionId) {
317
+ throw new Error(`Must call createSession before calling captureLoginSession`);
318
+ }
319
+ const data = {
320
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
321
+ };
322
+ const response = await this.makeRequest("post", "/capture_login_session", data);
323
+ return response.storage_state || "";
324
+ }
325
+ async closeSession() {
326
+ if (!this.sessionId) {
327
+ return;
328
+ }
329
+ await this.makeRequest("post", "/close_session", { session_id: this.sessionId });
330
+ this.sessionId = null;
331
+ this.connectUrl = null;
332
+ }
333
+ };
334
+ // Annotate the CommonJS export names for ESM import in node:
335
+ 0 && (module.exports = {
336
+ Simplex,
337
+ greet
338
+ });
339
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Example function to demonstrate package usage\n * @param name - The name to greet\n * @returns A greeting message\n */\nexport function greet(name: string): string {\n return `Hello, ${name}!`;\n}\n\n// Export other functions and types here \n\nimport axios from 'axios';\n\nconst BASE_URL = \"https://api.simplex.sh\";\n// const BASE_URL = \"https://simplex-dev-shreya--api-server-and-container-service-fas-bba69e.modal.run\"\n\ninterface SessionData {\n [key: string]: any;\n}\n\ninterface PlaywrightClickOptions {\n locator: string;\n locatorType: string;\n exact?: boolean;\n elementIndex?: 'first' | 'last' | 'nth';\n nthIndex?: number;\n locatorOptions?: Record<string, any>;\n}\n\ninterface SimplexResponse {\n succeeded?: boolean;\n error?: string;\n session_id?: string;\n livestream_url?: string;\n connect_url?: string;\n element_clicked?: string;\n text?: string;\n image?: string;\n bbox?: any;\n b64?: string;\n filename?: string;\n exists?: boolean;\n reasoning?: string;\n response?: string;\n url?: string;\n storage_state?: string;\n}\n\nexport class Simplex {\n private apiKey: string;\n private sessionId: string | null = null;\n private connectUrl: string | null = null;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async makeRequest<T>(\n method: 'get' | 'post',\n endpoint: string,\n data?: any,\n params?: any\n ): Promise<T> {\n try {\n console.log(`Making ${method.toUpperCase()} request to ${endpoint}`);\n \n // Convert data to FormData\n const formData = new FormData();\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n formData.append(key, value.toString());\n }\n });\n }\n \n const response = await axios({\n method,\n url: `${BASE_URL}${endpoint}`,\n data: method === 'post' ? formData : undefined,\n params: method === 'get' ? params : undefined,\n headers: {\n 'x-api-key': this.apiKey,\n ...(method === 'post' ? { 'Content-Type': 'multipart/form-data' } : {})\n }\n });\n\n const responseData = response.data as SimplexResponse;\n \n // Consider response successful if:\n // 1. It has succeeded: true, or\n // 2. It's a create_session response with a session_id\n // 3. It's a goto or hover response with a succeeded field\n // 4. It's a get_network_response with success status\n\n if (endpoint === \"/goto\" || endpoint === \"/hover\") {\n if (!('succeeded' in responseData)) {\n throw new Error('Response data is missing the \"succeeded\" field');\n }\n return responseData as T;\n }\n\n if (endpoint === \"/get_network_response\") {\n if (!('status' in responseData)) {\n throw new Error('It looks like the get_network_response action failed to return a response. Did you set your api_key when creating the Simplex class?');\n } else if (responseData.status == \"success\") {\n return responseData as T;\n } else {\n throw new Error(`Failed to get network response: ${responseData.error}`);\n }\n }\n\n\n if (!responseData.succeeded && !(endpoint === '/create_session' && responseData.session_id)) {\n const errorMessage = responseData.error || 'Request failed';\n console.error('API request failed:', errorMessage);\n throw new Error(errorMessage);\n }\n return responseData as T;\n } catch (error: unknown) {\n const axiosError = error as { response?: { data?: { error?: string }, status?: number, statusText?: string } };\n if (axiosError.response) {\n const errorMessage = axiosError.response.data?.error || String(error);\n console.error('Axios error:', {\n status: axiosError.response.status,\n statusText: axiosError.response.statusText,\n data: axiosError.response.data,\n message: errorMessage\n });\n throw new Error(`Request failed: ${errorMessage}`);\n }\n console.error('Unexpected error:', error);\n throw error;\n }\n }\n\n async createSession(\n showInConsole: boolean = true,\n proxies: boolean = true,\n workflowName?: string,\n sessionData?: SessionData | string\n ): Promise<[string, string]> {\n const data: any = {\n proxies,\n workflow_name: workflowName\n };\n\n if (this.sessionId) {\n throw new Error(\"A session is already active. Please close the current session before creating a new one.\");\n }\n if (sessionData) {\n if (typeof sessionData === 'string') {\n try {\n data.session_data = JSON.stringify(JSON.parse(sessionData));\n } catch {\n // If parsing fails, treat as file path\n // Note: File system operations are not available in browser environment\n throw new Error('File system operations are not supported in this environment');\n }\n } else {\n data.session_data = JSON.stringify(sessionData);\n }\n }\n\n const response = await this.makeRequest<SimplexResponse>('post', '/create_session', data);\n \n if (!response.session_id) {\n throw new Error('Session creation failed: No session ID returned');\n }\n\n this.sessionId = response.session_id;\n this.connectUrl = response.connect_url || null;\n\n if (showInConsole && response.livestream_url) {\n console.log(`Livestream URL: ${response.livestream_url}`);\n }\n\n return [response.session_id, response.livestream_url || ''];\n }\n\n async goto(url: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling goto with url='${url}'`);\n }\n\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n url = 'https://' + url;\n }\n\n const data = {\n url,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/goto', data);\n }\n\n async click(elementDescription: string, cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/click', data);\n return response.element_clicked || '';\n }\n\n async hover(elementDescription: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest<SimplexResponse>('post', '/hover', data);\n }\n\n async scrollToElement(elementDescription: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest<SimplexResponse>('post', '/scroll_to_element', data);\n }\n\n\n async getNetworkResponse(url: string, cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling getNetworkResponse with url='${url}'`);\n }\n \n const data = {\n url,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/get_network_response', data);\n return response.response || '';\n }\n\n async type(text: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling type with text='${text}'`);\n }\n\n const data = {\n text,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/type', data);\n }\n\n async pressEnter(cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error('Must call createSession before calling pressEnter');\n }\n\n const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };\n await this.makeRequest('post', '/press_enter', data);\n }\n\n async pressTab(cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error('Must call createSession before calling pressTab');\n }\n\n const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };\n await this.makeRequest('post', '/press_tab', data);\n }\n\n async deleteText(cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error('Must call createSession before calling deleteText');\n }\n\n const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };\n await this.makeRequest('post', '/delete_text', data);\n }\n\n async extractBbox(elementDescription: string, cdpUrl?: string): Promise<any> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling extractBbox with elementDescription='${elementDescription}'`);\n }\n\n const params = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('get', '/extract-bbox', undefined, params);\n return response.bbox;\n }\n\n async extractText(elementDescription: string, cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling extractText with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/extract-text', data);\n return response.text || '';\n }\n\n async scroll(pixels: number, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling scroll with pixels=${pixels}`);\n }\n\n const data = {\n pixels,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/scroll', data);\n }\n\n async wait(milliseconds: number, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling wait with milliseconds=${milliseconds}`);\n }\n\n const data = {\n milliseconds,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/wait', data);\n }\n\n async clickAndUpload(\n elementDescription: string,\n filePathOrCallable: string | (() => Blob)\n ): Promise<void> {\n if (!this.sessionId) {\n throw new Error(`Must call createSession before calling clickAndUpload with elementDescription='${elementDescription}'`);\n }\n\n if (typeof filePathOrCallable !== 'string' && typeof filePathOrCallable !== 'function') {\n throw new TypeError(`filePathOrCallable must be either a string or a callable, not a ${typeof filePathOrCallable}`);\n }\n\n const formData = new FormData();\n formData.append('element_description', elementDescription);\n formData.append('session_id', this.sessionId);\n\n if (typeof filePathOrCallable === 'string') {\n // Note: File system operations are not available in browser environment\n throw new Error('File system operations are not supported in this environment');\n } else {\n const blob = filePathOrCallable();\n formData.append('file', blob, 'file'); // Add filename for the blob\n }\n\n await this.makeRequest('post', '/click_and_upload', formData, undefined);\n }\n\n async clickAndDownload(elementDescription: string): Promise<[string, string]> {\n if (!this.sessionId) {\n throw new Error(`Must call createSession before calling clickAndDownload with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n session_id: this.sessionId\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/click_and_download', data);\n return [response.b64 || '', response.filename || ''];\n }\n\n async exists(elementDescription: string, cdpUrl?: string): Promise<[boolean, string]> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling exists with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/exists', data);\n return [response.exists || false, response.reasoning || ''];\n }\n\n async getPageURL(cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling getPageURL`);\n }\n\n const data = {\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/get_page_url', data);\n return response.url || '';\n }\n\n async captureLoginSession(cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling captureLoginSession`);\n }\n \n const data = {\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/capture_login_session', data);\n return response.storage_state || '';\n }\n\n async closeSession(): Promise<void> {\n if (!this.sessionId) {\n return;\n }\n\n await this.makeRequest('post', '/close_session', { session_id: this.sessionId });\n this.sessionId = null;\n this.connectUrl = null;\n }\n} "],"mappings":"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","names":["axios"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,303 @@
1
+ // src/index.ts
2
+ import axios from "axios";
3
+ function greet(name) {
4
+ return `Hello, ${name}!`;
5
+ }
6
+ var BASE_URL = "https://api.simplex.sh";
7
+ var Simplex = class {
8
+ constructor(apiKey) {
9
+ this.sessionId = null;
10
+ this.connectUrl = null;
11
+ this.apiKey = apiKey;
12
+ }
13
+ async makeRequest(method, endpoint, data, params) {
14
+ try {
15
+ console.log(`Making ${method.toUpperCase()} request to ${endpoint}`);
16
+ const formData = new FormData();
17
+ if (data) {
18
+ Object.entries(data).forEach(([key, value]) => {
19
+ if (value !== void 0 && value !== null) {
20
+ formData.append(key, value.toString());
21
+ }
22
+ });
23
+ }
24
+ const response = await axios({
25
+ method,
26
+ url: `${BASE_URL}${endpoint}`,
27
+ data: method === "post" ? formData : void 0,
28
+ params: method === "get" ? params : void 0,
29
+ headers: {
30
+ "x-api-key": this.apiKey,
31
+ ...method === "post" ? { "Content-Type": "multipart/form-data" } : {}
32
+ }
33
+ });
34
+ const responseData = response.data;
35
+ if (endpoint === "/goto" || endpoint === "/hover") {
36
+ if (!("succeeded" in responseData)) {
37
+ throw new Error('Response data is missing the "succeeded" field');
38
+ }
39
+ return responseData;
40
+ }
41
+ if (endpoint === "/get_network_response") {
42
+ if (!("status" in responseData)) {
43
+ throw new Error("It looks like the get_network_response action failed to return a response. Did you set your api_key when creating the Simplex class?");
44
+ } else if (responseData.status == "success") {
45
+ return responseData;
46
+ } else {
47
+ throw new Error(`Failed to get network response: ${responseData.error}`);
48
+ }
49
+ }
50
+ if (!responseData.succeeded && !(endpoint === "/create_session" && responseData.session_id)) {
51
+ const errorMessage = responseData.error || "Request failed";
52
+ console.error("API request failed:", errorMessage);
53
+ throw new Error(errorMessage);
54
+ }
55
+ return responseData;
56
+ } catch (error) {
57
+ const axiosError = error;
58
+ if (axiosError.response) {
59
+ const errorMessage = axiosError.response.data?.error || String(error);
60
+ console.error("Axios error:", {
61
+ status: axiosError.response.status,
62
+ statusText: axiosError.response.statusText,
63
+ data: axiosError.response.data,
64
+ message: errorMessage
65
+ });
66
+ throw new Error(`Request failed: ${errorMessage}`);
67
+ }
68
+ console.error("Unexpected error:", error);
69
+ throw error;
70
+ }
71
+ }
72
+ async createSession(showInConsole = true, proxies = true, workflowName, sessionData) {
73
+ const data = {
74
+ proxies,
75
+ workflow_name: workflowName
76
+ };
77
+ if (this.sessionId) {
78
+ throw new Error("A session is already active. Please close the current session before creating a new one.");
79
+ }
80
+ if (sessionData) {
81
+ if (typeof sessionData === "string") {
82
+ try {
83
+ data.session_data = JSON.stringify(JSON.parse(sessionData));
84
+ } catch {
85
+ throw new Error("File system operations are not supported in this environment");
86
+ }
87
+ } else {
88
+ data.session_data = JSON.stringify(sessionData);
89
+ }
90
+ }
91
+ const response = await this.makeRequest("post", "/create_session", data);
92
+ if (!response.session_id) {
93
+ throw new Error("Session creation failed: No session ID returned");
94
+ }
95
+ this.sessionId = response.session_id;
96
+ this.connectUrl = response.connect_url || null;
97
+ if (showInConsole && response.livestream_url) {
98
+ console.log(`Livestream URL: ${response.livestream_url}`);
99
+ }
100
+ return [response.session_id, response.livestream_url || ""];
101
+ }
102
+ async goto(url, cdpUrl) {
103
+ if (!cdpUrl && !this.sessionId) {
104
+ throw new Error(`Must call createSession before calling goto with url='${url}'`);
105
+ }
106
+ if (!url.startsWith("http://") && !url.startsWith("https://")) {
107
+ url = "https://" + url;
108
+ }
109
+ const data = {
110
+ url,
111
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
112
+ };
113
+ await this.makeRequest("post", "/goto", data);
114
+ }
115
+ async click(elementDescription, cdpUrl) {
116
+ if (!cdpUrl && !this.sessionId) {
117
+ throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);
118
+ }
119
+ const data = {
120
+ element_description: elementDescription,
121
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
122
+ };
123
+ const response = await this.makeRequest("post", "/click", data);
124
+ return response.element_clicked || "";
125
+ }
126
+ async hover(elementDescription, cdpUrl) {
127
+ if (!cdpUrl && !this.sessionId) {
128
+ throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);
129
+ }
130
+ const data = {
131
+ element_description: elementDescription,
132
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
133
+ };
134
+ await this.makeRequest("post", "/hover", data);
135
+ }
136
+ async scrollToElement(elementDescription, cdpUrl) {
137
+ if (!cdpUrl && !this.sessionId) {
138
+ throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);
139
+ }
140
+ const data = {
141
+ element_description: elementDescription,
142
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
143
+ };
144
+ await this.makeRequest("post", "/scroll_to_element", data);
145
+ }
146
+ async getNetworkResponse(url, cdpUrl) {
147
+ if (!cdpUrl && !this.sessionId) {
148
+ throw new Error(`Must call createSession before calling getNetworkResponse with url='${url}'`);
149
+ }
150
+ const data = {
151
+ url,
152
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
153
+ };
154
+ const response = await this.makeRequest("post", "/get_network_response", data);
155
+ return response.response || "";
156
+ }
157
+ async type(text, cdpUrl) {
158
+ if (!cdpUrl && !this.sessionId) {
159
+ throw new Error(`Must call createSession before calling type with text='${text}'`);
160
+ }
161
+ const data = {
162
+ text,
163
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
164
+ };
165
+ await this.makeRequest("post", "/type", data);
166
+ }
167
+ async pressEnter(cdpUrl) {
168
+ if (!cdpUrl && !this.sessionId) {
169
+ throw new Error("Must call createSession before calling pressEnter");
170
+ }
171
+ const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };
172
+ await this.makeRequest("post", "/press_enter", data);
173
+ }
174
+ async pressTab(cdpUrl) {
175
+ if (!cdpUrl && !this.sessionId) {
176
+ throw new Error("Must call createSession before calling pressTab");
177
+ }
178
+ const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };
179
+ await this.makeRequest("post", "/press_tab", data);
180
+ }
181
+ async deleteText(cdpUrl) {
182
+ if (!cdpUrl && !this.sessionId) {
183
+ throw new Error("Must call createSession before calling deleteText");
184
+ }
185
+ const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };
186
+ await this.makeRequest("post", "/delete_text", data);
187
+ }
188
+ async extractBbox(elementDescription, cdpUrl) {
189
+ if (!cdpUrl && !this.sessionId) {
190
+ throw new Error(`Must call createSession before calling extractBbox with elementDescription='${elementDescription}'`);
191
+ }
192
+ const params = {
193
+ element_description: elementDescription,
194
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
195
+ };
196
+ const response = await this.makeRequest("get", "/extract-bbox", void 0, params);
197
+ return response.bbox;
198
+ }
199
+ async extractText(elementDescription, cdpUrl) {
200
+ if (!cdpUrl && !this.sessionId) {
201
+ throw new Error(`Must call createSession before calling extractText with elementDescription='${elementDescription}'`);
202
+ }
203
+ const data = {
204
+ element_description: elementDescription,
205
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
206
+ };
207
+ const response = await this.makeRequest("post", "/extract-text", data);
208
+ return response.text || "";
209
+ }
210
+ async scroll(pixels, cdpUrl) {
211
+ if (!cdpUrl && !this.sessionId) {
212
+ throw new Error(`Must call createSession before calling scroll with pixels=${pixels}`);
213
+ }
214
+ const data = {
215
+ pixels,
216
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
217
+ };
218
+ await this.makeRequest("post", "/scroll", data);
219
+ }
220
+ async wait(milliseconds, cdpUrl) {
221
+ if (!cdpUrl && !this.sessionId) {
222
+ throw new Error(`Must call createSession before calling wait with milliseconds=${milliseconds}`);
223
+ }
224
+ const data = {
225
+ milliseconds,
226
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
227
+ };
228
+ await this.makeRequest("post", "/wait", data);
229
+ }
230
+ async clickAndUpload(elementDescription, filePathOrCallable) {
231
+ if (!this.sessionId) {
232
+ throw new Error(`Must call createSession before calling clickAndUpload with elementDescription='${elementDescription}'`);
233
+ }
234
+ if (typeof filePathOrCallable !== "string" && typeof filePathOrCallable !== "function") {
235
+ throw new TypeError(`filePathOrCallable must be either a string or a callable, not a ${typeof filePathOrCallable}`);
236
+ }
237
+ const formData = new FormData();
238
+ formData.append("element_description", elementDescription);
239
+ formData.append("session_id", this.sessionId);
240
+ if (typeof filePathOrCallable === "string") {
241
+ throw new Error("File system operations are not supported in this environment");
242
+ } else {
243
+ const blob = filePathOrCallable();
244
+ formData.append("file", blob, "file");
245
+ }
246
+ await this.makeRequest("post", "/click_and_upload", formData, void 0);
247
+ }
248
+ async clickAndDownload(elementDescription) {
249
+ if (!this.sessionId) {
250
+ throw new Error(`Must call createSession before calling clickAndDownload with elementDescription='${elementDescription}'`);
251
+ }
252
+ const data = {
253
+ element_description: elementDescription,
254
+ session_id: this.sessionId
255
+ };
256
+ const response = await this.makeRequest("post", "/click_and_download", data);
257
+ return [response.b64 || "", response.filename || ""];
258
+ }
259
+ async exists(elementDescription, cdpUrl) {
260
+ if (!cdpUrl && !this.sessionId) {
261
+ throw new Error(`Must call createSession before calling exists with elementDescription='${elementDescription}'`);
262
+ }
263
+ const data = {
264
+ element_description: elementDescription,
265
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
266
+ };
267
+ const response = await this.makeRequest("post", "/exists", data);
268
+ return [response.exists || false, response.reasoning || ""];
269
+ }
270
+ async getPageURL(cdpUrl) {
271
+ if (!cdpUrl && !this.sessionId) {
272
+ throw new Error(`Must call createSession before calling getPageURL`);
273
+ }
274
+ const data = {
275
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
276
+ };
277
+ const response = await this.makeRequest("post", "/get_page_url", data);
278
+ return response.url || "";
279
+ }
280
+ async captureLoginSession(cdpUrl) {
281
+ if (!cdpUrl && !this.sessionId) {
282
+ throw new Error(`Must call createSession before calling captureLoginSession`);
283
+ }
284
+ const data = {
285
+ ...cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId }
286
+ };
287
+ const response = await this.makeRequest("post", "/capture_login_session", data);
288
+ return response.storage_state || "";
289
+ }
290
+ async closeSession() {
291
+ if (!this.sessionId) {
292
+ return;
293
+ }
294
+ await this.makeRequest("post", "/close_session", { session_id: this.sessionId });
295
+ this.sessionId = null;
296
+ this.connectUrl = null;
297
+ }
298
+ };
299
+ export {
300
+ Simplex,
301
+ greet
302
+ };
303
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Example function to demonstrate package usage\n * @param name - The name to greet\n * @returns A greeting message\n */\nexport function greet(name: string): string {\n return `Hello, ${name}!`;\n}\n\n// Export other functions and types here \n\nimport axios from 'axios';\n\nconst BASE_URL = \"https://api.simplex.sh\";\n// const BASE_URL = \"https://simplex-dev-shreya--api-server-and-container-service-fas-bba69e.modal.run\"\n\ninterface SessionData {\n [key: string]: any;\n}\n\ninterface PlaywrightClickOptions {\n locator: string;\n locatorType: string;\n exact?: boolean;\n elementIndex?: 'first' | 'last' | 'nth';\n nthIndex?: number;\n locatorOptions?: Record<string, any>;\n}\n\ninterface SimplexResponse {\n succeeded?: boolean;\n error?: string;\n session_id?: string;\n livestream_url?: string;\n connect_url?: string;\n element_clicked?: string;\n text?: string;\n image?: string;\n bbox?: any;\n b64?: string;\n filename?: string;\n exists?: boolean;\n reasoning?: string;\n response?: string;\n url?: string;\n storage_state?: string;\n}\n\nexport class Simplex {\n private apiKey: string;\n private sessionId: string | null = null;\n private connectUrl: string | null = null;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async makeRequest<T>(\n method: 'get' | 'post',\n endpoint: string,\n data?: any,\n params?: any\n ): Promise<T> {\n try {\n console.log(`Making ${method.toUpperCase()} request to ${endpoint}`);\n \n // Convert data to FormData\n const formData = new FormData();\n if (data) {\n Object.entries(data).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n formData.append(key, value.toString());\n }\n });\n }\n \n const response = await axios({\n method,\n url: `${BASE_URL}${endpoint}`,\n data: method === 'post' ? formData : undefined,\n params: method === 'get' ? params : undefined,\n headers: {\n 'x-api-key': this.apiKey,\n ...(method === 'post' ? { 'Content-Type': 'multipart/form-data' } : {})\n }\n });\n\n const responseData = response.data as SimplexResponse;\n \n // Consider response successful if:\n // 1. It has succeeded: true, or\n // 2. It's a create_session response with a session_id\n // 3. It's a goto or hover response with a succeeded field\n // 4. It's a get_network_response with success status\n\n if (endpoint === \"/goto\" || endpoint === \"/hover\") {\n if (!('succeeded' in responseData)) {\n throw new Error('Response data is missing the \"succeeded\" field');\n }\n return responseData as T;\n }\n\n if (endpoint === \"/get_network_response\") {\n if (!('status' in responseData)) {\n throw new Error('It looks like the get_network_response action failed to return a response. Did you set your api_key when creating the Simplex class?');\n } else if (responseData.status == \"success\") {\n return responseData as T;\n } else {\n throw new Error(`Failed to get network response: ${responseData.error}`);\n }\n }\n\n\n if (!responseData.succeeded && !(endpoint === '/create_session' && responseData.session_id)) {\n const errorMessage = responseData.error || 'Request failed';\n console.error('API request failed:', errorMessage);\n throw new Error(errorMessage);\n }\n return responseData as T;\n } catch (error: unknown) {\n const axiosError = error as { response?: { data?: { error?: string }, status?: number, statusText?: string } };\n if (axiosError.response) {\n const errorMessage = axiosError.response.data?.error || String(error);\n console.error('Axios error:', {\n status: axiosError.response.status,\n statusText: axiosError.response.statusText,\n data: axiosError.response.data,\n message: errorMessage\n });\n throw new Error(`Request failed: ${errorMessage}`);\n }\n console.error('Unexpected error:', error);\n throw error;\n }\n }\n\n async createSession(\n showInConsole: boolean = true,\n proxies: boolean = true,\n workflowName?: string,\n sessionData?: SessionData | string\n ): Promise<[string, string]> {\n const data: any = {\n proxies,\n workflow_name: workflowName\n };\n\n if (this.sessionId) {\n throw new Error(\"A session is already active. Please close the current session before creating a new one.\");\n }\n if (sessionData) {\n if (typeof sessionData === 'string') {\n try {\n data.session_data = JSON.stringify(JSON.parse(sessionData));\n } catch {\n // If parsing fails, treat as file path\n // Note: File system operations are not available in browser environment\n throw new Error('File system operations are not supported in this environment');\n }\n } else {\n data.session_data = JSON.stringify(sessionData);\n }\n }\n\n const response = await this.makeRequest<SimplexResponse>('post', '/create_session', data);\n \n if (!response.session_id) {\n throw new Error('Session creation failed: No session ID returned');\n }\n\n this.sessionId = response.session_id;\n this.connectUrl = response.connect_url || null;\n\n if (showInConsole && response.livestream_url) {\n console.log(`Livestream URL: ${response.livestream_url}`);\n }\n\n return [response.session_id, response.livestream_url || ''];\n }\n\n async goto(url: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling goto with url='${url}'`);\n }\n\n if (!url.startsWith('http://') && !url.startsWith('https://')) {\n url = 'https://' + url;\n }\n\n const data = {\n url,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/goto', data);\n }\n\n async click(elementDescription: string, cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/click', data);\n return response.element_clicked || '';\n }\n\n async hover(elementDescription: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest<SimplexResponse>('post', '/hover', data);\n }\n\n async scrollToElement(elementDescription: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling click with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest<SimplexResponse>('post', '/scroll_to_element', data);\n }\n\n\n async getNetworkResponse(url: string, cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling getNetworkResponse with url='${url}'`);\n }\n \n const data = {\n url,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/get_network_response', data);\n return response.response || '';\n }\n\n async type(text: string, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling type with text='${text}'`);\n }\n\n const data = {\n text,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/type', data);\n }\n\n async pressEnter(cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error('Must call createSession before calling pressEnter');\n }\n\n const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };\n await this.makeRequest('post', '/press_enter', data);\n }\n\n async pressTab(cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error('Must call createSession before calling pressTab');\n }\n\n const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };\n await this.makeRequest('post', '/press_tab', data);\n }\n\n async deleteText(cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error('Must call createSession before calling deleteText');\n }\n\n const data = cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId };\n await this.makeRequest('post', '/delete_text', data);\n }\n\n async extractBbox(elementDescription: string, cdpUrl?: string): Promise<any> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling extractBbox with elementDescription='${elementDescription}'`);\n }\n\n const params = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('get', '/extract-bbox', undefined, params);\n return response.bbox;\n }\n\n async extractText(elementDescription: string, cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling extractText with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/extract-text', data);\n return response.text || '';\n }\n\n async scroll(pixels: number, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling scroll with pixels=${pixels}`);\n }\n\n const data = {\n pixels,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/scroll', data);\n }\n\n async wait(milliseconds: number, cdpUrl?: string): Promise<void> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling wait with milliseconds=${milliseconds}`);\n }\n\n const data = {\n milliseconds,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n await this.makeRequest('post', '/wait', data);\n }\n\n async clickAndUpload(\n elementDescription: string,\n filePathOrCallable: string | (() => Blob)\n ): Promise<void> {\n if (!this.sessionId) {\n throw new Error(`Must call createSession before calling clickAndUpload with elementDescription='${elementDescription}'`);\n }\n\n if (typeof filePathOrCallable !== 'string' && typeof filePathOrCallable !== 'function') {\n throw new TypeError(`filePathOrCallable must be either a string or a callable, not a ${typeof filePathOrCallable}`);\n }\n\n const formData = new FormData();\n formData.append('element_description', elementDescription);\n formData.append('session_id', this.sessionId);\n\n if (typeof filePathOrCallable === 'string') {\n // Note: File system operations are not available in browser environment\n throw new Error('File system operations are not supported in this environment');\n } else {\n const blob = filePathOrCallable();\n formData.append('file', blob, 'file'); // Add filename for the blob\n }\n\n await this.makeRequest('post', '/click_and_upload', formData, undefined);\n }\n\n async clickAndDownload(elementDescription: string): Promise<[string, string]> {\n if (!this.sessionId) {\n throw new Error(`Must call createSession before calling clickAndDownload with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n session_id: this.sessionId\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/click_and_download', data);\n return [response.b64 || '', response.filename || ''];\n }\n\n async exists(elementDescription: string, cdpUrl?: string): Promise<[boolean, string]> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling exists with elementDescription='${elementDescription}'`);\n }\n\n const data = {\n element_description: elementDescription,\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/exists', data);\n return [response.exists || false, response.reasoning || ''];\n }\n\n async getPageURL(cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling getPageURL`);\n }\n\n const data = {\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/get_page_url', data);\n return response.url || '';\n }\n\n async captureLoginSession(cdpUrl?: string): Promise<string> {\n if (!cdpUrl && !this.sessionId) {\n throw new Error(`Must call createSession before calling captureLoginSession`);\n }\n \n const data = {\n ...(cdpUrl ? { cdp_url: cdpUrl } : { session_id: this.sessionId })\n };\n\n const response = await this.makeRequest<SimplexResponse>('post', '/capture_login_session', data);\n return response.storage_state || '';\n }\n\n async closeSession(): Promise<void> {\n if (!this.sessionId) {\n return;\n }\n\n await this.makeRequest('post', '/close_session', { session_id: this.sessionId });\n this.sessionId = null;\n this.connectUrl = null;\n }\n} "],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "simplex-ts",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "description": "A TypeScript package for the Simplex API",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",