@nestbox-ai/cli 1.0.24 → 1.0.26

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.
Files changed (41) hide show
  1. package/dist/commands/auth/index.d.ts +2 -0
  2. package/dist/commands/auth/index.js +9 -0
  3. package/dist/commands/auth/index.js.map +1 -0
  4. package/dist/commands/auth/login.d.ts +2 -0
  5. package/dist/commands/auth/login.js +186 -0
  6. package/dist/commands/auth/login.js.map +1 -0
  7. package/dist/commands/auth/logout.d.ts +2 -0
  8. package/dist/commands/auth/logout.js +111 -0
  9. package/dist/commands/auth/logout.js.map +1 -0
  10. package/dist/commands/auth.d.ts +4 -1
  11. package/dist/commands/auth.js +8 -270
  12. package/dist/commands/auth.js.map +1 -1
  13. package/dist/commands/compute/apiUtils.d.ts +11 -0
  14. package/dist/commands/compute/apiUtils.js +22 -0
  15. package/dist/commands/compute/apiUtils.js.map +1 -0
  16. package/dist/commands/compute/create.d.ts +2 -0
  17. package/dist/commands/compute/create.js +183 -0
  18. package/dist/commands/compute/create.js.map +1 -0
  19. package/dist/commands/compute/delete.d.ts +2 -0
  20. package/dist/commands/compute/delete.js +145 -0
  21. package/dist/commands/compute/delete.js.map +1 -0
  22. package/dist/commands/compute/index.d.ts +4 -0
  23. package/dist/commands/compute/index.js +14 -0
  24. package/dist/commands/compute/index.js.map +1 -0
  25. package/dist/commands/compute/list.d.ts +2 -0
  26. package/dist/commands/compute/list.js +128 -0
  27. package/dist/commands/compute/list.js.map +1 -0
  28. package/dist/commands/compute.d.ts +3 -0
  29. package/dist/commands/compute.js +10 -400
  30. package/dist/commands/compute.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/commands/auth/index.ts +3 -0
  33. package/src/commands/auth/login.ts +184 -0
  34. package/src/commands/auth/logout.ts +110 -0
  35. package/src/commands/auth.ts +9 -288
  36. package/src/commands/compute/apiUtils.ts +28 -0
  37. package/src/commands/compute/create.ts +195 -0
  38. package/src/commands/compute/delete.ts +147 -0
  39. package/src/commands/compute/index.ts +7 -0
  40. package/src/commands/compute/list.ts +125 -0
  41. package/src/commands/compute.ts +16 -449
@@ -1,410 +1,20 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
2
  Object.defineProperty(exports, "__esModule", { value: true });
15
3
  exports.registerComputeProgram = registerComputeProgram;
16
- const chalk_1 = __importDefault(require("chalk"));
17
- const ora_1 = __importDefault(require("ora"));
18
- const cli_table3_1 = __importDefault(require("cli-table3"));
19
- const admin_1 = require("@nestbox-ai/admin");
20
- const project_1 = require("../utils/project");
21
- const api_1 = require("../utils/api");
22
- const inquirer_1 = __importDefault(require("inquirer"));
23
- const axios_1 = __importDefault(require("axios"));
24
- const user_1 = require("../utils/user");
4
+ const list_1 = require("./compute/list");
5
+ const create_1 = require("./compute/create");
6
+ const delete_1 = require("./compute/delete");
7
+ /**
8
+ * Register all compute-related commands
9
+ */
25
10
  function registerComputeProgram(program) {
26
- const authResult = (0, api_1.setupAuthAndConfig)();
27
- if (!authResult) {
28
- return;
29
- }
30
- const { authToken, configuration } = authResult;
31
- const machineInstanceApi = new admin_1.MachineInstancesApi(configuration);
32
- const miscellaneousApi = new admin_1.MiscellaneousApi(configuration);
33
- const projectsApi = new admin_1.ProjectsApi(configuration);
34
11
  // Create the main compute command
35
12
  const computeCommand = program
36
13
  .command('compute')
37
14
  .description('Manage Nestbox computes');
38
- // List command
39
- computeCommand
40
- .command('list')
41
- .description('List all compute instances')
42
- .option('--project <projectId>', 'Project ID or name (defaults to the current project)')
43
- .action((options) => __awaiter(this, void 0, void 0, function* () {
44
- var _a, _b;
45
- try {
46
- // Resolve project using the shared utility
47
- const project = yield (0, project_1.resolveProject)(projectsApi, options);
48
- const spinner = (0, ora_1.default)(`Fetching compute instances for project: ${project.name}`).start();
49
- try {
50
- // Fetch machine instances for the project
51
- const instancesResponse = yield machineInstanceApi.machineInstancesControllerGetMachineInstanceByUserId(project.id, 0, // page
52
- 10 // limit
53
- );
54
- spinner.succeed('Successfully retrieved compute instances');
55
- const instances = ((_a = instancesResponse.data) === null || _a === void 0 ? void 0 : _a.machineInstances) || [];
56
- if (instances.length === 0) {
57
- console.log(chalk_1.default.yellow('No compute instances found for this project.'));
58
- return;
59
- }
60
- // Create table for display
61
- const table = new cli_table3_1.default({
62
- head: [
63
- chalk_1.default.white.bold('ID'),
64
- chalk_1.default.white.bold('Name'),
65
- chalk_1.default.white.bold('Status'),
66
- chalk_1.default.white.bold('API Key')
67
- ],
68
- style: {
69
- head: [], // Disable the default styling
70
- border: []
71
- }
72
- });
73
- // Status mappings
74
- const statusMappings = {
75
- 'Job Scheduled': 'Scheduled',
76
- 'Job Executed': 'Ready',
77
- 'Job in Progress': 'Initializing',
78
- 'Job Failed': 'Failed',
79
- 'Deleting': 'Deleting',
80
- };
81
- // Add rows to the table
82
- instances.forEach((instance) => {
83
- // Map the status if a mapping exists
84
- const originalStatus = instance.runningStatus || 'unknown';
85
- const displayStatus = statusMappings[originalStatus] || originalStatus;
86
- // Color the status based on its mapped value
87
- let statusColor;
88
- switch (displayStatus.toLowerCase()) {
89
- case 'ready':
90
- statusColor = chalk_1.default.green(displayStatus);
91
- break;
92
- case 'failed':
93
- statusColor = chalk_1.default.red(displayStatus);
94
- break;
95
- case 'initializing':
96
- statusColor = chalk_1.default.yellow(displayStatus);
97
- break;
98
- case 'scheduled':
99
- statusColor = chalk_1.default.blue(displayStatus);
100
- break;
101
- case 'deleting':
102
- statusColor = chalk_1.default.red(displayStatus);
103
- break;
104
- default:
105
- statusColor = chalk_1.default.gray(displayStatus);
106
- }
107
- table.push([
108
- instance.id || 'N/A',
109
- instance.instanceName || 'N/A',
110
- statusColor,
111
- instance.instanceApiKey || 'N/A'
112
- ]);
113
- });
114
- // Display the table
115
- console.log(table.toString());
116
- }
117
- catch (error) {
118
- spinner.fail('Failed to retrieve compute instances');
119
- if (error.response && error.response.status === 401) {
120
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
121
- }
122
- else if (error.response) {
123
- console.error(chalk_1.default.red('API Error:'), ((_b = error.response.data) === null || _b === void 0 ? void 0 : _b.message) || 'Unknown error');
124
- }
125
- else {
126
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
127
- }
128
- }
129
- }
130
- catch (error) {
131
- if (error.response && error.response.status === 401) {
132
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
133
- }
134
- else {
135
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
136
- }
137
- }
138
- }));
139
- computeCommand
140
- .command('create')
141
- .description('Create a new compute instance')
142
- .requiredOption('--image <imageId>', 'Image ID to use for the compute instance')
143
- .option('--project <projectId>', 'Project ID or name (defaults to the current project)')
144
- .action((options) => __awaiter(this, void 0, void 0, function* () {
145
- var _a, _b, _c;
146
- try {
147
- // Resolve project using the shared utility
148
- const project = yield (0, project_1.resolveProject)(projectsApi, options);
149
- const spinner = (0, ora_1.default)(`Fetching available images...`).start();
150
- try {
151
- // Get available images data
152
- const response = yield miscellaneousApi.miscellaneousControllerGetData();
153
- const availableImages = response.data || [];
154
- // Find the selected image
155
- const selectedImage = availableImages.find((image) => image.id === options.image);
156
- if (!selectedImage) {
157
- spinner.fail(`Image ID '${options.image}' does not exist.`);
158
- console.log(chalk_1.default.yellow('Available image IDs:'));
159
- availableImages.forEach((img) => {
160
- console.log(` ${chalk_1.default.cyan(img.id)} - ${img.name} (${img.type})`);
161
- });
162
- return;
163
- }
164
- spinner.succeed(`Found image: ${selectedImage.name}`);
165
- // Ask for instance name first
166
- const instanceNameAnswer = yield inquirer_1.default.prompt([
167
- {
168
- type: 'input',
169
- name: 'instanceName',
170
- message: 'Enter a name for this compute instance:',
171
- validate: (input) => {
172
- if (!input || input.trim() === '') {
173
- return 'Instance name cannot be empty';
174
- }
175
- // Add more validation here if needed (e.g., checking for valid characters)
176
- return true;
177
- }
178
- }
179
- ]);
180
- const instanceName = instanceNameAnswer.instanceName;
181
- // Directly create the provisioningParams object with the structure needed for API
182
- let provisioningParams = {};
183
- if (selectedImage.provisioningParameters &&
184
- selectedImage.provisioningParameters.properties) {
185
- const requiredParams = selectedImage.provisioningParameters.required || [];
186
- const paramProperties = selectedImage.provisioningParameters.properties;
187
- // Build questions for inquirer
188
- const questions = [];
189
- for (const [paramName, paramConfig] of Object.entries(paramProperties)) {
190
- const isRequired = requiredParams.includes(paramName);
191
- const paramUI = ((_a = selectedImage.provisioningParametersUI) === null || _a === void 0 ? void 0 : _a[paramName]) || {};
192
- let question = {
193
- name: paramName,
194
- message: paramUI['ui:title'] || `Enter ${paramName}:`,
195
- when: isRequired // Only ask required params by default
196
- };
197
- // Handle different parameter types
198
- if (paramConfig.type === 'string') {
199
- if (paramConfig.enum) {
200
- question.type = 'list';
201
- question.choices = paramConfig.enum;
202
- }
203
- else if (paramUI['ui:widget'] === 'password') {
204
- question.type = 'password';
205
- }
206
- else {
207
- question.type = 'input';
208
- }
209
- }
210
- else if (paramConfig.type === 'array') {
211
- if (paramConfig.items && paramConfig.items.enum) {
212
- question.type = 'checkbox';
213
- question.choices = paramConfig.items.enum;
214
- // Ensure at least one option is selected for required array parameters
215
- question.validate = (input) => {
216
- if (isRequired && (!input || input.length === 0)) {
217
- return 'Please select at least one option';
218
- }
219
- return true;
220
- };
221
- }
222
- }
223
- if (paramUI['ui:help']) {
224
- question.message += ` (${paramUI['ui:help']})`;
225
- }
226
- questions.push(question);
227
- }
228
- if (questions.length > 0) {
229
- console.log(chalk_1.default.blue(`\nPlease provide the required parameters for ${selectedImage.name}:`));
230
- const answers = yield inquirer_1.default.prompt(questions);
231
- // Assign the answers directly to provisioningParams
232
- for (const [key, value] of Object.entries(answers)) {
233
- provisioningParams[key] = value;
234
- }
235
- }
236
- }
237
- // Now we have all the required params in provisioningParams
238
- console.log(chalk_1.default.green(`\nCreating compute instance '${instanceName}' with image '${selectedImage.name}'`));
239
- console.log(chalk_1.default.dim('Using the following parameters:'));
240
- for (const [key, value] of Object.entries(provisioningParams)) {
241
- console.log(chalk_1.default.dim(` ${key}: ${Array.isArray(value) ? value.join(', ') : value}`));
242
- }
243
- // Start a spinner for the creation process
244
- const creationSpinner = (0, ora_1.default)('Creating compute instance...').start();
245
- const getUserData = yield (0, user_1.userData)();
246
- try {
247
- const createParams = Object.assign({ userId: getUserData.id, machineId: selectedImage.id, machineTitle: selectedImage.name, instanceName: instanceName }, provisioningParams);
248
- const createResponse = yield axios_1.default.post(`${authToken.serverUrl}/projects/${project.id}/instances`, createParams, {
249
- headers: {
250
- Authorization: authToken.token,
251
- },
252
- });
253
- creationSpinner.succeed('Compute instance created successfully!');
254
- console.log(chalk_1.default.green(`\nInstance '${instanceName}' is now being provisioned`));
255
- console.log(chalk_1.default.gray('You can check the status with: nestbox compute list'));
256
- console.log(chalk_1.default.green("Instance created successfully!"));
257
- }
258
- catch (createError) {
259
- creationSpinner.fail('Failed to create compute instance');
260
- if (createError.response && createError.response.status === 401) {
261
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
262
- }
263
- else if (createError.response) {
264
- console.error(chalk_1.default.red('API Error:'), ((_b = createError.response.data) === null || _b === void 0 ? void 0 : _b.message) || 'Unknown error');
265
- }
266
- else {
267
- console.error(chalk_1.default.red('Error:'), createError.message || 'Unknown error');
268
- }
269
- }
270
- }
271
- catch (error) {
272
- spinner.fail('Failed to fetch available images');
273
- if (error.response && error.response.status === 401) {
274
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
275
- }
276
- else if (error.response) {
277
- console.error(chalk_1.default.red('API Error:'), ((_c = error.response.data) === null || _c === void 0 ? void 0 : _c.message) || 'Unknown error');
278
- }
279
- else {
280
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
281
- }
282
- }
283
- }
284
- catch (error) {
285
- if (error.response && error.response.status === 401) {
286
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
287
- }
288
- else {
289
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
290
- }
291
- }
292
- }));
293
- computeCommand
294
- .command('delete')
295
- .description('Delete one or more compute instances')
296
- .option('--project <projectId>', 'Project ID or name (defaults to the current project)')
297
- .option('--force', 'Skip confirmation prompt')
298
- .action((options) => __awaiter(this, void 0, void 0, function* () {
299
- var _a, _b, _c;
300
- try {
301
- // Resolve project using the shared utility
302
- const project = yield (0, project_1.resolveProject)(projectsApi, options);
303
- const spinner = (0, ora_1.default)(`Fetching compute instances for project: ${project.name}`).start();
304
- try {
305
- // Fetch machine instances for the project
306
- const instancesResponse = yield machineInstanceApi.machineInstancesControllerGetMachineInstanceByUserId(project.id, 0, // page
307
- 50 // limit - increased to show more instances
308
- );
309
- spinner.succeed('Successfully retrieved compute instances');
310
- const instances = ((_a = instancesResponse.data) === null || _a === void 0 ? void 0 : _a.machineInstances) || [];
311
- if (instances.length === 0) {
312
- console.log(chalk_1.default.yellow('No compute instances found for this project.'));
313
- return;
314
- }
315
- // Create choices for the selection prompt
316
- const instanceChoices = instances.map((instance) => ({
317
- name: `${instance.instanceName || 'Unnamed'} (${instance.id})`,
318
- value: instance.id,
319
- short: instance.instanceName || instance.id
320
- }));
321
- // Prompt user to select instances to delete
322
- const { selectedInstances } = yield inquirer_1.default.prompt([
323
- {
324
- type: 'checkbox',
325
- name: 'selectedInstances',
326
- message: 'Select compute instances to delete:',
327
- choices: instanceChoices,
328
- validate: (input) => {
329
- if (input.length === 0) {
330
- return 'Please select at least one instance to delete';
331
- }
332
- return true;
333
- }
334
- }
335
- ]);
336
- if (selectedInstances.length === 0) {
337
- console.log(chalk_1.default.yellow('No instances selected for deletion.'));
338
- return;
339
- }
340
- // Show selected instances
341
- console.log(chalk_1.default.yellow('\nSelected instances for deletion:'));
342
- const selectedInstanceDetails = instances
343
- .filter((instance) => selectedInstances.includes(instance.id))
344
- .map((instance) => ` - ${chalk_1.default.cyan(instance.instanceName || 'Unnamed')} (${instance.id})`);
345
- console.log(selectedInstanceDetails.join('\n'));
346
- // Confirm deletion if not using --force
347
- if (!options.force) {
348
- const { confirmDeletion } = yield inquirer_1.default.prompt([
349
- {
350
- type: 'confirm',
351
- name: 'confirmDeletion',
352
- message: chalk_1.default.red('Are you sure you want to delete these instances? This cannot be undone.'),
353
- default: false
354
- }
355
- ]);
356
- if (!confirmDeletion) {
357
- console.log(chalk_1.default.yellow('Deletion cancelled.'));
358
- return;
359
- }
360
- }
361
- // Process deletion - using single request with all selected IDs
362
- const deleteSpinner = (0, ora_1.default)(`Deleting ${selectedInstances.length} instance(s)...`).start();
363
- try {
364
- yield axios_1.default.delete(`${authToken.serverUrl}/projects/${project.id}/instances`, {
365
- data: { ids: selectedInstances },
366
- headers: {
367
- Authorization: authToken.token,
368
- }
369
- });
370
- deleteSpinner.succeed(`Successfully deleted ${selectedInstances.length} instance(s)`);
371
- console.log(chalk_1.default.green('\nAll selected instances have been deleted'));
372
- console.log(chalk_1.default.gray('You can verify with: nestbox compute list'));
373
- }
374
- catch (error) {
375
- deleteSpinner.fail(`Failed to delete instances`);
376
- if (error.response && error.response.status === 401) {
377
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
378
- }
379
- else if (error.response) {
380
- console.error(chalk_1.default.red('API Error:'), ((_b = error.response.data) === null || _b === void 0 ? void 0 : _b.message) || 'Unknown error');
381
- }
382
- else {
383
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
384
- }
385
- }
386
- }
387
- catch (error) {
388
- spinner.fail('Failed to retrieve compute instances');
389
- if (error.response && error.response.status === 401) {
390
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
391
- }
392
- else if (error.response) {
393
- console.error(chalk_1.default.red('API Error:'), ((_c = error.response.data) === null || _c === void 0 ? void 0 : _c.message) || 'Unknown error');
394
- }
395
- else {
396
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
397
- }
398
- }
399
- }
400
- catch (error) {
401
- if (error.response && error.response.status === 401) {
402
- console.error(chalk_1.default.red('Authentication token has expired. Please login again using "nestbox login <domain>".'));
403
- }
404
- else {
405
- console.error(chalk_1.default.red('Error:'), error.message || 'Unknown error');
406
- }
407
- }
408
- }));
15
+ // Register all subcommands
16
+ (0, list_1.registerListCommand)(computeCommand);
17
+ (0, create_1.registerCreateCommand)(computeCommand);
18
+ (0, delete_1.registerDeleteCommand)(computeCommand);
409
19
  }
410
20
  //# sourceMappingURL=compute.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../src/commands/compute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../src/commands/compute.ts"],"names":[],"mappings":";;AAQA,wDAUC;AAjBD,yCAAqD;AACrD,6CAAyD;AACzD,6CAAyD;AAEzD;;GAEG;AACH,SAAgB,sBAAsB,CAAC,OAAgB;IACrD,kCAAkC;IAClC,MAAM,cAAc,GAAG,OAAO;SAC3B,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE1C,2BAA2B;IAC3B,IAAA,0BAAmB,EAAC,cAAc,CAAC,CAAC;IACpC,IAAA,8BAAqB,EAAC,cAAc,CAAC,CAAC;IACtC,IAAA,8BAAqB,EAAC,cAAc,CAAC,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestbox-ai/cli",
3
- "version": "1.0.24",
3
+ "version": "1.0.26",
4
4
  "description": "The cli tools that helps developers to build agents",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -0,0 +1,3 @@
1
+ // Auth command exports
2
+ export { registerLoginCommand } from "./login";
3
+ export { registerLogoutCommand } from "./logout";
@@ -0,0 +1,184 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ import open from 'open';
5
+ import ora from 'ora';
6
+ import fs from 'fs';
7
+ import os from 'os';
8
+ import path from 'path';
9
+ import { AuthApi, Configuration, OAuthLoginRequestDTOTypeEnum } from '@nestbox-ai/admin';
10
+ import axios from 'axios';
11
+
12
+ export function registerLoginCommand(program: Command): void {
13
+ program
14
+ .command('login <nestbox-domain>')
15
+ .description('Login using Google SSO')
16
+ .action(async (domain: string) => {
17
+ console.log('Login command triggered for domain:', domain);
18
+ const spinner = ora('Initiating Google login...').start();
19
+
20
+ try {
21
+ // Determine the protocol and construct the auth URL based on the provided domain
22
+ let authUrl;
23
+ if (domain.includes('localhost')) {
24
+ // Use HTTP for localhost and specific port
25
+ authUrl = `http://${domain}/cli/auth`;
26
+ } else {
27
+ // Use HTTPS for all other domains
28
+ authUrl = `https://${domain}/cli/auth`;
29
+ }
30
+
31
+ spinner.text = 'Opening browser for Google authentication...';
32
+
33
+ // Open the browser for authentication
34
+ await open(authUrl);
35
+ spinner.succeed('Browser opened for authentication');
36
+
37
+ // Prompt user to paste the combined token and API URL
38
+ const { combinedInput } = await inquirer.prompt<{ combinedInput: string }>([
39
+ {
40
+ type: 'input',
41
+ name: 'combinedInput',
42
+ message: 'After authenticating, please paste the data here:',
43
+ validate: (input) => input.trim().length > 0 || 'Input is required'
44
+ }
45
+ ]);
46
+
47
+ // Split the input by comma
48
+ const [accessToken, apiServerUrl] = combinedInput.split(',').map(item => item.trim());
49
+
50
+ if (!accessToken || !apiServerUrl) {
51
+ spinner.fail('Invalid input format. Expected: token,apiServerUrl');
52
+ return;
53
+ }
54
+
55
+ console.log(chalk.green('Credentials received. Extracting user information...'));
56
+
57
+ // Fetch user data from the token
58
+ let email = '';
59
+ let name = '';
60
+ let picture = '';
61
+ try {
62
+ // Try to decode JWT to get user data (email, name, picture, etc.)
63
+ const tokenParts = accessToken.split('.');
64
+ if (tokenParts.length === 3) {
65
+ // Base64 decode the payload part of JWT
66
+ const base64Payload = tokenParts[1].replace(/-/g, '+').replace(/_/g, '/');
67
+ const decodedPayload = Buffer.from(base64Payload, 'base64').toString('utf-8');
68
+ const tokenPayload = JSON.parse(decodedPayload);
69
+
70
+ // Extract user information
71
+ email = tokenPayload.email || '';
72
+ name = tokenPayload.name || '';
73
+ picture = tokenPayload.picture || '';
74
+ }
75
+ } catch (e) {
76
+ console.log(chalk.yellow('Could not decode token payload. Will prompt for email.'));
77
+ }
78
+
79
+ // If email couldn't be extracted from token, prompt user
80
+ if (!email) {
81
+ const response = await inquirer.prompt<{ email: string }>([
82
+ {
83
+ type: 'input',
84
+ name: 'email',
85
+ message: 'Enter your email address:',
86
+ validate: (input) => /\S+@\S+\.\S+/.test(input) || 'Please enter a valid email'
87
+ }
88
+ ]);
89
+ email = response.email;
90
+ }
91
+
92
+ spinner.start('Verifying access token...');
93
+
94
+ if (apiServerUrl && email && accessToken) {
95
+ // Verify the access token
96
+ const configuration = new Configuration({
97
+ basePath: apiServerUrl,
98
+ accessToken: accessToken,
99
+ });
100
+ const authApi = new AuthApi(configuration);
101
+ try {
102
+ const response = await authApi.authControllerOAuthLogin({
103
+ providerId: accessToken,
104
+ type: OAuthLoginRequestDTOTypeEnum.Google,
105
+ email,
106
+ profilePictureUrl: picture || '',
107
+ });
108
+ const authResponse = response.data;
109
+
110
+ // Save credentials to file
111
+ try {
112
+ // Create directory structure
113
+ const configDir = path.join(os.homedir(), '.config', '.nestbox');
114
+ if (!fs.existsSync(configDir)) {
115
+ fs.mkdirSync(configDir, { recursive: true });
116
+ }
117
+
118
+ // Create the file path
119
+ const fileName = `${email.replace('@', '_at_')}_${domain}.json`;
120
+ const filePath = path.join(configDir, fileName);
121
+
122
+ // Create credentials object
123
+ const credentials = {
124
+ domain,
125
+ email,
126
+ token: authResponse.token,
127
+ accessToken, // Save the original accessToken
128
+ apiServerUrl,
129
+ name,
130
+ picture,
131
+ timestamp: new Date().toISOString()
132
+ };
133
+
134
+ // Write to file
135
+ fs.writeFileSync(filePath, JSON.stringify(credentials, null, 2));
136
+
137
+ spinner.succeed('Authentication successful');
138
+ console.log(chalk.green(`Successfully logged in as ${email}`));
139
+ console.log(chalk.blue(`Credentials saved to: ${filePath}`));
140
+ } catch (fileError) {
141
+ spinner.warn('Authentication successful, but failed to save credentials file');
142
+ console.error(chalk.yellow('File error:'), fileError instanceof Error ? fileError.message : 'Unknown error');
143
+
144
+ }
145
+ } catch (authError) {
146
+ spinner.fail('Failed to verify access token');
147
+ if (axios.isAxiosError(authError) && authError.response) {
148
+ if (authError.response.data.message === "user.not_found") {
149
+ console.error(chalk.red('Authentication Error:'), "You need to register your email with the Nestbox platform");
150
+ const { openSignup } = await inquirer.prompt<{ openSignup: boolean }>([
151
+ {
152
+ type: 'confirm',
153
+ name: 'openSignup',
154
+ message: 'Would you like to open the signup page to register?',
155
+ default: true
156
+ }
157
+ ]);
158
+
159
+ if (openSignup) {
160
+ // Construct signup URL with the same protocol logic as login
161
+ let signupUrl;
162
+ if (domain.includes('localhost')) {
163
+ signupUrl = `http://${domain}`;
164
+ } else {
165
+ signupUrl = `https://${domain}`;
166
+ }
167
+
168
+ console.log(chalk.blue(`Opening signup page: ${signupUrl}`));
169
+ await open(signupUrl);
170
+ }
171
+ }
172
+ } else {
173
+ console.error(chalk.red('Authentication Error:'), authError instanceof Error ? authError.message : 'Unknown error');
174
+ }
175
+ }
176
+ } else {
177
+ spinner.fail('Missing required information for authentication');
178
+ }
179
+ } catch (error) {
180
+ spinner.fail('Authentication failed');
181
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
182
+ }
183
+ });
184
+ }