@redplanethq/corebrain 2.3.7 → 2.5.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/dist/commands/browser/close.d.ts +5 -4
- package/dist/commands/browser/close.d.ts.map +1 -1
- package/dist/commands/browser/close.js +25 -20
- package/dist/commands/browser/close.js.map +1 -1
- package/dist/commands/browser/command.d.ts +5 -3
- package/dist/commands/browser/command.d.ts.map +1 -1
- package/dist/commands/browser/command.js +10 -16
- package/dist/commands/browser/command.js.map +1 -1
- package/dist/commands/browser/delete-session.d.ts +10 -0
- package/dist/commands/browser/delete-session.d.ts.map +1 -0
- package/dist/commands/browser/delete-session.js +41 -0
- package/dist/commands/browser/delete-session.js.map +1 -0
- package/dist/commands/browser/install.d.ts.map +1 -1
- package/dist/commands/browser/install.js +41 -9
- package/dist/commands/browser/install.js.map +1 -1
- package/dist/commands/browser/list-sessions.d.ts +8 -0
- package/dist/commands/browser/list-sessions.d.ts.map +1 -0
- package/dist/commands/browser/list-sessions.js +46 -0
- package/dist/commands/browser/list-sessions.js.map +1 -0
- package/dist/commands/browser/open-head.d.ts +8 -0
- package/dist/commands/browser/open-head.d.ts.map +1 -0
- package/dist/commands/browser/open-head.js +68 -0
- package/dist/commands/browser/open-head.js.map +1 -0
- package/dist/commands/browser/open.d.ts +3 -3
- package/dist/commands/browser/open.d.ts.map +1 -1
- package/dist/commands/browser/open.js +18 -25
- package/dist/commands/browser/open.js.map +1 -1
- package/dist/commands/browser/status.d.ts.map +1 -1
- package/dist/commands/browser/status.js +15 -9
- package/dist/commands/browser/status.js.map +1 -1
- package/dist/commands/coding/start.d.ts.map +1 -1
- package/dist/commands/coding/start.js.map +1 -1
- package/dist/commands/gateway/config.d.ts.map +1 -1
- package/dist/commands/gateway/config.js +19 -25
- package/dist/commands/gateway/config.js.map +1 -1
- package/dist/commands/gateway/restart.js +1 -1
- package/dist/commands/gateway/restart.js.map +1 -1
- package/dist/commands/gateway/start.d.ts +8 -0
- package/dist/commands/gateway/start.d.ts.map +1 -0
- package/dist/commands/gateway/start.js +106 -0
- package/dist/commands/gateway/start.js.map +1 -0
- package/dist/commands/gateway/status.js +2 -2
- package/dist/commands/gateway/status.js.map +1 -1
- package/dist/commands/gateway/stop.d.ts +8 -0
- package/dist/commands/gateway/stop.d.ts.map +1 -0
- package/dist/commands/gateway/stop.js +67 -0
- package/dist/commands/gateway/stop.js.map +1 -0
- package/dist/server/gateway-client.d.ts.map +1 -1
- package/dist/server/gateway-client.js +2 -2
- package/dist/server/gateway-client.js.map +1 -1
- package/dist/server/tools/browser-tools.d.ts +5 -6
- package/dist/server/tools/browser-tools.d.ts.map +1 -1
- package/dist/server/tools/browser-tools.js +63 -42
- package/dist/server/tools/browser-tools.js.map +1 -1
- package/dist/server/tools/coding-tools.d.ts +1 -2
- package/dist/server/tools/coding-tools.d.ts.map +1 -1
- package/dist/server/tools/coding-tools.js +9 -21
- package/dist/server/tools/coding-tools.js.map +1 -1
- package/dist/utils/agent-browser.d.ts +8 -26
- package/dist/utils/agent-browser.d.ts.map +1 -1
- package/dist/utils/agent-browser.js +28 -127
- package/dist/utils/agent-browser.js.map +1 -1
- package/dist/utils/browser-use.d.ts +57 -0
- package/dist/utils/browser-use.d.ts.map +1 -0
- package/dist/utils/browser-use.js +212 -0
- package/dist/utils/browser-use.js.map +1 -0
- package/dist/utils/coding-runner.d.ts +1 -3
- package/dist/utils/coding-runner.d.ts.map +1 -1
- package/dist/utils/coding-runner.js +7 -35
- package/dist/utils/coding-runner.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { spawn, execSync } from 'node:child_process';
|
|
2
|
-
import { existsSync, mkdirSync, rmSync, readdirSync
|
|
2
|
+
import { existsSync, mkdirSync, rmSync, readdirSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { getConfigPath } from '../config/paths.js';
|
|
5
5
|
// Constants - use unified config directory
|
|
6
6
|
const COREBRAIN_DIR = getConfigPath();
|
|
7
7
|
const BROWSER_PROFILES_DIR = join(COREBRAIN_DIR, 'browser-profiles');
|
|
8
|
-
const SESSIONS_FILE = join(COREBRAIN_DIR, 'browser-sessions.json');
|
|
9
|
-
const MAX_SESSIONS = 3;
|
|
10
8
|
// Blocked commands that cannot be run via browser_command
|
|
11
9
|
const BLOCKED_COMMANDS = [
|
|
12
10
|
'open',
|
|
@@ -21,58 +19,15 @@ const BLOCKED_COMMANDS = [
|
|
|
21
19
|
'state',
|
|
22
20
|
'download',
|
|
23
21
|
];
|
|
24
|
-
// ============ Session Management ============
|
|
25
|
-
function loadSessions() {
|
|
26
|
-
try {
|
|
27
|
-
if (!existsSync(SESSIONS_FILE)) {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
const data = readFileSync(SESSIONS_FILE, 'utf-8');
|
|
31
|
-
return JSON.parse(data);
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function saveSessions(sessions) {
|
|
38
|
-
if (!existsSync(COREBRAIN_DIR)) {
|
|
39
|
-
mkdirSync(COREBRAIN_DIR, { recursive: true });
|
|
40
|
-
}
|
|
41
|
-
writeFileSync(SESSIONS_FILE, JSON.stringify(sessions, null, 2));
|
|
42
|
-
}
|
|
43
|
-
export function getActiveSessions() {
|
|
44
|
-
return loadSessions();
|
|
45
|
-
}
|
|
46
|
-
export function getSession(sessionName) {
|
|
47
|
-
const sessions = loadSessions();
|
|
48
|
-
return sessions.find(s => s.sessionName === sessionName);
|
|
49
|
-
}
|
|
50
|
-
function addSession(session) {
|
|
51
|
-
const sessions = loadSessions();
|
|
52
|
-
// Remove existing session with same name if any
|
|
53
|
-
const filtered = sessions.filter(s => s.sessionName !== session.sessionName);
|
|
54
|
-
filtered.push(session);
|
|
55
|
-
saveSessions(filtered);
|
|
56
|
-
}
|
|
57
|
-
function removeSession(sessionName) {
|
|
58
|
-
const sessions = loadSessions();
|
|
59
|
-
const filtered = sessions.filter(s => s.sessionName !== sessionName);
|
|
60
|
-
saveSessions(filtered);
|
|
61
|
-
}
|
|
62
|
-
export function canCreateSession() {
|
|
63
|
-
const sessions = loadSessions();
|
|
64
|
-
return {
|
|
65
|
-
allowed: sessions.length < MAX_SESSIONS,
|
|
66
|
-
count: sessions.length,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
22
|
// ============ Installation ============
|
|
70
23
|
/**
|
|
71
24
|
* Get the agent-browser binary path (cross-platform)
|
|
72
25
|
*/
|
|
73
26
|
function getAgentBrowserPath() {
|
|
74
27
|
try {
|
|
75
|
-
const command = process.platform === 'win32'
|
|
28
|
+
const command = process.platform === 'win32'
|
|
29
|
+
? 'where agent-browser'
|
|
30
|
+
: 'which agent-browser';
|
|
76
31
|
const result = execSync(command, { stdio: 'pipe', encoding: 'utf-8' });
|
|
77
32
|
const path = result.trim().split('\n')[0]; // Take first result on Windows (where can return multiple)
|
|
78
33
|
return path || null;
|
|
@@ -125,7 +80,7 @@ function runNpmCommand(args) {
|
|
|
125
80
|
});
|
|
126
81
|
}
|
|
127
82
|
// ============ Core Browser Command Runner ============
|
|
128
|
-
async function runAgentBrowserCommand(
|
|
83
|
+
async function runAgentBrowserCommand(profile, args) {
|
|
129
84
|
const binaryPath = getBinaryPath();
|
|
130
85
|
if (!binaryPath) {
|
|
131
86
|
return {
|
|
@@ -134,8 +89,11 @@ async function runAgentBrowserCommand(sessionName, args) {
|
|
|
134
89
|
code: 1,
|
|
135
90
|
};
|
|
136
91
|
}
|
|
92
|
+
// Ensure profile directory exists
|
|
93
|
+
const profilePath = ensureProfileExists(profile);
|
|
137
94
|
return new Promise(resolve => {
|
|
138
|
-
|
|
95
|
+
// Use profile path for persistent browser state
|
|
96
|
+
const fullArgs = [...args, '--profile', profilePath];
|
|
139
97
|
const proc = spawn(binaryPath, fullArgs, {
|
|
140
98
|
cwd: COREBRAIN_DIR,
|
|
141
99
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
@@ -217,46 +175,23 @@ export function listProfiles() {
|
|
|
217
175
|
export function getProfilesDir() {
|
|
218
176
|
return BROWSER_PROFILES_DIR;
|
|
219
177
|
}
|
|
220
|
-
|
|
178
|
+
export function profileExists(name) {
|
|
179
|
+
const profilePath = join(BROWSER_PROFILES_DIR, name);
|
|
180
|
+
return existsSync(profilePath);
|
|
181
|
+
}
|
|
182
|
+
// ============ Browser Operations ============
|
|
221
183
|
/**
|
|
222
|
-
* Open a browser
|
|
223
|
-
* Creates the corebrain profile if it doesn't exist
|
|
224
|
-
* Enforces max 3 concurrent sessions
|
|
184
|
+
* Open a browser with URL using the specified profile
|
|
225
185
|
*/
|
|
226
|
-
export async function browserOpen(
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
const existingSession = getSession(sessionName);
|
|
230
|
-
// Allow if session already exists (re-opening) or under limit
|
|
231
|
-
if (!existingSession && !allowed) {
|
|
232
|
-
return {
|
|
233
|
-
stdout: '',
|
|
234
|
-
stderr: `Maximum ${MAX_SESSIONS} sessions allowed. Currently running: ${count}. Close a session first.`,
|
|
235
|
-
code: 1,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
// Ensure profile directory exists
|
|
239
|
-
const profilePath = ensureProfileExists(profile);
|
|
240
|
-
const args = ['open', url, '--profile', profilePath];
|
|
241
|
-
const result = await runAgentBrowserCommand(sessionName, args);
|
|
242
|
-
if (result.code === 0) {
|
|
243
|
-
addSession({
|
|
244
|
-
sessionName,
|
|
245
|
-
profile,
|
|
246
|
-
url,
|
|
247
|
-
startedAt: new Date().toISOString(),
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
return result;
|
|
186
|
+
export async function browserOpen(url, profile = 'default') {
|
|
187
|
+
const args = ['open', url];
|
|
188
|
+
return runAgentBrowserCommand(profile, args);
|
|
251
189
|
}
|
|
252
190
|
/**
|
|
253
|
-
* Close a browser
|
|
191
|
+
* Close a browser for the specified profile
|
|
254
192
|
*/
|
|
255
|
-
export async function browserClose(
|
|
256
|
-
|
|
257
|
-
// Remove session regardless of result (it might already be closed)
|
|
258
|
-
removeSession(sessionName);
|
|
259
|
-
return result;
|
|
193
|
+
export async function browserClose(profile) {
|
|
194
|
+
return runAgentBrowserCommand(profile, ['close']);
|
|
260
195
|
}
|
|
261
196
|
/**
|
|
262
197
|
* Check if a command is blocked
|
|
@@ -266,10 +201,10 @@ export function isBlockedCommand(command) {
|
|
|
266
201
|
return BLOCKED_COMMANDS.includes(cmd);
|
|
267
202
|
}
|
|
268
203
|
/**
|
|
269
|
-
* Execute a generic browser command
|
|
204
|
+
* Execute a generic browser command on a profile
|
|
270
205
|
* Blocks: open, close, cookies, storage, network, trace, highlight, console, errors, state, download
|
|
271
206
|
*/
|
|
272
|
-
export async function browserCommand(
|
|
207
|
+
export async function browserCommand(profile, command, args = []) {
|
|
273
208
|
// Check if command is blocked
|
|
274
209
|
if (isBlockedCommand(command)) {
|
|
275
210
|
return {
|
|
@@ -278,22 +213,7 @@ export async function browserCommand(sessionName, command, args = []) {
|
|
|
278
213
|
code: 1,
|
|
279
214
|
};
|
|
280
215
|
}
|
|
281
|
-
|
|
282
|
-
const session = getSession(sessionName);
|
|
283
|
-
if (!session) {
|
|
284
|
-
return {
|
|
285
|
-
stdout: '',
|
|
286
|
-
stderr: `Session "${sessionName}" not found. Use browser_open to create a session first.`,
|
|
287
|
-
code: 1,
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
return runAgentBrowserCommand(sessionName, [command, ...args]);
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* List all active browser sessions
|
|
294
|
-
*/
|
|
295
|
-
export function browserListSessions() {
|
|
296
|
-
return getActiveSessions();
|
|
216
|
+
return runAgentBrowserCommand(profile, [command, ...args]);
|
|
297
217
|
}
|
|
298
218
|
/**
|
|
299
219
|
* Get all available profiles
|
|
@@ -302,31 +222,12 @@ export function browserGetProfiles() {
|
|
|
302
222
|
return listProfiles();
|
|
303
223
|
}
|
|
304
224
|
/**
|
|
305
|
-
* Close
|
|
225
|
+
* Close a browser for the specified profile
|
|
306
226
|
*/
|
|
307
227
|
export async function browserCloseAll() {
|
|
308
|
-
const
|
|
309
|
-
for (const
|
|
310
|
-
|
|
311
|
-
await browserClose(session.sessionName);
|
|
312
|
-
}
|
|
313
|
-
catch {
|
|
314
|
-
// Ignore errors when closing individual sessions
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
// Clear all sessions
|
|
318
|
-
saveSessions([]);
|
|
319
|
-
}
|
|
320
|
-
// ============ Session Status ============
|
|
321
|
-
export async function getSessionStatus(sessionName) {
|
|
322
|
-
const result = await runAgentBrowserCommand(sessionName, ['status']);
|
|
323
|
-
if (result.code !== 0) {
|
|
324
|
-
return 'unknown';
|
|
325
|
-
}
|
|
326
|
-
const output = result.stdout.toLowerCase();
|
|
327
|
-
if (output.includes('running') || output.includes('active')) {
|
|
328
|
-
return 'running';
|
|
228
|
+
const profiles = browserGetProfiles();
|
|
229
|
+
for await (const profile of profiles) {
|
|
230
|
+
await runAgentBrowserCommand(profile, ['close']);
|
|
329
231
|
}
|
|
330
|
-
return 'stopped';
|
|
331
232
|
}
|
|
332
233
|
//# sourceMappingURL=agent-browser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-browser.js","sourceRoot":"","sources":["../../src/utils/agent-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"agent-browser.js","sourceRoot":"","sources":["../../src/utils/agent-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface CommandResult {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
code: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function clearBinaryPathCache(): void;
|
|
7
|
+
export declare function isBrowserUseInstalled(): Promise<boolean>;
|
|
8
|
+
/**
|
|
9
|
+
* Install browser-use using the official installer
|
|
10
|
+
*/
|
|
11
|
+
export declare function installBrowserUse(): Promise<CommandResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Run browser-use doctor to validate installation
|
|
14
|
+
*/
|
|
15
|
+
export declare function runBrowserUseDoctor(): Promise<CommandResult>;
|
|
16
|
+
export interface SessionInfo {
|
|
17
|
+
name: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* List all available sessions using browser-use sessions command
|
|
22
|
+
*/
|
|
23
|
+
export declare function listSessions(): Promise<string[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a session exists
|
|
26
|
+
*/
|
|
27
|
+
export declare function sessionExists(name: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Open a browser with URL using the specified session
|
|
30
|
+
*/
|
|
31
|
+
export declare function browserOpen(url: string, sessionName?: string, headed?: boolean): Promise<CommandResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Close a browser for the specified session
|
|
34
|
+
*/
|
|
35
|
+
export declare function browserClose(sessionName: string): Promise<CommandResult>;
|
|
36
|
+
/**
|
|
37
|
+
* Close all browser sessions
|
|
38
|
+
*/
|
|
39
|
+
export declare function browserCloseAll(): Promise<CommandResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Check if a command is blocked
|
|
42
|
+
*/
|
|
43
|
+
export declare function isBlockedCommand(command: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Execute a generic browser command on a session
|
|
46
|
+
* Blocks: open, close, cookies, storage, network, download, run, session, task, tunnel
|
|
47
|
+
*/
|
|
48
|
+
export declare function browserCommand(sessionName: string, command: string, args?: string[]): Promise<CommandResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Get all available sessions
|
|
51
|
+
*/
|
|
52
|
+
export declare function browserGetSessions(): Promise<string[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Get server status
|
|
55
|
+
*/
|
|
56
|
+
export declare function getServerStatus(): Promise<CommandResult>;
|
|
57
|
+
//# sourceMappingURL=browser-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use.d.ts","sourceRoot":"","sources":["../../src/utils/browser-use.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACb;AAgCD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAahE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAElE;AAsFD,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBtD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlE;AAID;;GAEG;AACH,wBAAsB,WAAW,CAChC,GAAG,EAAE,MAAM,EACX,WAAW,GAAE,MAAkB,EAC/B,MAAM,GAAE,OAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CAGxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CACjC,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAExB;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,GACjB,OAAO,CAAC,aAAa,CAAC,CAaxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5D;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC,CAE9D"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { spawn, execSync } from 'node:child_process';
|
|
2
|
+
// Constants
|
|
3
|
+
const BINARY_NAME = 'browser-use';
|
|
4
|
+
// Blocked commands that cannot be run via browser_command
|
|
5
|
+
// Updated for browser-use CLI
|
|
6
|
+
const BLOCKED_COMMANDS = [
|
|
7
|
+
'open',
|
|
8
|
+
'close',
|
|
9
|
+
'cookies',
|
|
10
|
+
'storage',
|
|
11
|
+
'network',
|
|
12
|
+
'download',
|
|
13
|
+
'run', // agent tasks
|
|
14
|
+
'session', // session management
|
|
15
|
+
'task', // task commands
|
|
16
|
+
'tunnel', // tunneling
|
|
17
|
+
];
|
|
18
|
+
// ============ Installation ============
|
|
19
|
+
/**
|
|
20
|
+
* Get the browser-use binary path (cross-platform)
|
|
21
|
+
*/
|
|
22
|
+
function getBrowserUsePath() {
|
|
23
|
+
try {
|
|
24
|
+
const command = process.platform === 'win32'
|
|
25
|
+
? `where ${BINARY_NAME}`
|
|
26
|
+
: `which ${BINARY_NAME}`;
|
|
27
|
+
const result = execSync(command, { stdio: 'pipe', encoding: 'utf-8' });
|
|
28
|
+
const path = result.trim().split('\n')[0]; // Take first result on Windows (where can return multiple)
|
|
29
|
+
return path || null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Cache the binary path
|
|
36
|
+
let cachedBinaryPath;
|
|
37
|
+
function getBinaryPath() {
|
|
38
|
+
if (cachedBinaryPath === undefined) {
|
|
39
|
+
cachedBinaryPath = getBrowserUsePath();
|
|
40
|
+
}
|
|
41
|
+
return cachedBinaryPath;
|
|
42
|
+
}
|
|
43
|
+
// Clear cache (useful after installation)
|
|
44
|
+
export function clearBinaryPathCache() {
|
|
45
|
+
cachedBinaryPath = undefined;
|
|
46
|
+
}
|
|
47
|
+
export async function isBrowserUseInstalled() {
|
|
48
|
+
return getBinaryPath() !== null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Install browser-use using the official installer
|
|
52
|
+
*/
|
|
53
|
+
export async function installBrowserUse() {
|
|
54
|
+
const isWindows = process.platform === 'win32';
|
|
55
|
+
// Use the official browser-use installer
|
|
56
|
+
const installCommand = isWindows
|
|
57
|
+
? 'powershell -Command "& {iwr -useb https://browser-use.com/cli/install.ps1 | iex}"'
|
|
58
|
+
: 'curl -fsSL https://browser-use.com/cli/install.sh | bash -s -- --full # All modes';
|
|
59
|
+
const result = await runShellCommand(installCommand);
|
|
60
|
+
// Clear cache so next check finds the newly installed binary
|
|
61
|
+
clearBinaryPathCache();
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Run browser-use doctor to validate installation
|
|
66
|
+
*/
|
|
67
|
+
export async function runBrowserUseDoctor() {
|
|
68
|
+
return runBrowserUseRawCommand(['doctor']);
|
|
69
|
+
}
|
|
70
|
+
function runShellCommand(command) {
|
|
71
|
+
return new Promise(resolve => {
|
|
72
|
+
const proc = spawn(command, [], {
|
|
73
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
74
|
+
shell: true,
|
|
75
|
+
});
|
|
76
|
+
let stdout = '';
|
|
77
|
+
let stderr = '';
|
|
78
|
+
proc.stdout?.on('data', data => {
|
|
79
|
+
stdout += data.toString();
|
|
80
|
+
});
|
|
81
|
+
proc.stderr?.on('data', data => {
|
|
82
|
+
stderr += data.toString();
|
|
83
|
+
});
|
|
84
|
+
proc.on('close', code => {
|
|
85
|
+
resolve({ stdout, stderr, code: code ?? 0 });
|
|
86
|
+
});
|
|
87
|
+
proc.on('error', err => {
|
|
88
|
+
resolve({ stdout, stderr: err.message, code: 1 });
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// ============ Core Browser Command Runner ============
|
|
93
|
+
/**
|
|
94
|
+
* Run a raw browser-use command without session
|
|
95
|
+
*/
|
|
96
|
+
async function runBrowserUseRawCommand(args) {
|
|
97
|
+
const binaryPath = getBinaryPath();
|
|
98
|
+
if (!binaryPath) {
|
|
99
|
+
return {
|
|
100
|
+
stdout: '',
|
|
101
|
+
stderr: 'browser-use not found. Run: corebrain browser install',
|
|
102
|
+
code: 1,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return new Promise(resolve => {
|
|
106
|
+
const proc = spawn(binaryPath, args, {
|
|
107
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
108
|
+
});
|
|
109
|
+
let stdout = '';
|
|
110
|
+
let stderr = '';
|
|
111
|
+
proc.stdout?.on('data', data => {
|
|
112
|
+
stdout += data.toString();
|
|
113
|
+
});
|
|
114
|
+
proc.stderr?.on('data', data => {
|
|
115
|
+
stderr += data.toString();
|
|
116
|
+
});
|
|
117
|
+
proc.on('close', code => {
|
|
118
|
+
resolve({ stdout, stderr, code: code ?? 0 });
|
|
119
|
+
});
|
|
120
|
+
proc.on('error', err => {
|
|
121
|
+
resolve({ stdout, stderr: err.message, code: 1 });
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Run a browser-use command with session
|
|
127
|
+
* browser-use --session <name> <command> <args>
|
|
128
|
+
*/
|
|
129
|
+
async function runBrowserUseCommand(sessionName, args) {
|
|
130
|
+
// Use --session for persistent session state
|
|
131
|
+
const fullArgs = ['--session', sessionName, ...args];
|
|
132
|
+
return runBrowserUseRawCommand(fullArgs);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* List all available sessions using browser-use sessions command
|
|
136
|
+
*/
|
|
137
|
+
export async function listSessions() {
|
|
138
|
+
const result = await runBrowserUseRawCommand(['sessions']);
|
|
139
|
+
if (result.code !== 0) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
// Parse output - each line is a session name
|
|
143
|
+
// browser-use sessions outputs one session per line
|
|
144
|
+
const sessions = result.stdout
|
|
145
|
+
.trim()
|
|
146
|
+
.split('\n')
|
|
147
|
+
.map(line => line.trim())
|
|
148
|
+
.filter(line => line.length > 0 && !line.startsWith('No '));
|
|
149
|
+
return sessions;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if a session exists
|
|
153
|
+
*/
|
|
154
|
+
export async function sessionExists(name) {
|
|
155
|
+
const sessions = await listSessions();
|
|
156
|
+
return sessions.includes(name);
|
|
157
|
+
}
|
|
158
|
+
// ============ Browser Operations ============
|
|
159
|
+
/**
|
|
160
|
+
* Open a browser with URL using the specified session
|
|
161
|
+
*/
|
|
162
|
+
export async function browserOpen(url, sessionName = 'default', headed = false) {
|
|
163
|
+
const args = headed ? ['--headed', 'open', url] : ['open', url];
|
|
164
|
+
return runBrowserUseCommand(sessionName, args);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Close a browser for the specified session
|
|
168
|
+
*/
|
|
169
|
+
export async function browserClose(sessionName) {
|
|
170
|
+
return runBrowserUseCommand(sessionName, ['close']);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Close all browser sessions
|
|
174
|
+
*/
|
|
175
|
+
export async function browserCloseAll() {
|
|
176
|
+
return runBrowserUseRawCommand(['close', '--all']);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check if a command is blocked
|
|
180
|
+
*/
|
|
181
|
+
export function isBlockedCommand(command) {
|
|
182
|
+
const cmd = command.toLowerCase().trim();
|
|
183
|
+
return BLOCKED_COMMANDS.includes(cmd);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Execute a generic browser command on a session
|
|
187
|
+
* Blocks: open, close, cookies, storage, network, download, run, session, task, tunnel
|
|
188
|
+
*/
|
|
189
|
+
export async function browserCommand(sessionName, command, args = []) {
|
|
190
|
+
// Check if command is blocked
|
|
191
|
+
if (isBlockedCommand(command)) {
|
|
192
|
+
return {
|
|
193
|
+
stdout: '',
|
|
194
|
+
stderr: `Command "${command}" is blocked. Blocked commands: ${BLOCKED_COMMANDS.join(', ')}`,
|
|
195
|
+
code: 1,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return runBrowserUseCommand(sessionName, [command, ...args]);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get all available sessions
|
|
202
|
+
*/
|
|
203
|
+
export async function browserGetSessions() {
|
|
204
|
+
return listSessions();
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get server status
|
|
208
|
+
*/
|
|
209
|
+
export async function getServerStatus() {
|
|
210
|
+
return runBrowserUseRawCommand(['server', 'status']);
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=browser-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-use.js","sourceRoot":"","sources":["../../src/utils/browser-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,15 +19,13 @@ export declare function buildResumeArgs(config: CliBackendConfig, params: {
|
|
|
19
19
|
prompt: string;
|
|
20
20
|
sessionId: string;
|
|
21
21
|
}): string[];
|
|
22
|
-
export type Logger = (message: string) => void;
|
|
23
22
|
/**
|
|
24
23
|
* Start an agent process in the background (detached)
|
|
25
24
|
* Returns immediately, CLI can exit while process continues
|
|
26
25
|
* Output is written by the agent to its own session files (e.g., Claude Code writes to ~/.claude/projects/)
|
|
27
26
|
*/
|
|
28
|
-
export declare function startAgentProcess(sessionId: string, config: CliBackendConfig, args: string[], workingDirectory: string
|
|
27
|
+
export declare function startAgentProcess(sessionId: string, config: CliBackendConfig, args: string[], workingDirectory: string): {
|
|
29
28
|
pid: number | undefined;
|
|
30
|
-
error?: string;
|
|
31
29
|
};
|
|
32
30
|
/**
|
|
33
31
|
* Check if a process is still running by session ID
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coding-runner.d.ts","sourceRoot":"","sources":["../../src/utils/coding-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAOrD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,GACC,MAAM,EAAE,CAoCV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB,GACC,MAAM,EAAE,CAYV;AAwBD
|
|
1
|
+
{"version":3,"file":"coding-runner.d.ts","sourceRoot":"","sources":["../../src/utils/coding-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,gBAAgB,CAAC;AAOrD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAOzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB,GACC,MAAM,EAAE,CAoCV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CAClB,GACC,MAAM,EAAE,CAYV;AAwBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EAAE,EACd,gBAAgB,EAAE,MAAM,GACtB;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAC,CAgC3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAM3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAetD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG;IAClD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAUP"}
|
|
@@ -82,59 +82,31 @@ function ensureLogsDir() {
|
|
|
82
82
|
* Returns immediately, CLI can exit while process continues
|
|
83
83
|
* Output is written by the agent to its own session files (e.g., Claude Code writes to ~/.claude/projects/)
|
|
84
84
|
*/
|
|
85
|
-
export function startAgentProcess(sessionId, config, args, workingDirectory
|
|
86
|
-
const log = logger || (() => { });
|
|
87
|
-
log(`SPAWN_START: sessionId=${sessionId}`);
|
|
88
|
-
log(`SPAWN_COMMAND: ${config.command}`);
|
|
89
|
-
log(`SPAWN_ARGS: ${JSON.stringify(args)}`);
|
|
90
|
-
log(`SPAWN_CWD: ${workingDirectory}`);
|
|
85
|
+
export function startAgentProcess(sessionId, config, args, workingDirectory) {
|
|
91
86
|
// Ensure logs directory exists
|
|
92
87
|
ensureLogsDir();
|
|
93
88
|
// Open log files for stdout/stderr (so we can see any errors from the process itself)
|
|
94
89
|
const stdoutPath = getSessionLogPath(sessionId, 'stdout');
|
|
95
90
|
const stderrPath = getSessionLogPath(sessionId, 'stderr');
|
|
96
|
-
log(`SPAWN_STDOUT_LOG: ${stdoutPath}`);
|
|
97
|
-
log(`SPAWN_STDERR_LOG: ${stderrPath}`);
|
|
98
91
|
const stdoutFd = openSync(stdoutPath, 'w');
|
|
99
92
|
const stderrFd = openSync(stderrPath, 'w');
|
|
100
93
|
// Spawn detached process
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
cwd: workingDirectory,
|
|
107
|
-
shell: false,
|
|
108
|
-
stdio: ['ignore', stdoutFd, stderrFd],
|
|
109
|
-
detached: true,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
catch (err) {
|
|
113
|
-
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
114
|
-
log(`SPAWN_ERROR: Failed to spawn process: ${errorMsg}`);
|
|
115
|
-
return { pid: undefined, error: errorMsg };
|
|
116
|
-
}
|
|
117
|
-
const pid = proc.pid;
|
|
118
|
-
log(`SPAWN_PID: ${pid}`);
|
|
119
|
-
// Handle spawn errors
|
|
120
|
-
proc.on('error', (err) => {
|
|
121
|
-
log(`SPAWN_PROCESS_ERROR: ${err.message}`);
|
|
122
|
-
});
|
|
123
|
-
// Log when process exits (useful for debugging quick failures)
|
|
124
|
-
proc.on('exit', (code, signal) => {
|
|
125
|
-
log(`SPAWN_EXIT: pid=${pid} code=${code} signal=${signal}`);
|
|
94
|
+
const proc = spawn(config.command, args, {
|
|
95
|
+
cwd: workingDirectory,
|
|
96
|
+
shell: true,
|
|
97
|
+
stdio: ['ignore', stdoutFd, stderrFd],
|
|
98
|
+
detached: true,
|
|
126
99
|
});
|
|
100
|
+
const pid = proc.pid;
|
|
127
101
|
// Store PID in session
|
|
128
102
|
const session = getSession(sessionId);
|
|
129
103
|
if (session && pid) {
|
|
130
104
|
session.pid = pid;
|
|
131
105
|
session.updatedAt = Date.now();
|
|
132
106
|
updateSession(session);
|
|
133
|
-
log(`SPAWN_SESSION_UPDATED: pid stored in session`);
|
|
134
107
|
}
|
|
135
108
|
// Unref so parent can exit
|
|
136
109
|
proc.unref();
|
|
137
|
-
log(`SPAWN_DETACHED: process detached and running`);
|
|
138
110
|
return { pid };
|
|
139
111
|
}
|
|
140
112
|
/**
|