@redplanethq/corebrain 2.4.0 → 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 +2 -1
- package/dist/commands/browser/close.d.ts.map +1 -1
- package/dist/commands/browser/close.js +22 -15
- package/dist/commands/browser/close.js.map +1 -1
- package/dist/commands/browser/command.d.ts +1 -1
- 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.map +1 -1
- package/dist/commands/browser/open-head.js +28 -22
- package/dist/commands/browser/open-head.js.map +1 -1
- package/dist/commands/browser/open.d.ts +1 -1
- package/dist/commands/browser/open.d.ts.map +1 -1
- package/dist/commands/browser/open.js +17 -15
- 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 +16 -11
- package/dist/commands/browser/status.js.map +1 -1
- package/dist/commands/gateway/config.d.ts.map +1 -1
- package/dist/commands/gateway/config.js +18 -24
- package/dist/commands/gateway/config.js.map +1 -1
- package/dist/server/gateway-client.js +1 -1
- package/dist/server/gateway-client.js.map +1 -1
- package/dist/server/tools/browser-tools.d.ts +5 -4
- package/dist/server/tools/browser-tools.d.ts.map +1 -1
- package/dist/server/tools/browser-tools.js +79 -38
- package/dist/server/tools/browser-tools.js.map +1 -1
- package/dist/server/tools/coding-tools.d.ts.map +1 -1
- package/dist/server/tools/coding-tools.js +2 -2
- package/dist/server/tools/coding-tools.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/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import zod from 'zod';
|
|
2
2
|
export declare const options: zod.ZodObject<{
|
|
3
|
-
|
|
3
|
+
sessionName: zod.ZodOptional<zod.ZodString>;
|
|
4
|
+
all: zod.ZodDefault<zod.ZodOptional<zod.ZodBoolean>>;
|
|
4
5
|
}, zod.core.$strip>;
|
|
5
6
|
type Props = {
|
|
6
7
|
options: zod.infer<typeof options>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/close.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"close.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/close.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,OAAO;;;mBAGlB,CAAC;AAEH,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA0CF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,QActD"}
|
|
@@ -3,45 +3,52 @@ import { useApp } from 'ink';
|
|
|
3
3
|
import * as p from '@clack/prompts';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import zod from 'zod';
|
|
6
|
-
import {
|
|
6
|
+
import { isBrowserUseInstalled, browserClose, browserCloseAll } from '../../utils/browser-use.js';
|
|
7
7
|
export const options = zod.object({
|
|
8
|
-
|
|
8
|
+
sessionName: zod.string().optional().describe('Session name to close'),
|
|
9
|
+
all: zod.boolean().optional().default(false).describe('Close all sessions'),
|
|
9
10
|
});
|
|
10
|
-
async function runBrowserClose(
|
|
11
|
+
async function runBrowserClose(sessionName, closeAll) {
|
|
11
12
|
const spinner = p.spinner();
|
|
12
|
-
spinner.start('Checking
|
|
13
|
-
const installed = await
|
|
13
|
+
spinner.start('Checking browser-use...');
|
|
14
|
+
const installed = await isBrowserUseInstalled();
|
|
14
15
|
if (!installed) {
|
|
15
16
|
spinner.stop(chalk.red('Not installed'));
|
|
16
|
-
p.log.error('
|
|
17
|
+
p.log.error('browser-use is not installed. Run `corebrain browser install` first.');
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
if (closeAll) {
|
|
21
|
+
spinner.message('Closing all browser sessions...');
|
|
22
|
+
const result = await browserCloseAll();
|
|
23
|
+
if (result.code !== 0) {
|
|
24
|
+
spinner.stop(chalk.red('Failed to close all browsers'));
|
|
25
|
+
p.log.error(result.stderr || 'Failed to close all browsers');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
spinner.stop(chalk.green('Closed all browser sessions'));
|
|
23
29
|
return;
|
|
24
30
|
}
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
const session = sessionName || 'default';
|
|
32
|
+
spinner.message(`Closing browser for session "${session}"...`);
|
|
33
|
+
const result = await browserClose(session);
|
|
27
34
|
if (result.code !== 0) {
|
|
28
35
|
spinner.stop(chalk.red('Failed to close browser'));
|
|
29
36
|
p.log.error(result.stderr || 'Failed to close browser');
|
|
30
37
|
return;
|
|
31
38
|
}
|
|
32
|
-
spinner.stop(chalk.green(`Closed browser for
|
|
39
|
+
spinner.stop(chalk.green(`Closed browser for session "${session}"`));
|
|
33
40
|
}
|
|
34
41
|
export default function BrowserClose({ options }) {
|
|
35
42
|
const { exit } = useApp();
|
|
36
43
|
useEffect(() => {
|
|
37
|
-
runBrowserClose(options.
|
|
44
|
+
runBrowserClose(options.sessionName, options.all)
|
|
38
45
|
.catch((err) => {
|
|
39
46
|
p.log.error(`Failed to close browser: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
40
47
|
})
|
|
41
48
|
.finally(() => {
|
|
42
49
|
setTimeout(() => exit(), 100);
|
|
43
50
|
});
|
|
44
|
-
}, [options.
|
|
51
|
+
}, [options.sessionName, options.all, exit]);
|
|
45
52
|
return null;
|
|
46
53
|
}
|
|
47
54
|
//# sourceMappingURL=close.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/commands/browser/close.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"close.js","sourceRoot":"","sources":["../../../src/commands/browser/close.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import zod from 'zod';
|
|
2
2
|
export declare const args: zod.ZodTuple<[zod.ZodString], zod.ZodString>;
|
|
3
3
|
export declare const options: zod.ZodObject<{
|
|
4
|
-
|
|
4
|
+
sessionName: zod.ZodDefault<zod.ZodOptional<zod.ZodString>>;
|
|
5
5
|
}, zod.core.$strip>;
|
|
6
6
|
type Props = {
|
|
7
7
|
args: zod.infer<typeof args>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/command.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,IAAI,8CAEkC,CAAC;AAEpD,eAAO,MAAM,OAAO;;mBAElB,CAAC;AAEH,KAAK,KAAK,GAAG;IACZ,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/command.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,IAAI,8CAEkC,CAAC;AAEpD,eAAO,MAAM,OAAO;;mBAElB,CAAC;AAEH,KAAK,KAAK,GAAG;IACZ,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAmCF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,QAczF"}
|
|
@@ -3,20 +3,20 @@ import { useApp } from 'ink';
|
|
|
3
3
|
import * as p from '@clack/prompts';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import zod from 'zod';
|
|
6
|
-
import {
|
|
6
|
+
import { isBrowserUseInstalled, browserCommand, isBlockedCommand } from '../../utils/browser-use.js';
|
|
7
7
|
export const args = zod.tuple([
|
|
8
8
|
zod.string().describe('Command to run'),
|
|
9
9
|
]).rest(zod.string().describe('Command arguments'));
|
|
10
10
|
export const options = zod.object({
|
|
11
|
-
|
|
11
|
+
sessionName: zod.string().optional().default('default').describe('Session name to use (default: default)'),
|
|
12
12
|
});
|
|
13
|
-
async function runBrowserCommand(
|
|
13
|
+
async function runBrowserCommand(sessionName, command, commandArgs) {
|
|
14
14
|
const spinner = p.spinner();
|
|
15
|
-
spinner.start('Checking
|
|
16
|
-
const installed = await
|
|
15
|
+
spinner.start('Checking browser-use...');
|
|
16
|
+
const installed = await isBrowserUseInstalled();
|
|
17
17
|
if (!installed) {
|
|
18
18
|
spinner.stop(chalk.red('Not installed'));
|
|
19
|
-
p.log.error('
|
|
19
|
+
p.log.error('browser-use is not installed. Run `corebrain browser install` first.');
|
|
20
20
|
return;
|
|
21
21
|
}
|
|
22
22
|
// Check if command is blocked
|
|
@@ -25,14 +25,8 @@ async function runBrowserCommand(profile, command, commandArgs) {
|
|
|
25
25
|
p.log.error(`Command "${command}" is blocked. Use \`corebrain browser open\` or \`corebrain browser close\` for open/close operations.`);
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
spinner.stop(chalk.yellow('Profile not found'));
|
|
31
|
-
p.log.error(`Profile "${profile}" not found. Use \`corebrain browser open\` to create a profile first.`);
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
spinner.message(`Running: ${command} ${commandArgs.join(' ')} on profile "${profile}"`);
|
|
35
|
-
const result = await browserCommand(profile, command, commandArgs);
|
|
28
|
+
spinner.message(`Running: ${command} ${commandArgs.join(' ')} on session "${sessionName}"`);
|
|
29
|
+
const result = await browserCommand(sessionName, command, commandArgs);
|
|
36
30
|
spinner.stop(result.code === 0 ? chalk.green('Command completed') : chalk.yellow(`Exit code: ${result.code}`));
|
|
37
31
|
if (result.stdout) {
|
|
38
32
|
console.log(result.stdout);
|
|
@@ -44,14 +38,14 @@ async function runBrowserCommand(profile, command, commandArgs) {
|
|
|
44
38
|
export default function BrowserCommand({ args: [command, ...commandArgs], options }) {
|
|
45
39
|
const { exit } = useApp();
|
|
46
40
|
useEffect(() => {
|
|
47
|
-
runBrowserCommand(options.
|
|
41
|
+
runBrowserCommand(options.sessionName, command, commandArgs)
|
|
48
42
|
.catch((err) => {
|
|
49
43
|
p.log.error(err instanceof Error ? err.message : 'Unknown error');
|
|
50
44
|
})
|
|
51
45
|
.finally(() => {
|
|
52
46
|
setTimeout(() => exit(), 100);
|
|
53
47
|
});
|
|
54
|
-
}, [options.
|
|
48
|
+
}, [options.sessionName, command, commandArgs, exit]);
|
|
55
49
|
return null;
|
|
56
50
|
}
|
|
57
51
|
//# sourceMappingURL=command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/browser/command.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/commands/browser/command.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import zod from 'zod';
|
|
2
|
+
export declare const args: zod.ZodTuple<[zod.ZodString], null>;
|
|
3
|
+
export declare const options: zod.ZodObject<{}, zod.core.$strip>;
|
|
4
|
+
type Props = {
|
|
5
|
+
args: zod.infer<typeof args>;
|
|
6
|
+
options: zod.infer<typeof options>;
|
|
7
|
+
};
|
|
8
|
+
export default function BrowserDeleteSession({ args: [name] }: Props): null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=delete-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-session.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/delete-session.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,IAAI,qCAA+D,CAAC;AAEjF,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA4BF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,QAcnE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useApp } from 'ink';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import zod from 'zod';
|
|
6
|
+
import { browserClose, isBrowserUseInstalled } from '../../utils/browser-use.js';
|
|
7
|
+
export const args = zod.tuple([zod.string().describe('Session name to delete')]);
|
|
8
|
+
export const options = zod.object({});
|
|
9
|
+
async function runDeleteSession(name) {
|
|
10
|
+
const spinner = p.spinner();
|
|
11
|
+
spinner.start('Checking browser-use...');
|
|
12
|
+
const installed = await isBrowserUseInstalled();
|
|
13
|
+
if (!installed) {
|
|
14
|
+
spinner.stop(chalk.red('Not installed'));
|
|
15
|
+
p.log.error('browser-use is not installed. Run `corebrain browser install` first.');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
spinner.message(`Closing and removing session "${name}"...`);
|
|
19
|
+
// browser-use manages session cleanup when closing
|
|
20
|
+
const result = await browserClose(name);
|
|
21
|
+
if (result.code !== 0) {
|
|
22
|
+
spinner.stop(chalk.red('Failed to delete session'));
|
|
23
|
+
p.log.error(result.stderr || 'Failed to delete session');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
spinner.stop(chalk.green(`Session "${name}" deleted`));
|
|
27
|
+
}
|
|
28
|
+
export default function BrowserDeleteSession({ args: [name] }) {
|
|
29
|
+
const { exit } = useApp();
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
runDeleteSession(name)
|
|
32
|
+
.catch((err) => {
|
|
33
|
+
p.log.error(`Failed to delete session: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
34
|
+
})
|
|
35
|
+
.finally(() => {
|
|
36
|
+
setTimeout(() => exit(), 100);
|
|
37
|
+
});
|
|
38
|
+
}, [name, exit]);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=delete-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-session.js","sourceRoot":"","sources":["../../../src/commands/browser/delete-session.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAEjF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAOtC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO;IACR,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,iCAAiC,IAAI,MAAM,CAAC,CAAC;IAE7D,mDAAmD;IACnD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,0BAA0B,CAAC,CAAC;QACzD,OAAO;IACR,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAS;IACnE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,gBAAgB,CAAC,IAAI,CAAC;aACpB,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAClG,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEjB,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/install.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/install.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAOtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAgEF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,MAAM,EAAE,KAAK,QAkBnD"}
|
|
@@ -3,31 +3,63 @@ import { useApp } from 'ink';
|
|
|
3
3
|
import * as p from '@clack/prompts';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import zod from 'zod';
|
|
6
|
-
import {
|
|
6
|
+
import { isBrowserUseInstalled, installBrowserUse, runBrowserUseDoctor, } from '../../utils/browser-use.js';
|
|
7
7
|
export const options = zod.object({});
|
|
8
8
|
async function runBrowserInstall() {
|
|
9
9
|
const spinner = p.spinner();
|
|
10
|
-
spinner.start('Checking if
|
|
11
|
-
const installed = await
|
|
10
|
+
spinner.start('Checking if browser-use is installed...');
|
|
11
|
+
const installed = await isBrowserUseInstalled();
|
|
12
12
|
if (installed) {
|
|
13
|
-
spinner.stop(chalk.green('
|
|
13
|
+
spinner.stop(chalk.green('browser-use is already installed'));
|
|
14
|
+
// Run doctor to validate installation
|
|
15
|
+
const doctorSpinner = p.spinner();
|
|
16
|
+
doctorSpinner.start('Running browser-use doctor...');
|
|
17
|
+
const doctorResult = await runBrowserUseDoctor();
|
|
18
|
+
if (doctorResult.code === 0) {
|
|
19
|
+
doctorSpinner.stop(chalk.green('Installation validated'));
|
|
20
|
+
if (doctorResult.stdout) {
|
|
21
|
+
console.log(doctorResult.stdout);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
doctorSpinner.stop(chalk.yellow('Doctor reported issues'));
|
|
26
|
+
if (doctorResult.stdout) {
|
|
27
|
+
console.log(doctorResult.stdout);
|
|
28
|
+
}
|
|
29
|
+
if (doctorResult.stderr) {
|
|
30
|
+
console.error(chalk.red(doctorResult.stderr));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
14
33
|
return;
|
|
15
34
|
}
|
|
16
|
-
spinner.message('Installing
|
|
17
|
-
const result = await
|
|
35
|
+
spinner.message('Installing browser-use...');
|
|
36
|
+
const result = await installBrowserUse();
|
|
18
37
|
if (result.code !== 0) {
|
|
19
38
|
spinner.stop(chalk.red('Installation failed'));
|
|
20
39
|
p.log.error(result.stderr || 'Installation failed');
|
|
21
40
|
return;
|
|
22
41
|
}
|
|
23
|
-
spinner.stop(chalk.green('
|
|
42
|
+
spinner.stop(chalk.green('browser-use installed successfully'));
|
|
43
|
+
// Run doctor to validate
|
|
44
|
+
const doctorSpinner = p.spinner();
|
|
45
|
+
doctorSpinner.start('Validating installation with browser-use doctor...');
|
|
46
|
+
const doctorResult = await runBrowserUseDoctor();
|
|
47
|
+
if (doctorResult.code === 0) {
|
|
48
|
+
doctorSpinner.stop(chalk.green('Installation validated'));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
doctorSpinner.stop(chalk.yellow('Doctor reported issues - you may need to fix these manually'));
|
|
52
|
+
if (doctorResult.stdout) {
|
|
53
|
+
console.log(doctorResult.stdout);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
24
56
|
}
|
|
25
57
|
export default function BrowserInstall(_props) {
|
|
26
58
|
const { exit } = useApp();
|
|
27
59
|
useEffect(() => {
|
|
28
60
|
runBrowserInstall()
|
|
29
|
-
.catch(
|
|
30
|
-
p.log.error(`Failed to install
|
|
61
|
+
.catch(err => {
|
|
62
|
+
p.log.error(`Failed to install browser-use: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
31
63
|
})
|
|
32
64
|
.finally(() => {
|
|
33
65
|
setTimeout(() => exit(), 100);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/browser/install.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/commands/browser/install.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAChC,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAMtC,KAAK,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEhD,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAE9D,sCAAsC;QACtC,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAClC,aAAa,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAEjD,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAC1D,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;aAAM,CAAC;YACP,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAC3D,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;QACD,OAAO;IACR,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEzC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,qBAAqB,CAAC,CAAC;QACpD,OAAO;IACR,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAEhE,yBAAyB;IACzB,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,aAAa,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAEjD,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACP,aAAa,CAAC,IAAI,CACjB,KAAK,CAAC,MAAM,CACX,6DAA6D,CAC7D,CACD,CAAC;QACF,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,MAAa;IACnD,MAAM,EAAC,IAAI,EAAC,GAAG,MAAM,EAAE,CAAC;IAExB,SAAS,CAAC,GAAG,EAAE;QACd,iBAAiB,EAAE;aACjB,KAAK,CAAC,GAAG,CAAC,EAAE;YACZ,CAAC,CAAC,GAAG,CAAC,KAAK,CACV,kCACC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACtC,EAAE,CACF,CAAC;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import zod from 'zod';
|
|
2
|
+
export declare const options: zod.ZodObject<{}, zod.core.$strip>;
|
|
3
|
+
type Props = {
|
|
4
|
+
options: zod.infer<typeof options>;
|
|
5
|
+
};
|
|
6
|
+
export default function BrowserListSessions(_props: Props): null;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=list-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sessions.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/list-sessions.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAoCF,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAM,EAAE,KAAK,QAcxD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useApp } from 'ink';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import zod from 'zod';
|
|
6
|
+
import { browserGetSessions, isBrowserUseInstalled } from '../../utils/browser-use.js';
|
|
7
|
+
export const options = zod.object({});
|
|
8
|
+
async function runListSessions() {
|
|
9
|
+
const spinner = p.spinner();
|
|
10
|
+
spinner.start('Fetching sessions...');
|
|
11
|
+
const installed = await isBrowserUseInstalled();
|
|
12
|
+
if (!installed) {
|
|
13
|
+
spinner.stop(chalk.red('Not installed'));
|
|
14
|
+
p.log.error('browser-use is not installed. Run `corebrain browser install` first.');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const sessions = await browserGetSessions();
|
|
18
|
+
spinner.stop(chalk.green('Sessions retrieved'));
|
|
19
|
+
if (sessions.length === 0) {
|
|
20
|
+
p.log.info('No active sessions found.');
|
|
21
|
+
p.log.info('Run `corebrain browser open <url> --session-name <name>` to create a session.');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const lines = [
|
|
25
|
+
`${chalk.bold('Active Sessions:')} ${chalk.green(`${sessions.length} found`)}`,
|
|
26
|
+
'',
|
|
27
|
+
];
|
|
28
|
+
for (const session of sessions) {
|
|
29
|
+
lines.push(` ${chalk.dim('•')} ${chalk.cyan(session)}`);
|
|
30
|
+
}
|
|
31
|
+
p.note(lines.join('\n'), 'Browser Sessions');
|
|
32
|
+
}
|
|
33
|
+
export default function BrowserListSessions(_props) {
|
|
34
|
+
const { exit } = useApp();
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
runListSessions()
|
|
37
|
+
.catch((err) => {
|
|
38
|
+
p.log.error(err instanceof Error ? err.message : 'Unknown error');
|
|
39
|
+
})
|
|
40
|
+
.finally(() => {
|
|
41
|
+
setTimeout(() => exit(), 100);
|
|
42
|
+
});
|
|
43
|
+
}, [exit]);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=list-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-sessions.js","sourceRoot":"","sources":["../../../src/commands/browser/list-sessions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAMtC,KAAK,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAEtC,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE5C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAEhD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAC5F,OAAO;IACR,CAAC;IAED,MAAM,KAAK,GAAa;QACvB,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,EAAE;QAC9E,EAAE;KACF,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,MAAa;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACd,eAAe,EAAE;aACf,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACnE,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-head.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/open-head.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"open-head.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/open-head.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAStB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA+DF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,MAAM,EAAE,KAAK,QAgBpD"}
|
|
@@ -3,54 +3,60 @@ import { useApp } from 'ink';
|
|
|
3
3
|
import * as p from '@clack/prompts';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import zod from 'zod';
|
|
6
|
-
import {
|
|
6
|
+
import { isBrowserUseInstalled, browserOpen, browserGetSessions, } from '../../utils/browser-use.js';
|
|
7
7
|
const DEFAULT_URL = 'https://app.getcore.me';
|
|
8
8
|
export const options = zod.object({});
|
|
9
9
|
async function runOpenHead() {
|
|
10
10
|
const spinner = p.spinner();
|
|
11
|
-
spinner.start('Checking
|
|
12
|
-
const installed = await
|
|
11
|
+
spinner.start('Checking browser-use...');
|
|
12
|
+
const installed = await isBrowserUseInstalled();
|
|
13
13
|
if (!installed) {
|
|
14
14
|
spinner.stop(chalk.red('Not installed'));
|
|
15
|
-
p.log.error('
|
|
15
|
+
p.log.error('browser-use is not installed. Run `corebrain browser install` first.');
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
18
|
spinner.stop(chalk.green('Ready'));
|
|
19
|
-
// Get available
|
|
20
|
-
let
|
|
21
|
-
//
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
createProfile('personal');
|
|
25
|
-
profiles = ['personal'];
|
|
19
|
+
// Get available sessions
|
|
20
|
+
let sessions = await browserGetSessions();
|
|
21
|
+
// Add default session options if no sessions exist
|
|
22
|
+
if (sessions.length === 0) {
|
|
23
|
+
sessions = ['personal', 'work'];
|
|
26
24
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
else {
|
|
26
|
+
// Add common options if not already present
|
|
27
|
+
if (!sessions.includes('personal'))
|
|
28
|
+
sessions.push('personal');
|
|
29
|
+
if (!sessions.includes('work'))
|
|
30
|
+
sessions.push('work');
|
|
31
|
+
}
|
|
32
|
+
// Show session selector
|
|
33
|
+
const selectedSession = await p.select({
|
|
34
|
+
message: 'Select a session to use:',
|
|
35
|
+
options: sessions.map(session => ({
|
|
36
|
+
value: session,
|
|
37
|
+
label: session,
|
|
33
38
|
})),
|
|
34
39
|
});
|
|
35
|
-
if (p.isCancel(
|
|
40
|
+
if (p.isCancel(selectedSession)) {
|
|
36
41
|
p.log.info('Cancelled');
|
|
37
42
|
return;
|
|
38
43
|
}
|
|
39
44
|
const openSpinner = p.spinner();
|
|
40
|
-
openSpinner.start(`Opening ${DEFAULT_URL} with
|
|
41
|
-
|
|
45
|
+
openSpinner.start(`Opening ${DEFAULT_URL} with session "${selectedSession}" (headed)...`);
|
|
46
|
+
// Open in headed mode
|
|
47
|
+
const result = await browserOpen(DEFAULT_URL, selectedSession, true);
|
|
42
48
|
if (result.code !== 0) {
|
|
43
49
|
openSpinner.stop(chalk.red('Failed to open browser'));
|
|
44
50
|
p.log.error(result.stderr || 'Failed to open browser');
|
|
45
51
|
return;
|
|
46
52
|
}
|
|
47
|
-
openSpinner.stop(chalk.green(`Opened ${DEFAULT_URL} (
|
|
53
|
+
openSpinner.stop(chalk.green(`Opened ${DEFAULT_URL} (session: ${selectedSession}, headed)`));
|
|
48
54
|
}
|
|
49
55
|
export default function BrowserOpenHead(_props) {
|
|
50
56
|
const { exit } = useApp();
|
|
51
57
|
useEffect(() => {
|
|
52
58
|
runOpenHead()
|
|
53
|
-
.catch(
|
|
59
|
+
.catch(err => {
|
|
54
60
|
p.log.error(`Failed: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
55
61
|
})
|
|
56
62
|
.finally(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-head.js","sourceRoot":"","sources":["../../../src/commands/browser/open-head.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"open-head.js","sourceRoot":"","sources":["../../../src/commands/browser/open-head.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import zod from 'zod';
|
|
2
2
|
export declare const args: zod.ZodTuple<[zod.ZodString], null>;
|
|
3
3
|
export declare const options: zod.ZodObject<{
|
|
4
|
-
|
|
4
|
+
sessionName: zod.ZodDefault<zod.ZodOptional<zod.ZodString>>;
|
|
5
5
|
}, zod.core.$strip>;
|
|
6
6
|
type Props = {
|
|
7
7
|
args: zod.infer<typeof args>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/open.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/browser/open.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,eAAO,MAAM,IAAI,qCAAoD,CAAC;AAEtE,eAAO,MAAM,OAAO;;mBAMlB,CAAC;AAEH,KAAK,KAAK,GAAG;IACZ,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA6BF,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAC,EAAE,KAAK,QAkBhE"}
|
|
@@ -3,42 +3,44 @@ import { useApp } from 'ink';
|
|
|
3
3
|
import * as p from '@clack/prompts';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import zod from 'zod';
|
|
6
|
-
import {
|
|
7
|
-
export const args = zod.tuple([
|
|
8
|
-
zod.string().describe('URL to open'),
|
|
9
|
-
]);
|
|
6
|
+
import { isBrowserUseInstalled, browserOpen } from '../../utils/browser-use.js';
|
|
7
|
+
export const args = zod.tuple([zod.string().describe('URL to open')]);
|
|
10
8
|
export const options = zod.object({
|
|
11
|
-
|
|
9
|
+
sessionName: zod
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.default('default')
|
|
13
|
+
.describe('Session name for persistence (default: default)'),
|
|
12
14
|
});
|
|
13
|
-
async function runBrowserOpen(url,
|
|
15
|
+
async function runBrowserOpen(url, sessionName) {
|
|
14
16
|
const spinner = p.spinner();
|
|
15
|
-
spinner.start('Checking
|
|
16
|
-
const installed = await
|
|
17
|
+
spinner.start('Checking browser-use...');
|
|
18
|
+
const installed = await isBrowserUseInstalled();
|
|
17
19
|
if (!installed) {
|
|
18
20
|
spinner.stop(chalk.red('Not installed'));
|
|
19
|
-
p.log.error('
|
|
21
|
+
p.log.error('browser-use is not installed. Run `corebrain browser install` first.');
|
|
20
22
|
return;
|
|
21
23
|
}
|
|
22
|
-
spinner.message(`Opening ${url} with
|
|
23
|
-
const result = await browserOpen(url,
|
|
24
|
+
spinner.message(`Opening ${url} with session "${sessionName}"...`);
|
|
25
|
+
const result = await browserOpen(url, sessionName);
|
|
24
26
|
if (result.code !== 0) {
|
|
25
27
|
spinner.stop(chalk.red('Failed to open URL'));
|
|
26
28
|
p.log.error(result.stderr || 'Failed to open URL');
|
|
27
29
|
return;
|
|
28
30
|
}
|
|
29
|
-
spinner.stop(chalk.green(`Opened ${url} (
|
|
31
|
+
spinner.stop(chalk.green(`Opened ${url} (session: ${sessionName})`));
|
|
30
32
|
}
|
|
31
33
|
export default function BrowserOpen({ args: [url], options }) {
|
|
32
34
|
const { exit } = useApp();
|
|
33
35
|
useEffect(() => {
|
|
34
|
-
runBrowserOpen(url, options.
|
|
35
|
-
.catch(
|
|
36
|
+
runBrowserOpen(url, options.sessionName)
|
|
37
|
+
.catch(err => {
|
|
36
38
|
p.log.error(`Failed to open URL: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
37
39
|
})
|
|
38
40
|
.finally(() => {
|
|
39
41
|
setTimeout(() => exit(), 100);
|
|
40
42
|
});
|
|
41
|
-
}, [url, options.
|
|
43
|
+
}, [url, options.sessionName, exit]);
|
|
42
44
|
return null;
|
|
43
45
|
}
|
|
44
46
|
//# sourceMappingURL=open.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/browser/open.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/browser/open.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAChC,OAAO,EAAC,MAAM,EAAC,MAAM,KAAK,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,qBAAqB,EAAE,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAEvE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;IACjC,WAAW,EAAE,GAAG;SACd,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,SAAS,CAAC;SAClB,QAAQ,CAAC,iDAAiD,CAAC;CAC7D,CAAC,CAAC;AAOH,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,WAAmB;IAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,GAAG,CAAC,KAAK,CACV,sEAAsE,CACtE,CAAC;QACF,OAAO;IACR,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,kBAAkB,WAAW,MAAM,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEnD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,oBAAoB,CAAC,CAAC;QACnD,OAAO;IACR,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,cAAc,WAAW,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAQ;IAChE,MAAM,EAAC,IAAI,EAAC,GAAG,MAAM,EAAE,CAAC;IAExB,SAAS,CAAC,GAAG,EAAE;QACd,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC;aACtC,KAAK,CAAC,GAAG,CAAC,EAAE;YACZ,CAAC,CAAC,GAAG,CAAC,KAAK,CACV,uBACC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eACtC,EAAE,CACF,CAAC;QACH,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IAErC,OAAO,IAAI,CAAC;AACb,CAAC"}
|