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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Opensteer
3
- } from "../chunk-OXFW5I3Y.js";
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
- import { homedir } from "os";
13
- import { mkdirSync } from "fs";
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(getRuntimeDir(), "opensteer.sock");
16
+ function getSocketPath(namespace2) {
17
+ return join(tmpdir(), `${prefix(namespace2)}.sock`);
21
18
  }
22
- function getPidPath() {
23
- return join(getRuntimeDir(), "opensteer.pid");
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(ov, args) {
26
+ async navigate(opensteer, args) {
30
27
  const url = args.url;
31
28
  if (!url) throw new Error("Missing required argument: url");
32
- await ov.goto(url, {
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: ov.page.url() };
34
+ return { url: opensteer.page.url() };
38
35
  },
39
- async back(ov) {
40
- await ov.page.goBack();
41
- return { url: ov.page.url() };
36
+ async back(opensteer) {
37
+ await opensteer.page.goBack();
38
+ return { url: opensteer.page.url() };
42
39
  },
43
- async forward(ov) {
44
- await ov.page.goForward();
45
- return { url: ov.page.url() };
40
+ async forward(opensteer) {
41
+ await opensteer.page.goForward();
42
+ return { url: opensteer.page.url() };
46
43
  },
47
- async reload(ov) {
48
- await ov.page.reload();
49
- return { url: ov.page.url() };
44
+ async reload(opensteer) {
45
+ await opensteer.page.reload();
46
+ return { url: opensteer.page.url() };
50
47
  },
51
- async snapshot(ov, args) {
48
+ async snapshot(opensteer, args) {
52
49
  const mode = args.mode || "action";
53
- const html = await ov.snapshot({ mode });
50
+ const html = await opensteer.snapshot({ mode });
54
51
  return { html };
55
52
  },
56
- async state(ov) {
57
- return await ov.state();
53
+ async state(opensteer) {
54
+ return await opensteer.state();
58
55
  },
59
- async screenshot(ov, args) {
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 ov.screenshot({
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(ov, args) {
70
- return await ov.click({
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(ov, args) {
79
- return await ov.dblclick({
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(ov, args) {
86
- return await ov.rightclick({
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(ov, args) {
93
- return await ov.hover({
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(ov, args) {
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 ov.input({
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(ov, args) {
112
- return await ov.select({
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(ov, args) {
122
- return await ov.scroll({
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(ov, args) {
127
+ async press(opensteer, args) {
131
128
  const key = args.key;
132
129
  if (!key) throw new Error("Missing required argument: key");
133
- await ov.pressKey(key);
130
+ await opensteer.pressKey(key);
134
131
  return { key };
135
132
  },
136
- async type(ov, args) {
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 ov.type(text);
136
+ await opensteer.type(text);
140
137
  return { text };
141
138
  },
142
- async "get-text"(ov, args) {
143
- const text = await ov.getElementText({
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"(ov, args) {
151
- const value = await ov.getElementValue({
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"(ov, args) {
159
- const attributes = await ov.getElementAttributes({
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"(ov, args) {
167
- const html = await ov.getHtml(args.selector);
163
+ async "get-html"(opensteer, args) {
164
+ const html = await opensteer.getHtml(args.selector);
168
165
  return { html };
169
166
  },
170
- async tabs(ov) {
171
- const tabs = await ov.tabs();
167
+ async tabs(opensteer) {
168
+ const tabs = await opensteer.tabs();
172
169
  return { tabs };
173
170
  },
174
- async "tab-new"(ov, args) {
175
- return await ov.newTab(args.url);
171
+ async "tab-new"(opensteer, args) {
172
+ return await opensteer.newTab(args.url);
176
173
  },
177
- async "tab-switch"(ov, args) {
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 ov.switchTab(index);
177
+ await opensteer.switchTab(index);
181
178
  return { index };
182
179
  },
183
- async "tab-close"(ov, args) {
184
- await ov.closeTab(args.index);
180
+ async "tab-close"(opensteer, args) {
181
+ await opensteer.closeTab(args.index);
185
182
  return {};
186
183
  },
187
- async cookies(ov, args) {
188
- const cookies = await ov.getCookies(args.url);
184
+ async cookies(opensteer, args) {
185
+ const cookies = await opensteer.getCookies(args.url);
189
186
  return { cookies };
190
187
  },
191
- async "cookie-set"(ov, args) {
192
- await ov.setCookie({
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"(ov) {
206
- await ov.clearCookies();
202
+ async "cookies-clear"(opensteer) {
203
+ await opensteer.clearCookies();
207
204
  return {};
208
205
  },
209
- async "cookies-export"(ov, args) {
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 ov.exportCookies(file, args.url);
209
+ await opensteer.exportCookies(file, args.url);
213
210
  return { file };
214
211
  },
215
- async "cookies-import"(ov, args) {
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 ov.importCookies(file);
215
+ await opensteer.importCookies(file);
219
216
  return { file };
220
217
  },
221
- async eval(ov, args) {
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 ov.page.evaluate(expression);
222
+ const result = await opensteer.page.evaluate(expression);
226
223
  return { result };
227
224
  },
228
- async "wait-for"(ov, args) {
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 ov.waitForText(text, {
228
+ await opensteer.waitForText(text, {
232
229
  timeout: args.timeout
233
230
  });
234
231
  return { text };
235
232
  },
236
- async "wait-selector"(ov, args) {
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 ov.page.waitForSelector(selector, {
236
+ await opensteer.page.waitForSelector(selector, {
240
237
  timeout: args.timeout ?? 3e4
241
238
  });
242
239
  return { selector };
243
240
  },
244
- async extract(ov, args) {
241
+ async extract(opensteer, args) {
245
242
  const schema = args.schema;
246
- const data = await ov.extract({
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 socketPath = getSocketPath();
261
- var pidPath = getPidPath();
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 name = args.name;
285
- const cdpUrl = args["cdp-url"];
287
+ const connectUrl = args["connect-url"];
286
288
  const channel = args.channel;
287
- const userDataDir = args["user-data-dir"];
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: name ?? "cli",
306
+ name: namespace,
291
307
  browser: {
292
308
  headless: headless ?? false,
293
- cdpUrl,
309
+ connectUrl,
294
310
  channel,
295
- userDataDir
311
+ profileDir
296
312
  }
297
313
  });
298
- await instance.launch({ headless: headless ?? false });
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: { url: instance.page.url() }
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, { id, ok: true, result: {} });
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: "No browser session. Call 'opensteer open' first."
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
  }