@redplanethq/corebrain 2.1.0 → 2.2.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 +1 -1
- package/dist/commands/browser/close.d.ts.map +1 -1
- package/dist/commands/browser/close.js +39 -50
- 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 +46 -56
- package/dist/commands/browser/command.js.map +1 -1
- package/dist/commands/browser/create-profile.d.ts +1 -1
- package/dist/commands/browser/create-profile.d.ts.map +1 -1
- package/dist/commands/browser/create-profile.js +27 -21
- package/dist/commands/browser/create-profile.js.map +1 -1
- package/dist/commands/browser/delete-profile.d.ts +1 -1
- package/dist/commands/browser/delete-profile.d.ts.map +1 -1
- package/dist/commands/browser/delete-profile.js +26 -19
- package/dist/commands/browser/delete-profile.js.map +1 -1
- package/dist/commands/browser/install.d.ts +1 -1
- package/dist/commands/browser/install.d.ts.map +1 -1
- package/dist/commands/browser/install.js +31 -42
- package/dist/commands/browser/install.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 +40 -52
- package/dist/commands/browser/open.js.map +1 -1
- package/dist/commands/browser/status.d.ts +1 -1
- package/dist/commands/browser/status.d.ts.map +1 -1
- package/dist/commands/browser/status.js +36 -41
- package/dist/commands/browser/status.js.map +1 -1
- package/dist/commands/coding/config.d.ts +1 -1
- package/dist/commands/coding/config.d.ts.map +1 -1
- package/dist/commands/coding/config.js +95 -98
- package/dist/commands/coding/config.js.map +1 -1
- package/dist/commands/coding/remove.d.ts +1 -1
- package/dist/commands/coding/remove.d.ts.map +1 -1
- package/dist/commands/coding/remove.js +26 -28
- package/dist/commands/coding/remove.js.map +1 -1
- package/dist/commands/coding/setup.d.ts +1 -1
- package/dist/commands/coding/setup.d.ts.map +1 -1
- package/dist/commands/coding/setup.js +56 -71
- package/dist/commands/coding/setup.js.map +1 -1
- package/dist/commands/exec/config.d.ts +1 -1
- package/dist/commands/exec/config.d.ts.map +1 -1
- package/dist/commands/exec/config.js +71 -66
- package/dist/commands/exec/config.js.map +1 -1
- package/dist/commands/gateway/config.d.ts +10 -2
- package/dist/commands/gateway/config.d.ts.map +1 -1
- package/dist/commands/gateway/config.js +427 -156
- package/dist/commands/gateway/config.js.map +1 -1
- package/dist/commands/gateway/off.d.ts +1 -1
- package/dist/commands/gateway/off.d.ts.map +1 -1
- package/dist/commands/gateway/off.js +53 -63
- package/dist/commands/gateway/off.js.map +1 -1
- package/dist/commands/gateway/on.d.ts +1 -1
- package/dist/commands/gateway/on.d.ts.map +1 -1
- package/dist/commands/gateway/on.js +88 -117
- package/dist/commands/gateway/on.js.map +1 -1
- package/dist/commands/gateway/restart.d.ts +1 -1
- package/dist/commands/gateway/restart.d.ts.map +1 -1
- package/dist/commands/gateway/restart.js +49 -63
- package/dist/commands/gateway/restart.js.map +1 -1
- package/dist/commands/gateway/status.d.ts +1 -1
- package/dist/commands/gateway/status.d.ts.map +1 -1
- package/dist/commands/gateway/status.js +62 -76
- package/dist/commands/gateway/status.js.map +1 -1
- package/dist/commands/gateway/uninstall.d.ts +1 -1
- package/dist/commands/gateway/uninstall.d.ts.map +1 -1
- package/dist/commands/gateway/uninstall.js +60 -72
- package/dist/commands/gateway/uninstall.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +87 -107
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +24 -45
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/me.d.ts +1 -1
- package/dist/commands/me.d.ts.map +1 -1
- package/dist/commands/me.js +40 -50
- package/dist/commands/me.js.map +1 -1
- package/dist/commands/token.d.ts +1 -1
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/commands/token.js +19 -24
- package/dist/commands/token.js.map +1 -1
- package/dist/components/error-message.js +0 -1
- package/dist/components/error-message.js.map +1 -1
- package/dist/components/warning-message.js +0 -1
- package/dist/components/warning-message.js.map +1 -1
- package/dist/server/gateway-client.d.ts +4 -0
- package/dist/server/gateway-client.d.ts.map +1 -1
- package/dist/server/gateway-client.js +45 -6
- package/dist/server/gateway-client.js.map +1 -1
- package/dist/server/tools/exec-tools.d.ts.map +1 -1
- package/dist/server/tools/exec-tools.js +9 -0
- package/dist/server/tools/exec-tools.js.map +1 -1
- package/dist/types/config.d.ts +15 -0
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +6 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/commands/gateway/restart.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/commands/gateway/restart.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,6 @@ export declare const options: zod.ZodObject<{}, zod.core.$strip>;
|
|
|
3
3
|
type Props = {
|
|
4
4
|
options: zod.infer<typeof options>;
|
|
5
5
|
};
|
|
6
|
-
export default function GatewayStatus(_props: Props):
|
|
6
|
+
export default function GatewayStatus(_props: Props): null;
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAUtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA2EF,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,KAAK,QAclD"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useApp } from 'ink';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
4
5
|
import zod from 'zod';
|
|
5
6
|
import { getPreferences } from '../../config/preferences.js';
|
|
6
7
|
import { getServiceType, getServiceName, isServiceInstalled, getServiceStatus, getServicePid, } from '../../utils/service-manager/index.js';
|
|
7
|
-
import InfoMessage from '../../components/info-message.js';
|
|
8
|
-
import ErrorMessage from '../../components/error-message.js';
|
|
9
|
-
import { ThemeContext } from '../../hooks/useTheme.js';
|
|
10
|
-
import { themeContextValue } from '../../config/themes.js';
|
|
11
8
|
export const options = zod.object({});
|
|
12
9
|
function formatUptime(startedAt) {
|
|
13
10
|
const uptimeMs = Date.now() - startedAt;
|
|
@@ -23,76 +20,65 @@ function formatUptime(startedAt) {
|
|
|
23
20
|
return `${minutes}m ${seconds % 60}s`;
|
|
24
21
|
return `${seconds}s`;
|
|
25
22
|
}
|
|
23
|
+
function getServiceTypeLabel(type) {
|
|
24
|
+
if (type === 'launchd')
|
|
25
|
+
return 'launchd (macOS)';
|
|
26
|
+
if (type === 'systemd')
|
|
27
|
+
return 'systemd (Linux)';
|
|
28
|
+
return 'unknown';
|
|
29
|
+
}
|
|
30
|
+
async function runGatewayStatus() {
|
|
31
|
+
const spinner = p.spinner();
|
|
32
|
+
spinner.start('Checking gateway status...');
|
|
33
|
+
const serviceType = getServiceType();
|
|
34
|
+
if (serviceType === 'none') {
|
|
35
|
+
spinner.stop(chalk.red('Not supported'));
|
|
36
|
+
p.log.error('Service management not supported on this platform.');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const serviceName = getServiceName();
|
|
40
|
+
const installed = await isServiceInstalled(serviceName);
|
|
41
|
+
if (!installed) {
|
|
42
|
+
spinner.stop(chalk.yellow('Not installed'));
|
|
43
|
+
p.log.warning('Gateway not installed.');
|
|
44
|
+
p.log.info("Start with: corebrain gateway on");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const status = await getServiceStatus(serviceName);
|
|
48
|
+
const running = status === 'running';
|
|
49
|
+
if (!running) {
|
|
50
|
+
spinner.stop(chalk.yellow('Stopped'));
|
|
51
|
+
p.log.warning('Gateway installed but stopped.');
|
|
52
|
+
p.log.info("Start with: corebrain gateway on");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// Get PID from service manager, fallback to preferences
|
|
56
|
+
const prefs = getPreferences();
|
|
57
|
+
let pid = getServicePid(serviceName);
|
|
58
|
+
if (!pid && prefs.gateway?.pid) {
|
|
59
|
+
pid = prefs.gateway.pid;
|
|
60
|
+
}
|
|
61
|
+
spinner.stop(chalk.green('Running'));
|
|
62
|
+
p.note([
|
|
63
|
+
`${chalk.bold('Status:')} ${chalk.green('Running')}`,
|
|
64
|
+
`${chalk.bold('Service:')} ${getServiceTypeLabel(serviceType)}`,
|
|
65
|
+
`${chalk.bold('PID:')} ${pid || 'unknown'}`,
|
|
66
|
+
`${chalk.bold('Uptime:')} ${prefs.gateway?.startedAt ? formatUptime(prefs.gateway.startedAt) : 'unknown'}`,
|
|
67
|
+
'',
|
|
68
|
+
`${chalk.dim('Logs: ~/.corebrain/logs/gateway.log')}`,
|
|
69
|
+
].join('\n'), 'Gateway Status');
|
|
70
|
+
}
|
|
26
71
|
export default function GatewayStatus(_props) {
|
|
27
|
-
const
|
|
28
|
-
const [gatewayStatus, setGatewayStatus] = useState({
|
|
29
|
-
running: false,
|
|
30
|
-
installed: false,
|
|
31
|
-
});
|
|
72
|
+
const { exit } = useApp();
|
|
32
73
|
useEffect(() => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
const serviceName = getServiceName();
|
|
44
|
-
const installed = await isServiceInstalled(serviceName);
|
|
45
|
-
if (!installed) {
|
|
46
|
-
if (!cancelled) {
|
|
47
|
-
setGatewayStatus({ running: false, installed: false });
|
|
48
|
-
setStatus('ready');
|
|
49
|
-
}
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const serviceStatus = await getServiceStatus(serviceName);
|
|
53
|
-
const running = serviceStatus === 'running';
|
|
54
|
-
// Get PID from service manager, fallback to preferences
|
|
55
|
-
const prefs = getPreferences();
|
|
56
|
-
let pid = null;
|
|
57
|
-
if (running) {
|
|
58
|
-
pid = getServicePid(serviceName);
|
|
59
|
-
// Fallback to stored PID in preferences
|
|
60
|
-
if (!pid && prefs.gateway?.pid) {
|
|
61
|
-
pid = prefs.gateway.pid;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (!cancelled) {
|
|
65
|
-
setGatewayStatus({
|
|
66
|
-
running,
|
|
67
|
-
installed: true,
|
|
68
|
-
pid: pid || undefined,
|
|
69
|
-
startedAt: prefs.gateway?.startedAt,
|
|
70
|
-
uptime: prefs.gateway?.startedAt
|
|
71
|
-
? formatUptime(prefs.gateway.startedAt)
|
|
72
|
-
: undefined,
|
|
73
|
-
serviceType: serviceType === 'launchd' ? 'launchd' : 'systemd',
|
|
74
|
-
});
|
|
75
|
-
setStatus('ready');
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
if (!cancelled) {
|
|
80
|
-
setGatewayStatus({ running: false, installed: false });
|
|
81
|
-
setStatus('ready');
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
})();
|
|
85
|
-
return () => {
|
|
86
|
-
cancelled = true;
|
|
87
|
-
};
|
|
88
|
-
}, []);
|
|
89
|
-
const getServiceTypeLabel = () => {
|
|
90
|
-
if (gatewayStatus.serviceType === 'launchd')
|
|
91
|
-
return 'launchd (macOS)';
|
|
92
|
-
if (gatewayStatus.serviceType === 'systemd')
|
|
93
|
-
return 'systemd (Linux)';
|
|
94
|
-
return 'unknown';
|
|
95
|
-
};
|
|
96
|
-
return (_jsx(ThemeContext.Provider, { value: themeContextValue, children: status === 'loading' ? (_jsx(Text, { dimColor: true, children: "Checking gateway status..." })) : status === 'unsupported' ? (_jsx(ErrorMessage, { message: "Service management not supported on this platform." })) : !gatewayStatus.installed ? (_jsx(ErrorMessage, { message: `Gateway not installed.\n\nStart with: corebrain gateway on`, hideTitle: true })) : !gatewayStatus.running ? (_jsx(ErrorMessage, { message: `Gateway installed but stopped.\n\nStart with: corebrain gateway on`, hideTitle: true })) : (_jsx(InfoMessage, { message: `Gateway: Running\n\nService: ${getServiceTypeLabel()}\nPID: ${gatewayStatus.pid || 'unknown'}\nUptime: ${gatewayStatus.uptime || 'unknown'}\n\nLogs: ~/.corebrain/logs/gateway.log` })) }));
|
|
74
|
+
runGatewayStatus()
|
|
75
|
+
.catch((err) => {
|
|
76
|
+
p.log.error(err instanceof Error ? err.message : 'Unknown error');
|
|
77
|
+
})
|
|
78
|
+
.finally(() => {
|
|
79
|
+
setTimeout(() => exit(), 100);
|
|
80
|
+
});
|
|
81
|
+
}, [exit]);
|
|
82
|
+
return null;
|
|
97
83
|
}
|
|
98
84
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/gateway/status.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,6 @@ export declare const options: zod.ZodObject<{}, zod.core.$strip>;
|
|
|
3
3
|
type Props = {
|
|
4
4
|
options: zod.infer<typeof options>;
|
|
5
5
|
};
|
|
6
|
-
export default function GatewayUninstall(_props: Props):
|
|
6
|
+
export default function GatewayUninstall(_props: Props): null;
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAWtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AA8DF,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,MAAM,EAAE,KAAK,QAcrD"}
|
|
@@ -1,80 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useApp } from 'ink';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
4
5
|
import zod from 'zod';
|
|
5
6
|
import { getPreferences, updatePreferences } from '../../config/preferences.js';
|
|
6
7
|
import { getServiceType, getServiceName, uninstallService, isServiceInstalled, stopService, getServiceStatus, } from '../../utils/service-manager/index.js';
|
|
7
|
-
import SuccessMessage from '../../components/success-message.js';
|
|
8
|
-
import ErrorMessage from '../../components/error-message.js';
|
|
9
|
-
import { ThemeContext } from '../../hooks/useTheme.js';
|
|
10
|
-
import { themeContextValue } from '../../config/themes.js';
|
|
11
8
|
export const options = zod.object({});
|
|
9
|
+
async function runGatewayUninstall() {
|
|
10
|
+
const spinner = p.spinner();
|
|
11
|
+
const serviceType = getServiceType();
|
|
12
|
+
if (serviceType === 'none') {
|
|
13
|
+
p.log.error('Service management not supported on this platform.');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
spinner.start('Checking service...');
|
|
17
|
+
const serviceName = getServiceName();
|
|
18
|
+
const installed = await isServiceInstalled(serviceName);
|
|
19
|
+
if (!installed) {
|
|
20
|
+
// Clean up preferences if needed
|
|
21
|
+
const prefs = getPreferences();
|
|
22
|
+
if (prefs.gateway?.serviceInstalled) {
|
|
23
|
+
const { gateway, ...rest } = prefs;
|
|
24
|
+
updatePreferences(rest);
|
|
25
|
+
}
|
|
26
|
+
spinner.stop(chalk.yellow('Not installed'));
|
|
27
|
+
p.log.warning('Gateway is not installed');
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Stop if running
|
|
31
|
+
const serviceStatus = await getServiceStatus(serviceName);
|
|
32
|
+
if (serviceStatus === 'running') {
|
|
33
|
+
spinner.message('Stopping gateway...');
|
|
34
|
+
try {
|
|
35
|
+
await stopService(serviceName);
|
|
36
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Continue anyway
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Uninstall
|
|
43
|
+
spinner.message('Removing service...');
|
|
44
|
+
await uninstallService(serviceName);
|
|
45
|
+
// Clean up preferences
|
|
46
|
+
const prefs = getPreferences();
|
|
47
|
+
const { gateway, ...rest } = prefs;
|
|
48
|
+
updatePreferences(rest);
|
|
49
|
+
spinner.stop(chalk.green('Gateway service removed'));
|
|
50
|
+
p.note([
|
|
51
|
+
'The gateway will no longer auto-start.',
|
|
52
|
+
'To reinstall: corebrain gateway on',
|
|
53
|
+
].join('\n'), 'Gateway Uninstalled');
|
|
54
|
+
}
|
|
12
55
|
export default function GatewayUninstall(_props) {
|
|
13
|
-
const
|
|
14
|
-
const [error, setError] = useState('');
|
|
56
|
+
const { exit } = useApp();
|
|
15
57
|
useEffect(() => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
const serviceName = getServiceName();
|
|
27
|
-
const installed = await isServiceInstalled(serviceName);
|
|
28
|
-
if (!installed) {
|
|
29
|
-
// Clean up preferences if needed
|
|
30
|
-
const prefs = getPreferences();
|
|
31
|
-
if (prefs.gateway?.serviceInstalled) {
|
|
32
|
-
const { gateway, ...rest } = prefs;
|
|
33
|
-
updatePreferences(rest);
|
|
34
|
-
}
|
|
35
|
-
if (!cancelled) {
|
|
36
|
-
setStatus('not-installed');
|
|
37
|
-
}
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
// Stop if running
|
|
41
|
-
const serviceStatus = await getServiceStatus(serviceName);
|
|
42
|
-
if (serviceStatus === 'running') {
|
|
43
|
-
if (!cancelled) {
|
|
44
|
-
setStatus('stopping');
|
|
45
|
-
}
|
|
46
|
-
try {
|
|
47
|
-
await stopService(serviceName);
|
|
48
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
// Continue anyway
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Uninstall
|
|
55
|
-
if (!cancelled) {
|
|
56
|
-
setStatus('uninstalling');
|
|
57
|
-
}
|
|
58
|
-
await uninstallService(serviceName);
|
|
59
|
-
// Clean up preferences
|
|
60
|
-
const prefs = getPreferences();
|
|
61
|
-
const { gateway, ...rest } = prefs;
|
|
62
|
-
updatePreferences(rest);
|
|
63
|
-
if (!cancelled) {
|
|
64
|
-
setStatus('success');
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
if (!cancelled) {
|
|
69
|
-
setError(err instanceof Error ? err.message : 'Unknown error');
|
|
70
|
-
setStatus('error');
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
})();
|
|
74
|
-
return () => {
|
|
75
|
-
cancelled = true;
|
|
76
|
-
};
|
|
77
|
-
}, []);
|
|
78
|
-
return (_jsx(ThemeContext.Provider, { value: themeContextValue, children: status === 'checking' ? (_jsx(Text, { dimColor: true, children: "Checking service..." })) : status === 'stopping' ? (_jsx(Text, { dimColor: true, children: "Stopping gateway..." })) : status === 'uninstalling' ? (_jsx(Text, { dimColor: true, children: "Removing service..." })) : status === 'unsupported' ? (_jsx(ErrorMessage, { message: "Service management not supported on this platform." })) : status === 'not-installed' ? (_jsx(ErrorMessage, { message: "Gateway is not installed", hideTitle: true })) : status === 'success' ? (_jsx(SuccessMessage, { message: `Gateway service removed.\n\nThe gateway will no longer auto-start.\nTo reinstall: corebrain gateway on` })) : status === 'error' ? (_jsx(ErrorMessage, { message: `Failed to uninstall: ${error}` })) : null }));
|
|
58
|
+
runGatewayUninstall()
|
|
59
|
+
.catch((err) => {
|
|
60
|
+
p.log.error(`Failed to uninstall: ${err instanceof Error ? err.message : 'Unknown error'}`);
|
|
61
|
+
})
|
|
62
|
+
.finally(() => {
|
|
63
|
+
setTimeout(() => exit(), 100);
|
|
64
|
+
});
|
|
65
|
+
}, [exit]);
|
|
66
|
+
return null;
|
|
79
67
|
}
|
|
80
68
|
//# sourceMappingURL=uninstall.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/commands/gateway/uninstall.tsx"],"names":[],"mappings":"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"}
|
package/dist/commands/login.d.ts
CHANGED
|
@@ -3,6 +3,6 @@ export declare const options: zod.ZodObject<{}, zod.core.$strip>;
|
|
|
3
3
|
type Props = {
|
|
4
4
|
options: zod.infer<typeof options>;
|
|
5
5
|
};
|
|
6
|
-
export default function Login(_props: Props):
|
|
6
|
+
export default function Login(_props: Props): null;
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAwBtB,eAAO,MAAM,OAAO,oCAAiB,CAAC;AAEtC,KAAK,KAAK,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAC;CACnC,CAAC;AAoFF,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,KAAK,QAc1C"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useApp } from 'ink';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
4
5
|
import zod from 'zod';
|
|
5
6
|
import { exec } from 'node:child_process';
|
|
6
7
|
import { CoreClient } from '@redplanethq/sdk';
|
|
@@ -8,9 +9,6 @@ import { getConfig, updateConfig } from '../config/index.js';
|
|
|
8
9
|
const BASE_URL = 'https://app.getcore.me';
|
|
9
10
|
const POLL_INTERVAL_MS = 2000;
|
|
10
11
|
const POLL_TIMEOUT_MS = 300_000; // 5 minutes
|
|
11
|
-
/**
|
|
12
|
-
* Open URL in the default browser
|
|
13
|
-
*/
|
|
14
12
|
function openBrowser(url) {
|
|
15
13
|
const command = process.platform === 'darwin'
|
|
16
14
|
? `open "${url}"`
|
|
@@ -19,113 +17,95 @@ function openBrowser(url) {
|
|
|
19
17
|
: `xdg-open "${url}"`;
|
|
20
18
|
exec(command, (error) => {
|
|
21
19
|
if (error) {
|
|
22
|
-
// Silently fail - user can still copy the URL manually
|
|
23
20
|
console.error('Failed to open browser:', error.message);
|
|
24
21
|
}
|
|
25
22
|
});
|
|
26
23
|
}
|
|
27
24
|
export const options = zod.object({});
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
setError(err instanceof Error ? err.message : 'Failed to get authorization code');
|
|
66
|
-
setStatus('error');
|
|
67
|
-
}
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
if (!cancelled) {
|
|
71
|
-
setUrl(verifyUrl);
|
|
72
|
-
setStatus('polling');
|
|
73
|
-
// Automatically open the URL in browser
|
|
74
|
-
openBrowser(verifyUrl);
|
|
75
|
-
}
|
|
76
|
-
// Step 3: Poll for token
|
|
77
|
-
const startedAt = Date.now();
|
|
78
|
-
while (!cancelled) {
|
|
79
|
-
if (Date.now() - startedAt > POLL_TIMEOUT_MS) {
|
|
80
|
-
if (!cancelled) {
|
|
81
|
-
setError('Login timed out after 5 minutes. Please try again.');
|
|
82
|
-
setStatus('error');
|
|
83
|
-
}
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
87
|
-
if (cancelled)
|
|
88
|
-
break;
|
|
89
|
-
try {
|
|
90
|
-
const tokenRes = await client.exchangeToken({ authorizationCode: authCode });
|
|
91
|
-
if (tokenRes.token) {
|
|
92
|
-
const pat = tokenRes.token.token;
|
|
93
|
-
// Step 4: Persist token
|
|
94
|
-
updateConfig({
|
|
95
|
-
auth: {
|
|
96
|
-
url: BASE_URL,
|
|
97
|
-
apiKey: pat,
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
if (!cancelled)
|
|
101
|
-
setStatus('success');
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// Token endpoint returned an error — keep polling
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
})();
|
|
110
|
-
return () => {
|
|
111
|
-
cancelled = true;
|
|
25
|
+
async function runLogin() {
|
|
26
|
+
p.intro(chalk.bgCyan(chalk.black(' Login ')));
|
|
27
|
+
const spinner = p.spinner();
|
|
28
|
+
// Step 1: Check if already authenticated
|
|
29
|
+
spinner.start('Checking existing authentication...');
|
|
30
|
+
const config = getConfig();
|
|
31
|
+
if (config.auth?.apiKey) {
|
|
32
|
+
try {
|
|
33
|
+
const client = new CoreClient({
|
|
34
|
+
baseUrl: config.auth.url || BASE_URL,
|
|
35
|
+
token: config.auth.apiKey,
|
|
36
|
+
});
|
|
37
|
+
await client.checkAuth();
|
|
38
|
+
spinner.stop(chalk.green('Already authenticated'));
|
|
39
|
+
p.outro('Use a different command or clear your config to re-login.');
|
|
40
|
+
return { success: true };
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Token invalid or expired — proceed with login flow
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Step 2: Request authorization code
|
|
47
|
+
spinner.message('Requesting authorization code...');
|
|
48
|
+
const client = new CoreClient({ baseUrl: BASE_URL, token: '' });
|
|
49
|
+
let authCode = '';
|
|
50
|
+
let verifyUrl = '';
|
|
51
|
+
try {
|
|
52
|
+
const res = await client.getAuthorizationCode();
|
|
53
|
+
authCode = res.authorizationCode;
|
|
54
|
+
const base64Token = Buffer.from(JSON.stringify({ authorizationCode: authCode, source: 'core-cli', clientName: 'core-cli' })).toString('base64');
|
|
55
|
+
verifyUrl = `${BASE_URL}/agent/verify/${base64Token}?source=core-cli`;
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
spinner.stop(chalk.red('Failed to get authorization code'));
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: err instanceof Error ? err.message : 'Failed to get authorization code',
|
|
112
62
|
};
|
|
113
|
-
}, []);
|
|
114
|
-
switch (status) {
|
|
115
|
-
case 'checking':
|
|
116
|
-
return _jsx(Text, { dimColor: true, children: "Checking existing authentication..." });
|
|
117
|
-
case 'already-authenticated':
|
|
118
|
-
return (_jsx(Text, { color: "green", children: "Already authenticated. Use a different command or clear your config to re-login." }));
|
|
119
|
-
case 'fetching-code':
|
|
120
|
-
return _jsx(Text, { dimColor: true, children: "Requesting authorization code..." });
|
|
121
|
-
case 'polling':
|
|
122
|
-
return (_jsxs(_Fragment, { children: [_jsx(Text, { color: "green", children: "Opening browser to authorize... If it doesn't open automatically, visit:" }), _jsx(Text, { color: "cyan", children: url }), _jsx(Text, { dimColor: true, children: "Waiting for authorization..." })] }));
|
|
123
|
-
case 'success':
|
|
124
|
-
return (_jsx(Text, { color: "green", bold: true, children: "Successfully logged in. Token saved to config." }));
|
|
125
|
-
case 'error':
|
|
126
|
-
return _jsx(Text, { color: "red", children: error });
|
|
127
|
-
default:
|
|
128
|
-
return null;
|
|
129
63
|
}
|
|
64
|
+
spinner.stop(chalk.green('Authorization code received'));
|
|
65
|
+
// Open browser and show URL
|
|
66
|
+
p.log.info(`Opening browser to authorize...`);
|
|
67
|
+
p.log.message(chalk.cyan(verifyUrl));
|
|
68
|
+
openBrowser(verifyUrl);
|
|
69
|
+
// Step 3: Poll for token
|
|
70
|
+
spinner.start('Waiting for authorization...');
|
|
71
|
+
const startedAt = Date.now();
|
|
72
|
+
while (true) {
|
|
73
|
+
if (Date.now() - startedAt > POLL_TIMEOUT_MS) {
|
|
74
|
+
spinner.stop(chalk.red('Login timed out'));
|
|
75
|
+
return { success: false, error: 'Login timed out after 5 minutes. Please try again.' };
|
|
76
|
+
}
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
78
|
+
try {
|
|
79
|
+
const tokenRes = await client.exchangeToken({ authorizationCode: authCode });
|
|
80
|
+
if (tokenRes.token) {
|
|
81
|
+
const pat = tokenRes.token.token;
|
|
82
|
+
updateConfig({
|
|
83
|
+
auth: {
|
|
84
|
+
url: BASE_URL,
|
|
85
|
+
apiKey: pat,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
spinner.stop(chalk.green('Authorization successful'));
|
|
89
|
+
p.outro(chalk.green('Successfully logged in. Token saved to config.'));
|
|
90
|
+
return { success: true };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Token endpoint returned an error — keep polling
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export default function Login(_props) {
|
|
99
|
+
const { exit } = useApp();
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
runLogin()
|
|
102
|
+
.catch((err) => {
|
|
103
|
+
p.log.error(err instanceof Error ? err.message : 'Unknown error');
|
|
104
|
+
})
|
|
105
|
+
.finally(() => {
|
|
106
|
+
setTimeout(() => exit(), 100);
|
|
107
|
+
});
|
|
108
|
+
}, [exit]);
|
|
109
|
+
return null;
|
|
130
110
|
}
|
|
131
111
|
//# sourceMappingURL=login.js.map
|