crewly 1.4.60 → 1.4.61
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/cli/cli/src/commands/cloud.d.ts +94 -0
- package/dist/cli/cli/src/commands/cloud.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/cloud.js +323 -0
- package/dist/cli/cli/src/commands/cloud.js.map +1 -0
- package/dist/cli/cli/src/index.js +17 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Cloud Command Group
|
|
3
|
+
*
|
|
4
|
+
* Provides subcommands for managing CrewlyAI Cloud connection:
|
|
5
|
+
* crewly cloud login [--token <token>] — Authenticate with CrewlyAI Cloud
|
|
6
|
+
* crewly cloud status — Show current connection status
|
|
7
|
+
* crewly cloud logout — Disconnect from CrewlyAI Cloud
|
|
8
|
+
*
|
|
9
|
+
* The login flow supports two modes:
|
|
10
|
+
* 1. Direct token login via --token flag
|
|
11
|
+
* 2. Browser-based OAuth: starts a local HTTP callback server, opens the
|
|
12
|
+
* backend Google OAuth URL, receives the token via redirect, persists
|
|
13
|
+
* credentials to ~/.crewly/cloud/config.json, then calls POST /api/cloud/connect.
|
|
14
|
+
*
|
|
15
|
+
* @module cli/commands/cloud
|
|
16
|
+
*/
|
|
17
|
+
import http from 'http';
|
|
18
|
+
/** Options for the login subcommand */
|
|
19
|
+
interface LoginOptions {
|
|
20
|
+
token?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Shape of the credentials saved to config.json */
|
|
23
|
+
interface CloudCredentials {
|
|
24
|
+
token: string;
|
|
25
|
+
refreshToken?: string;
|
|
26
|
+
savedAt: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Save cloud credentials to ~/.crewly/cloud/config.json.
|
|
30
|
+
*
|
|
31
|
+
* Creates the directory hierarchy if it does not exist.
|
|
32
|
+
*
|
|
33
|
+
* @param token - JWT access token
|
|
34
|
+
* @param refreshToken - Optional refresh token
|
|
35
|
+
*/
|
|
36
|
+
export declare function saveCloudCredentials(token: string, refreshToken?: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Load cloud credentials from ~/.crewly/cloud/config.json.
|
|
39
|
+
*
|
|
40
|
+
* @returns The saved credentials, or null if the file does not exist or is invalid
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadCloudCredentials(): CloudCredentials | null;
|
|
43
|
+
/**
|
|
44
|
+
* Open a URL in the user's default browser.
|
|
45
|
+
*
|
|
46
|
+
* Uses `open` on macOS and `xdg-open` on Linux.
|
|
47
|
+
*
|
|
48
|
+
* @param url - The URL to open
|
|
49
|
+
*/
|
|
50
|
+
export declare function openBrowser(url: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Start a temporary HTTP server to receive the OAuth callback.
|
|
53
|
+
*
|
|
54
|
+
* The server listens on a random port and resolves with the token and
|
|
55
|
+
* refreshToken query parameters from the callback URL. It automatically
|
|
56
|
+
* shuts down after receiving the callback or after a 120-second timeout.
|
|
57
|
+
*
|
|
58
|
+
* @returns An object containing the server instance, the port, and a
|
|
59
|
+
* promise that resolves with the received credentials
|
|
60
|
+
*/
|
|
61
|
+
export declare function startCallbackServer(): {
|
|
62
|
+
server: http.Server;
|
|
63
|
+
port: Promise<number>;
|
|
64
|
+
credentials: Promise<{
|
|
65
|
+
token: string;
|
|
66
|
+
refreshToken?: string;
|
|
67
|
+
}>;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Handle the `crewly cloud login` subcommand.
|
|
71
|
+
*
|
|
72
|
+
* With `--token`: saves the token and calls POST /api/cloud/connect directly.
|
|
73
|
+
* Without `--token`: starts a local HTTP callback server, opens the browser
|
|
74
|
+
* to the backend OAuth URL, waits for the callback, saves credentials, and
|
|
75
|
+
* then calls POST /api/cloud/connect.
|
|
76
|
+
*
|
|
77
|
+
* @param options - Login command options (optional --token)
|
|
78
|
+
*/
|
|
79
|
+
export declare function loginCommand(options: LoginOptions): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Handle the `crewly cloud status` subcommand.
|
|
82
|
+
*
|
|
83
|
+
* Calls GET /api/cloud/status and displays the connection state,
|
|
84
|
+
* tier, cloud URL, and last sync time with color-coded output.
|
|
85
|
+
*/
|
|
86
|
+
export declare function statusCommand(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Handle the `crewly cloud logout` subcommand.
|
|
89
|
+
*
|
|
90
|
+
* Calls POST /api/cloud/disconnect to terminate the cloud session.
|
|
91
|
+
*/
|
|
92
|
+
export declare function logoutCommand(): Promise<void>;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,IAAI,MAAM,MAAM,CAAC;AAuCxB,uCAAuC;AACvC,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,oDAAoD;AACpD,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAU/E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,gBAAgB,GAAG,IAAI,CAU9D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAG7C;AAiCD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE,CAsDA;AAED;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsCvE;AAsCD;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCnD;AAMD;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBnD"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Cloud Command Group
|
|
3
|
+
*
|
|
4
|
+
* Provides subcommands for managing CrewlyAI Cloud connection:
|
|
5
|
+
* crewly cloud login [--token <token>] — Authenticate with CrewlyAI Cloud
|
|
6
|
+
* crewly cloud status — Show current connection status
|
|
7
|
+
* crewly cloud logout — Disconnect from CrewlyAI Cloud
|
|
8
|
+
*
|
|
9
|
+
* The login flow supports two modes:
|
|
10
|
+
* 1. Direct token login via --token flag
|
|
11
|
+
* 2. Browser-based OAuth: starts a local HTTP callback server, opens the
|
|
12
|
+
* backend Google OAuth URL, receives the token via redirect, persists
|
|
13
|
+
* credentials to ~/.crewly/cloud/config.json, then calls POST /api/cloud/connect.
|
|
14
|
+
*
|
|
15
|
+
* @module cli/commands/cloud
|
|
16
|
+
*/
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
import axios from 'axios';
|
|
19
|
+
import http from 'http';
|
|
20
|
+
import { exec } from 'child_process';
|
|
21
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
|
|
22
|
+
import { join } from 'path';
|
|
23
|
+
import { homedir, platform } from 'os';
|
|
24
|
+
import { DEFAULT_WEB_PORT } from '../constants.js';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Constants
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** Backend base URL */
|
|
29
|
+
const BACKEND_URL = `http://localhost:${DEFAULT_WEB_PORT}`;
|
|
30
|
+
/** Cloud connect endpoint */
|
|
31
|
+
const CLOUD_CONNECT_ENDPOINT = '/api/cloud/connect';
|
|
32
|
+
/** Cloud disconnect endpoint */
|
|
33
|
+
const CLOUD_DISCONNECT_ENDPOINT = '/api/cloud/disconnect';
|
|
34
|
+
/** Cloud status endpoint */
|
|
35
|
+
const CLOUD_STATUS_ENDPOINT = '/api/cloud/status';
|
|
36
|
+
/** Google OAuth start endpoint */
|
|
37
|
+
const GOOGLE_OAUTH_START_ENDPOINT = '/api/cloud/google/start';
|
|
38
|
+
/** Timeout for backend API requests (ms) */
|
|
39
|
+
const API_TIMEOUT_MS = 15_000;
|
|
40
|
+
/** Directory for cloud credentials */
|
|
41
|
+
const CLOUD_CONFIG_DIR = join(homedir(), '.crewly', 'cloud');
|
|
42
|
+
/** Path to cloud config file */
|
|
43
|
+
const CLOUD_CONFIG_FILE = join(CLOUD_CONFIG_DIR, 'config.json');
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Helpers
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/**
|
|
48
|
+
* Save cloud credentials to ~/.crewly/cloud/config.json.
|
|
49
|
+
*
|
|
50
|
+
* Creates the directory hierarchy if it does not exist.
|
|
51
|
+
*
|
|
52
|
+
* @param token - JWT access token
|
|
53
|
+
* @param refreshToken - Optional refresh token
|
|
54
|
+
*/
|
|
55
|
+
export function saveCloudCredentials(token, refreshToken) {
|
|
56
|
+
if (!existsSync(CLOUD_CONFIG_DIR)) {
|
|
57
|
+
mkdirSync(CLOUD_CONFIG_DIR, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
const credentials = {
|
|
60
|
+
token,
|
|
61
|
+
refreshToken,
|
|
62
|
+
savedAt: new Date().toISOString(),
|
|
63
|
+
};
|
|
64
|
+
writeFileSync(CLOUD_CONFIG_FILE, JSON.stringify(credentials, null, 2), 'utf-8');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Load cloud credentials from ~/.crewly/cloud/config.json.
|
|
68
|
+
*
|
|
69
|
+
* @returns The saved credentials, or null if the file does not exist or is invalid
|
|
70
|
+
*/
|
|
71
|
+
export function loadCloudCredentials() {
|
|
72
|
+
if (!existsSync(CLOUD_CONFIG_FILE)) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const raw = readFileSync(CLOUD_CONFIG_FILE, 'utf-8');
|
|
77
|
+
return JSON.parse(raw);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Open a URL in the user's default browser.
|
|
85
|
+
*
|
|
86
|
+
* Uses `open` on macOS and `xdg-open` on Linux.
|
|
87
|
+
*
|
|
88
|
+
* @param url - The URL to open
|
|
89
|
+
*/
|
|
90
|
+
export function openBrowser(url) {
|
|
91
|
+
const cmd = platform() === 'darwin' ? 'open' : 'xdg-open';
|
|
92
|
+
exec(`${cmd} "${url}"`);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Handle API errors with user-friendly output.
|
|
96
|
+
*
|
|
97
|
+
* Differentiates between network errors (backend not running) and
|
|
98
|
+
* server errors (backend returned an error status).
|
|
99
|
+
*
|
|
100
|
+
* @param error - The caught error
|
|
101
|
+
* @param action - Description of the failed action for the error message
|
|
102
|
+
*/
|
|
103
|
+
function handleApiError(error, action) {
|
|
104
|
+
if (axios.isAxiosError(error)) {
|
|
105
|
+
if (error.code === 'ECONNREFUSED') {
|
|
106
|
+
console.log(chalk.red(` ✗ Cannot ${action}: Crewly backend is not running.`));
|
|
107
|
+
console.log(chalk.gray(' Start with: crewly start'));
|
|
108
|
+
}
|
|
109
|
+
else if (error.response) {
|
|
110
|
+
const msg = error.response.data?.error || error.response.statusText || 'Server error';
|
|
111
|
+
console.log(chalk.red(` ✗ Failed to ${action}: ${msg}`));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(chalk.red(` ✗ Failed to ${action}: ${error.message}`));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
119
|
+
console.log(chalk.red(` ✗ Failed to ${action}: ${msg}`));
|
|
120
|
+
}
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Login subcommand
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
/**
|
|
127
|
+
* Start a temporary HTTP server to receive the OAuth callback.
|
|
128
|
+
*
|
|
129
|
+
* The server listens on a random port and resolves with the token and
|
|
130
|
+
* refreshToken query parameters from the callback URL. It automatically
|
|
131
|
+
* shuts down after receiving the callback or after a 120-second timeout.
|
|
132
|
+
*
|
|
133
|
+
* @returns An object containing the server instance, the port, and a
|
|
134
|
+
* promise that resolves with the received credentials
|
|
135
|
+
*/
|
|
136
|
+
export function startCallbackServer() {
|
|
137
|
+
let resolvePort;
|
|
138
|
+
let resolveCreds;
|
|
139
|
+
let rejectCreds;
|
|
140
|
+
const portPromise = new Promise((resolve) => {
|
|
141
|
+
resolvePort = resolve;
|
|
142
|
+
});
|
|
143
|
+
const credsPromise = new Promise((resolve, reject) => {
|
|
144
|
+
resolveCreds = resolve;
|
|
145
|
+
rejectCreds = reject;
|
|
146
|
+
});
|
|
147
|
+
const server = http.createServer((req, res) => {
|
|
148
|
+
const url = new URL(req.url || '/', `http://localhost`);
|
|
149
|
+
if (url.pathname === '/callback') {
|
|
150
|
+
const token = url.searchParams.get('token');
|
|
151
|
+
const refreshToken = url.searchParams.get('refreshToken') || undefined;
|
|
152
|
+
if (token) {
|
|
153
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
154
|
+
res.end('<html><body><h2>Login successful!</h2><p>You can close this tab.</p></body></html>');
|
|
155
|
+
resolveCreds({ token, refreshToken });
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
159
|
+
res.end('<html><body><h2>Login failed</h2><p>No token received.</p></body></html>');
|
|
160
|
+
rejectCreds(new Error('No token received in callback'));
|
|
161
|
+
}
|
|
162
|
+
// Shut down server after response
|
|
163
|
+
setTimeout(() => server.close(), 500);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
res.writeHead(404);
|
|
167
|
+
res.end('Not found');
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
server.listen(0, () => {
|
|
171
|
+
const addr = server.address();
|
|
172
|
+
const port = typeof addr === 'object' && addr ? addr.port : 0;
|
|
173
|
+
resolvePort(port);
|
|
174
|
+
});
|
|
175
|
+
// Timeout after 120 seconds
|
|
176
|
+
const timeout = setTimeout(() => {
|
|
177
|
+
server.close();
|
|
178
|
+
rejectCreds(new Error('Login timed out — no callback received within 120 seconds'));
|
|
179
|
+
}, 120_000);
|
|
180
|
+
// Clean up timeout when credentials resolve
|
|
181
|
+
credsPromise.then(() => clearTimeout(timeout)).catch(() => clearTimeout(timeout));
|
|
182
|
+
return { server, port: portPromise, credentials: credsPromise };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Handle the `crewly cloud login` subcommand.
|
|
186
|
+
*
|
|
187
|
+
* With `--token`: saves the token and calls POST /api/cloud/connect directly.
|
|
188
|
+
* Without `--token`: starts a local HTTP callback server, opens the browser
|
|
189
|
+
* to the backend OAuth URL, waits for the callback, saves credentials, and
|
|
190
|
+
* then calls POST /api/cloud/connect.
|
|
191
|
+
*
|
|
192
|
+
* @param options - Login command options (optional --token)
|
|
193
|
+
*/
|
|
194
|
+
export async function loginCommand(options) {
|
|
195
|
+
if (options.token) {
|
|
196
|
+
// Direct token login
|
|
197
|
+
console.log(chalk.blue('Logging in with provided token...'));
|
|
198
|
+
await connectWithToken(options.token);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Browser-based OAuth flow
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log(chalk.blue('CrewlyAI Cloud Login'));
|
|
204
|
+
console.log(chalk.gray('─'.repeat(40)));
|
|
205
|
+
console.log('');
|
|
206
|
+
console.log(chalk.white('Opening browser for Google OAuth...'));
|
|
207
|
+
const { server, port: portPromise, credentials } = startCallbackServer();
|
|
208
|
+
try {
|
|
209
|
+
const port = await portPromise;
|
|
210
|
+
const redirectUrl = `http://localhost:${port}/callback`;
|
|
211
|
+
const oauthUrl = `${BACKEND_URL}${GOOGLE_OAUTH_START_ENDPOINT}?redirect=${encodeURIComponent(redirectUrl)}`;
|
|
212
|
+
openBrowser(oauthUrl);
|
|
213
|
+
console.log(chalk.gray(` Callback server listening on port ${port}`));
|
|
214
|
+
console.log(chalk.gray(' Waiting for OAuth callback...'));
|
|
215
|
+
console.log('');
|
|
216
|
+
const creds = await credentials;
|
|
217
|
+
saveCloudCredentials(creds.token, creds.refreshToken);
|
|
218
|
+
console.log(chalk.green(' ✓ Credentials saved'));
|
|
219
|
+
await connectWithToken(creds.token, creds.refreshToken);
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
server.close();
|
|
223
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
224
|
+
console.log(chalk.red(` ✗ Login failed: ${msg}`));
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Connect to CrewlyAI Cloud by calling POST /api/cloud/connect.
|
|
230
|
+
*
|
|
231
|
+
* On success, displays the connection tier info.
|
|
232
|
+
*
|
|
233
|
+
* @param token - JWT access token
|
|
234
|
+
* @param refreshToken - Optional refresh token
|
|
235
|
+
*/
|
|
236
|
+
async function connectWithToken(token, refreshToken) {
|
|
237
|
+
try {
|
|
238
|
+
const response = await axios.post(`${BACKEND_URL}${CLOUD_CONNECT_ENDPOINT}`, { token, refreshToken }, { timeout: API_TIMEOUT_MS });
|
|
239
|
+
if (response.data?.success) {
|
|
240
|
+
console.log(chalk.green(' ✓ Connected to CrewlyAI Cloud'));
|
|
241
|
+
const tier = response.data.data?.tier || response.data.tier || 'unknown';
|
|
242
|
+
console.log(chalk.green(` ✓ Tier: ${tier}`));
|
|
243
|
+
saveCloudCredentials(token, refreshToken);
|
|
244
|
+
console.log(chalk.green(' ✓ Credentials saved'));
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
const msg = response.data?.error || 'Unknown error';
|
|
248
|
+
console.log(chalk.red(` ✗ Failed to connect: ${msg}`));
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
handleApiError(error, 'login to CrewlyAI Cloud');
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// Status subcommand
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
/**
|
|
260
|
+
* Handle the `crewly cloud status` subcommand.
|
|
261
|
+
*
|
|
262
|
+
* Calls GET /api/cloud/status and displays the connection state,
|
|
263
|
+
* tier, cloud URL, and last sync time with color-coded output.
|
|
264
|
+
*/
|
|
265
|
+
export async function statusCommand() {
|
|
266
|
+
console.log(chalk.blue('Checking CrewlyAI Cloud status...'));
|
|
267
|
+
console.log('');
|
|
268
|
+
try {
|
|
269
|
+
const response = await axios.get(`${BACKEND_URL}${CLOUD_STATUS_ENDPOINT}`, { timeout: API_TIMEOUT_MS });
|
|
270
|
+
if (response.data?.success) {
|
|
271
|
+
const data = response.data.data || {};
|
|
272
|
+
const status = data.connectionStatus || 'unknown';
|
|
273
|
+
const tier = data.tier || 'none';
|
|
274
|
+
const cloudUrl = data.cloudUrl || 'N/A';
|
|
275
|
+
const lastSyncAt = data.lastSyncAt || 'never';
|
|
276
|
+
// Color-code the status
|
|
277
|
+
let statusDisplay;
|
|
278
|
+
if (status === 'connected') {
|
|
279
|
+
statusDisplay = chalk.green(status);
|
|
280
|
+
}
|
|
281
|
+
else if (status === 'token_expired') {
|
|
282
|
+
statusDisplay = chalk.yellow(status);
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
statusDisplay = chalk.red(status);
|
|
286
|
+
}
|
|
287
|
+
console.log(` Status: ${statusDisplay}`);
|
|
288
|
+
console.log(` Tier: ${chalk.white(tier)}`);
|
|
289
|
+
console.log(` Cloud URL: ${chalk.gray(cloudUrl)}`);
|
|
290
|
+
console.log(` Last sync: ${chalk.gray(lastSyncAt)}`);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
console.log(chalk.yellow(' Could not retrieve cloud status.'));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
handleApiError(error, 'check cloud status');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
// Logout subcommand
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
/**
|
|
304
|
+
* Handle the `crewly cloud logout` subcommand.
|
|
305
|
+
*
|
|
306
|
+
* Calls POST /api/cloud/disconnect to terminate the cloud session.
|
|
307
|
+
*/
|
|
308
|
+
export async function logoutCommand() {
|
|
309
|
+
console.log(chalk.blue('Disconnecting from CrewlyAI Cloud...'));
|
|
310
|
+
try {
|
|
311
|
+
const response = await axios.post(`${BACKEND_URL}${CLOUD_DISCONNECT_ENDPOINT}`, {}, { timeout: API_TIMEOUT_MS });
|
|
312
|
+
if (response.data?.success) {
|
|
313
|
+
console.log(chalk.green(' ✓ Disconnected from CrewlyAI Cloud'));
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
console.log(chalk.yellow(' No active cloud session to disconnect.'));
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
handleApiError(error, 'disconnect from CrewlyAI Cloud');
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../../../../cli/src/commands/cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ import { publishCommand } from './commands/publish.js';
|
|
|
14
14
|
import { seedMarketplaceCommand } from './commands/seed-marketplace.js';
|
|
15
15
|
import { serviceCommand } from './commands/service.js';
|
|
16
16
|
import { pairCommand } from './commands/pair.js';
|
|
17
|
+
import { loginCommand, statusCommand as cloudStatusCommand, logoutCommand } from './commands/cloud.js';
|
|
17
18
|
import { DEFAULT_WEB_PORT } from './constants.js';
|
|
18
19
|
import { getLocalVersion } from './utils/version-check.js';
|
|
19
20
|
const program = new Command();
|
|
@@ -114,6 +115,22 @@ program
|
|
|
114
115
|
.option('--disconnect', 'Disconnect from active relay session')
|
|
115
116
|
.option('--devices', 'List paired devices')
|
|
116
117
|
.action(pairCommand);
|
|
118
|
+
const cloudCmd = program
|
|
119
|
+
.command('cloud')
|
|
120
|
+
.description('Manage CrewlyAI Cloud connection (login, status, logout)');
|
|
121
|
+
cloudCmd
|
|
122
|
+
.command('login')
|
|
123
|
+
.description('Login to CrewlyAI Cloud via Google OAuth or direct token')
|
|
124
|
+
.option('--token <token>', 'Login with a token directly (skip browser OAuth)')
|
|
125
|
+
.action(loginCommand);
|
|
126
|
+
cloudCmd
|
|
127
|
+
.command('status')
|
|
128
|
+
.description('Show CrewlyAI Cloud connection status')
|
|
129
|
+
.action(cloudStatusCommand);
|
|
130
|
+
cloudCmd
|
|
131
|
+
.command('logout')
|
|
132
|
+
.description('Disconnect from CrewlyAI Cloud')
|
|
133
|
+
.action(logoutCommand);
|
|
117
134
|
// Error handling
|
|
118
135
|
program.exitOverride();
|
|
119
136
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli/src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,IAAI,UAAU,GAAG,OAAO,CAAC;AACzB,IAAI,CAAC;IACH,UAAU,GAAG,eAAe,EAAE,CAAC;AACjC,CAAC;AAAC,MAAM,CAAC;IACP,6DAA6D;AAC/D,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,6EAA6E,CAAC;KAC1F,OAAO,CAAC,UAAU,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC;KAC3E,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC;KAC3D,MAAM,CAAC,YAAY,EAAE,2DAA2D,CAAC;KACjF,MAAM,CAAC,gBAAgB,EAAE,qEAAqE,CAAC;KAC/F,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC/D,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,sCAAsC,CAAC;KACnD,MAAM,CAAC,SAAS,EAAE,sCAAsC,CAAC;KACzD,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC;KACxC,MAAM,CAAC,iBAAiB,EAAE,2CAA2C,CAAC;KACtE,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,OAAO,EAAE,0BAA0B,CAAC;KAC3C,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;KAC9D,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,KAAK,CAAC,SAAS,CAAC;KAChB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,WAAW,EAAE,sDAAsD,CAAC;KAC3E,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;KAC7E,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,WAAW,EAAE,sCAAsC,CAAC;KAC3D,MAAM,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;KAChE,MAAM,CAAC,UAAU,EAAE,gDAAgD,CAAC;KACpE,MAAM,CAAC,aAAa,EAAE,6DAA6D,CAAC;KACpF,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,2DAA2D,CAAC;KACxE,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;KACpD,MAAM,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;KAChE,MAAM,CAAC,sBAAsB,CAAC,CAAC;AAElC,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,+EAA+E,CAAC;KAC5F,MAAM,CAAC,SAAS,EAAE,iCAAiC,CAAC;KACpD,MAAM,CAAC,kBAAkB,EAAE,iDAAiD,CAAC;KAC7E,MAAM,CAAC,OAAO,EAAE,qCAAqC,CAAC;KACtD,MAAM,CAAC,sBAAsB,EAAE,2CAA2C,CAAC;KAC3E,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;KACtE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,SAAS,EAAE,6BAA6B,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC3D,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,CAAC;KAC3E,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;KAC9D,MAAM,CAAC,WAAW,EAAE,qBAAqB,CAAC;KAC1C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,iBAAiB;AACjB,OAAO,CAAC,YAAY,EAAE,CAAC;AAEvB,IAAI,CAAC;IACH,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../cli/src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "crewly",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.61",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
|
|
6
6
|
"main": "dist/cli/cli/src/index.js",
|