opensteer 0.4.1 → 0.4.3
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.
- package/CHANGELOG.md +16 -1
- package/README.md +80 -20
- package/bin/opensteer.mjs +260 -32
- package/dist/cli/server.cjs +2763 -1170
- package/dist/cli/server.js +130 -93
- package/dist/index.cjs +2640 -1078
- package/dist/index.d.cts +117 -54
- package/dist/index.d.ts +117 -54
- package/dist/index.js +27 -21
- package/package.json +12 -19
- package/dist/chunk-OXFW5I3Y.js +0 -7679
package/dist/cli/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Opensteer
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-2NKR4JZ6.js";
|
|
4
4
|
import "../chunk-3H5RRIMZ.js";
|
|
5
5
|
|
|
6
6
|
// src/cli/server.ts
|
|
@@ -8,66 +8,63 @@ import { createServer } from "net";
|
|
|
8
8
|
import { writeFileSync, unlinkSync, existsSync } from "fs";
|
|
9
9
|
|
|
10
10
|
// src/cli/paths.ts
|
|
11
|
+
import { tmpdir } from "os";
|
|
11
12
|
import { join } from "path";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
function getRuntimeDir() {
|
|
15
|
-
const dir = join(homedir(), ".opensteer");
|
|
16
|
-
mkdirSync(dir, { recursive: true });
|
|
17
|
-
return dir;
|
|
13
|
+
function prefix(namespace2) {
|
|
14
|
+
return `opensteer-${namespace2}`;
|
|
18
15
|
}
|
|
19
|
-
function getSocketPath() {
|
|
20
|
-
return join(
|
|
16
|
+
function getSocketPath(namespace2) {
|
|
17
|
+
return join(tmpdir(), `${prefix(namespace2)}.sock`);
|
|
21
18
|
}
|
|
22
|
-
function getPidPath() {
|
|
23
|
-
return join(
|
|
19
|
+
function getPidPath(namespace2) {
|
|
20
|
+
return join(tmpdir(), `${prefix(namespace2)}.pid`);
|
|
24
21
|
}
|
|
25
22
|
|
|
26
23
|
// src/cli/commands.ts
|
|
27
24
|
import { writeFile } from "fs/promises";
|
|
28
25
|
var commands = {
|
|
29
|
-
async navigate(
|
|
26
|
+
async navigate(opensteer, args) {
|
|
30
27
|
const url = args.url;
|
|
31
28
|
if (!url) throw new Error("Missing required argument: url");
|
|
32
|
-
await
|
|
29
|
+
await opensteer.goto(url, {
|
|
33
30
|
timeout: args.timeout,
|
|
34
31
|
settleMs: args.settleMs,
|
|
35
32
|
waitUntil: args.waitUntil
|
|
36
33
|
});
|
|
37
|
-
return { url:
|
|
34
|
+
return { url: opensteer.page.url() };
|
|
38
35
|
},
|
|
39
|
-
async back(
|
|
40
|
-
await
|
|
41
|
-
return { url:
|
|
36
|
+
async back(opensteer) {
|
|
37
|
+
await opensteer.page.goBack();
|
|
38
|
+
return { url: opensteer.page.url() };
|
|
42
39
|
},
|
|
43
|
-
async forward(
|
|
44
|
-
await
|
|
45
|
-
return { url:
|
|
40
|
+
async forward(opensteer) {
|
|
41
|
+
await opensteer.page.goForward();
|
|
42
|
+
return { url: opensteer.page.url() };
|
|
46
43
|
},
|
|
47
|
-
async reload(
|
|
48
|
-
await
|
|
49
|
-
return { url:
|
|
44
|
+
async reload(opensteer) {
|
|
45
|
+
await opensteer.page.reload();
|
|
46
|
+
return { url: opensteer.page.url() };
|
|
50
47
|
},
|
|
51
|
-
async snapshot(
|
|
48
|
+
async snapshot(opensteer, args) {
|
|
52
49
|
const mode = args.mode || "action";
|
|
53
|
-
const html = await
|
|
50
|
+
const html = await opensteer.snapshot({ mode });
|
|
54
51
|
return { html };
|
|
55
52
|
},
|
|
56
|
-
async state(
|
|
57
|
-
return await
|
|
53
|
+
async state(opensteer) {
|
|
54
|
+
return await opensteer.state();
|
|
58
55
|
},
|
|
59
|
-
async screenshot(
|
|
56
|
+
async screenshot(opensteer, args) {
|
|
60
57
|
const file = args.file || "screenshot.png";
|
|
61
58
|
const type = file.endsWith(".jpg") || file.endsWith(".jpeg") ? "jpeg" : "png";
|
|
62
|
-
const buffer = await
|
|
59
|
+
const buffer = await opensteer.screenshot({
|
|
63
60
|
fullPage: args.fullPage,
|
|
64
61
|
type
|
|
65
62
|
});
|
|
66
63
|
await writeFile(file, buffer);
|
|
67
64
|
return { file };
|
|
68
65
|
},
|
|
69
|
-
async click(
|
|
70
|
-
return await
|
|
66
|
+
async click(opensteer, args) {
|
|
67
|
+
return await opensteer.click({
|
|
71
68
|
element: args.element,
|
|
72
69
|
selector: args.selector,
|
|
73
70
|
description: args.description,
|
|
@@ -75,31 +72,31 @@ var commands = {
|
|
|
75
72
|
clickCount: args.clickCount
|
|
76
73
|
});
|
|
77
74
|
},
|
|
78
|
-
async dblclick(
|
|
79
|
-
return await
|
|
75
|
+
async dblclick(opensteer, args) {
|
|
76
|
+
return await opensteer.dblclick({
|
|
80
77
|
element: args.element,
|
|
81
78
|
selector: args.selector,
|
|
82
79
|
description: args.description
|
|
83
80
|
});
|
|
84
81
|
},
|
|
85
|
-
async rightclick(
|
|
86
|
-
return await
|
|
82
|
+
async rightclick(opensteer, args) {
|
|
83
|
+
return await opensteer.rightclick({
|
|
87
84
|
element: args.element,
|
|
88
85
|
selector: args.selector,
|
|
89
86
|
description: args.description
|
|
90
87
|
});
|
|
91
88
|
},
|
|
92
|
-
async hover(
|
|
93
|
-
return await
|
|
89
|
+
async hover(opensteer, args) {
|
|
90
|
+
return await opensteer.hover({
|
|
94
91
|
element: args.element,
|
|
95
92
|
selector: args.selector,
|
|
96
93
|
description: args.description
|
|
97
94
|
});
|
|
98
95
|
},
|
|
99
|
-
async input(
|
|
96
|
+
async input(opensteer, args) {
|
|
100
97
|
const text = args.text;
|
|
101
98
|
if (text == null) throw new Error("Missing required argument: text");
|
|
102
|
-
return await
|
|
99
|
+
return await opensteer.input({
|
|
103
100
|
element: args.element,
|
|
104
101
|
selector: args.selector,
|
|
105
102
|
description: args.description,
|
|
@@ -108,8 +105,8 @@ var commands = {
|
|
|
108
105
|
pressEnter: args.pressEnter
|
|
109
106
|
});
|
|
110
107
|
},
|
|
111
|
-
async select(
|
|
112
|
-
return await
|
|
108
|
+
async select(opensteer, args) {
|
|
109
|
+
return await opensteer.select({
|
|
113
110
|
element: args.element,
|
|
114
111
|
selector: args.selector,
|
|
115
112
|
description: args.description,
|
|
@@ -118,8 +115,8 @@ var commands = {
|
|
|
118
115
|
index: args.index
|
|
119
116
|
});
|
|
120
117
|
},
|
|
121
|
-
async scroll(
|
|
122
|
-
return await
|
|
118
|
+
async scroll(opensteer, args) {
|
|
119
|
+
return await opensteer.scroll({
|
|
123
120
|
element: args.element,
|
|
124
121
|
selector: args.selector,
|
|
125
122
|
description: args.description,
|
|
@@ -127,69 +124,69 @@ var commands = {
|
|
|
127
124
|
amount: args.amount
|
|
128
125
|
});
|
|
129
126
|
},
|
|
130
|
-
async press(
|
|
127
|
+
async press(opensteer, args) {
|
|
131
128
|
const key = args.key;
|
|
132
129
|
if (!key) throw new Error("Missing required argument: key");
|
|
133
|
-
await
|
|
130
|
+
await opensteer.pressKey(key);
|
|
134
131
|
return { key };
|
|
135
132
|
},
|
|
136
|
-
async type(
|
|
133
|
+
async type(opensteer, args) {
|
|
137
134
|
const text = args.text;
|
|
138
135
|
if (text == null) throw new Error("Missing required argument: text");
|
|
139
|
-
await
|
|
136
|
+
await opensteer.type(text);
|
|
140
137
|
return { text };
|
|
141
138
|
},
|
|
142
|
-
async "get-text"(
|
|
143
|
-
const text = await
|
|
139
|
+
async "get-text"(opensteer, args) {
|
|
140
|
+
const text = await opensteer.getElementText({
|
|
144
141
|
element: args.element,
|
|
145
142
|
selector: args.selector,
|
|
146
143
|
description: args.description
|
|
147
144
|
});
|
|
148
145
|
return { text };
|
|
149
146
|
},
|
|
150
|
-
async "get-value"(
|
|
151
|
-
const value = await
|
|
147
|
+
async "get-value"(opensteer, args) {
|
|
148
|
+
const value = await opensteer.getElementValue({
|
|
152
149
|
element: args.element,
|
|
153
150
|
selector: args.selector,
|
|
154
151
|
description: args.description
|
|
155
152
|
});
|
|
156
153
|
return { value };
|
|
157
154
|
},
|
|
158
|
-
async "get-attrs"(
|
|
159
|
-
const attributes = await
|
|
155
|
+
async "get-attrs"(opensteer, args) {
|
|
156
|
+
const attributes = await opensteer.getElementAttributes({
|
|
160
157
|
element: args.element,
|
|
161
158
|
selector: args.selector,
|
|
162
159
|
description: args.description
|
|
163
160
|
});
|
|
164
161
|
return { attributes };
|
|
165
162
|
},
|
|
166
|
-
async "get-html"(
|
|
167
|
-
const html = await
|
|
163
|
+
async "get-html"(opensteer, args) {
|
|
164
|
+
const html = await opensteer.getHtml(args.selector);
|
|
168
165
|
return { html };
|
|
169
166
|
},
|
|
170
|
-
async tabs(
|
|
171
|
-
const tabs = await
|
|
167
|
+
async tabs(opensteer) {
|
|
168
|
+
const tabs = await opensteer.tabs();
|
|
172
169
|
return { tabs };
|
|
173
170
|
},
|
|
174
|
-
async "tab-new"(
|
|
175
|
-
return await
|
|
171
|
+
async "tab-new"(opensteer, args) {
|
|
172
|
+
return await opensteer.newTab(args.url);
|
|
176
173
|
},
|
|
177
|
-
async "tab-switch"(
|
|
174
|
+
async "tab-switch"(opensteer, args) {
|
|
178
175
|
const index = args.index;
|
|
179
176
|
if (index == null) throw new Error("Missing required argument: index");
|
|
180
|
-
await
|
|
177
|
+
await opensteer.switchTab(index);
|
|
181
178
|
return { index };
|
|
182
179
|
},
|
|
183
|
-
async "tab-close"(
|
|
184
|
-
await
|
|
180
|
+
async "tab-close"(opensteer, args) {
|
|
181
|
+
await opensteer.closeTab(args.index);
|
|
185
182
|
return {};
|
|
186
183
|
},
|
|
187
|
-
async cookies(
|
|
188
|
-
const cookies = await
|
|
184
|
+
async cookies(opensteer, args) {
|
|
185
|
+
const cookies = await opensteer.getCookies(args.url);
|
|
189
186
|
return { cookies };
|
|
190
187
|
},
|
|
191
|
-
async "cookie-set"(
|
|
192
|
-
await
|
|
188
|
+
async "cookie-set"(opensteer, args) {
|
|
189
|
+
await opensteer.setCookie({
|
|
193
190
|
name: args.name,
|
|
194
191
|
value: args.value,
|
|
195
192
|
url: args.url,
|
|
@@ -202,48 +199,48 @@ var commands = {
|
|
|
202
199
|
});
|
|
203
200
|
return {};
|
|
204
201
|
},
|
|
205
|
-
async "cookies-clear"(
|
|
206
|
-
await
|
|
202
|
+
async "cookies-clear"(opensteer) {
|
|
203
|
+
await opensteer.clearCookies();
|
|
207
204
|
return {};
|
|
208
205
|
},
|
|
209
|
-
async "cookies-export"(
|
|
206
|
+
async "cookies-export"(opensteer, args) {
|
|
210
207
|
const file = args.file;
|
|
211
208
|
if (!file) throw new Error("Missing required argument: file");
|
|
212
|
-
await
|
|
209
|
+
await opensteer.exportCookies(file, args.url);
|
|
213
210
|
return { file };
|
|
214
211
|
},
|
|
215
|
-
async "cookies-import"(
|
|
212
|
+
async "cookies-import"(opensteer, args) {
|
|
216
213
|
const file = args.file;
|
|
217
214
|
if (!file) throw new Error("Missing required argument: file");
|
|
218
|
-
await
|
|
215
|
+
await opensteer.importCookies(file);
|
|
219
216
|
return { file };
|
|
220
217
|
},
|
|
221
|
-
async eval(
|
|
218
|
+
async eval(opensteer, args) {
|
|
222
219
|
const expression = args.expression;
|
|
223
220
|
if (!expression)
|
|
224
221
|
throw new Error("Missing required argument: expression");
|
|
225
|
-
const result = await
|
|
222
|
+
const result = await opensteer.page.evaluate(expression);
|
|
226
223
|
return { result };
|
|
227
224
|
},
|
|
228
|
-
async "wait-for"(
|
|
225
|
+
async "wait-for"(opensteer, args) {
|
|
229
226
|
const text = args.text;
|
|
230
227
|
if (!text) throw new Error("Missing required argument: text");
|
|
231
|
-
await
|
|
228
|
+
await opensteer.waitForText(text, {
|
|
232
229
|
timeout: args.timeout
|
|
233
230
|
});
|
|
234
231
|
return { text };
|
|
235
232
|
},
|
|
236
|
-
async "wait-selector"(
|
|
233
|
+
async "wait-selector"(opensteer, args) {
|
|
237
234
|
const selector = args.selector;
|
|
238
235
|
if (!selector) throw new Error("Missing required argument: selector");
|
|
239
|
-
await
|
|
236
|
+
await opensteer.page.waitForSelector(selector, {
|
|
240
237
|
timeout: args.timeout ?? 3e4
|
|
241
238
|
});
|
|
242
239
|
return { selector };
|
|
243
240
|
},
|
|
244
|
-
async extract(
|
|
241
|
+
async extract(opensteer, args) {
|
|
245
242
|
const schema = args.schema;
|
|
246
|
-
const data = await
|
|
243
|
+
const data = await opensteer.extract({
|
|
247
244
|
schema,
|
|
248
245
|
description: args.description,
|
|
249
246
|
prompt: args.prompt
|
|
@@ -257,8 +254,14 @@ function getCommandHandler(name) {
|
|
|
257
254
|
|
|
258
255
|
// src/cli/server.ts
|
|
259
256
|
var instance = null;
|
|
260
|
-
var
|
|
261
|
-
var
|
|
257
|
+
var launchPromise = null;
|
|
258
|
+
var namespace = process.env.OPENSTEER_NAME?.trim();
|
|
259
|
+
if (!namespace) {
|
|
260
|
+
process.stderr.write("Missing OPENSTEER_NAME environment variable.\n");
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
var socketPath = getSocketPath(namespace);
|
|
264
|
+
var pidPath = getPidPath(namespace);
|
|
262
265
|
function cleanup() {
|
|
263
266
|
try {
|
|
264
267
|
unlinkSync(socketPath);
|
|
@@ -281,21 +284,47 @@ async function handleRequest(request, socket) {
|
|
|
281
284
|
try {
|
|
282
285
|
const url = args.url;
|
|
283
286
|
const headless = args.headless;
|
|
284
|
-
const
|
|
285
|
-
const cdpUrl = args["cdp-url"];
|
|
287
|
+
const connectUrl = args["connect-url"];
|
|
286
288
|
const channel = args.channel;
|
|
287
|
-
const
|
|
289
|
+
const profileDir = args["profile-dir"];
|
|
290
|
+
if (instance && !launchPromise) {
|
|
291
|
+
try {
|
|
292
|
+
const alive = !instance.page.isClosed();
|
|
293
|
+
if (!alive) {
|
|
294
|
+
await instance.close().catch(() => {
|
|
295
|
+
});
|
|
296
|
+
instance = null;
|
|
297
|
+
}
|
|
298
|
+
} catch {
|
|
299
|
+
await instance?.close().catch(() => {
|
|
300
|
+
});
|
|
301
|
+
instance = null;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
288
304
|
if (!instance) {
|
|
289
305
|
instance = new Opensteer({
|
|
290
|
-
name:
|
|
306
|
+
name: namespace,
|
|
291
307
|
browser: {
|
|
292
308
|
headless: headless ?? false,
|
|
293
|
-
|
|
309
|
+
connectUrl,
|
|
294
310
|
channel,
|
|
295
|
-
|
|
311
|
+
profileDir
|
|
296
312
|
}
|
|
297
313
|
});
|
|
298
|
-
|
|
314
|
+
launchPromise = instance.launch({
|
|
315
|
+
headless: headless ?? false,
|
|
316
|
+
timeout: connectUrl ? 12e4 : 3e4
|
|
317
|
+
});
|
|
318
|
+
try {
|
|
319
|
+
await launchPromise;
|
|
320
|
+
} catch (err) {
|
|
321
|
+
instance = null;
|
|
322
|
+
throw err;
|
|
323
|
+
} finally {
|
|
324
|
+
launchPromise = null;
|
|
325
|
+
}
|
|
326
|
+
} else if (launchPromise) {
|
|
327
|
+
await launchPromise;
|
|
299
328
|
}
|
|
300
329
|
if (url) {
|
|
301
330
|
await instance.page.goto(url);
|
|
@@ -303,7 +332,11 @@ async function handleRequest(request, socket) {
|
|
|
303
332
|
sendResponse(socket, {
|
|
304
333
|
id,
|
|
305
334
|
ok: true,
|
|
306
|
-
result: {
|
|
335
|
+
result: {
|
|
336
|
+
url: instance.page.url(),
|
|
337
|
+
sessionId: instance.getRemoteSessionId() ?? void 0,
|
|
338
|
+
name: namespace
|
|
339
|
+
}
|
|
307
340
|
});
|
|
308
341
|
} catch (err) {
|
|
309
342
|
sendResponse(socket, {
|
|
@@ -320,7 +353,11 @@ async function handleRequest(request, socket) {
|
|
|
320
353
|
await instance.close();
|
|
321
354
|
instance = null;
|
|
322
355
|
}
|
|
323
|
-
sendResponse(socket, {
|
|
356
|
+
sendResponse(socket, {
|
|
357
|
+
id,
|
|
358
|
+
ok: true,
|
|
359
|
+
result: { sessionClosed: true }
|
|
360
|
+
});
|
|
324
361
|
} catch (err) {
|
|
325
362
|
sendResponse(socket, {
|
|
326
363
|
id,
|
|
@@ -342,7 +379,7 @@ async function handleRequest(request, socket) {
|
|
|
342
379
|
sendResponse(socket, {
|
|
343
380
|
id,
|
|
344
381
|
ok: false,
|
|
345
|
-
error:
|
|
382
|
+
error: `No browser session in namespace '${namespace}'. Call 'opensteer open --name ${namespace}' first, or use 'opensteer sessions' to list active sessions.`
|
|
346
383
|
});
|
|
347
384
|
return;
|
|
348
385
|
}
|