@thinksoftai/cli 1.0.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.
Files changed (39) hide show
  1. package/bin/thinksoft.js +2 -0
  2. package/dist/commands/apps.d.ts +4 -0
  3. package/dist/commands/apps.d.ts.map +1 -0
  4. package/dist/commands/apps.js +86 -0
  5. package/dist/commands/apps.js.map +1 -0
  6. package/dist/commands/create.d.ts +6 -0
  7. package/dist/commands/create.js +95 -0
  8. package/dist/commands/create.js.map +1 -0
  9. package/dist/commands/deploy.d.ts +9 -0
  10. package/dist/commands/deploy.js +195 -0
  11. package/dist/commands/deploy.js.map +1 -0
  12. package/dist/commands/init.d.ts +10 -0
  13. package/dist/commands/init.d.ts.map +1 -0
  14. package/dist/commands/init.js +158 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/login.d.ts +8 -0
  17. package/dist/commands/login.d.ts.map +1 -0
  18. package/dist/commands/login.js +146 -0
  19. package/dist/commands/login.js.map +1 -0
  20. package/dist/commands/open.d.ts +8 -0
  21. package/dist/commands/open.js +66 -0
  22. package/dist/commands/open.js.map +1 -0
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +70 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/utils/api.d.ts +26 -0
  28. package/dist/utils/api.d.ts.map +1 -0
  29. package/dist/utils/api.js +152 -0
  30. package/dist/utils/api.js.map +1 -0
  31. package/dist/utils/config.d.ts +33 -0
  32. package/dist/utils/config.d.ts.map +1 -0
  33. package/dist/utils/config.js +136 -0
  34. package/dist/utils/config.js.map +1 -0
  35. package/dist/utils/logger.d.ts +12 -0
  36. package/dist/utils/logger.d.ts.map +1 -0
  37. package/dist/utils/logger.js +74 -0
  38. package/dist/utils/logger.js.map +1 -0
  39. package/package.json +47 -0
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * Login command - authenticate with ThinkSoft
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.login = login;
43
+ exports.logout = logout;
44
+ exports.whoami = whoami;
45
+ const inquirer_1 = __importDefault(require("inquirer"));
46
+ const ora_1 = __importDefault(require("ora"));
47
+ const api = __importStar(require("../utils/api"));
48
+ const config = __importStar(require("../utils/config"));
49
+ const logger = __importStar(require("../utils/logger"));
50
+ async function login(options) {
51
+ // Check if already logged in
52
+ if (config.isLoggedIn()) {
53
+ const user = config.getUser();
54
+ logger.warning(`Already logged in as ${user?.email}`);
55
+ logger.info('Use "thinksoft logout" to logout first');
56
+ return;
57
+ }
58
+ // If token provided via CLI, use it directly
59
+ if (options.token) {
60
+ if (!options.token.startsWith('ts_')) {
61
+ logger.error('Invalid API key format. Should start with "ts_"');
62
+ return;
63
+ }
64
+ config.saveAuth({ token: options.token });
65
+ logger.success('Logged in with API key');
66
+ return;
67
+ }
68
+ // Interactive OTP login
69
+ logger.header('ThinkSoft Login');
70
+ logger.log('Login with your email address (OTP will be sent)');
71
+ logger.newLine();
72
+ const { email } = await inquirer_1.default.prompt([
73
+ {
74
+ type: 'input',
75
+ name: 'email',
76
+ message: 'Email:',
77
+ validate: (input) => {
78
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
79
+ return emailRegex.test(input) || 'Please enter a valid email';
80
+ }
81
+ }
82
+ ]);
83
+ // Send OTP
84
+ const spinner = (0, ora_1.default)('Sending OTP...').start();
85
+ // Use a global app context for CLI auth
86
+ const sendResult = await api.sendOtp(email, '_cli');
87
+ if (sendResult.error) {
88
+ spinner.fail('Failed to send OTP');
89
+ logger.error(sendResult.error);
90
+ return;
91
+ }
92
+ spinner.succeed('OTP sent to your email');
93
+ // Get OTP
94
+ const { otp } = await inquirer_1.default.prompt([
95
+ {
96
+ type: 'input',
97
+ name: 'otp',
98
+ message: 'Enter OTP:',
99
+ validate: (input) => {
100
+ return /^\d{6}$/.test(input) || 'OTP must be 6 digits';
101
+ }
102
+ }
103
+ ]);
104
+ // Verify OTP
105
+ const verifySpinner = (0, ora_1.default)('Verifying...').start();
106
+ const verifyResult = await api.verifyOtp(email, otp, '_cli');
107
+ if (verifyResult.error) {
108
+ verifySpinner.fail('Verification failed');
109
+ logger.error(verifyResult.error);
110
+ return;
111
+ }
112
+ verifySpinner.succeed('Logged in successfully!');
113
+ logger.newLine();
114
+ logger.keyValue('Email', email);
115
+ logger.keyValue('Config', config.getConfigPath());
116
+ }
117
+ async function logout() {
118
+ if (!config.isLoggedIn()) {
119
+ logger.warning('Not logged in');
120
+ return;
121
+ }
122
+ const user = config.getUser();
123
+ config.clearAuth();
124
+ logger.success(`Logged out from ${user?.email || 'ThinkSoft'}`);
125
+ }
126
+ async function whoami() {
127
+ if (!config.isLoggedIn()) {
128
+ logger.warning('Not logged in');
129
+ logger.info('Use "thinksoft login" to authenticate');
130
+ return;
131
+ }
132
+ const user = config.getUser();
133
+ if (!user) {
134
+ logger.warning('Logged in but user info not available');
135
+ return;
136
+ }
137
+ logger.header('Current User');
138
+ logger.keyValue('Email', user.email);
139
+ logger.keyValue('User ID', user.id);
140
+ logger.keyValue('Config', config.getConfigPath());
141
+ if (config.isTokenExpired()) {
142
+ logger.newLine();
143
+ logger.warning('Token expired - will auto-refresh on next request');
144
+ }
145
+ }
146
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Open command - open app in browser
3
+ */
4
+ interface OpenOptions {
5
+ admin?: boolean;
6
+ }
7
+ export declare function openApp(appId: string | undefined, options: OpenOptions): Promise<void>;
8
+ export {};
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Open command - open app in browser
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.openApp = openApp;
43
+ const open_1 = __importDefault(require("open"));
44
+ const config = __importStar(require("../utils/config"));
45
+ const logger = __importStar(require("../utils/logger"));
46
+ async function openApp(appId, options) {
47
+ // Get app ID from argument or project config
48
+ const projectConfig = config.getProjectConfig();
49
+ const targetAppId = appId || projectConfig?.appId;
50
+ if (!targetAppId) {
51
+ logger.error('No app ID specified');
52
+ logger.info('Either provide an app ID or run from a project with thinksoft.json');
53
+ return;
54
+ }
55
+ let url;
56
+ if (options.admin) {
57
+ url = `https://thinksoftai.com/app/${targetAppId}`;
58
+ logger.info(`Opening admin UI: ${url}`);
59
+ }
60
+ else {
61
+ url = `https://${targetAppId.toLowerCase()}.thinksoftai.com`;
62
+ logger.info(`Opening app: ${url}`);
63
+ }
64
+ await (0, open_1.default)(url);
65
+ }
66
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUH,0BAsBC;AA9BD,gDAAuB;AACvB,wDAAyC;AACzC,wDAAyC;AAMlC,KAAK,UAAU,OAAO,CAAC,KAAyB,EAAE,OAAoB;IAC3E,6CAA6C;IAC7C,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAA;IAC/C,MAAM,WAAW,GAAG,KAAK,IAAI,aAAa,EAAE,KAAK,CAAA;IAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACnC,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;QACjF,OAAM;IACR,CAAC;IAED,IAAI,GAAW,CAAA;IAEf,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,GAAG,GAAG,+BAA+B,WAAW,EAAE,CAAA;QAClD,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAA;IACzC,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,WAAW,WAAW,CAAC,WAAW,EAAE,kBAAkB,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,IAAA,cAAI,EAAC,GAAG,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ThinkSoft CLI
4
+ * Deploy apps to ThinkSoft platform
5
+ */
6
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * ThinkSoft CLI
5
+ * Deploy apps to ThinkSoft platform
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const commander_1 = require("commander");
9
+ const login_1 = require("./commands/login");
10
+ const apps_1 = require("./commands/apps");
11
+ const init_1 = require("./commands/init");
12
+ const create_1 = require("./commands/create");
13
+ const deploy_1 = require("./commands/deploy");
14
+ const open_1 = require("./commands/open");
15
+ const program = new commander_1.Command();
16
+ program
17
+ .name('thinksoft')
18
+ .description('ThinkSoft CLI - Deploy apps to ThinkSoft platform')
19
+ .version('1.0.0');
20
+ // Login command
21
+ program
22
+ .command('login')
23
+ .description('Authenticate with ThinkSoft')
24
+ .option('-t, --token <token>', 'API key (ts_secret_xxx)')
25
+ .action(login_1.login);
26
+ // Logout command
27
+ program
28
+ .command('logout')
29
+ .description('Clear stored credentials')
30
+ .action(login_1.logout);
31
+ // Whoami command
32
+ program
33
+ .command('whoami')
34
+ .description('Show current logged in user')
35
+ .action(login_1.whoami);
36
+ // Apps command
37
+ program
38
+ .command('apps')
39
+ .description('List your apps')
40
+ .action(apps_1.apps);
41
+ // Create command
42
+ program
43
+ .command('create <description>')
44
+ .description('Create a new app with AI')
45
+ .option('-t, --type <type>', 'App type: workapp or storeapp', 'workapp')
46
+ .action(create_1.create);
47
+ // Init command
48
+ program
49
+ .command('init')
50
+ .description('Initialize project with thinksoft.json')
51
+ .option('-a, --app <appId>', 'App ID to link')
52
+ .option('-d, --dir <directory>', 'Output directory (default: dist)')
53
+ .option('-y, --yes', 'Skip confirmation prompts')
54
+ .action(init_1.init);
55
+ // Deploy command
56
+ program
57
+ .command('deploy')
58
+ .description('Deploy frontend to ThinkSoft')
59
+ .option('-a, --app <appId>', 'App ID to deploy to')
60
+ .option('-d, --dir <directory>', 'Directory to deploy (default: from thinksoft.json or dist)')
61
+ .action(deploy_1.deploy);
62
+ // Open command
63
+ program
64
+ .command('open [appId]')
65
+ .description('Open app in browser')
66
+ .option('--admin', 'Open admin UI instead of deployed app')
67
+ .action(open_1.openApp);
68
+ // Parse arguments
69
+ program.parse();
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;GAGG;;AAEH,yCAAmC;AACnC,4CAAwD;AACxD,0CAAsC;AACtC,0CAAsC;AACtC,8CAA0C;AAC1C,8CAA0C;AAC1C,0CAAyC;AAEzC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,mDAAmD,CAAC;KAChE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,aAAK,CAAC,CAAA;AAEhB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,cAAM,CAAC,CAAA;AAEjB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,cAAM,CAAC,CAAA;AAEjB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,WAAI,CAAC,CAAA;AAEf,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,sBAAsB,CAAC;KAC/B,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,SAAS,CAAC;KACvE,MAAM,CAAC,eAAM,CAAC,CAAA;AAEjB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;KAC7C,MAAM,CAAC,uBAAuB,EAAE,kCAAkC,CAAC;KACnE,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,MAAM,CAAC,WAAI,CAAC,CAAA;AAEf,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAClD,MAAM,CAAC,uBAAuB,EAAE,4DAA4D,CAAC;KAC7F,MAAM,CAAC,eAAM,CAAC,CAAA;AAEjB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,SAAS,EAAE,uCAAuC,CAAC;KAC1D,MAAM,CAAC,cAAO,CAAC,CAAA;AAElB,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * API utility - makes requests to ThinkSoft API
3
+ */
4
+ interface ApiResponse<T = any> {
5
+ success?: boolean;
6
+ data?: T;
7
+ error?: string;
8
+ token?: string;
9
+ refresh_token?: string;
10
+ expires_in?: number;
11
+ user?: {
12
+ id: string;
13
+ email: string;
14
+ };
15
+ message?: string;
16
+ }
17
+ export declare function request<T = any>(path: string, options?: {
18
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
19
+ body?: any;
20
+ requiresAuth?: boolean;
21
+ }): Promise<ApiResponse<T>>;
22
+ export declare function sendOtp(email: string, appId?: string): Promise<ApiResponse>;
23
+ export declare function verifyOtp(email: string, otp: string, appId?: string): Promise<ApiResponse>;
24
+ export declare function listApps(): Promise<ApiResponse<any[]>>;
25
+ export declare function createApp(prompt: string, type?: string): Promise<ApiResponse>;
26
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,UAAU,WAAW,CAAC,CAAC,GAAG,GAAG;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA4CD,wBAAsB,OAAO,CAAC,CAAC,GAAG,GAAG,EACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;IAC1C,IAAI,CAAC,EAAE,GAAG,CAAA;IACV,YAAY,CAAC,EAAE,OAAO,CAAA;CAClB,GACL,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAuCzB;AAGD,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAM5F;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiB3G;AAGD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAE5D;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAK9F"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * API utility - makes requests to ThinkSoft API
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.request = request;
40
+ exports.sendOtp = sendOtp;
41
+ exports.verifyOtp = verifyOtp;
42
+ exports.listApps = listApps;
43
+ exports.createApp = createApp;
44
+ const config = __importStar(require("./config"));
45
+ const BASE_URL = 'https://thinksoftai.com/api/v1';
46
+ async function refreshToken() {
47
+ const refreshToken = config.getRefreshToken();
48
+ if (!refreshToken)
49
+ return false;
50
+ try {
51
+ // Use a dummy appId for auth refresh - the API handles it
52
+ const response = await fetch(`${BASE_URL}/auth/refresh`, {
53
+ method: 'POST',
54
+ headers: { 'Content-Type': 'application/json' },
55
+ body: JSON.stringify({ refresh_token: refreshToken })
56
+ });
57
+ if (!response.ok) {
58
+ config.clearAuth();
59
+ return false;
60
+ }
61
+ const data = await response.json();
62
+ if (data.token) {
63
+ config.saveAuth({
64
+ token: data.token,
65
+ refreshToken: data.refresh_token,
66
+ expiresIn: data.expires_in,
67
+ user: data.user
68
+ });
69
+ return true;
70
+ }
71
+ return false;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ async function ensureValidToken() {
78
+ if (!config.isLoggedIn())
79
+ return false;
80
+ if (!config.isTokenExpired())
81
+ return true;
82
+ return refreshToken();
83
+ }
84
+ async function request(path, options = {}) {
85
+ const { method = 'GET', body, requiresAuth = true } = options;
86
+ // Auto-refresh if needed
87
+ if (requiresAuth) {
88
+ const isValid = await ensureValidToken();
89
+ if (!isValid) {
90
+ return { error: 'Session expired. Please login again.' };
91
+ }
92
+ }
93
+ const headers = {
94
+ 'Content-Type': 'application/json'
95
+ };
96
+ if (requiresAuth) {
97
+ const token = config.getToken();
98
+ if (token) {
99
+ headers['Authorization'] = `Bearer ${token}`;
100
+ }
101
+ }
102
+ try {
103
+ const response = await fetch(`${BASE_URL}${path}`, {
104
+ method,
105
+ headers,
106
+ body: body ? JSON.stringify(body) : undefined
107
+ });
108
+ const data = await response.json();
109
+ if (!response.ok) {
110
+ return { error: data.error || `Request failed with status ${response.status}` };
111
+ }
112
+ return data;
113
+ }
114
+ catch (error) {
115
+ return { error: error.message || 'Network error' };
116
+ }
117
+ }
118
+ // Auth APIs
119
+ async function sendOtp(email, appId = '_global') {
120
+ return request(`/${appId}/auth/send-otp`, {
121
+ method: 'POST',
122
+ body: { email },
123
+ requiresAuth: false
124
+ });
125
+ }
126
+ async function verifyOtp(email, otp, appId = '_global') {
127
+ const result = await request(`/${appId}/auth/verify-otp`, {
128
+ method: 'POST',
129
+ body: { email, otp },
130
+ requiresAuth: false
131
+ });
132
+ if (result.token) {
133
+ config.saveAuth({
134
+ token: result.token,
135
+ refreshToken: result.refresh_token,
136
+ expiresIn: result.expires_in,
137
+ user: result.user
138
+ });
139
+ }
140
+ return result;
141
+ }
142
+ // App APIs
143
+ async function listApps() {
144
+ return request('/apps', { method: 'GET' });
145
+ }
146
+ async function createApp(prompt, type = 'workapp') {
147
+ return request('/apps/create', {
148
+ method: 'POST',
149
+ body: { prompt, type }
150
+ });
151
+ }
152
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Config utility - manages CLI configuration stored in ~/.thinksoft/
3
+ */
4
+ interface ProjectConfig {
5
+ appId: string;
6
+ name?: string;
7
+ outputDir: string;
8
+ framework?: string;
9
+ }
10
+ export declare function getToken(): string | undefined;
11
+ export declare function getRefreshToken(): string | undefined;
12
+ export declare function getUser(): {
13
+ id: string;
14
+ email: string;
15
+ } | undefined;
16
+ export declare function getExpiresAt(): number | undefined;
17
+ export declare function isLoggedIn(): boolean;
18
+ export declare function isTokenExpired(bufferSeconds?: number): boolean;
19
+ export declare function saveAuth(data: {
20
+ token: string;
21
+ refreshToken?: string;
22
+ expiresIn?: number;
23
+ user?: {
24
+ id: string;
25
+ email: string;
26
+ };
27
+ }): void;
28
+ export declare function clearAuth(): void;
29
+ export declare function getConfigPath(): string;
30
+ export declare function getProjectConfig(): ProjectConfig | null;
31
+ export declare function saveProjectConfig(config: ProjectConfig): void;
32
+ export declare function projectConfigExists(): boolean;
33
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAmBD,wBAAgB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7C;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD;AAED,wBAAgB,OAAO,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAEnE;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,cAAc,CAAC,aAAa,GAAE,MAAY,GAAG,OAAO,CAKnE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CACrC,GAAG,IAAI,CAeP;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAQD,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAavD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAG7D;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}