fastbrowser_cli 1.0.2 → 1.0.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/README.md +118 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.d.ts +3 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.d.ts.map +1 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js +288 -0
- package/dist/fastbrowser_cli/fastbrowser_cli.js.map +1 -0
- package/dist/fastbrowser_cli/libs/http-client.d.ts +7 -0
- package/dist/fastbrowser_cli/libs/http-client.d.ts.map +1 -0
- package/dist/fastbrowser_cli/libs/http-client.js +51 -0
- package/dist/fastbrowser_cli/libs/http-client.js.map +1 -0
- package/dist/fastbrowser_cli/libs/server-manager.d.ts +12 -0
- package/dist/fastbrowser_cli/libs/server-manager.d.ts.map +1 -0
- package/dist/fastbrowser_cli/libs/server-manager.js +194 -0
- package/dist/fastbrowser_cli/libs/server-manager.js.map +1 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.d.ts +3 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.d.ts.map +1 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.js +82 -0
- package/dist/fastbrowser_httpd/fastbrowser_httpd.js.map +1 -0
- package/dist/fastbrowser_httpd/libs/routes.d.ts +6 -0
- package/dist/fastbrowser_httpd/libs/routes.d.ts.map +1 -0
- package/dist/fastbrowser_httpd/libs/routes.js +41 -0
- package/dist/fastbrowser_httpd/libs/routes.js.map +1 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts +72 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.d.ts.map +1 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.js +65 -0
- package/dist/fastbrowser_httpd/libs/tool-schemas.js.map +1 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.d.ts +4 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js +417 -0
- package/dist/fastbrowser_mcp/fastbrowser_mcp.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.d.ts +120 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.js +83 -0
- package/dist/fastbrowser_mcp/libs/mcp_client.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.d.ts +10 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.js +45 -0
- package/dist/fastbrowser_mcp/libs/mcp_proxy.js.map +1 -0
- package/dist/fastbrowser_mcp/libs/schemas.d.ts +28 -0
- package/dist/fastbrowser_mcp/libs/schemas.d.ts.map +1 -0
- package/dist/fastbrowser_mcp/libs/schemas.js +38 -0
- package/dist/fastbrowser_mcp/libs/schemas.js.map +1 -0
- package/docs/brainstorm_scrap_by_ai.md +1 -1
- package/docs/feature_support_cli.md +27 -27
- package/package.json +7 -7
- package/skills/fastbrowser/SKILL.md +214 -0
- package/src/{fastweb_cli/fastweb_cli.ts → fastbrowser_cli/fastbrowser_cli.ts} +49 -15
- package/src/{fastweb_cli → fastbrowser_cli}/libs/http-client.ts +2 -2
- package/src/{fastweb_cli → fastbrowser_cli}/libs/server-manager.ts +8 -8
- package/src/{fastweb_http_server/fastweb_http_server.ts → fastbrowser_httpd/fastbrowser_httpd.ts} +10 -10
- package/src/{fastweb_http_server → fastbrowser_httpd}/libs/routes.ts +1 -1
- package/src/{fastweb_http_server → fastbrowser_httpd}/libs/tool-schemas.ts +4 -4
- package/src/{fastweb_mcp → fastbrowser_mcp}/libs/mcp_proxy.ts +1 -1
- package/src/{fastweb_mcp → fastbrowser_mcp}/libs/schemas.ts +1 -1
- package/tmp/.claude/skills/fastweb/SKILL.md +17 -17
- /package/src/{fastweb_mcp/fastweb_mcp.ts → fastbrowser_mcp/fastbrowser_mcp.ts} +0 -0
- /package/src/{fastweb_mcp → fastbrowser_mcp}/libs/mcp_client.ts +0 -0
package/README.md
CHANGED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# fastbrowser_cli
|
|
2
|
+
|
|
3
|
+
Control a live Chrome browser from the command line: navigate, click, fill forms, and query the accessibility tree with CSS-like selectors.
|
|
4
|
+
|
|
5
|
+
A lighter alternative to Chrome DevTools MCP or Puppeteer, designed for AI agents and shell workflows. A persistent HTTP daemon keeps an MCP connection to the browser alive so each command incurs minimal latency.
|
|
6
|
+
|
|
7
|
+
- rely on [chrome-devtools-mcp](https://github.com/ChromeDevTools/chrome-devtools-mcp) for robust browser control
|
|
8
|
+
- expose a curated, efficient toolset optimized for AI agent use cases
|
|
9
|
+
- minimize the required round-trips and boilerplate to perform common tasks
|
|
10
|
+
- minimize the output size, thus reducing LLM input size and parsing complexity.
|
|
11
|
+
- It means faster/cheaper LLM iterations when used in an agent loop.
|
|
12
|
+
- It means more accurate/better quality responses from the LLM as well, since it has less irrelevant info to parse through.
|
|
13
|
+
|
|
14
|
+
## Architecture
|
|
15
|
+
|
|
16
|
+
Three components ship together in this package:
|
|
17
|
+
|
|
18
|
+
- **`fastbrowser_cli`** — the user-facing CLI. Each subcommand maps 1-to-1 to a fastbrowser tool and prints the response on stdout.
|
|
19
|
+
- **`fastbrowser_httpd`** — a long-running HTTP server that fronts `fastbrowser_mcp` and holds the persistent MCP connection. The CLI auto-starts it on first use.
|
|
20
|
+
- **`fastbrowser_mcp`** — the MCP server that drives the actual Chrome browser via `chrome-devtools-mcp`.
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
fastbrowser_cli ──HTTP──▶ fastbrowser_httpd ──MCP/stdio──▶ fastbrowser_mcp ──▶ chrome-devtools-mcp ──▶ Chrome
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install -g fastbrowser_cli
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Or install just the SKILL.md into an agent folder so an AI agent can use it:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npx fastbrowser_cli --install <skill-folder>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
This copies `SKILL.md` to `<skill-folder>/skills/fastbrowser/SKILL.md`.
|
|
39
|
+
|
|
40
|
+
## Quick Start
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Open a page (auto-starts the daemon)
|
|
44
|
+
npx fastbrowser_cli new_page --url https://example.com
|
|
45
|
+
|
|
46
|
+
# Find the first link and the first heading on the page
|
|
47
|
+
npx fastbrowser_cli query_selectors -s 'link' -s 'heading'
|
|
48
|
+
|
|
49
|
+
# Click it
|
|
50
|
+
npx fastbrowser_cli click -s 'link[name="More information..."]'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Commands
|
|
54
|
+
|
|
55
|
+
| Command | Purpose | Required flags |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `list_pages` | List open browser pages | — |
|
|
58
|
+
| `new_page` | Open a new page at a URL | `--url` |
|
|
59
|
+
| `close_page` | Close a page by id | `--page-id` |
|
|
60
|
+
| `navigate_page` | Navigate current page to a URL | `--url` |
|
|
61
|
+
| `take_snapshot` | Dump the full accessibility tree (expensive — prefer targeted queries) | — |
|
|
62
|
+
| `query_selectors` | Query the a11y tree, returning the first match per selector | `--selector` or `--selectors-json` |
|
|
63
|
+
| `query_selectors_all` | Query the a11y tree, returning every match per selector | `--selector` or `--selectors-json` |
|
|
64
|
+
| `click` | Click an element by accessibility selector | `-s, --selector` |
|
|
65
|
+
| `fill_form` | Fill a form field by accessibility selector | `-s, --selector`, `--value` |
|
|
66
|
+
| `press_keys` | Press a comma-separated key sequence | `--keys` |
|
|
67
|
+
| `server start` | Start the HTTP daemon | — |
|
|
68
|
+
| `server status` | Report daemon running/stopped | — |
|
|
69
|
+
| `server stop` | Stop the HTTP daemon | — |
|
|
70
|
+
|
|
71
|
+
## Selector Language
|
|
72
|
+
|
|
73
|
+
The selector syntax is modelled on CSS, adapted for the accessibility tree.
|
|
74
|
+
|
|
75
|
+
- **Role:** `button`, `link`, `heading`, `searchbox`, `WebArea`, …
|
|
76
|
+
- **UID:** `#1_42` (fast path — bypasses the a11y-tree lookup)
|
|
77
|
+
- **Universal:** `*`
|
|
78
|
+
- **Attributes:** `[attr]`, `[attr="v"]`, `[attr^="p"]`, `[attr$="s"]`, `[attr*="x"]`. The virtual `name` attribute maps to the node's accessible name.
|
|
79
|
+
- **Combinators:** descendant `A B`, direct child `A > B`, union `A, B`.
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
link[href^="https"]
|
|
85
|
+
button[name="Submit"]
|
|
86
|
+
navigation > link
|
|
87
|
+
heading, button
|
|
88
|
+
#1_7
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Full selector reference is in [skills/fastbrowser/SKILL.md](skills/fastbrowser/SKILL.md).
|
|
92
|
+
|
|
93
|
+
## Configuration
|
|
94
|
+
|
|
95
|
+
| Flag / env | Purpose | Default |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `--server <url>` / `FASTBROWSER_SERVER` | URL of the `fastbrowser_httpd` daemon | `http://localhost:8787` |
|
|
98
|
+
| `--autostart` / `--no-autostart` | Auto-start the daemon if it is not already running | `--autostart` |
|
|
99
|
+
|
|
100
|
+
## Scripts
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npm run build # tsc compile
|
|
104
|
+
npm run typecheck # tsc --noEmit
|
|
105
|
+
npm run start:cli # run the CLI from source
|
|
106
|
+
npm run start:http-server # run fastbrowser_httpd from source
|
|
107
|
+
npm run start:fastbrowser_mcp # run fastbrowser_mcp from source
|
|
108
|
+
npm run inspect:fastbrowser_mcp # open the MCP inspector against fastbrowser_mcp
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Output & Errors
|
|
112
|
+
|
|
113
|
+
- Tool output is written to **stdout**, one line per response content part.
|
|
114
|
+
- Errors are written to **stderr** as `fastbrowser-cli error: <message>` and the process exits with code `1`.
|
|
115
|
+
|
|
116
|
+
## License
|
|
117
|
+
|
|
118
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_cli.d.ts","sourceRoot":"","sources":["../../src/fastbrowser_cli/fastbrowser_cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
// node imports
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
// npm imports
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
// local imports
|
|
13
|
+
const http_client_js_1 = require("./libs/http-client.js");
|
|
14
|
+
const server_manager_js_1 = require("./libs/server-manager.js");
|
|
15
|
+
function getServerFromCmd(cmd) {
|
|
16
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
17
|
+
return http_client_js_1.HttpClient.getServerUrl(globalOpts.server);
|
|
18
|
+
}
|
|
19
|
+
function getAutostartFromCmd(cmd) {
|
|
20
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
21
|
+
return globalOpts.autostart !== false;
|
|
22
|
+
}
|
|
23
|
+
async function runTool(cmd, routeName, body) {
|
|
24
|
+
const server = getServerFromCmd(cmd);
|
|
25
|
+
try {
|
|
26
|
+
if (getAutostartFromCmd(cmd) === true) {
|
|
27
|
+
await server_manager_js_1.ServerManager.ensureRunning(server);
|
|
28
|
+
}
|
|
29
|
+
const response = await http_client_js_1.HttpClient.postTool(server, routeName, body);
|
|
30
|
+
http_client_js_1.HttpClient.printResponse(response);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
34
|
+
console.error(`fastbrowser-cli error: ${message}`);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
39
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
40
|
+
//
|
|
41
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
42
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
43
|
+
function buildQuerySelectorsBody(opts) {
|
|
44
|
+
if (opts.selectorsJson !== undefined && opts.selectorsJson !== '') {
|
|
45
|
+
let parsed;
|
|
46
|
+
try {
|
|
47
|
+
parsed = JSON.parse(opts.selectorsJson);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new Error(`--selectors-json is not valid JSON: ${err.message}`);
|
|
51
|
+
}
|
|
52
|
+
if (Array.isArray(parsed) === false) {
|
|
53
|
+
throw new Error('--selectors-json must be a JSON array');
|
|
54
|
+
}
|
|
55
|
+
return { selectors: parsed };
|
|
56
|
+
}
|
|
57
|
+
const selectorList = opts.selector ?? [];
|
|
58
|
+
if (selectorList.length === 0) {
|
|
59
|
+
throw new Error('At least one --selector or --selectors-json is required');
|
|
60
|
+
}
|
|
61
|
+
const limit = opts.limit === undefined ? 0 : Number.parseInt(opts.limit, 10);
|
|
62
|
+
if (Number.isNaN(limit) === true) {
|
|
63
|
+
throw new Error(`Invalid --limit: ${opts.limit}`);
|
|
64
|
+
}
|
|
65
|
+
const withAncestors = opts.withAncestors !== false;
|
|
66
|
+
const selectors = selectorList.map((selector) => ({
|
|
67
|
+
selector,
|
|
68
|
+
limit,
|
|
69
|
+
withAncestors,
|
|
70
|
+
}));
|
|
71
|
+
return { selectors };
|
|
72
|
+
}
|
|
73
|
+
function buildQuerySelectorFirstBody(opts) {
|
|
74
|
+
if (opts.selectorsJson !== undefined && opts.selectorsJson !== '') {
|
|
75
|
+
let parsed;
|
|
76
|
+
try {
|
|
77
|
+
parsed = JSON.parse(opts.selectorsJson);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
throw new Error(`--selectors-json is not valid JSON: ${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
if (Array.isArray(parsed) === false) {
|
|
83
|
+
throw new Error('--selectors-json must be a JSON array');
|
|
84
|
+
}
|
|
85
|
+
return { selectors: parsed };
|
|
86
|
+
}
|
|
87
|
+
const selectorList = opts.selector ?? [];
|
|
88
|
+
if (selectorList.length === 0) {
|
|
89
|
+
throw new Error('At least one --selector or --selectors-json is required');
|
|
90
|
+
}
|
|
91
|
+
const withAncestors = opts.withAncestors !== false;
|
|
92
|
+
const selectors = selectorList.map((selector) => ({
|
|
93
|
+
selector,
|
|
94
|
+
withAncestors,
|
|
95
|
+
}));
|
|
96
|
+
return { selectors };
|
|
97
|
+
}
|
|
98
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
99
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
100
|
+
//
|
|
101
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
102
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
103
|
+
async function runInstall(skillFolder) {
|
|
104
|
+
const sourceSkillMd = node_path_1.default.resolve(__dirname, '../../skills/fastbrowser/SKILL.md');
|
|
105
|
+
const targetDir = node_path_1.default.resolve(skillFolder, 'skills', 'fastbrowser');
|
|
106
|
+
const targetSkillMd = node_path_1.default.join(targetDir, 'SKILL.md');
|
|
107
|
+
try {
|
|
108
|
+
await node_fs_1.default.promises.mkdir(targetDir, { recursive: true });
|
|
109
|
+
await node_fs_1.default.promises.copyFile(sourceSkillMd, targetSkillMd);
|
|
110
|
+
console.log(`Installed fastbrowser SKILL.md at ${targetSkillMd}`);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
114
|
+
console.error(`fastbrowser-cli error: ${message}`);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
119
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
120
|
+
//
|
|
121
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
122
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
123
|
+
async function main() {
|
|
124
|
+
const installIdx = process.argv.indexOf('--install');
|
|
125
|
+
if (installIdx !== -1) {
|
|
126
|
+
const next = process.argv[installIdx + 1];
|
|
127
|
+
const skillFolder = (next !== undefined && next.startsWith('-') === false) ? next : '.';
|
|
128
|
+
await runInstall(skillFolder);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const program = new commander_1.Command();
|
|
132
|
+
program
|
|
133
|
+
.name('fastbrowser-cli')
|
|
134
|
+
.description('CLI client for fastbrowser')
|
|
135
|
+
.option('--server <url>', 'fastbrowser-httpd URL (default: env FASTBROWSER_SERVER or http://localhost:8787)')
|
|
136
|
+
.option('--autostart', 'Auto-start the server before a command if it is not running', true)
|
|
137
|
+
.option('--no-autostart', 'Do not auto-start the server before a command')
|
|
138
|
+
.option('--install [skill-folder]', 'Install SKILL.md into <skill-folder>/skills/fastbrowser (default: .)');
|
|
139
|
+
const serverCmd = program
|
|
140
|
+
.command('server')
|
|
141
|
+
.description('Manage the fastbrowser HTTP server');
|
|
142
|
+
serverCmd
|
|
143
|
+
.command('start')
|
|
144
|
+
.description('Start the fastbrowser HTTP server as a detached daemon')
|
|
145
|
+
.action(async (_opts, cmd) => {
|
|
146
|
+
const server = getServerFromCmd(cmd);
|
|
147
|
+
try {
|
|
148
|
+
await server_manager_js_1.ServerManager.start(server);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
152
|
+
console.error(`fastbrowser-cli error: ${message}`);
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
serverCmd
|
|
157
|
+
.command('stop')
|
|
158
|
+
.description('Stop the fastbrowser HTTP server')
|
|
159
|
+
.action(async (_opts, cmd) => {
|
|
160
|
+
const server = getServerFromCmd(cmd);
|
|
161
|
+
try {
|
|
162
|
+
await server_manager_js_1.ServerManager.stop(server);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
166
|
+
console.error(`fastbrowser-cli error: ${message}`);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
serverCmd
|
|
171
|
+
.command('status')
|
|
172
|
+
.description('Report whether the fastbrowser HTTP server is running')
|
|
173
|
+
.action(async (_opts, cmd) => {
|
|
174
|
+
const server = getServerFromCmd(cmd);
|
|
175
|
+
const state = await server_manager_js_1.ServerManager.status(server);
|
|
176
|
+
console.log(`fastbrowser server at ${server}: ${state}`);
|
|
177
|
+
if (state === 'stopped')
|
|
178
|
+
process.exit(1);
|
|
179
|
+
});
|
|
180
|
+
program
|
|
181
|
+
.command('list_pages')
|
|
182
|
+
.description('List all open browser pages')
|
|
183
|
+
.action(async (_opts, cmd) => {
|
|
184
|
+
await runTool(cmd, 'list_pages', {});
|
|
185
|
+
});
|
|
186
|
+
program
|
|
187
|
+
.command('new_page')
|
|
188
|
+
.description('Open a new browser page')
|
|
189
|
+
.requiredOption('--url <url>', 'URL to open')
|
|
190
|
+
.action(async (opts, cmd) => {
|
|
191
|
+
await runTool(cmd, 'new_page', { url: opts.url });
|
|
192
|
+
});
|
|
193
|
+
program
|
|
194
|
+
.command('close_page')
|
|
195
|
+
.description('Close a page by its id')
|
|
196
|
+
.requiredOption('--page-id <number>', 'The page id to close')
|
|
197
|
+
.action(async (opts, cmd) => {
|
|
198
|
+
const pageId = Number.parseInt(opts.pageId, 10);
|
|
199
|
+
if (Number.isNaN(pageId) === true) {
|
|
200
|
+
console.error(`Invalid --page-id: ${opts.pageId}`);
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
203
|
+
await runTool(cmd, 'close_page', { pageId });
|
|
204
|
+
});
|
|
205
|
+
program
|
|
206
|
+
.command('navigate_page')
|
|
207
|
+
.description('Navigate the current page to a URL')
|
|
208
|
+
.requiredOption('--url <url>', 'URL to navigate to')
|
|
209
|
+
.action(async (opts, cmd) => {
|
|
210
|
+
await runTool(cmd, 'navigate_page', { url: opts.url });
|
|
211
|
+
});
|
|
212
|
+
program
|
|
213
|
+
.command('click')
|
|
214
|
+
.description('Click an element by its accessibility selector')
|
|
215
|
+
.requiredOption('-s, --selector <selector>', 'Accessibility selector (e.g. "#1_3" or \'button[name="Submit"]\')')
|
|
216
|
+
.action(async (opts, cmd) => {
|
|
217
|
+
await runTool(cmd, 'click', { selector: opts.selector });
|
|
218
|
+
});
|
|
219
|
+
program
|
|
220
|
+
.command('fill_form')
|
|
221
|
+
.description('Fill a form field by its accessibility selector')
|
|
222
|
+
.requiredOption('-s, --selector <selector>', 'Accessibility selector (e.g. "#1_3" or \'textbox[name="Email"]\')')
|
|
223
|
+
.requiredOption('--value <value>', 'Value to fill')
|
|
224
|
+
.action(async (opts, cmd) => {
|
|
225
|
+
await runTool(cmd, 'fill_form', {
|
|
226
|
+
elements: [{ selector: opts.selector, value: opts.value }],
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
program
|
|
230
|
+
.command('query_selectors_all')
|
|
231
|
+
.description('Query the accessibility tree with CSS-like selectors')
|
|
232
|
+
.option('-s, --selector <selector>', 'CSS-like selector (repeatable)', (value, prev = []) => {
|
|
233
|
+
prev.push(value);
|
|
234
|
+
return prev;
|
|
235
|
+
})
|
|
236
|
+
.option('--limit <number>', 'Max nodes per selector (0 = unlimited)', '0')
|
|
237
|
+
.option('--with-ancestors', 'Include ancestor nodes', true)
|
|
238
|
+
.option('--no-with-ancestors', 'Exclude ancestor nodes')
|
|
239
|
+
.option('--selectors-json <json>', 'JSON array of {selector,limit,withAncestors} for per-selector control')
|
|
240
|
+
.action(async (opts, cmd) => {
|
|
241
|
+
let body;
|
|
242
|
+
try {
|
|
243
|
+
body = buildQuerySelectorsBody(opts);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
console.error(`fastbrowser-cli error: ${err.message}`);
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
await runTool(cmd, 'query_selectors_all', body);
|
|
250
|
+
});
|
|
251
|
+
program
|
|
252
|
+
.command('query_selectors')
|
|
253
|
+
.description('Query the accessibility tree with CSS-like selectors and, for each, return the first matching node')
|
|
254
|
+
.option('-s, --selector <selector>', 'CSS-like selector (repeatable)', (value, prev = []) => {
|
|
255
|
+
prev.push(value);
|
|
256
|
+
return prev;
|
|
257
|
+
})
|
|
258
|
+
.option('--with-ancestors', 'Include ancestor nodes', true)
|
|
259
|
+
.option('--no-with-ancestors', 'Exclude ancestor nodes')
|
|
260
|
+
.option('--selectors-json <json>', 'JSON array of {selector,withAncestors} for per-selector control')
|
|
261
|
+
.action(async (opts, cmd) => {
|
|
262
|
+
let body;
|
|
263
|
+
try {
|
|
264
|
+
body = buildQuerySelectorFirstBody(opts);
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
console.error(`fastbrowser-cli error: ${err.message}`);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
await runTool(cmd, 'query_selectors', body);
|
|
271
|
+
});
|
|
272
|
+
program
|
|
273
|
+
.command('take_snapshot')
|
|
274
|
+
.description('Take an accessibility-tree snapshot of the current page')
|
|
275
|
+
.action(async (_opts, cmd) => {
|
|
276
|
+
await runTool(cmd, 'take_snapshot', {});
|
|
277
|
+
});
|
|
278
|
+
program
|
|
279
|
+
.command('press_keys')
|
|
280
|
+
.description('Press a sequence of keys')
|
|
281
|
+
.requiredOption('--keys <keys>', "Comma-separated keys. E.g. 'Hello, Tab, Enter'")
|
|
282
|
+
.action(async (opts, cmd) => {
|
|
283
|
+
await runTool(cmd, 'press_keys', { keys: opts.keys });
|
|
284
|
+
});
|
|
285
|
+
await program.parseAsync(process.argv);
|
|
286
|
+
}
|
|
287
|
+
void main();
|
|
288
|
+
//# sourceMappingURL=fastbrowser_cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastbrowser_cli.js","sourceRoot":"","sources":["../../src/fastbrowser_cli/fastbrowser_cli.ts"],"names":[],"mappings":";;;;;;AAEA,eAAe;AACf,sDAAyB;AACzB,0DAA6B;AAE7B,cAAc;AACd,yCAAoC;AAEpC,gBAAgB;AAChB,0DAAmD;AACnD,gEAAyD;AAezD,SAAS,gBAAgB,CAAC,GAAY;IACrC,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAc,CAAC;IACrD,OAAO,2BAAU,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAY;IACxC,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAc,CAAC;IACrD,OAAO,UAAU,CAAC,SAAS,KAAK,KAAK,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAY,EAAE,SAAiB,EAAE,IAAa;IACpE,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC;QACJ,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,MAAM,iCAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,2BAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACpE,2BAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,SAAS,uBAAuB,CAAC,IAKhC;IACA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;QACnE,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,MAA8B,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC;IAEnD,MAAM,SAAS,GAAyB,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACvE,QAAQ;QACR,KAAK;QACL,aAAa;KACb,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,SAAS,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,2BAA2B,CAAC,IAIpC;IACA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;QACnE,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,MAAmC,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACzC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC;IAEnD,MAAM,SAAS,GAA8B,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5E,QAAQ;QACR,aAAa;KACb,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,SAAS,EAAE,CAAC;AACtB,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,aAAa,GAAG,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,CAAC;QACJ,MAAM,iBAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,iBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,qCAAqC,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,KAAK,UAAU,IAAI;IAClB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACxF,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;QAC9B,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC9B,OAAO;SACL,IAAI,CAAC,iBAAiB,CAAC;SACvB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,gBAAgB,EAAE,kFAAkF,CAAC;SAC5G,MAAM,CAAC,aAAa,EAAE,6DAA6D,EAAE,IAAI,CAAC;SAC1F,MAAM,CAAC,gBAAgB,EAAE,+CAA+C,CAAC;SACzE,MAAM,CAAC,0BAA0B,EAAE,sEAAsE,CAAC,CAAC;IAE7G,MAAM,SAAS,GAAG,OAAO;SACvB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC,CAAC;IAEpD,SAAS;SACP,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC;YACJ,MAAM,iCAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;IAEJ,SAAS;SACP,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC;YACJ,MAAM,iCAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;IAEJ,SAAS;SACP,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,iCAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;QACzD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;QACrC,MAAM,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yBAAyB,CAAC;SACtC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,IAAqB,EAAE,GAAY,EAAE,EAAE;QACrD,MAAM,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,wBAAwB,CAAC;SACrC,cAAc,CAAC,oBAAoB,EAAE,sBAAsB,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,GAAY,EAAE,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,oCAAoC,CAAC;SACjD,cAAc,CAAC,aAAa,EAAE,oBAAoB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,IAAqB,EAAE,GAAY,EAAE,EAAE;QACrD,MAAM,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,cAAc,CAAC,2BAA2B,EAAE,mEAAmE,CAAC;SAChH,MAAM,CAAC,KAAK,EAAE,IAA0B,EAAE,GAAY,EAAE,EAAE;QAC1D,MAAM,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,cAAc,CAAC,2BAA2B,EAAE,mEAAmE,CAAC;SAChH,cAAc,CAAC,iBAAiB,EAAE,eAAe,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,IAAyC,EAAE,GAAY,EAAE,EAAE;QACzE,MAAM,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE;YAC/B,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;SAC1D,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,qBAAqB,CAAC;SAC9B,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,2BAA2B,EAAE,gCAAgC,EAAE,CAAC,KAAa,EAAE,OAAiB,EAAE,EAAE,EAAE;QAC7G,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,GAAG,CAAC;SACzE,MAAM,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,IAAI,CAAC;SAC1D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,yBAAyB,EAAE,uEAAuE,CAAC;SAC1G,MAAM,CAAC,KAAK,EAAE,IAKd,EAAE,GAAY,EAAE,EAAE;QAClB,IAAI,IAA8B,CAAC;QACnC,IAAI,CAAC;YACJ,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,oGAAoG,CAAC;SACjH,MAAM,CAAC,2BAA2B,EAAE,gCAAgC,EAAE,CAAC,KAAa,EAAE,OAAiB,EAAE,EAAE,EAAE;QAC7G,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACb,CAAC,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,IAAI,CAAC;SAC1D,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;SACvD,MAAM,CAAC,yBAAyB,EAAE,iEAAiE,CAAC;SACpG,MAAM,CAAC,KAAK,EAAE,IAId,EAAE,GAAY,EAAE,EAAE;QAClB,IAAI,IAA0B,CAAC;QAC/B,IAAI,CAAC;YACJ,IAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,MAAM,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;QACrC,MAAM,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEJ,OAAO;SACL,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,0BAA0B,CAAC;SACvC,cAAc,CAAC,eAAe,EAAE,gDAAgD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,GAAY,EAAE,EAAE;QACtD,MAAM,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ToolResponse } from '../../fastbrowser_httpd/libs/tool-schemas.js';
|
|
2
|
+
export declare class HttpClient {
|
|
3
|
+
static getServerUrl(overrideUrl: string | undefined): string;
|
|
4
|
+
static postTool(serverUrl: string, routeName: string, body: unknown): Promise<ToolResponse>;
|
|
5
|
+
static printResponse(response: ToolResponse): void;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/fastbrowser_cli/libs/http-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,8CAA8C,CAAC;AAQrG,qBAAa,UAAU;IACtB,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;WAO/C,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BjG,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;CAKlD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpClient = void 0;
|
|
4
|
+
// local imports
|
|
5
|
+
const tool_schemas_js_1 = require("../../fastbrowser_httpd/libs/tool-schemas.js");
|
|
6
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
7
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
8
|
+
//
|
|
9
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
10
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
11
|
+
class HttpClient {
|
|
12
|
+
static getServerUrl(overrideUrl) {
|
|
13
|
+
if (overrideUrl !== undefined && overrideUrl !== '')
|
|
14
|
+
return overrideUrl;
|
|
15
|
+
const envUrl = process.env.FASTBROWSER_SERVER;
|
|
16
|
+
if (envUrl !== undefined && envUrl !== '')
|
|
17
|
+
return envUrl;
|
|
18
|
+
return 'http://localhost:8787';
|
|
19
|
+
}
|
|
20
|
+
static async postTool(serverUrl, routeName, body) {
|
|
21
|
+
const url = `${serverUrl.replace(/\/+$/, '')}/tools/${routeName}`;
|
|
22
|
+
const response = await fetch(url, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
headers: { 'content-type': 'application/json' },
|
|
25
|
+
body: JSON.stringify(body ?? {}),
|
|
26
|
+
});
|
|
27
|
+
const responseText = await response.text();
|
|
28
|
+
if (response.ok === false) {
|
|
29
|
+
throw new Error(`HTTP ${response.status} ${response.statusText}: ${responseText}`);
|
|
30
|
+
}
|
|
31
|
+
let parsedJson;
|
|
32
|
+
try {
|
|
33
|
+
parsedJson = JSON.parse(responseText);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
throw new Error(`Invalid JSON from server: ${responseText}`);
|
|
37
|
+
}
|
|
38
|
+
const parsed = tool_schemas_js_1.ToolResponseSchema.safeParse(parsedJson);
|
|
39
|
+
if (parsed.success === false) {
|
|
40
|
+
throw new Error(`Unexpected response shape: ${JSON.stringify(parsed.error.flatten())}`);
|
|
41
|
+
}
|
|
42
|
+
return parsed.data;
|
|
43
|
+
}
|
|
44
|
+
static printResponse(response) {
|
|
45
|
+
for (const part of response.content) {
|
|
46
|
+
console.log(part.text);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.HttpClient = HttpClient;
|
|
51
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/fastbrowser_cli/libs/http-client.ts"],"names":[],"mappings":";;;AAAA,gBAAgB;AAChB,kFAAqG;AAErG,+EAA+E;AAC/E,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAE/E,MAAa,UAAU;IACtB,MAAM,CAAC,YAAY,CAAC,WAA+B;QAClD,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,EAAE;YAAE,OAAO,WAAW,CAAC;QACxE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;YAAE,OAAO,MAAM,CAAC;QACzD,OAAO,uBAAuB,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAa;QACxE,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,SAAS,EAAE,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,UAAmB,CAAC;QACxB,IAAI,CAAC;YACJ,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,oCAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,QAAsB;QAC1C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;CACD;AAxCD,gCAwCC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class ServerManager {
|
|
2
|
+
static status(serverUrl: string): Promise<'running' | 'stopped'>;
|
|
3
|
+
static ensureRunning(serverUrl: string): Promise<void>;
|
|
4
|
+
static start(serverUrl: string): Promise<void>;
|
|
5
|
+
static stop(serverUrl: string): Promise<void>;
|
|
6
|
+
private static isLocalUrl;
|
|
7
|
+
private static parsePort;
|
|
8
|
+
private static isAlive;
|
|
9
|
+
private static readLogTail;
|
|
10
|
+
private static sleep;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=server-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-manager.d.ts","sourceRoot":"","sources":["../../../src/fastbrowser_cli/libs/server-manager.ts"],"names":[],"mappings":"AA4BA,qBAAa,aAAa;WACZ,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;WAezD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAU/C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAuDvC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDnD,OAAO,CAAC,MAAM,CAAC,UAAU;IAUzB,OAAO,CAAC,MAAM,CAAC,SAAS;IAaxB,OAAO,CAAC,MAAM,CAAC,OAAO;IAWtB,OAAO,CAAC,MAAM,CAAC,WAAW;IAU1B,OAAO,CAAC,MAAM,CAAC,KAAK;CAGpB"}
|