arise-browser 0.3.1 → 0.4.0
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 +4 -4
- package/deploy/neko/CONTEXT.md +2 -2
- package/deploy/neko/arise-browser.service +1 -1
- package/deploy/neko/setup.sh +2 -2
- package/dist/bin/arise-browser.d.ts +9 -19
- package/dist/bin/arise-browser.d.ts.map +1 -1
- package/dist/bin/arise-browser.js +206 -192
- package/dist/bin/arise-browser.js.map +1 -1
- package/dist/bin/cli.d.ts +9 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +332 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/server/routes/health.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/plugin/openclaw.plugin.json +1 -1
- package/skill/arise-browser/SKILL.md +70 -115
- package/skill/arise-browser/references/api.md +1 -1
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ AriseBrowser's **virtual display mode** runs a real headed Chrome on any Linux s
|
|
|
30
30
|
npx arise-browser --virtual-display --host 0.0.0.0
|
|
31
31
|
|
|
32
32
|
# AI agent uses the API as usual
|
|
33
|
-
curl -X POST http://server:
|
|
33
|
+
curl -X POST http://server:16473/navigate -d '{"url":"https://example.com"}'
|
|
34
34
|
|
|
35
35
|
# Users open http://server:6090 in their browser → live view of Chrome
|
|
36
36
|
```
|
|
@@ -195,9 +195,9 @@ const result = await session.execAction({ type: "click", ref: "e5" });
|
|
|
195
195
|
// As an HTTP server
|
|
196
196
|
const server = await createServer(
|
|
197
197
|
{ mode: "standalone", headless: true },
|
|
198
|
-
{ port:
|
|
198
|
+
{ port: 16473 }
|
|
199
199
|
);
|
|
200
|
-
await server.listen({ port:
|
|
200
|
+
await server.listen({ port: 16473 });
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
## Comparison
|
|
@@ -229,7 +229,7 @@ AriseBrowser ships with an [OpenClaw skill](skill/arise-browser/SKILL.md) and [p
|
|
|
229
229
|
|
|
230
230
|
| Variable | Alias | Default |
|
|
231
231
|
|----------|-------|---------|
|
|
232
|
-
| `ARISE_BROWSER_PORT` | `BRIDGE_PORT` |
|
|
232
|
+
| `ARISE_BROWSER_PORT` | `BRIDGE_PORT` | 16473 |
|
|
233
233
|
| `ARISE_BROWSER_BIND` | `BRIDGE_BIND` | 127.0.0.1 |
|
|
234
234
|
| `ARISE_BROWSER_TOKEN` | `BRIDGE_TOKEN` | (none) |
|
|
235
235
|
| `ARISE_BROWSER_HEADLESS` | — | true |
|
package/deploy/neko/CONTEXT.md
CHANGED
|
@@ -11,7 +11,7 @@ arise-browser (Node.js, host)
|
|
|
11
11
|
├── docker run arise-neko
|
|
12
12
|
│ └── supervisord: Xorg, PulseAudio, Openbox, Chrome (CDP :9222), Neko (:8080)
|
|
13
13
|
├── Playwright connectOverCDP(localhost:9222)
|
|
14
|
-
└── Fastify HTTP Server (:
|
|
14
|
+
└── Fastify HTTP Server (:16473)
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
## Files
|
|
@@ -31,7 +31,7 @@ arise-browser (Node.js, host)
|
|
|
31
31
|
| Neko HTTP/WS | 6090 | 8080 | Public (WebRTC UI) |
|
|
32
32
|
| Chrome CDP | 9222 | 9222 | localhost only |
|
|
33
33
|
| WebRTC UDP | 52000-52100 | 52000-52100 | Public |
|
|
34
|
-
| arise-browser |
|
|
34
|
+
| arise-browser | 16473 | — | As needed (API) |
|
|
35
35
|
|
|
36
36
|
## Persistent Profile
|
|
37
37
|
|
|
@@ -5,7 +5,7 @@ Requires=docker.service
|
|
|
5
5
|
|
|
6
6
|
[Service]
|
|
7
7
|
Type=simple
|
|
8
|
-
ExecStart=/usr/bin/node /opt/arise-browser/dist/bin/arise-browser.js --virtual-display --port
|
|
8
|
+
ExecStart=/usr/bin/node /opt/arise-browser/dist/bin/arise-browser.js --virtual-display --port 16473 --host 0.0.0.0
|
|
9
9
|
ExecStopPost=/usr/bin/docker rm -f arise-neko
|
|
10
10
|
Restart=always
|
|
11
11
|
RestartSec=5
|
package/deploy/neko/setup.sh
CHANGED
|
@@ -78,7 +78,7 @@ echo " 1. Install arise-browser:"
|
|
|
78
78
|
echo " npm install -g arise-browser"
|
|
79
79
|
echo ""
|
|
80
80
|
echo " 2. Run:"
|
|
81
|
-
echo " npx arise-browser --virtual-display --port
|
|
81
|
+
echo " npx arise-browser --virtual-display --port 16473 --host 0.0.0.0"
|
|
82
82
|
echo ""
|
|
83
83
|
echo " Or use systemd:"
|
|
84
84
|
echo " cp deploy/neko/arise-browser.service /etc/systemd/system/"
|
|
@@ -86,7 +86,7 @@ echo " systemctl daemon-reload"
|
|
|
86
86
|
echo " systemctl enable --now arise-browser"
|
|
87
87
|
echo ""
|
|
88
88
|
echo "Ports:"
|
|
89
|
-
echo " -
|
|
89
|
+
echo " - 16473 arise-browser API"
|
|
90
90
|
echo " - 6090 Neko WebRTC UI"
|
|
91
91
|
echo " - 9222 Chrome CDP (localhost only)"
|
|
92
92
|
echo " - 52000-52100 WebRTC UDP"
|
|
@@ -1,26 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* AriseBrowser CLI —
|
|
3
|
+
* AriseBrowser CLI — Entry point.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Options:
|
|
9
|
-
* --port, -p Server port (default: 9867)
|
|
10
|
-
* --host Bind address (default: 127.0.0.1)
|
|
11
|
-
* --token Auth token
|
|
12
|
-
* --headless Run headless (default: true)
|
|
13
|
-
* --no-headless Run with visible browser
|
|
14
|
-
* --profile Browser profile directory (enables managed mode)
|
|
15
|
-
* --cdp CDP endpoint URL (enables cdp mode)
|
|
16
|
-
* --help Show help
|
|
5
|
+
* Routes to CLI subcommands (start, open, snap, click, etc.) if the first
|
|
6
|
+
* argument is a known command. Otherwise starts the HTTP server directly
|
|
7
|
+
* (legacy / daemon mode).
|
|
17
8
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* ARISE_BROWSER_PROFILE
|
|
9
|
+
* Usage:
|
|
10
|
+
* npx arise-browser start [options] # Start server as daemon
|
|
11
|
+
* npx arise-browser open <url> # Navigate
|
|
12
|
+
* npx arise-browser snap # Page snapshot
|
|
13
|
+
* npx arise-browser [server-options] # Direct server mode (legacy)
|
|
24
14
|
*/
|
|
25
15
|
export {};
|
|
26
16
|
//# sourceMappingURL=arise-browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arise-browser.d.ts","sourceRoot":"","sources":["../../bin/arise-browser.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"arise-browser.d.ts","sourceRoot":"","sources":["../../bin/arise-browser.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
|
|
@@ -1,70 +1,85 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* AriseBrowser CLI —
|
|
3
|
+
* AriseBrowser CLI — Entry point.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* Options:
|
|
9
|
-
* --port, -p Server port (default: 9867)
|
|
10
|
-
* --host Bind address (default: 127.0.0.1)
|
|
11
|
-
* --token Auth token
|
|
12
|
-
* --headless Run headless (default: true)
|
|
13
|
-
* --no-headless Run with visible browser
|
|
14
|
-
* --profile Browser profile directory (enables managed mode)
|
|
15
|
-
* --cdp CDP endpoint URL (enables cdp mode)
|
|
16
|
-
* --help Show help
|
|
5
|
+
* Routes to CLI subcommands (start, open, snap, click, etc.) if the first
|
|
6
|
+
* argument is a known command. Otherwise starts the HTTP server directly
|
|
7
|
+
* (legacy / daemon mode).
|
|
17
8
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* ARISE_BROWSER_PROFILE
|
|
9
|
+
* Usage:
|
|
10
|
+
* npx arise-browser start [options] # Start server as daemon
|
|
11
|
+
* npx arise-browser open <url> # Navigate
|
|
12
|
+
* npx arise-browser snap # Page snapshot
|
|
13
|
+
* npx arise-browser [server-options] # Direct server mode (legacy)
|
|
24
14
|
*/
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
15
|
+
const KNOWN_COMMANDS = [
|
|
16
|
+
"start", "stop", "open", "snap", "click", "type",
|
|
17
|
+
"select", "press", "scroll", "screenshot", "tabs", "health",
|
|
18
|
+
];
|
|
19
|
+
const firstArg = process.argv[2];
|
|
20
|
+
if (firstArg && KNOWN_COMMANDS.includes(firstArg)) {
|
|
21
|
+
// CLI subcommand mode
|
|
22
|
+
import("./cli.js").then((m) => m.run()).catch((err) => {
|
|
23
|
+
console.error("Fatal:", err);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Server mode (original behavior)
|
|
29
|
+
startServer();
|
|
30
|
+
}
|
|
31
|
+
async function startServer() {
|
|
32
|
+
const { createServer } = await import("../src/server/server.js");
|
|
33
|
+
const { VirtualDisplayManager } = await import("../src/virtual-display/manager.js");
|
|
34
|
+
const { readFileSync } = await import("node:fs");
|
|
35
|
+
function getPackageVersion() {
|
|
36
|
+
const candidates = [
|
|
37
|
+
new URL("../package.json", import.meta.url),
|
|
38
|
+
new URL("../../package.json", import.meta.url),
|
|
39
|
+
];
|
|
40
|
+
for (const candidate of candidates) {
|
|
41
|
+
try {
|
|
42
|
+
const pkg = JSON.parse(readFileSync(candidate, "utf-8"));
|
|
43
|
+
if (pkg.version) {
|
|
44
|
+
return pkg.version;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// try next path
|
|
38
49
|
}
|
|
39
50
|
}
|
|
40
|
-
|
|
41
|
-
// try next path
|
|
42
|
-
}
|
|
51
|
+
throw new Error(`Could not locate package.json for CLI version. Tried: ${candidates.join(", ")}`);
|
|
43
52
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return args[idx + 1];
|
|
53
|
+
const PKG_VERSION = getPackageVersion();
|
|
54
|
+
const args = process.argv.slice(2);
|
|
55
|
+
function getArg(names) {
|
|
56
|
+
for (const name of names) {
|
|
57
|
+
const idx = args.indexOf(name);
|
|
58
|
+
if (idx !== -1 && idx + 1 < args.length) {
|
|
59
|
+
return args[idx + 1];
|
|
60
|
+
}
|
|
53
61
|
}
|
|
62
|
+
return undefined;
|
|
54
63
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (hasFlag(["--help", "-h"])) {
|
|
61
|
-
console.log(`
|
|
64
|
+
function hasFlag(names) {
|
|
65
|
+
return names.some((n) => args.includes(n));
|
|
66
|
+
}
|
|
67
|
+
if (hasFlag(["--help", "-h"])) {
|
|
68
|
+
console.log(`
|
|
62
69
|
AriseBrowser — AI browser automation engine
|
|
63
70
|
|
|
64
|
-
Usage:
|
|
71
|
+
Usage:
|
|
72
|
+
arise-browser <command> [args] CLI mode (recommended)
|
|
73
|
+
arise-browser [server-options] Direct server mode (legacy)
|
|
74
|
+
|
|
75
|
+
Commands:
|
|
76
|
+
start, stop, open, snap, click, type, select, press, scroll,
|
|
77
|
+
screenshot, tabs, health
|
|
78
|
+
|
|
79
|
+
Run 'arise-browser <command>' without args for command-specific help.
|
|
65
80
|
|
|
66
|
-
|
|
67
|
-
--port, -p <port> Server port (default:
|
|
81
|
+
Server options (direct mode):
|
|
82
|
+
--port, -p <port> Server port (default: 16473)
|
|
68
83
|
--host <host> Bind address (default: 127.0.0.1)
|
|
69
84
|
--token <token> Bearer auth token
|
|
70
85
|
--headless Run headless (default)
|
|
@@ -73,166 +88,165 @@ Options:
|
|
|
73
88
|
--cdp <url> CDP endpoint URL (cdp mode)
|
|
74
89
|
--help Show this help
|
|
75
90
|
|
|
76
|
-
Virtual display
|
|
77
|
-
--virtual-display Enable Docker
|
|
78
|
-
--neko-port <port>
|
|
79
|
-
--neko-password <pwd>
|
|
80
|
-
--neko-admin-password <pwd>
|
|
91
|
+
Virtual display:
|
|
92
|
+
--virtual-display Enable Docker virtual display container
|
|
93
|
+
--neko-port <port> Virtual display HTTP/WS port (default: 6090)
|
|
94
|
+
--neko-password <pwd> User password (default: "neko")
|
|
95
|
+
--neko-admin-password <pwd> Admin password (default: "admin")
|
|
81
96
|
--container-name <name> Docker container name (default: "arise-neko")
|
|
82
97
|
--image-name <name> Docker image name (default: "arise-neko")
|
|
83
98
|
|
|
84
99
|
Environment variables:
|
|
85
|
-
ARISE_BROWSER_PORT / BRIDGE_PORT Default:
|
|
100
|
+
ARISE_BROWSER_PORT / BRIDGE_PORT Default: 16473
|
|
86
101
|
ARISE_BROWSER_BIND / BRIDGE_BIND Default: 127.0.0.1
|
|
87
102
|
ARISE_BROWSER_TOKEN / BRIDGE_TOKEN Auth token
|
|
88
103
|
ARISE_BROWSER_HEADLESS "true" or "false"
|
|
89
104
|
ARISE_BROWSER_PROFILE Profile dir (managed mode)
|
|
90
|
-
ARISE_BROWSER_VIRTUAL_DISPLAY "true" to enable
|
|
91
|
-
ARISE_BROWSER_NEKO_PORT
|
|
92
|
-
ARISE_BROWSER_NEKO_PASSWORD
|
|
93
|
-
ARISE_BROWSER_NEKO_ADMIN_PASSWORD
|
|
105
|
+
ARISE_BROWSER_VIRTUAL_DISPLAY "true" to enable virtual display
|
|
106
|
+
ARISE_BROWSER_NEKO_PORT Virtual display port (default: 6090)
|
|
107
|
+
ARISE_BROWSER_NEKO_PASSWORD User password
|
|
108
|
+
ARISE_BROWSER_NEKO_ADMIN_PASSWORD Admin password
|
|
94
109
|
ARISE_BROWSER_CONTAINER_NAME Container name (default: "arise-neko")
|
|
95
110
|
ARISE_BROWSER_IMAGE_NAME Image name (default: "arise-neko")
|
|
96
111
|
`);
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
const port = parseInt(getArg(["--port", "-p"])
|
|
100
|
-
|| process.env.ARISE_BROWSER_PORT
|
|
101
|
-
|| process.env.BRIDGE_PORT
|
|
102
|
-
|| "9867", 10);
|
|
103
|
-
if (Number.isNaN(port) || port < 0 || port > 65535) {
|
|
104
|
-
console.error("Error: invalid port number");
|
|
105
|
-
process.exit(1);
|
|
106
|
-
}
|
|
107
|
-
const host = getArg(["--host"])
|
|
108
|
-
|| process.env.ARISE_BROWSER_BIND
|
|
109
|
-
|| process.env.BRIDGE_BIND
|
|
110
|
-
|| "127.0.0.1";
|
|
111
|
-
const token = getArg(["--token"])
|
|
112
|
-
|| process.env.ARISE_BROWSER_TOKEN
|
|
113
|
-
|| process.env.BRIDGE_TOKEN;
|
|
114
|
-
const cdpUrl = getArg(["--cdp"]);
|
|
115
|
-
const profileDir = getArg(["--profile"])
|
|
116
|
-
|| process.env.ARISE_BROWSER_PROFILE;
|
|
117
|
-
let headless = true;
|
|
118
|
-
if (hasFlag(["--no-headless"])) {
|
|
119
|
-
headless = false;
|
|
120
|
-
}
|
|
121
|
-
else if (process.env.ARISE_BROWSER_HEADLESS === "false") {
|
|
122
|
-
headless = false;
|
|
123
|
-
}
|
|
124
|
-
// Virtual display mode
|
|
125
|
-
const virtualDisplayEnabled = hasFlag(["--virtual-display"])
|
|
126
|
-
|| process.env.ARISE_BROWSER_VIRTUAL_DISPLAY === "true";
|
|
127
|
-
const nekoPort = parseInt(getArg(["--neko-port"])
|
|
128
|
-
|| process.env.ARISE_BROWSER_NEKO_PORT
|
|
129
|
-
|| "6090", 10);
|
|
130
|
-
const nekoPassword = getArg(["--neko-password"])
|
|
131
|
-
|| process.env.ARISE_BROWSER_NEKO_PASSWORD
|
|
132
|
-
|| "neko";
|
|
133
|
-
const nekoAdminPassword = getArg(["--neko-admin-password"])
|
|
134
|
-
|| process.env.ARISE_BROWSER_NEKO_ADMIN_PASSWORD
|
|
135
|
-
|| "admin";
|
|
136
|
-
const containerName = getArg(["--container-name"])
|
|
137
|
-
|| process.env.ARISE_BROWSER_CONTAINER_NAME
|
|
138
|
-
|| "arise-neko";
|
|
139
|
-
const imageName = getArg(["--image-name"])
|
|
140
|
-
|| process.env.ARISE_BROWSER_IMAGE_NAME
|
|
141
|
-
|| "arise-neko";
|
|
142
|
-
// Determine mode
|
|
143
|
-
let mode = "standalone";
|
|
144
|
-
let effectiveCdpUrl = cdpUrl;
|
|
145
|
-
if (virtualDisplayEnabled) {
|
|
146
|
-
// Virtual display forces CDP mode — Chrome is launched by VirtualDisplayManager
|
|
147
|
-
mode = "cdp";
|
|
148
|
-
effectiveCdpUrl = "http://localhost:9222";
|
|
149
|
-
}
|
|
150
|
-
else if (cdpUrl) {
|
|
151
|
-
mode = "cdp";
|
|
152
|
-
}
|
|
153
|
-
else if (profileDir) {
|
|
154
|
-
mode = "managed";
|
|
155
|
-
}
|
|
156
|
-
const browserConfig = {
|
|
157
|
-
mode,
|
|
158
|
-
cdpUrl: effectiveCdpUrl,
|
|
159
|
-
headless,
|
|
160
|
-
profileDir,
|
|
161
|
-
stealthHeaders: true,
|
|
162
|
-
...(virtualDisplayEnabled && {
|
|
163
|
-
virtualDisplay: {
|
|
164
|
-
enabled: true,
|
|
165
|
-
nekoPort,
|
|
166
|
-
nekoPassword,
|
|
167
|
-
nekoAdminPassword,
|
|
168
|
-
containerName,
|
|
169
|
-
imageName,
|
|
170
|
-
},
|
|
171
|
-
}),
|
|
172
|
-
};
|
|
173
|
-
async function main() {
|
|
174
|
-
console.log(`AriseBrowser v${PKG_VERSION}`);
|
|
175
|
-
console.log(`Mode: ${mode} | Headless: ${headless} | Port: ${port}`);
|
|
176
|
-
let displayManager = null;
|
|
177
|
-
// Start virtual display environment before the HTTP server
|
|
178
|
-
if (virtualDisplayEnabled) {
|
|
179
|
-
console.log(`Virtual display: enabled (Neko :${nekoPort})`);
|
|
180
|
-
displayManager = new VirtualDisplayManager({
|
|
181
|
-
nekoPort,
|
|
182
|
-
nekoPassword,
|
|
183
|
-
nekoAdminPassword,
|
|
184
|
-
containerName,
|
|
185
|
-
imageName,
|
|
186
|
-
});
|
|
187
|
-
await displayManager.start();
|
|
112
|
+
process.exit(0);
|
|
188
113
|
}
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
114
|
+
const port = parseInt(getArg(["--port", "-p"])
|
|
115
|
+
|| process.env.ARISE_BROWSER_PORT
|
|
116
|
+
|| process.env.BRIDGE_PORT
|
|
117
|
+
|| "16473", 10);
|
|
118
|
+
if (Number.isNaN(port) || port < 0 || port > 65535) {
|
|
119
|
+
console.error("Error: invalid port number");
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
const host = getArg(["--host"])
|
|
123
|
+
|| process.env.ARISE_BROWSER_BIND
|
|
124
|
+
|| process.env.BRIDGE_BIND
|
|
125
|
+
|| "127.0.0.1";
|
|
126
|
+
const token = getArg(["--token"])
|
|
127
|
+
|| process.env.ARISE_BROWSER_TOKEN
|
|
128
|
+
|| process.env.BRIDGE_TOKEN;
|
|
129
|
+
const cdpUrl = getArg(["--cdp"]);
|
|
130
|
+
const profileDir = getArg(["--profile"])
|
|
131
|
+
|| process.env.ARISE_BROWSER_PROFILE;
|
|
132
|
+
let headless = true;
|
|
133
|
+
if (hasFlag(["--no-headless"])) {
|
|
134
|
+
headless = false;
|
|
135
|
+
}
|
|
136
|
+
else if (process.env.ARISE_BROWSER_HEADLESS === "false") {
|
|
137
|
+
headless = false;
|
|
138
|
+
}
|
|
139
|
+
// Virtual display mode
|
|
140
|
+
const virtualDisplayEnabled = hasFlag(["--virtual-display"])
|
|
141
|
+
|| process.env.ARISE_BROWSER_VIRTUAL_DISPLAY === "true";
|
|
142
|
+
const nekoPort = parseInt(getArg(["--neko-port"])
|
|
143
|
+
|| process.env.ARISE_BROWSER_NEKO_PORT
|
|
144
|
+
|| "6090", 10);
|
|
145
|
+
const nekoPassword = getArg(["--neko-password"])
|
|
146
|
+
|| process.env.ARISE_BROWSER_NEKO_PASSWORD
|
|
147
|
+
|| "neko";
|
|
148
|
+
const nekoAdminPassword = getArg(["--neko-admin-password"])
|
|
149
|
+
|| process.env.ARISE_BROWSER_NEKO_ADMIN_PASSWORD
|
|
150
|
+
|| "admin";
|
|
151
|
+
const containerName = getArg(["--container-name"])
|
|
152
|
+
|| process.env.ARISE_BROWSER_CONTAINER_NAME
|
|
153
|
+
|| "arise-neko";
|
|
154
|
+
const imageName = getArg(["--image-name"])
|
|
155
|
+
|| process.env.ARISE_BROWSER_IMAGE_NAME
|
|
156
|
+
|| "arise-neko";
|
|
157
|
+
let mode = "standalone";
|
|
158
|
+
let effectiveCdpUrl = cdpUrl;
|
|
159
|
+
if (virtualDisplayEnabled) {
|
|
160
|
+
mode = "cdp";
|
|
161
|
+
effectiveCdpUrl = "http://localhost:9222";
|
|
194
162
|
}
|
|
195
|
-
else {
|
|
196
|
-
|
|
163
|
+
else if (cdpUrl) {
|
|
164
|
+
mode = "cdp";
|
|
197
165
|
}
|
|
198
|
-
if (
|
|
199
|
-
|
|
166
|
+
else if (profileDir) {
|
|
167
|
+
mode = "managed";
|
|
200
168
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
169
|
+
const browserConfig = {
|
|
170
|
+
mode,
|
|
171
|
+
cdpUrl: effectiveCdpUrl,
|
|
172
|
+
headless,
|
|
173
|
+
profileDir,
|
|
174
|
+
stealthHeaders: true,
|
|
175
|
+
...(virtualDisplayEnabled && {
|
|
176
|
+
virtualDisplay: {
|
|
177
|
+
enabled: true,
|
|
178
|
+
nekoPort,
|
|
179
|
+
nekoPassword,
|
|
180
|
+
nekoAdminPassword,
|
|
181
|
+
containerName,
|
|
182
|
+
imageName,
|
|
183
|
+
},
|
|
184
|
+
}),
|
|
185
|
+
};
|
|
186
|
+
try {
|
|
187
|
+
console.log(`AriseBrowser v${PKG_VERSION}`);
|
|
188
|
+
console.log(`Mode: ${mode} | Headless: ${headless} | Port: ${port}`);
|
|
189
|
+
let displayManager = null;
|
|
190
|
+
if (virtualDisplayEnabled) {
|
|
191
|
+
console.log(`Virtual display: enabled (port :${nekoPort})`);
|
|
192
|
+
displayManager = new VirtualDisplayManager({
|
|
193
|
+
nekoPort,
|
|
194
|
+
nekoPassword,
|
|
195
|
+
nekoAdminPassword,
|
|
196
|
+
containerName,
|
|
197
|
+
imageName,
|
|
198
|
+
});
|
|
199
|
+
await displayManager.start();
|
|
207
200
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}, 15_000);
|
|
214
|
-
forceTimer.unref();
|
|
215
|
-
try {
|
|
216
|
-
await server.close();
|
|
201
|
+
const server = await createServer(browserConfig, { port, host, token });
|
|
202
|
+
await server.listen({ port, host });
|
|
203
|
+
console.log(`Server listening on http://${host}:${port}`);
|
|
204
|
+
if (token) {
|
|
205
|
+
console.log(`Auth: Bearer token required`);
|
|
217
206
|
}
|
|
218
|
-
|
|
219
|
-
console.
|
|
207
|
+
else {
|
|
208
|
+
console.log(`Auth: disabled (set ARISE_BROWSER_TOKEN to enable)`);
|
|
220
209
|
}
|
|
221
210
|
if (displayManager) {
|
|
211
|
+
console.log(`Live view on http://0.0.0.0:${nekoPort}`);
|
|
212
|
+
}
|
|
213
|
+
// Graceful shutdown with forced exit timeout
|
|
214
|
+
let shuttingDown = false;
|
|
215
|
+
const shutdown = async () => {
|
|
216
|
+
if (shuttingDown) {
|
|
217
|
+
console.log("Forced exit.");
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
shuttingDown = true;
|
|
221
|
+
console.log("\nShutting down...");
|
|
222
|
+
const forceTimer = setTimeout(() => {
|
|
223
|
+
console.error("Shutdown timed out — forcing exit");
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}, 15_000);
|
|
226
|
+
forceTimer.unref();
|
|
222
227
|
try {
|
|
223
|
-
await
|
|
228
|
+
await server.close();
|
|
224
229
|
}
|
|
225
230
|
catch (e) {
|
|
226
|
-
console.error("Error during
|
|
231
|
+
console.error("Error during server shutdown:", e);
|
|
227
232
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
+
if (displayManager) {
|
|
234
|
+
try {
|
|
235
|
+
await displayManager.stop();
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
console.error("Error during display shutdown:", e);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
process.exit(0);
|
|
242
|
+
};
|
|
243
|
+
process.on("SIGINT", shutdown);
|
|
244
|
+
process.on("SIGTERM", shutdown);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
console.error("Fatal:", err);
|
|
248
|
+
process.exit(1);
|
|
249
|
+
}
|
|
233
250
|
}
|
|
234
|
-
|
|
235
|
-
console.error("Fatal:", err);
|
|
236
|
-
process.exit(1);
|
|
237
|
-
});
|
|
251
|
+
export {};
|
|
238
252
|
//# sourceMappingURL=arise-browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arise-browser.js","sourceRoot":"","sources":["../../bin/arise-browser.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"arise-browser.js","sourceRoot":"","sources":["../../bin/arise-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AriseBrowser CLI — Agent-friendly subcommands for browser control.
|
|
4
|
+
*
|
|
5
|
+
* Each subcommand calls the local HTTP server and outputs plain text.
|
|
6
|
+
*/
|
|
7
|
+
export declare const KNOWN_COMMANDS: string[];
|
|
8
|
+
export declare function run(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAsTH,eAAO,MAAM,cAAc,UAAwB,CAAC;AAEpD,wBAAsB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAwCzC"}
|