opensteer 0.9.3 → 0.9.5
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/README.md +158 -165
- package/dist/{chunk-UM2Q4JD2.js → chunk-7D45QUZ3.js} +5 -7
- package/dist/chunk-7D45QUZ3.js.map +1 -0
- package/dist/{chunk-GREXSYNC.js → chunk-7LQL5YUR.js} +578 -224
- package/dist/chunk-7LQL5YUR.js.map +1 -0
- package/dist/{chunk-2TIVULZY.js → chunk-GSCQQKZZ.js} +53 -9
- package/dist/chunk-GSCQQKZZ.js.map +1 -0
- package/dist/{chunk-BMPUL66S.js → chunk-T5P2QGZ3.js} +58 -53
- package/dist/chunk-T5P2QGZ3.js.map +1 -0
- package/dist/{chunk-FIMNKEG5.js → chunk-ZRF7WMS3.js} +4 -4
- package/dist/{chunk-FIMNKEG5.js.map → chunk-ZRF7WMS3.js.map} +1 -1
- package/dist/cli/bin.cjs +707 -278
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.js +30 -34
- package/dist/cli/bin.js.map +1 -1
- package/dist/index.cjs +733 -473
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -460
- package/dist/index.d.ts +25 -460
- package/dist/index.js +4 -5
- package/dist/local-view/serve-entry.cjs +106 -57
- package/dist/local-view/serve-entry.cjs.map +1 -1
- package/dist/local-view/serve-entry.js +2 -2
- package/dist/opensteer-T2JENADR.js +6 -0
- package/dist/{opensteer-IBDPRIEX.js.map → opensteer-T2JENADR.js.map} +1 -1
- package/dist/{session-control-IFE3IPS3.js → session-control-M3JD7ZKA.js} +4 -4
- package/dist/{session-control-IFE3IPS3.js.map → session-control-M3JD7ZKA.js.map} +1 -1
- package/package.json +6 -6
- package/skills/opensteer/SKILL.md +134 -95
- package/skills/recorder/SKILL.md +43 -48
- package/dist/chunk-2TIVULZY.js.map +0 -1
- package/dist/chunk-BMPUL66S.js.map +0 -1
- package/dist/chunk-GREXSYNC.js.map +0 -1
- package/dist/chunk-KCINASQC.js +0 -3
- package/dist/chunk-KCINASQC.js.map +0 -1
- package/dist/chunk-UM2Q4JD2.js.map +0 -1
- package/dist/opensteer-IBDPRIEX.js +0 -6
- package/skills/recorder/references/recorder-reference.md +0 -71
package/README.md
CHANGED
|
@@ -1,211 +1,204 @@
|
|
|
1
|
-
|
|
1
|
+
<!-- This file is generated from the repository README. Run `node scripts/sync-package-readme.mjs`. -->
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>Opensteer</strong><br/>
|
|
5
|
+
<em>AI Browser Automation Framework</em>
|
|
6
|
+
</p>
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://www.npmjs.com/package/opensteer"><img src="https://img.shields.io/npm/v/opensteer.svg" alt="npm version" /></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/opensteer"><img src="https://img.shields.io/npm/dm/opensteer.svg" alt="npm downloads" /></a>
|
|
11
|
+
<a href="https://github.com/steerlabs/opensteer/blob/main/LICENSE"><img src="https://img.shields.io/github/license/steerlabs/opensteer.svg" alt="license" /></a>
|
|
12
|
+
<a href="https://github.com/steerlabs/opensteer/stargazers"><img src="https://img.shields.io/github/stars/steerlabs/opensteer.svg" alt="stars" /></a>
|
|
13
|
+
</p>
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://opensteer.com">Website</a> ·
|
|
17
|
+
<a href="https://docs.opensteer.com">Docs</a> ·
|
|
18
|
+
<a href="https://github.com/steerlabs/opensteer">GitHub</a> ·
|
|
19
|
+
<a href="https://discord.gg/opensteer">Discord</a>
|
|
20
|
+
</p>
|
|
12
21
|
|
|
13
|
-
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
Open-source browser automation framework for AI agents. CLI and TypeScript SDK that give coding agents a real Chromium browser with persistent sessions, network capture, and stealth -- so they can browse, inspect, and generate scrapers directly in your codebase.
|
|
14
25
|
|
|
15
26
|
## Install
|
|
16
27
|
|
|
17
28
|
```bash
|
|
18
|
-
|
|
19
|
-
|
|
29
|
+
npm i -g opensteer
|
|
30
|
+
```
|
|
20
31
|
|
|
21
|
-
|
|
22
|
-
|
|
32
|
+
Then install Chromium for Playwright:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
23
35
|
npx playwright install chromium
|
|
24
36
|
```
|
|
25
37
|
|
|
26
|
-
|
|
38
|
+
## Agent Quickstart
|
|
27
39
|
|
|
28
|
-
|
|
40
|
+
> **Using Claude Code, Codex, or Cursor?** Point your agent at Opensteer with a single command -- no manual setup needed.
|
|
29
41
|
|
|
30
42
|
```bash
|
|
31
|
-
opensteer
|
|
32
|
-
opensteer goto https://example.com/search --workspace demo --capture-network search
|
|
33
|
-
opensteer network query --workspace demo --capture search
|
|
34
|
-
opensteer network detail rec_123 --workspace demo
|
|
35
|
-
opensteer replay rec_123 --workspace demo
|
|
36
|
-
opensteer cookies example.com --workspace demo
|
|
37
|
-
opensteer storage example.com --workspace demo
|
|
38
|
-
opensteer state example.com --workspace demo
|
|
39
|
-
opensteer close --workspace demo
|
|
43
|
+
opensteer skills install
|
|
40
44
|
```
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
This installs first-party skills that teach your AI agent how to use the Opensteer CLI and SDK. The agent can then open browsers, capture network traffic, extract structured data, and generate scrapers autonomously.
|
|
47
|
+
|
|
48
|
+
Target specific agents:
|
|
43
49
|
|
|
44
50
|
```bash
|
|
51
|
+
opensteer skills install --agent codex --agent cursor --agent claude-code
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Quickstart
|
|
55
|
+
|
|
56
|
+
### CLI
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Open a page in a persistent workspace
|
|
60
|
+
opensteer open https://example.com --workspace demo
|
|
61
|
+
|
|
62
|
+
# Take a snapshot and list interactive elements
|
|
45
63
|
opensteer snapshot action --workspace demo
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
opensteer
|
|
49
|
-
|
|
64
|
+
|
|
65
|
+
# Click an element by its annotated index
|
|
66
|
+
opensteer click 3 --workspace demo --persist "cta"
|
|
67
|
+
|
|
68
|
+
# Extract structured data from the page
|
|
69
|
+
opensteer extract '{"title":{"element":3}}' --workspace demo
|
|
70
|
+
|
|
71
|
+
# Close the workspace
|
|
72
|
+
opensteer close --workspace demo
|
|
50
73
|
```
|
|
51
74
|
|
|
52
|
-
|
|
75
|
+
### SDK
|
|
53
76
|
|
|
54
77
|
```ts
|
|
55
78
|
import { Opensteer } from "opensteer";
|
|
56
79
|
|
|
57
|
-
const opensteer = new Opensteer({
|
|
58
|
-
workspace: "demo",
|
|
59
|
-
rootDir: process.cwd(),
|
|
60
|
-
});
|
|
80
|
+
const opensteer = new Opensteer({ workspace: "demo", rootDir: process.cwd() });
|
|
61
81
|
|
|
62
82
|
await opensteer.open("https://example.com");
|
|
63
|
-
await opensteer.
|
|
64
|
-
|
|
65
|
-
|
|
83
|
+
await opensteer.click({ persist: "cta" });
|
|
84
|
+
const data = await opensteer.extract({ persist: "page summary" });
|
|
85
|
+
await opensteer.close();
|
|
86
|
+
```
|
|
66
87
|
|
|
67
|
-
|
|
68
|
-
capture: "search",
|
|
69
|
-
json: true,
|
|
70
|
-
});
|
|
88
|
+
## Features
|
|
71
89
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
<table>
|
|
91
|
+
<tr>
|
|
92
|
+
<td width="50%">
|
|
75
93
|
|
|
76
|
-
|
|
77
|
-
console.log(detail.transportProbe?.recommended);
|
|
78
|
-
```
|
|
94
|
+
### Persistent Sessions
|
|
79
95
|
|
|
80
|
-
|
|
96
|
+
Logins, cookies, and browser state survive across restarts. Each workspace is a full Chrome user-data directory.
|
|
81
97
|
|
|
82
|
-
|
|
98
|
+
### Profile Cloning
|
|
83
99
|
|
|
84
|
-
|
|
85
|
-
import { Opensteer } from "opensteer";
|
|
100
|
+
Clone a real Chrome profile to start a workspace already logged in. Source browser doesn't need to close.
|
|
86
101
|
|
|
87
|
-
|
|
88
|
-
workspace: "target",
|
|
89
|
-
rootDir: process.cwd(),
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
async function ensureTargetSession() {
|
|
93
|
-
const cookies = await opensteer.cookies(".target.com");
|
|
94
|
-
if (cookies.has("visitorId")) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
await opensteer.goto("https://target.com");
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export async function searchTarget(keyword: string, count = 24) {
|
|
101
|
-
await ensureTargetSession();
|
|
102
|
-
|
|
103
|
-
const response = await opensteer.fetch(
|
|
104
|
-
"https://redsky.target.com/redsky_aggregations/v1/web/plp_search_v2",
|
|
105
|
-
{
|
|
106
|
-
query: {
|
|
107
|
-
keyword,
|
|
108
|
-
count,
|
|
109
|
-
offset: 0,
|
|
110
|
-
channel: "WEB",
|
|
111
|
-
platform: "desktop",
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
return response.json();
|
|
117
|
-
}
|
|
118
|
-
```
|
|
102
|
+
### Network Capture
|
|
119
103
|
|
|
120
|
-
|
|
104
|
+
Record traffic during any action, inspect requests, and replay APIs with browser-backed `fetch()`.
|
|
121
105
|
|
|
122
|
-
|
|
123
|
-
const response = await opensteer.fetch("https://api.example.com/search", {
|
|
124
|
-
query: { keyword: "laptop" },
|
|
125
|
-
transport: "matched-tls",
|
|
126
|
-
});
|
|
127
|
-
```
|
|
106
|
+
### Script Analysis
|
|
128
107
|
|
|
129
|
-
|
|
108
|
+
Capture, beautify, deobfuscate, and sandbox page JavaScript.
|
|
130
109
|
|
|
131
|
-
|
|
110
|
+
</td>
|
|
111
|
+
<td width="50%">
|
|
132
112
|
|
|
133
|
-
|
|
134
|
-
const cookies = await opensteer.cookies("example.com");
|
|
135
|
-
const localStorage = await opensteer.storage("example.com", "local");
|
|
136
|
-
const sessionStorage = await opensteer.storage("example.com", "session");
|
|
137
|
-
const state = await opensteer.state("example.com");
|
|
138
|
-
```
|
|
113
|
+
### Computer Use
|
|
139
114
|
|
|
140
|
-
|
|
115
|
+
Coordinate-based mouse and keyboard when DOM targeting isn't enough.
|
|
141
116
|
|
|
142
|
-
|
|
143
|
-
cookies.has("session");
|
|
144
|
-
cookies.get("session");
|
|
145
|
-
cookies.getAll();
|
|
146
|
-
cookies.serialize();
|
|
147
|
-
```
|
|
117
|
+
### Stealth
|
|
148
118
|
|
|
149
|
-
|
|
119
|
+
Anti-detection defaults: UA spoofing, fingerprint management, automation signal removal.
|
|
150
120
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
121
|
+
### Local View
|
|
122
|
+
|
|
123
|
+
Stream live screenshots from headless sessions to a browser-based viewer.
|
|
124
|
+
|
|
125
|
+
### Local or Cloud
|
|
126
|
+
|
|
127
|
+
Run browsers locally or on [Opensteer Cloud](https://opensteer.com). Same CLI, same SDK.
|
|
128
|
+
|
|
129
|
+
</td>
|
|
130
|
+
</tr>
|
|
131
|
+
</table>
|
|
132
|
+
|
|
133
|
+
## How It Works
|
|
134
|
+
|
|
135
|
+
Opensteer follows a **discover-then-codify** workflow:
|
|
136
|
+
|
|
137
|
+
1. **Capture** -- Open a real page, trigger actions, and record network traffic.
|
|
138
|
+
2. **Inspect** -- Query captured traffic, check cookies/storage/state for auth context.
|
|
139
|
+
3. **Probe** -- Test transport viability for captured requests before writing code.
|
|
140
|
+
4. **Codify** -- Write plain TypeScript with `session.fetch()`. The code is the durable artifact.
|
|
141
|
+
|
|
142
|
+
See the full [Workflow Guide](https://github.com/steerlabs/opensteer/blob/main/docs/workflows.md) for details.
|
|
143
|
+
|
|
144
|
+
## Documentation
|
|
145
|
+
|
|
146
|
+
| Resource | Description |
|
|
147
|
+
| -------------------------------------------------- | -------------------------------------- |
|
|
148
|
+
| [Package Guide](https://github.com/steerlabs/opensteer/blob/main/packages/opensteer/README.md) | Full CLI and SDK reference |
|
|
149
|
+
| [Workflow Guide](https://github.com/steerlabs/opensteer/blob/main/docs/workflows.md) | Discover-then-codify methodology |
|
|
150
|
+
| [Instrumentation Guide](https://github.com/steerlabs/opensteer/blob/main/docs/instrumentation.md) | Tracing and observability |
|
|
151
|
+
| [Skills Guide](https://github.com/steerlabs/opensteer/blob/main/skills/README.md) | Agent skill installation and authoring |
|
|
152
|
+
|
|
153
|
+
## FAQ
|
|
154
|
+
|
|
155
|
+
<details>
|
|
156
|
+
<summary><strong>Which AI agents are supported?</strong></summary>
|
|
157
|
+
|
|
158
|
+
Opensteer ships first-party skills for [Claude Code](https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview), [Codex](https://openai.com/index/introducing-codex/), [Cursor](https://www.cursor.com/), and any agent compatible with the [skills.sh](https://skills.sh) standard.
|
|
159
|
+
|
|
160
|
+
</details>
|
|
161
|
+
|
|
162
|
+
<details>
|
|
163
|
+
<summary><strong>Do I need to install a browser separately?</strong></summary>
|
|
164
|
+
|
|
165
|
+
Yes. After installing Opensteer, run `npx playwright install chromium` to download a compatible Chromium build. This is a one-time step.
|
|
166
|
+
|
|
167
|
+
</details>
|
|
168
|
+
|
|
169
|
+
<details>
|
|
170
|
+
<summary><strong>Can I use my existing Chrome login sessions?</strong></summary>
|
|
171
|
+
|
|
172
|
+
Yes. Use profile cloning to copy your real Chrome profile into an Opensteer workspace. Your logins, cookies, and extensions carry over without closing your main browser.
|
|
173
|
+
|
|
174
|
+
</details>
|
|
175
|
+
|
|
176
|
+
<details>
|
|
177
|
+
<summary><strong>Does it work in headless mode?</strong></summary>
|
|
178
|
+
|
|
179
|
+
Yes. Opensteer runs headless by default. Use the Local View feature to stream live screenshots from headless sessions to a browser-based viewer for debugging.
|
|
180
|
+
|
|
181
|
+
</details>
|
|
182
|
+
|
|
183
|
+
<details>
|
|
184
|
+
<summary><strong>What Node.js version is required?</strong></summary>
|
|
185
|
+
|
|
186
|
+
Node.js 22 or later.
|
|
187
|
+
|
|
188
|
+
</details>
|
|
189
|
+
|
|
190
|
+
## Development
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
pnpm install
|
|
194
|
+
pnpm run build
|
|
195
|
+
pnpm run typecheck
|
|
196
|
+
pnpm run test
|
|
167
197
|
```
|
|
168
198
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
- `info()`
|
|
176
|
-
- `listPages()`
|
|
177
|
-
- `newPage()`
|
|
178
|
-
- `activatePage()`
|
|
179
|
-
- `closePage()`
|
|
180
|
-
- `goto(url, { captureNetwork? })`
|
|
181
|
-
- `evaluate(script | input)`
|
|
182
|
-
- `addInitScript(input)`
|
|
183
|
-
- `snapshot("action" | "extraction")`
|
|
184
|
-
- `click({ element? | selector? | persist?, captureNetwork? })`
|
|
185
|
-
- `hover({ element? | selector? | persist?, captureNetwork? })`
|
|
186
|
-
- `input({ text, element? | selector? | persist?, captureNetwork? })`
|
|
187
|
-
- `scroll({ direction, amount, element? | selector? | persist?, captureNetwork? })`
|
|
188
|
-
- `extract({ schema } | { persist, schema? })`
|
|
189
|
-
- `network.query(input?)`
|
|
190
|
-
- `network.detail(recordId, { probe?: boolean })`
|
|
191
|
-
- `waitForPage(input?)`
|
|
192
|
-
- `cookies(domain?)`
|
|
193
|
-
- `storage(domain?, "local" | "session")`
|
|
194
|
-
- `state(domain?)`
|
|
195
|
-
- `fetch(url, options?)`
|
|
196
|
-
- `computerExecute(input)`
|
|
197
|
-
- `route(input)`
|
|
198
|
-
- `interceptScript(input)`
|
|
199
|
-
- `browser.status()`
|
|
200
|
-
- `browser.clone(input)`
|
|
201
|
-
- `browser.reset()`
|
|
202
|
-
- `browser.delete()`
|
|
203
|
-
- `close()`
|
|
204
|
-
- `disconnect()`
|
|
205
|
-
|
|
206
|
-
## Design Notes
|
|
207
|
-
|
|
208
|
-
- `network query` is intentionally summary-oriented. Use `network detail` for deep inspection.
|
|
209
|
-
- `replay` is transport-aware and should usually replace manual probe logic.
|
|
210
|
-
- `browser status` intentionally does not leak the raw browser websocket endpoint.
|
|
211
|
-
- The package also exports advanced cloud and browser-management utilities, but the core agent workflow is the local discovery-first SDK and CLI shown above.
|
|
199
|
+
## Community
|
|
200
|
+
|
|
201
|
+
- [Contributing](https://github.com/steerlabs/opensteer/blob/main/CONTRIBUTING.md)
|
|
202
|
+
- [Code of Conduct](https://github.com/steerlabs/opensteer/blob/main/CODE_OF_CONDUCT.md)
|
|
203
|
+
- [Security Policy](https://github.com/steerlabs/opensteer/blob/main/SECURITY.md)
|
|
204
|
+
- [License](https://github.com/steerlabs/opensteer/blob/main/LICENSE) (MIT)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { resolveOpensteerEnvironment, resolveOpensteerRuntimeConfig, createOpensteerSemanticRuntime } from './chunk-
|
|
2
|
-
import { OpensteerBrowserManager } from './chunk-
|
|
1
|
+
import { resolveOpensteerEnvironment, resolveOpensteerRuntimeConfig, createOpensteerSemanticRuntime } from './chunk-7LQL5YUR.js';
|
|
2
|
+
import { OpensteerBrowserManager } from './chunk-GSCQQKZZ.js';
|
|
3
3
|
|
|
4
4
|
// src/sdk/opensteer.ts
|
|
5
5
|
var SessionCookieJar = class {
|
|
@@ -52,6 +52,7 @@ var Opensteer = class {
|
|
|
52
52
|
...runtimeOptions.rootPath === void 0 ? {} : { rootPath: runtimeOptions.rootPath },
|
|
53
53
|
...runtimeOptions.workspace === void 0 ? {} : { workspace: runtimeOptions.workspace },
|
|
54
54
|
...engineName === void 0 ? {} : { engineName },
|
|
55
|
+
environment,
|
|
55
56
|
...runtimeOptions.browser === void 0 ? {} : { browser: runtimeOptions.browser },
|
|
56
57
|
...runtimeOptions.launch === void 0 ? {} : { launch: runtimeOptions.launch },
|
|
57
58
|
...runtimeOptions.context === void 0 ? {} : { context: runtimeOptions.context }
|
|
@@ -176,9 +177,6 @@ var Opensteer = class {
|
|
|
176
177
|
await delay(pollIntervalMs);
|
|
177
178
|
}
|
|
178
179
|
}
|
|
179
|
-
async snapshot(mode = "action") {
|
|
180
|
-
return (await this.runtime.snapshot({ mode })).html;
|
|
181
|
-
}
|
|
182
180
|
async cookies(domain) {
|
|
183
181
|
return new SessionCookieJar(
|
|
184
182
|
await this.runtime.getCookies(domain === void 0 ? {} : { domain })
|
|
@@ -330,5 +328,5 @@ function delay(ms) {
|
|
|
330
328
|
}
|
|
331
329
|
|
|
332
330
|
export { Opensteer };
|
|
333
|
-
//# sourceMappingURL=chunk-
|
|
334
|
-
//# sourceMappingURL=chunk-
|
|
331
|
+
//# sourceMappingURL=chunk-7D45QUZ3.js.map
|
|
332
|
+
//# sourceMappingURL=chunk-7D45QUZ3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sdk/opensteer.ts"],"names":["options"],"mappings":"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","file":"chunk-7D45QUZ3.js","sourcesContent":["import type {\n CookieRecord,\n OpensteerCookieQueryOutput,\n OpensteerActionResult,\n OpensteerAddInitScriptInput,\n OpensteerAddInitScriptOutput,\n OpensteerComputerExecuteInput,\n OpensteerComputerExecuteOutput,\n OpensteerComputerKeyModifier,\n OpensteerComputerMouseButton,\n OpensteerNetworkDetailOutput,\n OpensteerNetworkQueryInput,\n OpensteerNetworkQueryOutput,\n OpensteerOpenInput,\n OpensteerOpenOutput,\n OpensteerPageActivateInput,\n OpensteerPageActivateOutput,\n OpensteerPageCloseInput,\n OpensteerPageCloseOutput,\n OpensteerPageEvaluateInput,\n OpensteerPageEvaluateOutput,\n OpensteerPageGotoInput,\n OpensteerPageGotoOutput,\n OpensteerPageListInput,\n OpensteerPageListOutput,\n OpensteerPageNewInput,\n OpensteerPageNewOutput,\n OpensteerRequestBodyInput,\n OpensteerRequestResponseResult,\n OpensteerSessionCloseOutput,\n OpensteerSessionFetchInput,\n OpensteerSessionInfo,\n OpensteerStateQueryOutput,\n OpensteerStorageArea,\n OpensteerStorageDomainSnapshot,\n OpensteerTargetInput,\n} from \"@opensteer/protocol\";\n\nimport {\n OpensteerBrowserManager,\n type OpensteerBrowserStatus,\n type WorkspaceBrowserManifest,\n} from \"../browser-manager.js\";\nimport { resolveOpensteerEnvironment } from \"../env.js\";\nimport type { OpensteerProviderOptions } from \"../provider/config.js\";\nimport type {\n OpensteerInterceptScriptOptions,\n OpensteerInstrumentableRuntime,\n OpensteerRouteOptions,\n OpensteerRouteRegistration,\n} from \"./instrumentation.js\";\nimport type { OpensteerRuntimeOptions } from \"./runtime.js\";\nimport {\n createOpensteerSemanticRuntime,\n resolveOpensteerRuntimeConfig,\n} from \"./runtime-resolution.js\";\nimport type { OpensteerDisconnectableRuntime } from \"./semantic-runtime.js\";\n\nexport interface OpensteerTargetOptions {\n readonly element?: number;\n readonly selector?: string;\n readonly persist?: string;\n readonly captureNetwork?: string;\n}\n\nexport interface OpensteerClickOptions extends OpensteerTargetOptions {\n readonly button?: OpensteerComputerMouseButton;\n readonly clickCount?: number;\n readonly modifiers?: readonly OpensteerComputerKeyModifier[];\n}\n\nexport interface OpensteerInputOptions extends OpensteerTargetOptions {\n readonly text: string;\n readonly pressEnter?: boolean;\n}\n\nexport interface OpensteerScrollOptions extends OpensteerTargetOptions {\n readonly direction: \"up\" | \"down\" | \"left\" | \"right\";\n readonly amount: number;\n}\n\nexport interface OpensteerExtractOptions {\n readonly persist: string;\n}\n\nexport interface OpensteerWaitForPageOptions {\n readonly openerPageRef?: string;\n readonly urlIncludes?: string;\n readonly timeoutMs?: number;\n readonly pollIntervalMs?: number;\n}\n\nexport type OpensteerAddInitScriptOptions = OpensteerAddInitScriptInput;\nexport type OpensteerGotoOptions = Omit<OpensteerPageGotoInput, \"url\">;\nexport type OpensteerNetworkQueryOptions = OpensteerNetworkQueryInput;\nexport type OpensteerNetworkQueryResult = OpensteerNetworkQueryOutput;\nexport type OpensteerNetworkDetailResult = OpensteerNetworkDetailOutput;\nexport type OpensteerFetchOptions = Omit<OpensteerSessionFetchInput, \"url\" | \"body\"> & {\n readonly body?: string | OpensteerRequestBodyInput;\n};\nexport type OpensteerComputerExecuteOptions = OpensteerComputerExecuteInput;\nexport type OpensteerStorageMap = Readonly<Record<string, string>>;\nexport type OpensteerBrowserState = OpensteerStateQueryOutput;\n\nexport interface OpensteerCookieJar {\n readonly domain?: string;\n has(name: string): boolean;\n get(name: string): string | undefined;\n getAll(): readonly CookieRecord[];\n serialize(): string;\n}\n\nexport interface OpensteerDomController {\n click(input: OpensteerClickOptions): Promise<OpensteerActionResult>;\n hover(input: OpensteerTargetOptions): Promise<OpensteerActionResult>;\n input(input: OpensteerInputOptions): Promise<OpensteerActionResult>;\n scroll(input: OpensteerScrollOptions): Promise<OpensteerActionResult>;\n}\n\nexport interface OpensteerNetworkController {\n query(input?: OpensteerNetworkQueryOptions): Promise<OpensteerNetworkQueryResult>;\n detail(\n recordId: string,\n options?: { readonly probe?: boolean },\n ): Promise<OpensteerNetworkDetailResult>;\n}\n\nexport interface OpensteerOptions extends OpensteerRuntimeOptions {\n readonly provider?: OpensteerProviderOptions;\n}\n\nexport interface OpensteerBrowserCloneOptions {\n readonly sourceUserDataDir: string;\n readonly sourceProfileDirectory?: string;\n}\n\nexport interface OpensteerBrowserController {\n status(): Promise<OpensteerBrowserStatus>;\n clone(input: OpensteerBrowserCloneOptions): Promise<WorkspaceBrowserManifest>;\n reset(): Promise<void>;\n delete(): Promise<void>;\n}\n\nclass SessionCookieJar implements OpensteerCookieJar {\n readonly domain?: string;\n private readonly cookies: readonly CookieRecord[];\n\n constructor(output: OpensteerCookieQueryOutput) {\n if (output.domain !== undefined) {\n this.domain = output.domain;\n }\n this.cookies = output.cookies;\n }\n\n has(name: string): boolean {\n return this.cookies.some((cookie) => cookie.name === name);\n }\n\n get(name: string): string | undefined {\n return this.cookies.find((cookie) => cookie.name === name)?.value;\n }\n\n getAll(): readonly CookieRecord[] {\n return this.cookies;\n }\n\n serialize(): string {\n return this.cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join(\"; \");\n }\n}\n\nexport class Opensteer {\n private readonly runtime: OpensteerDisconnectableRuntime;\n private readonly browserManager: OpensteerBrowserManager | undefined;\n readonly browser: OpensteerBrowserController;\n readonly dom: OpensteerDomController;\n readonly network: OpensteerNetworkController;\n\n constructor(options: OpensteerOptions = {}) {\n const environment = resolveOpensteerEnvironment(options.rootDir);\n const { provider, engineName, ...runtimeOptions } = options;\n const runtimeConfig = resolveOpensteerRuntimeConfig({\n ...(provider === undefined ? {} : { provider }),\n environment,\n });\n\n if (runtimeConfig.provider.mode === \"cloud\") {\n this.browserManager = undefined;\n this.runtime = createOpensteerSemanticRuntime({\n ...(provider === undefined ? {} : { provider }),\n ...(engineName === undefined ? {} : { engine: engineName }),\n environment,\n runtimeOptions,\n });\n this.browser = createUnsupportedBrowserController();\n } else {\n this.browserManager = new OpensteerBrowserManager({\n ...(runtimeOptions.rootDir === undefined ? {} : { rootDir: runtimeOptions.rootDir }),\n ...(runtimeOptions.rootPath === undefined ? {} : { rootPath: runtimeOptions.rootPath }),\n ...(runtimeOptions.workspace === undefined ? {} : { workspace: runtimeOptions.workspace }),\n ...(engineName === undefined ? {} : { engineName }),\n environment,\n ...(runtimeOptions.browser === undefined ? {} : { browser: runtimeOptions.browser }),\n ...(runtimeOptions.launch === undefined ? {} : { launch: runtimeOptions.launch }),\n ...(runtimeOptions.context === undefined ? {} : { context: runtimeOptions.context }),\n });\n this.runtime = createOpensteerSemanticRuntime({\n ...(provider === undefined ? {} : { provider }),\n ...(engineName === undefined ? {} : { engine: engineName }),\n environment,\n runtimeOptions: {\n ...runtimeOptions,\n rootPath: this.browserManager.rootPath,\n cleanupRootOnClose: this.browserManager.cleanupRootOnDisconnect,\n },\n });\n this.browser = {\n status: () => this.browserManager!.status(),\n clone: (input) => this.browserManager!.clonePersistentBrowser(input),\n reset: () => this.browserManager!.reset(),\n delete: () => this.browserManager!.delete(),\n };\n }\n\n this.dom = {\n click: (input) => this.click(input),\n hover: (input) => this.hover(input),\n input: (input) => this.input(input),\n scroll: (input) => this.scroll(input),\n };\n\n this.network = {\n query: (input = {}) => this.runtime.queryNetwork(input),\n detail: (recordId, options) => this.runtime.getNetworkDetail({ recordId, ...options }),\n };\n }\n\n async open(input: string | OpensteerOpenInput = {}): Promise<OpensteerOpenOutput> {\n return this.runtime.open(typeof input === \"string\" ? { url: input } : input);\n }\n\n async info(): Promise<OpensteerSessionInfo> {\n return this.runtime.info();\n }\n\n async listPages(input: OpensteerPageListInput = {}): Promise<OpensteerPageListOutput> {\n return this.runtime.listPages(input);\n }\n\n async newPage(input: OpensteerPageNewInput = {}): Promise<OpensteerPageNewOutput> {\n return this.runtime.newPage(input);\n }\n\n async activatePage(input: OpensteerPageActivateInput): Promise<OpensteerPageActivateOutput> {\n return this.runtime.activatePage(input);\n }\n\n async closePage(input: OpensteerPageCloseInput = {}): Promise<OpensteerPageCloseOutput> {\n return this.runtime.closePage(input);\n }\n\n async goto(url: string, options: OpensteerGotoOptions = {}): Promise<OpensteerPageGotoOutput> {\n return this.runtime.goto({\n url,\n ...options,\n });\n }\n\n async evaluate(\n input: string | OpensteerPageEvaluateInput,\n ): Promise<OpensteerPageEvaluateOutput[\"value\"]> {\n const normalized =\n typeof input === \"string\"\n ? {\n script: input,\n }\n : input;\n return (await this.runtime.evaluate(normalized)).value;\n }\n\n async addInitScript(\n input: string | OpensteerAddInitScriptInput,\n ): Promise<OpensteerAddInitScriptOutput> {\n return this.runtime.addInitScript(\n typeof input === \"string\"\n ? {\n script: input,\n }\n : input,\n );\n }\n\n async click(input: OpensteerClickOptions): Promise<OpensteerActionResult> {\n const { button, clickCount, modifiers, ...target } = input;\n return this.runtime.click({\n ...normalizeTargetOptions(target),\n ...(button === undefined ? {} : { button }),\n ...(clickCount === undefined ? {} : { clickCount }),\n ...(modifiers === undefined ? {} : { modifiers }),\n });\n }\n\n async hover(input: OpensteerTargetOptions): Promise<OpensteerActionResult> {\n return this.runtime.hover(normalizeTargetOptions(input));\n }\n\n async input(input: OpensteerInputOptions): Promise<OpensteerActionResult> {\n return this.runtime.input({\n ...normalizeTargetOptions(input),\n text: input.text,\n ...(input.pressEnter === undefined ? {} : { pressEnter: input.pressEnter }),\n });\n }\n\n async scroll(input: OpensteerScrollOptions): Promise<OpensteerActionResult> {\n return this.runtime.scroll({\n ...normalizeTargetOptions(input),\n direction: input.direction,\n amount: input.amount,\n });\n }\n\n async extract(input: OpensteerExtractOptions): Promise<unknown> {\n return (await this.runtime.extract(input)).data;\n }\n\n async waitForPage(\n input: OpensteerWaitForPageOptions = {},\n ): Promise<OpensteerPageListOutput[\"pages\"][number]> {\n const baseline = new Set((await this.runtime.listPages()).pages.map((page) => page.pageRef));\n const timeoutAt = Date.now() + (input.timeoutMs ?? 30_000);\n const pollIntervalMs = input.pollIntervalMs ?? 100;\n\n while (true) {\n const match = (await this.runtime.listPages()).pages.find((page) => {\n if (baseline.has(page.pageRef)) {\n return false;\n }\n if (input.openerPageRef !== undefined && page.openerPageRef !== input.openerPageRef) {\n return false;\n }\n if (input.urlIncludes !== undefined && !page.url.includes(input.urlIncludes)) {\n return false;\n }\n return true;\n });\n if (match !== undefined) {\n return match;\n }\n if (Date.now() >= timeoutAt) {\n throw new Error(\"waitForPage timed out\");\n }\n await delay(pollIntervalMs);\n }\n }\n\n async cookies(domain?: string): Promise<OpensteerCookieJar> {\n return new SessionCookieJar(\n await this.runtime.getCookies(domain === undefined ? {} : { domain }),\n );\n }\n\n async storage(\n domain?: string,\n type: OpensteerStorageArea = \"local\",\n ): Promise<OpensteerStorageMap> {\n const snapshot = await this.runtime.getStorageSnapshot(domain === undefined ? {} : { domain });\n const domainSnapshot = pickStorageDomainSnapshot(snapshot, domain);\n if (domainSnapshot === undefined) {\n return {};\n }\n const entries = type === \"local\" ? domainSnapshot.localStorage : domainSnapshot.sessionStorage;\n return Object.fromEntries(entries.map((entry) => [entry.key, entry.value]));\n }\n\n async state(domain?: string): Promise<OpensteerBrowserState> {\n return this.runtime.getBrowserState(domain === undefined ? {} : { domain });\n }\n\n async fetch(url: string, options: OpensteerFetchOptions = {}): Promise<Response> {\n const input = buildFetchInput(url, options);\n const result = await this.runtime.fetch(input);\n if (result.response === undefined) {\n throw new Error(result.note ?? `session.fetch did not produce a response for ${url}`);\n }\n return toResponse(result.response);\n }\n\n async computerExecute(\n input: OpensteerComputerExecuteOptions,\n ): Promise<OpensteerComputerExecuteOutput> {\n return this.runtime.computerExecute(input);\n }\n\n async route(input: OpensteerRouteOptions): Promise<OpensteerRouteRegistration> {\n return this.requireOwnedInstrumentationRuntime(\"route\").route(input);\n }\n\n async interceptScript(\n input: OpensteerInterceptScriptOptions,\n ): Promise<OpensteerRouteRegistration> {\n return this.requireOwnedInstrumentationRuntime(\"interceptScript\").interceptScript(input);\n }\n\n async close(): Promise<OpensteerSessionCloseOutput> {\n if (this.browserManager === undefined || this.browserManager.mode === \"temporary\") {\n return this.runtime.close();\n }\n\n const output = await this.runtime.close();\n await this.browserManager.close();\n return output;\n }\n\n async disconnect(): Promise<void> {\n await this.runtime.disconnect();\n }\n\n private requireOwnedInstrumentationRuntime(\n method: \"route\" | \"interceptScript\",\n ): OpensteerInstrumentableRuntime {\n if (\n typeof (this.runtime as Partial<OpensteerInstrumentableRuntime>).route === \"function\" &&\n typeof (this.runtime as Partial<OpensteerInstrumentableRuntime>).interceptScript ===\n \"function\"\n ) {\n return this.runtime as OpensteerDisconnectableRuntime & OpensteerInstrumentableRuntime;\n }\n throw new Error(`${method}() is not available for this session runtime.`);\n }\n}\n\nfunction createUnsupportedBrowserController(): OpensteerBrowserController {\n const fail = async (): Promise<never> => {\n throw new Error(\"browser.* helpers are only available in local mode.\");\n };\n\n return {\n status: fail,\n clone: fail,\n reset: fail,\n delete: fail,\n };\n}\n\nfunction normalizeTargetOptions(input: OpensteerTargetOptions): {\n readonly target: OpensteerTargetInput;\n readonly persist?: string;\n readonly captureNetwork?: string;\n} {\n const hasElement = input.element !== undefined;\n const hasSelector = input.selector !== undefined;\n if (hasElement && hasSelector) {\n throw new Error(\"Specify exactly one of element, selector, or persist.\");\n }\n\n if (hasElement) {\n return {\n target: {\n kind: \"element\",\n element: input.element,\n },\n ...(input.persist === undefined ? {} : { persist: input.persist }),\n ...(input.captureNetwork === undefined ? {} : { captureNetwork: input.captureNetwork }),\n };\n }\n\n if (hasSelector) {\n return {\n target: {\n kind: \"selector\",\n selector: input.selector,\n },\n ...(input.persist === undefined ? {} : { persist: input.persist }),\n ...(input.captureNetwork === undefined ? {} : { captureNetwork: input.captureNetwork }),\n };\n }\n\n if (input.persist === undefined) {\n throw new Error(\"Specify exactly one of element, selector, or persist.\");\n }\n\n return {\n target: {\n kind: \"persist\",\n persist: input.persist,\n },\n ...(input.captureNetwork === undefined ? {} : { captureNetwork: input.captureNetwork }),\n };\n}\n\nfunction pickStorageDomainSnapshot(\n snapshot: {\n readonly domains: readonly OpensteerStorageDomainSnapshot[];\n },\n domain: string | undefined,\n): OpensteerStorageDomainSnapshot | undefined {\n if (snapshot.domains.length === 0) {\n return undefined;\n }\n if (domain === undefined) {\n return snapshot.domains[0];\n }\n return snapshot.domains.find((entry) => entry.domain === domain);\n}\n\nfunction buildFetchInput(url: string, options: OpensteerFetchOptions): OpensteerSessionFetchInput {\n const { body, ...rest } = options;\n return {\n url,\n ...rest,\n ...(body === undefined ? {} : { body: normalizeFetchBody(body, rest.headers) }),\n };\n}\n\nfunction normalizeFetchBody(\n body: string | OpensteerRequestBodyInput,\n headers: OpensteerSessionFetchInput[\"headers\"],\n): OpensteerRequestBodyInput {\n if (typeof body !== \"string\") {\n return body;\n }\n\n const contentType = findHeaderValue(headers, \"content-type\");\n return contentType === undefined ? { text: body } : { text: body, contentType };\n}\n\nfunction findHeaderValue(\n headers: OpensteerSessionFetchInput[\"headers\"],\n headerName: string,\n): string | undefined {\n if (headers === undefined) {\n return undefined;\n }\n\n const match = Object.entries(headers).find(\n ([name]) => name.toLowerCase() === headerName.toLowerCase(),\n );\n return match === undefined ? undefined : String(match[1]);\n}\n\nfunction toResponse(response: OpensteerRequestResponseResult): Response {\n return new Response(decodeBody(response), {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.map((header) => [header.name, header.value])),\n });\n}\n\nfunction decodeBody(response: OpensteerRequestResponseResult): Uint8Array | undefined {\n if (response.body === undefined) {\n return undefined;\n }\n return Uint8Array.from(Buffer.from(response.body.data, \"base64\"));\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}
|