sentron-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.
package/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # @sentron/cli
2
+
3
+ Command-line interface for the Sentron API.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Run directly with npx
9
+ npx @sentron/cli auth signin
10
+
11
+ # Or install globally
12
+ npm install -g @sentron/cli
13
+ sentron auth signin
14
+ ```
15
+
16
+ ## Commands
17
+
18
+ ### Authentication
19
+
20
+ ```bash
21
+ # Sign in via browser
22
+ sentron auth signin
23
+
24
+ # Get current user info
25
+ sentron auth me
26
+
27
+ # Check authentication status
28
+ sentron auth status
29
+
30
+ # Sign out
31
+ sentron auth signout
32
+ ```
33
+
34
+ ### API Keys
35
+
36
+ ```bash
37
+ # Create a new API key
38
+ sentron auth api-key create
39
+
40
+ # List all API keys
41
+ sentron auth api-key list
42
+
43
+ # Revoke an API key
44
+ sentron auth api-key revoke <id>
45
+ ```
46
+
47
+ ### Metrics
48
+
49
+ ```bash
50
+ # View usage summary
51
+ sentron metrics
52
+
53
+ # View detailed metrics
54
+ sentron metrics get
55
+
56
+ # View metrics for specific time period
57
+ sentron metrics get --days 7
58
+
59
+ # Output as JSON
60
+ sentron metrics --json
61
+ ```
62
+
63
+ ## Configuration
64
+
65
+ The CLI stores credentials in `~/.sentron/token`.
66
+
67
+ To use a custom API URL, set the `SENTRON_API_URL` environment variable:
68
+
69
+ ```bash
70
+ export SENTRON_API_URL=https://api.sentron.dev
71
+ ```
72
+
73
+ ## Links
74
+
75
+ - Website: https://sentron.dev
76
+ - Documentation: https://sentron.dev/docs
77
+ - GitHub: https://github.com/sentron-dev/sentron
78
+
package/dist/api.d.ts ADDED
@@ -0,0 +1,81 @@
1
+ /**
2
+ * API Client
3
+ * Makes HTTP requests to the Sentron API
4
+ */
5
+ /**
6
+ * Make an authenticated API request
7
+ */
8
+ export declare function apiRequest<T = any>(endpoint: string, options?: RequestInit): Promise<T>;
9
+ /**
10
+ * API endpoints
11
+ */
12
+ export declare const api: {
13
+ auth: {
14
+ signin(): Promise<{
15
+ authUrl: string;
16
+ signInAttemptId: string;
17
+ }>;
18
+ verifyCli(signInAttemptId: string): Promise<{
19
+ token: string;
20
+ userId: string;
21
+ email: string;
22
+ firstName?: string;
23
+ lastName?: string;
24
+ }>;
25
+ me(): Promise<{
26
+ id: string;
27
+ email: string;
28
+ firstName?: string;
29
+ lastName?: string;
30
+ createdAt: string;
31
+ }>;
32
+ };
33
+ apiKeys: {
34
+ create(name: string, expiresInDays?: number): Promise<{
35
+ id: string;
36
+ key: string;
37
+ name: string;
38
+ keyPrefix: string;
39
+ createdAt: string;
40
+ expiresAt: string | null;
41
+ }>;
42
+ list(): Promise<{
43
+ id: string;
44
+ name: string;
45
+ keyPrefix: string;
46
+ lastUsedAt: string | null;
47
+ createdAt: string;
48
+ expiresAt: string | null;
49
+ }[]>;
50
+ revoke(id: string): Promise<any>;
51
+ };
52
+ metrics: {
53
+ get(days?: number): Promise<{
54
+ totalRequests: number;
55
+ totalRequestsThisMonth: number;
56
+ totalMcpCalls: number;
57
+ totalCliCommands: number;
58
+ successRate: number;
59
+ avgResponseTime: number;
60
+ requestsByInterface: Record<string, number>;
61
+ requestsByDay: Array<{
62
+ date: string;
63
+ count: number;
64
+ }>;
65
+ topEndpoints: Array<{
66
+ endpoint: string;
67
+ count: number;
68
+ }>;
69
+ }>;
70
+ getSummary(): Promise<{
71
+ totalRequests: number;
72
+ totalRequestsThisMonth: number;
73
+ totalMcpCalls: number;
74
+ totalCliCommands: number;
75
+ successRate: number;
76
+ avgResponseTime: number;
77
+ requestsByInterface: Record<string, number>;
78
+ }>;
79
+ };
80
+ };
81
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;GAEG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAG,GAAG,EACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CA8BZ;AAED;;GAEG;AACH,eAAO,MAAM,GAAG;;;qBAYqB,MAAM;6BAAmB,MAAM;;mCAG/B,MAAM;mBAW5B,MAAM;oBACL,MAAM;mBACP,MAAM;wBACD,MAAM;uBACP,MAAM;;;gBAMb,MAAM;mBACH,MAAM;wBACD,MAAM;uBACP,MAAM;uBACN,MAAM;;;;qBAMF,MAAM,kBAAkB,MAAM;gBAEzC,MAAM;iBACL,MAAM;kBACL,MAAM;uBACD,MAAM;uBACN,MAAM;uBACN,MAAM,GAAG,IAAI;;;gBASpB,MAAM;kBACJ,MAAM;uBACD,MAAM;wBACL,MAAM,GAAG,IAAI;uBACd,MAAM;uBACN,MAAM,GAAG,IAAI;;mBAIX,MAAM;;;;2BAQJ,MAAM;oCACG,MAAM;2BACf,MAAM;8BACH,MAAM;yBACX,MAAM;6BACF,MAAM;iCACF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;2BAC5B,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;0BACvC,KAAK,CAAC;gBAAE,QAAQ,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,CAAC;;;2BAMzC,MAAM;oCACG,MAAM;2BACf,MAAM;8BACH,MAAM;yBACX,MAAM;6BACF,MAAM;iCACF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;CAIlD,CAAA"}
package/dist/api.js ADDED
@@ -0,0 +1,90 @@
1
+ /**
2
+ * API Client
3
+ * Makes HTTP requests to the Sentron API
4
+ */
5
+ import { config } from './config.js';
6
+ import { getStoredToken } from './utils/storage.js';
7
+ /**
8
+ * Make an authenticated API request
9
+ */
10
+ export async function apiRequest(endpoint, options = {}) {
11
+ const token = await getStoredToken();
12
+ const headers = {
13
+ 'Content-Type': 'application/json',
14
+ 'X-Request-Source': 'cli',
15
+ ...(options.headers || {}),
16
+ };
17
+ if (token) {
18
+ headers['Authorization'] = `Bearer ${token}`;
19
+ }
20
+ const url = endpoint.startsWith('http') ? endpoint : `${config.baseUrl}${endpoint}`;
21
+ const response = await fetch(url, {
22
+ ...options,
23
+ headers,
24
+ });
25
+ const data = await response.json().catch(() => ({}));
26
+ if (!response.ok || !data.success) {
27
+ const error = new Error(data.error?.message || `Request failed: ${response.status}`);
28
+ error.code = data.error?.code || 'REQUEST_FAILED';
29
+ error.status = response.status;
30
+ throw error;
31
+ }
32
+ return data.data;
33
+ }
34
+ /**
35
+ * API endpoints
36
+ */
37
+ export const api = {
38
+ auth: {
39
+ async signin() {
40
+ const response = await fetch(`${config.baseUrl}/auth/signin`, {
41
+ method: 'POST',
42
+ headers: { 'Content-Type': 'application/json' },
43
+ body: JSON.stringify({}),
44
+ });
45
+ const data = await response.json();
46
+ if (!response.ok) {
47
+ throw new Error(data.error?.message || 'Failed to initiate sign in');
48
+ }
49
+ return data.data;
50
+ },
51
+ async verifyCli(signInAttemptId) {
52
+ const response = await fetch(`${config.baseUrl}/auth/verify-cli`, {
53
+ method: 'POST',
54
+ headers: { 'Content-Type': 'application/json' },
55
+ body: JSON.stringify({ signInAttemptId }),
56
+ });
57
+ const data = await response.json();
58
+ if (!response.ok) {
59
+ throw new Error(data.error?.message || 'Authentication failed');
60
+ }
61
+ return data.data;
62
+ },
63
+ async me() {
64
+ return apiRequest('/auth/me');
65
+ },
66
+ },
67
+ apiKeys: {
68
+ async create(name, expiresInDays) {
69
+ return apiRequest('/api-keys', {
70
+ method: 'POST',
71
+ body: JSON.stringify({ name, expiresInDays }),
72
+ });
73
+ },
74
+ async list() {
75
+ return apiRequest('/api-keys');
76
+ },
77
+ async revoke(id) {
78
+ return apiRequest(`/api-keys/${id}`, { method: 'DELETE' });
79
+ },
80
+ },
81
+ metrics: {
82
+ async get(days = 30) {
83
+ return apiRequest(`/metrics?days=${days}`);
84
+ },
85
+ async getSummary() {
86
+ return apiRequest('/metrics/summary');
87
+ },
88
+ },
89
+ };
90
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Authentication Commands
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupAuthCommands(program: Command): void;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA0DnC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,QA6UjD"}
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Authentication Commands
3
+ */
4
+ import * as readline from 'readline';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+ import { api } from '../api.js';
8
+ import { getStoredToken, storeToken, removeToken, getTokenPath } from '../utils/storage.js';
9
+ import { printHeader, printSection, printSuccess, printError, printInfo, printWarning, printBox, printPrompt, printLoading, printLoadingComplete, printLoadingError, brand, } from '../utils/styling.js';
10
+ const execAsync = promisify(exec);
11
+ /**
12
+ * Prompt for input
13
+ */
14
+ function prompt(question) {
15
+ const rl = readline.createInterface({
16
+ input: process.stdin,
17
+ output: process.stdout,
18
+ });
19
+ return new Promise((resolve) => {
20
+ rl.question(question, (answer) => {
21
+ rl.close();
22
+ resolve(answer.trim());
23
+ });
24
+ });
25
+ }
26
+ /**
27
+ * Open URL in browser
28
+ */
29
+ async function openBrowser(url) {
30
+ try {
31
+ const platform = process.platform;
32
+ if (platform === 'darwin') {
33
+ await execAsync(`open "${url}"`);
34
+ }
35
+ else if (platform === 'win32') {
36
+ await execAsync(`start "${url}"`);
37
+ }
38
+ else {
39
+ await execAsync(`xdg-open "${url}"`);
40
+ }
41
+ }
42
+ catch {
43
+ // Ignore errors
44
+ }
45
+ }
46
+ export function setupAuthCommands(program) {
47
+ const authCmd = program
48
+ .command('auth')
49
+ .description('Authentication commands');
50
+ // Sign in command
51
+ authCmd
52
+ .command('signin')
53
+ .alias('login')
54
+ .description('Sign in via browser')
55
+ .action(async () => {
56
+ try {
57
+ printHeader();
58
+ printSection('Authentication');
59
+ printLoading('Initializing authentication');
60
+ const { authUrl, signInAttemptId } = await api.auth.signin();
61
+ printLoadingComplete();
62
+ printInfo('Opening browser for authentication...');
63
+ console.log();
64
+ printInfo(`If browser doesn't open, visit: ${brand.accent(authUrl)}`);
65
+ console.log();
66
+ await openBrowser(authUrl);
67
+ printLoading('Waiting for authentication in browser');
68
+ // Poll for verification (max 2 minutes)
69
+ const maxAttempts = 60;
70
+ const pollInterval = 2000;
71
+ let verifyResult = null;
72
+ for (let i = 0; i < maxAttempts; i++) {
73
+ try {
74
+ verifyResult = await api.auth.verifyCli(signInAttemptId);
75
+ break;
76
+ }
77
+ catch (error) {
78
+ if (i === maxAttempts - 1) {
79
+ throw new Error('Authentication timeout. Please try again.');
80
+ }
81
+ await new Promise(r => setTimeout(r, pollInterval));
82
+ }
83
+ }
84
+ if (!verifyResult) {
85
+ throw new Error('Authentication failed');
86
+ }
87
+ printLoadingComplete();
88
+ // Create an API key for CLI use
89
+ console.log();
90
+ printSection('API Key Setup');
91
+ printInfo('Creating an API key for CLI access...');
92
+ console.log();
93
+ const apiKeyName = await prompt(printPrompt('API Key Name (e.g., "CLI Key")'));
94
+ if (!apiKeyName) {
95
+ printError('API key name is required');
96
+ process.exit(1);
97
+ }
98
+ const expiresInput = await prompt(printPrompt('Expiration in days (optional, press Enter for no expiration)'));
99
+ const expiresInDays = expiresInput ? parseInt(expiresInput) : undefined;
100
+ if (expiresInput && (isNaN(expiresInDays) || expiresInDays <= 0)) {
101
+ printError('Expiration must be a positive number');
102
+ process.exit(1);
103
+ }
104
+ // Temporarily store JWT to create API key
105
+ await storeToken(verifyResult.token);
106
+ printLoading('Creating API key');
107
+ const keyData = await api.apiKeys.create(apiKeyName, expiresInDays);
108
+ printLoadingComplete();
109
+ // Store API key (replaces JWT)
110
+ await storeToken(keyData.key);
111
+ console.log();
112
+ printSection('Sign In Successful');
113
+ printBox([
114
+ `User ID: ${verifyResult.userId}`,
115
+ `Email: ${verifyResult.email}`,
116
+ verifyResult.firstName ? `Name: ${verifyResult.firstName} ${verifyResult.lastName || ''}`.trim() : '',
117
+ ].filter(Boolean));
118
+ console.log();
119
+ printSection('API Key Created');
120
+ printBox([
121
+ `Name: ${keyData.name}`,
122
+ `Key: ${brand.accent(keyData.key)}`,
123
+ `Prefix: ${brand.muted(keyData.keyPrefix)}...`,
124
+ keyData.expiresAt ? `Expires: ${new Date(keyData.expiresAt).toLocaleDateString()}` : 'Expires: Never',
125
+ ]);
126
+ console.log();
127
+ printInfo(`Credentials saved to ${brand.muted(getTokenPath())}`);
128
+ printWarning('⚠️ Save this API key now! You won\'t be able to see it again.');
129
+ }
130
+ catch (error) {
131
+ printLoadingError();
132
+ console.log();
133
+ printError(error instanceof Error ? error.message : 'Authentication failed');
134
+ process.exit(1);
135
+ }
136
+ });
137
+ // Get account info
138
+ authCmd
139
+ .command('me')
140
+ .alias('whoami')
141
+ .description('Get current account information')
142
+ .option('--json', 'Output as JSON')
143
+ .action(async (options) => {
144
+ try {
145
+ const token = await getStoredToken();
146
+ if (!token) {
147
+ printError('Not signed in. Run "sentron auth signin" first.');
148
+ process.exit(1);
149
+ }
150
+ printLoading('Fetching account information');
151
+ const userInfo = await api.auth.me();
152
+ printLoadingComplete();
153
+ if (options.json) {
154
+ console.log(JSON.stringify(userInfo, null, 2));
155
+ }
156
+ else {
157
+ console.log();
158
+ printSection('Account Information');
159
+ printBox([
160
+ `ID: ${userInfo.id}`,
161
+ `Email: ${userInfo.email}`,
162
+ userInfo.firstName ? `Name: ${userInfo.firstName} ${userInfo.lastName || ''}`.trim() : '',
163
+ `Created: ${new Date(userInfo.createdAt).toLocaleDateString()}`,
164
+ ].filter(Boolean));
165
+ }
166
+ }
167
+ catch (error) {
168
+ printLoadingError();
169
+ console.log();
170
+ printError(error instanceof Error ? error.message : 'Failed to get account info');
171
+ process.exit(1);
172
+ }
173
+ });
174
+ // Status command
175
+ authCmd
176
+ .command('status')
177
+ .description('Check authentication status')
178
+ .action(async () => {
179
+ const token = await getStoredToken();
180
+ if (!token) {
181
+ printSection('Authentication Status');
182
+ printBox([
183
+ `Status: ${brand.warning('Not signed in')}`,
184
+ '',
185
+ `Run ${brand.accent('sentron auth signin')} to sign in`,
186
+ ]);
187
+ return;
188
+ }
189
+ try {
190
+ printLoading('Checking authentication status');
191
+ const userInfo = await api.auth.me();
192
+ printLoadingComplete();
193
+ console.log();
194
+ printSection('Authentication Status');
195
+ printBox([
196
+ `Status: ${brand.success('Signed in')}`,
197
+ `User: ${userInfo.email}`,
198
+ `ID: ${brand.muted(userInfo.id)}`,
199
+ ]);
200
+ }
201
+ catch {
202
+ printLoadingError();
203
+ console.log();
204
+ printSection('Authentication Status');
205
+ printBox([
206
+ `Status: ${brand.error('Invalid token')}`,
207
+ '',
208
+ `Run ${brand.accent('sentron auth signin')} to sign in again`,
209
+ ]);
210
+ }
211
+ });
212
+ // Sign out command
213
+ authCmd
214
+ .command('signout')
215
+ .alias('logout')
216
+ .description('Sign out and remove stored credentials')
217
+ .action(async () => {
218
+ const removed = await removeToken();
219
+ printSection('Sign Out');
220
+ if (removed) {
221
+ printSuccess('Signed out successfully');
222
+ printInfo(`Credentials removed from ${brand.muted(getTokenPath())}`);
223
+ }
224
+ else {
225
+ printInfo('Already signed out');
226
+ }
227
+ });
228
+ // API Key subcommands
229
+ const apiKeyCmd = authCmd
230
+ .command('api-key')
231
+ .alias('apikey')
232
+ .description('Manage API keys');
233
+ // Create API key
234
+ apiKeyCmd
235
+ .command('create')
236
+ .description('Create a new API key')
237
+ .option('-n, --name <name>', 'Name for the API key')
238
+ .option('-e, --expires <days>', 'Expiration in days')
239
+ .action(async (options) => {
240
+ try {
241
+ const token = await getStoredToken();
242
+ if (!token) {
243
+ printError('Not signed in. Run "sentron auth signin" first.');
244
+ process.exit(1);
245
+ }
246
+ const name = options.name || await prompt(printPrompt('API Key Name'));
247
+ if (!name) {
248
+ printError('Name is required');
249
+ process.exit(1);
250
+ }
251
+ const expiresInDays = options.expires ? parseInt(options.expires) : undefined;
252
+ printLoading('Creating API key');
253
+ const result = await api.apiKeys.create(name, expiresInDays);
254
+ printLoadingComplete();
255
+ console.log();
256
+ printSection('API Key Created');
257
+ printBox([
258
+ `Name: ${result.name}`,
259
+ `Key: ${brand.accent(result.key)}`,
260
+ `Prefix: ${brand.muted(result.keyPrefix)}...`,
261
+ `Created: ${new Date(result.createdAt).toLocaleDateString()}`,
262
+ result.expiresAt ? `Expires: ${new Date(result.expiresAt).toLocaleDateString()}` : 'Expires: Never',
263
+ ]);
264
+ console.log();
265
+ printWarning('⚠️ Save this key now! You won\'t be able to see it again.');
266
+ }
267
+ catch (error) {
268
+ printLoadingError();
269
+ console.log();
270
+ printError(error instanceof Error ? error.message : 'Failed to create API key');
271
+ process.exit(1);
272
+ }
273
+ });
274
+ // List API keys
275
+ apiKeyCmd
276
+ .command('list')
277
+ .alias('ls')
278
+ .description('List all your API keys')
279
+ .option('--json', 'Output as JSON')
280
+ .action(async (options) => {
281
+ try {
282
+ const token = await getStoredToken();
283
+ if (!token) {
284
+ printError('Not signed in. Run "sentron auth signin" first.');
285
+ process.exit(1);
286
+ }
287
+ printLoading('Fetching API keys');
288
+ const keys = await api.apiKeys.list();
289
+ printLoadingComplete();
290
+ if (options.json) {
291
+ console.log(JSON.stringify(keys, null, 2));
292
+ }
293
+ else {
294
+ console.log();
295
+ printSection('API Keys');
296
+ if (keys.length === 0) {
297
+ printInfo('No API keys found. Create one with "sentron auth api-key create"');
298
+ }
299
+ else {
300
+ keys.forEach((key) => {
301
+ printBox([
302
+ `ID: ${brand.muted(key.id)}`,
303
+ `Name: ${key.name}`,
304
+ `Prefix: ${key.keyPrefix}...`,
305
+ `Created: ${new Date(key.createdAt).toLocaleDateString()}`,
306
+ key.lastUsedAt ? `Last Used: ${new Date(key.lastUsedAt).toLocaleDateString()}` : 'Last Used: Never',
307
+ key.expiresAt ? `Expires: ${new Date(key.expiresAt).toLocaleDateString()}` : 'Expires: Never',
308
+ ]);
309
+ console.log();
310
+ });
311
+ }
312
+ }
313
+ }
314
+ catch (error) {
315
+ printLoadingError();
316
+ console.log();
317
+ printError(error instanceof Error ? error.message : 'Failed to list API keys');
318
+ process.exit(1);
319
+ }
320
+ });
321
+ // Revoke API key
322
+ apiKeyCmd
323
+ .command('revoke <id>')
324
+ .alias('delete')
325
+ .description('Revoke an API key')
326
+ .action(async (id) => {
327
+ try {
328
+ const token = await getStoredToken();
329
+ if (!token) {
330
+ printError('Not signed in. Run "sentron auth signin" first.');
331
+ process.exit(1);
332
+ }
333
+ printLoading('Revoking API key');
334
+ await api.apiKeys.revoke(id);
335
+ printLoadingComplete();
336
+ console.log();
337
+ printSection('API Key Revoked');
338
+ printSuccess('API key revoked successfully');
339
+ }
340
+ catch (error) {
341
+ printLoadingError();
342
+ console.log();
343
+ printError(error instanceof Error ? error.message : 'Failed to revoke API key');
344
+ process.exit(1);
345
+ }
346
+ });
347
+ }
348
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Metrics Commands
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare function setupMetricsCommands(program: Command): void;
6
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,QAuKpD"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Metrics Commands
3
+ */
4
+ import { api } from '../api.js';
5
+ import { getStoredToken } from '../utils/storage.js';
6
+ import { printSection, printError, printInfo, printBox, printLoading, printLoadingComplete, printLoadingError, brand, } from '../utils/styling.js';
7
+ export function setupMetricsCommands(program) {
8
+ const metricsCmd = program
9
+ .command('metrics')
10
+ .description('View usage metrics');
11
+ // Get metrics summary
12
+ metricsCmd
13
+ .command('summary')
14
+ .alias('s')
15
+ .description('Get usage summary')
16
+ .option('--json', 'Output as JSON')
17
+ .action(async (options) => {
18
+ try {
19
+ const token = await getStoredToken();
20
+ if (!token) {
21
+ printError('Not signed in. Run "sentron auth signin" first.');
22
+ process.exit(1);
23
+ }
24
+ printLoading('Fetching metrics');
25
+ const metrics = await api.metrics.getSummary();
26
+ printLoadingComplete();
27
+ if (options.json) {
28
+ console.log(JSON.stringify(metrics, null, 2));
29
+ }
30
+ else {
31
+ console.log();
32
+ printSection('Usage Summary');
33
+ printBox([
34
+ `Total Requests: ${brand.accent(metrics.totalRequests.toString())}`,
35
+ `This Month: ${metrics.totalRequestsThisMonth}`,
36
+ `MCP Calls: ${metrics.totalMcpCalls}`,
37
+ `CLI Commands: ${metrics.totalCliCommands}`,
38
+ `Success Rate: ${brand.success(metrics.successRate + '%')}`,
39
+ `Avg Response Time: ${metrics.avgResponseTime}ms`,
40
+ ]);
41
+ if (Object.keys(metrics.requestsByInterface).length > 0) {
42
+ console.log();
43
+ printSection('By Interface');
44
+ printBox(Object.entries(metrics.requestsByInterface).map(([iface, count]) => `${iface.padEnd(10)} ${count}`));
45
+ }
46
+ }
47
+ }
48
+ catch (error) {
49
+ printLoadingError();
50
+ console.log();
51
+ printError(error instanceof Error ? error.message : 'Failed to get metrics');
52
+ process.exit(1);
53
+ }
54
+ });
55
+ // Get detailed metrics
56
+ metricsCmd
57
+ .command('get')
58
+ .alias('show')
59
+ .description('Get detailed usage metrics')
60
+ .option('-d, --days <days>', 'Number of days to include', '30')
61
+ .option('--json', 'Output as JSON')
62
+ .action(async (options) => {
63
+ try {
64
+ const token = await getStoredToken();
65
+ if (!token) {
66
+ printError('Not signed in. Run "sentron auth signin" first.');
67
+ process.exit(1);
68
+ }
69
+ const days = parseInt(options.days) || 30;
70
+ printLoading(`Fetching metrics for last ${days} days`);
71
+ const metrics = await api.metrics.get(days);
72
+ printLoadingComplete();
73
+ if (options.json) {
74
+ console.log(JSON.stringify(metrics, null, 2));
75
+ }
76
+ else {
77
+ console.log();
78
+ printSection('Usage Metrics');
79
+ printBox([
80
+ `Total Requests: ${brand.accent(metrics.totalRequests.toString())}`,
81
+ `This Month: ${metrics.totalRequestsThisMonth}`,
82
+ `MCP Calls: ${metrics.totalMcpCalls}`,
83
+ `CLI Commands: ${metrics.totalCliCommands}`,
84
+ `Success Rate: ${brand.success(metrics.successRate + '%')}`,
85
+ `Avg Response Time: ${metrics.avgResponseTime}ms`,
86
+ ]);
87
+ if (Object.keys(metrics.requestsByInterface).length > 0) {
88
+ console.log();
89
+ printSection('By Interface');
90
+ printBox(Object.entries(metrics.requestsByInterface).map(([iface, count]) => `${iface.padEnd(10)} ${count}`));
91
+ }
92
+ if (metrics.topEndpoints && metrics.topEndpoints.length > 0) {
93
+ console.log();
94
+ printSection('Top Endpoints');
95
+ printBox(metrics.topEndpoints.slice(0, 5).map((ep) => `${ep.endpoint.padEnd(25)} ${ep.count}`));
96
+ }
97
+ if (metrics.requestsByDay && metrics.requestsByDay.length > 0) {
98
+ console.log();
99
+ printSection('Daily Activity (Last 7 Days)');
100
+ const recent = metrics.requestsByDay.slice(-7);
101
+ printBox(recent.map((day) => {
102
+ const date = new Date(day.date).toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });
103
+ const bar = '█'.repeat(Math.min(day.count, 20));
104
+ return `${date.padEnd(15)} ${bar} ${day.count}`;
105
+ }));
106
+ }
107
+ }
108
+ }
109
+ catch (error) {
110
+ printLoadingError();
111
+ console.log();
112
+ printError(error instanceof Error ? error.message : 'Failed to get metrics');
113
+ process.exit(1);
114
+ }
115
+ });
116
+ // Default action - show summary
117
+ metricsCmd
118
+ .action(async () => {
119
+ try {
120
+ const token = await getStoredToken();
121
+ if (!token) {
122
+ printError('Not signed in. Run "sentron auth signin" first.');
123
+ process.exit(1);
124
+ }
125
+ printLoading('Fetching metrics');
126
+ const metrics = await api.metrics.getSummary();
127
+ printLoadingComplete();
128
+ console.log();
129
+ printSection('Usage Summary');
130
+ printBox([
131
+ `Total Requests: ${brand.accent(metrics.totalRequests.toString())}`,
132
+ `This Month: ${metrics.totalRequestsThisMonth}`,
133
+ `MCP Calls: ${metrics.totalMcpCalls}`,
134
+ `CLI Commands: ${metrics.totalCliCommands}`,
135
+ `Success Rate: ${brand.success(metrics.successRate + '%')}`,
136
+ `Avg Response Time: ${metrics.avgResponseTime}ms`,
137
+ ]);
138
+ console.log();
139
+ printInfo('Run "sentron metrics get" for detailed metrics');
140
+ printInfo('Run "sentron metrics --help" for more options');
141
+ }
142
+ catch (error) {
143
+ printLoadingError();
144
+ console.log();
145
+ printError(error instanceof Error ? error.message : 'Failed to get metrics');
146
+ process.exit(1);
147
+ }
148
+ });
149
+ }
150
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/commands/metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,GACN,MAAM,qBAAqB,CAAA;AAE5B,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,UAAU,GAAG,OAAO;SACvB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,oBAAoB,CAAC,CAAA;IAEpC,sBAAsB;IACtB,UAAU;SACP,OAAO,CAAC,SAAS,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAA;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,UAAU,CAAC,iDAAiD,CAAC,CAAA;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YAED,YAAY,CAAC,kBAAkB,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;YAC9C,oBAAoB,EAAE,CAAA;YAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,EAAE,CAAA;gBACb,YAAY,CAAC,eAAe,CAAC,CAAA;gBAC7B,QAAQ,CAAC;oBACP,uBAAuB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE;oBACvE,uBAAuB,OAAO,CAAC,sBAAsB,EAAE;oBACvD,uBAAuB,OAAO,CAAC,aAAa,EAAE;oBAC9C,uBAAuB,OAAO,CAAC,gBAAgB,EAAE;oBACjD,uBAAuB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,EAAE;oBACjE,uBAAuB,OAAO,CAAC,eAAe,IAAI;iBACnD,CAAC,CAAA;gBAEF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxD,OAAO,CAAC,GAAG,EAAE,CAAA;oBACb,YAAY,CAAC,cAAc,CAAC,CAAA;oBAC5B,QAAQ,CACN,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAC7C,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CACnD,CACF,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,EAAE,CAAA;YACnB,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAA;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,uBAAuB;IACvB,UAAU;SACP,OAAO,CAAC,KAAK,CAAC;SACd,KAAK,CAAC,MAAM,CAAC;SACb,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,EAAE,IAAI,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAA;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,UAAU,CAAC,iDAAiD,CAAC,CAAA;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAEzC,YAAY,CAAC,6BAA6B,IAAI,OAAO,CAAC,CAAA;YACtD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3C,oBAAoB,EAAE,CAAA;YAEtB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,EAAE,CAAA;gBACb,YAAY,CAAC,eAAe,CAAC,CAAA;gBAC7B,QAAQ,CAAC;oBACP,uBAAuB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE;oBACvE,uBAAuB,OAAO,CAAC,sBAAsB,EAAE;oBACvD,uBAAuB,OAAO,CAAC,aAAa,EAAE;oBAC9C,uBAAuB,OAAO,CAAC,gBAAgB,EAAE;oBACjD,uBAAuB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,EAAE;oBACjE,uBAAuB,OAAO,CAAC,eAAe,IAAI;iBACnD,CAAC,CAAA;gBAEF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxD,OAAO,CAAC,GAAG,EAAE,CAAA;oBACb,YAAY,CAAC,cAAc,CAAC,CAAA;oBAC5B,QAAQ,CACN,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAC7C,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CACnD,CACF,CAAA;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5D,OAAO,CAAC,GAAG,EAAE,CAAA;oBACb,YAAY,CAAC,eAAe,CAAC,CAAA;oBAC7B,QAAQ,CACN,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAClC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAChD,CACF,CAAA;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9D,OAAO,CAAC,GAAG,EAAE,CAAA;oBACb,YAAY,CAAC,8BAA8B,CAAC,CAAA;oBAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC9C,QAAQ,CACN,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;wBACjB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAA;wBACjH,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;wBAC/C,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAA;oBACjD,CAAC,CAAC,CACH,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,EAAE,CAAA;YACnB,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAA;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,gCAAgC;IAChC,UAAU;SACP,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAA;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,UAAU,CAAC,iDAAiD,CAAC,CAAA;gBAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YAED,YAAY,CAAC,kBAAkB,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAA;YAC9C,oBAAoB,EAAE,CAAA;YAEtB,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,YAAY,CAAC,eAAe,CAAC,CAAA;YAC7B,QAAQ,CAAC;gBACP,uBAAuB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACvE,uBAAuB,OAAO,CAAC,sBAAsB,EAAE;gBACvD,uBAAuB,OAAO,CAAC,aAAa,EAAE;gBAC9C,uBAAuB,OAAO,CAAC,gBAAgB,EAAE;gBACjD,uBAAuB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,EAAE;gBACjE,uBAAuB,OAAO,CAAC,eAAe,IAAI;aACnD,CAAC,CAAA;YAEF,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,SAAS,CAAC,gDAAgD,CAAC,CAAA;YAC3D,SAAS,CAAC,+CAA+C,CAAC,CAAA;QAE5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,EAAE,CAAA;YACnB,OAAO,CAAC,GAAG,EAAE,CAAA;YACb,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAA;YAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI Configuration
3
+ */
4
+ export declare const config: {
5
+ apiUrl: string;
6
+ apiVersion: string;
7
+ readonly baseUrl: string;
8
+ };
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;CAWlB,CAAA"}
package/dist/config.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * CLI Configuration
3
+ */
4
+ export const config = {
5
+ // Production API URL
6
+ apiUrl: process.env.SENTRON_API_URL || 'https://api.sentron.dev',
7
+ // API version
8
+ apiVersion: 'v1',
9
+ // Get full API base URL
10
+ get baseUrl() {
11
+ return `${this.apiUrl}/api/${this.apiVersion}`;
12
+ },
13
+ };
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,yBAAyB;IAEhE,cAAc;IACd,UAAU,EAAE,IAAI;IAEhB,wBAAwB;IACxB,IAAI,OAAO;QACT,OAAO,GAAG,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAA;IAChD,CAAC;CACF,CAAA"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Sentron CLI
4
+ * Command-line interface for Sentron API
5
+ *
6
+ * Usage:
7
+ * npx @sentron/cli auth signin
8
+ * npx @sentron/cli auth me
9
+ * npx @sentron/cli metrics
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Sentron CLI
4
+ * Command-line interface for Sentron API
5
+ *
6
+ * Usage:
7
+ * npx @sentron/cli auth signin
8
+ * npx @sentron/cli auth me
9
+ * npx @sentron/cli metrics
10
+ */
11
+ import { Command } from 'commander';
12
+ import { setupAuthCommands } from './commands/auth.js';
13
+ import { setupMetricsCommands } from './commands/metrics.js';
14
+ const program = new Command();
15
+ program
16
+ .name('sentron')
17
+ .description('Sentron CLI - Command-line interface for Sentron API')
18
+ .version('1.0.0');
19
+ // Setup command groups
20
+ setupAuthCommands(program);
21
+ setupMetricsCommands(program);
22
+ // Parse arguments
23
+ program.parse();
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,uBAAuB;AACvB,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC1B,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAE7B,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Token Storage
3
+ * Stores API key in ~/.sentron/token
4
+ */
5
+ /**
6
+ * Get stored token (API key)
7
+ */
8
+ export declare function getStoredToken(): Promise<string | null>;
9
+ /**
10
+ * Store token (API key) to file
11
+ */
12
+ export declare function storeToken(token: string): Promise<void>;
13
+ /**
14
+ * Remove stored token
15
+ */
16
+ export declare function removeToken(): Promise<boolean>;
17
+ /**
18
+ * Get token file path
19
+ */
20
+ export declare function getTokenPath(): string;
21
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU7D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAOpD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Token Storage
3
+ * Stores API key in ~/.sentron/token
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import * as path from 'path';
7
+ import { existsSync } from 'fs';
8
+ const TOKEN_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '', '.sentron');
9
+ const TOKEN_FILE = path.join(TOKEN_DIR, 'token');
10
+ /**
11
+ * Get stored token (API key)
12
+ */
13
+ export async function getStoredToken() {
14
+ try {
15
+ if (!existsSync(TOKEN_FILE)) {
16
+ return null;
17
+ }
18
+ const token = await fs.readFile(TOKEN_FILE, 'utf-8');
19
+ return token.trim() || null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /**
26
+ * Store token (API key) to file
27
+ */
28
+ export async function storeToken(token) {
29
+ await fs.mkdir(TOKEN_DIR, { recursive: true });
30
+ await fs.writeFile(TOKEN_FILE, token, { mode: 0o600 });
31
+ }
32
+ /**
33
+ * Remove stored token
34
+ */
35
+ export async function removeToken() {
36
+ try {
37
+ await fs.unlink(TOKEN_FILE);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Get token file path
46
+ */
47
+ export function getTokenPath() {
48
+ return TOKEN_FILE;
49
+ }
50
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,UAAU,CAAC,CAAA;AAC1F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACpD,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAA;AACnB,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * CLI Styling Utilities
3
+ * Beautiful terminal output
4
+ */
5
+ import kleur from 'kleur';
6
+ export declare const brand: {
7
+ primary: kleur.Color;
8
+ accent: kleur.Color;
9
+ success: kleur.Color;
10
+ warning: kleur.Color;
11
+ error: kleur.Color;
12
+ muted: kleur.Color;
13
+ bold: kleur.Color;
14
+ };
15
+ export declare const text: {
16
+ dim: kleur.Color;
17
+ bold: kleur.Color;
18
+ italic: kleur.Color;
19
+ underline: kleur.Color;
20
+ };
21
+ /**
22
+ * Print header with logo
23
+ */
24
+ export declare function printHeader(): void;
25
+ /**
26
+ * Print section header
27
+ */
28
+ export declare function printSection(title: string): void;
29
+ /**
30
+ * Print success message
31
+ */
32
+ export declare function printSuccess(message: string): void;
33
+ /**
34
+ * Print error message
35
+ */
36
+ export declare function printError(message: string): void;
37
+ /**
38
+ * Print info message
39
+ */
40
+ export declare function printInfo(message: string): void;
41
+ /**
42
+ * Print warning message
43
+ */
44
+ export declare function printWarning(message: string): void;
45
+ /**
46
+ * Print a box with content
47
+ */
48
+ export declare function printBox(lines: string[]): void;
49
+ /**
50
+ * Print prompt
51
+ */
52
+ export declare function printPrompt(question: string): string;
53
+ /**
54
+ * Start loading animation
55
+ */
56
+ export declare function printLoading(message: string): void;
57
+ /**
58
+ * Complete loading with success
59
+ */
60
+ export declare function printLoadingComplete(): void;
61
+ /**
62
+ * Complete loading with error
63
+ */
64
+ export declare function printLoadingError(): void;
65
+ //# sourceMappingURL=styling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styling.d.ts","sourceRoot":"","sources":["../../src/utils/styling.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,eAAO,MAAM,KAAK;;;;;;;;CAQjB,CAAA;AAED,eAAO,MAAM,IAAI;;;;;CAKhB,CAAA;AAED;;GAEG;AACH,wBAAgB,WAAW,SAM1B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAEzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAE3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAEzC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,QAExC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAE3C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAWvC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAW3C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,SAMnC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,SAMhC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * CLI Styling Utilities
3
+ * Beautiful terminal output
4
+ */
5
+ import kleur from 'kleur';
6
+ // Brand colors
7
+ export const brand = {
8
+ primary: kleur.cyan,
9
+ accent: kleur.magenta,
10
+ success: kleur.green,
11
+ warning: kleur.yellow,
12
+ error: kleur.red,
13
+ muted: kleur.gray,
14
+ bold: kleur.bold,
15
+ };
16
+ export const text = {
17
+ dim: kleur.dim,
18
+ bold: kleur.bold,
19
+ italic: kleur.italic,
20
+ underline: kleur.underline,
21
+ };
22
+ /**
23
+ * Print header with logo
24
+ */
25
+ export function printHeader() {
26
+ console.log();
27
+ console.log(brand.primary(' ╭─────────────────────────────────────╮'));
28
+ console.log(brand.primary(' │') + brand.bold(' SENTRON CLI ') + brand.primary('│'));
29
+ console.log(brand.primary(' ╰─────────────────────────────────────╯'));
30
+ console.log();
31
+ }
32
+ /**
33
+ * Print section header
34
+ */
35
+ export function printSection(title) {
36
+ console.log(brand.bold(brand.primary(`▸ ${title}`)));
37
+ }
38
+ /**
39
+ * Print success message
40
+ */
41
+ export function printSuccess(message) {
42
+ console.log(brand.success('✔ ') + message);
43
+ }
44
+ /**
45
+ * Print error message
46
+ */
47
+ export function printError(message) {
48
+ console.log(brand.error('✖ ') + message);
49
+ }
50
+ /**
51
+ * Print info message
52
+ */
53
+ export function printInfo(message) {
54
+ console.log(brand.muted('ℹ ') + message);
55
+ }
56
+ /**
57
+ * Print warning message
58
+ */
59
+ export function printWarning(message) {
60
+ console.log(brand.warning('⚠ ') + message);
61
+ }
62
+ /**
63
+ * Print a box with content
64
+ */
65
+ export function printBox(lines) {
66
+ const maxLen = Math.max(...lines.map(l => stripAnsi(l).length), 30);
67
+ const border = brand.muted('─'.repeat(maxLen + 4));
68
+ console.log(brand.muted('┌') + border + brand.muted('┐'));
69
+ lines.forEach(line => {
70
+ const stripped = stripAnsi(line);
71
+ const padding = ' '.repeat(maxLen - stripped.length);
72
+ console.log(brand.muted('│') + ' ' + line + padding + ' ' + brand.muted('│'));
73
+ });
74
+ console.log(brand.muted('└') + border + brand.muted('┘'));
75
+ }
76
+ /**
77
+ * Print prompt
78
+ */
79
+ export function printPrompt(question) {
80
+ return brand.primary('? ') + question + brand.muted(': ');
81
+ }
82
+ // Loading state
83
+ let loadingInterval = null;
84
+ let loadingMessage = '';
85
+ /**
86
+ * Start loading animation
87
+ */
88
+ export function printLoading(message) {
89
+ loadingMessage = message;
90
+ const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
91
+ let i = 0;
92
+ process.stdout.write(brand.primary(frames[0]) + ' ' + message);
93
+ loadingInterval = setInterval(() => {
94
+ i = (i + 1) % frames.length;
95
+ process.stdout.write(`\r${brand.primary(frames[i])} ${message}`);
96
+ }, 80);
97
+ }
98
+ /**
99
+ * Complete loading with success
100
+ */
101
+ export function printLoadingComplete() {
102
+ if (loadingInterval) {
103
+ clearInterval(loadingInterval);
104
+ loadingInterval = null;
105
+ }
106
+ process.stdout.write(`\r${brand.success('✔')} ${loadingMessage}\n`);
107
+ }
108
+ /**
109
+ * Complete loading with error
110
+ */
111
+ export function printLoadingError() {
112
+ if (loadingInterval) {
113
+ clearInterval(loadingInterval);
114
+ loadingInterval = null;
115
+ }
116
+ process.stdout.write(`\r${brand.error('✖')} ${loadingMessage}\n`);
117
+ }
118
+ /**
119
+ * Strip ANSI codes from string
120
+ */
121
+ function stripAnsi(str) {
122
+ return str.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
123
+ }
124
+ //# sourceMappingURL=styling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styling.js","sourceRoot":"","sources":["../../src/utils/styling.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "sentron-cli",
3
+ "version": "1.0.0",
4
+ "description": "Sentron CLI - Command-line interface for Sentron API",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "sentron": "./dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "sentron",
17
+ "cli",
18
+ "api",
19
+ "mcp"
20
+ ],
21
+ "author": "Sentron",
22
+ "license": "MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/sentron-dev/sentron"
26
+ },
27
+ "homepage": "https://sentron.dev",
28
+ "engines": {
29
+ "node": ">=18.0.0"
30
+ },
31
+ "dependencies": {
32
+ "commander": "^12.0.0",
33
+ "kleur": "^4.1.5"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^20.11.0",
37
+ "tsx": "^4.7.0",
38
+ "typescript": "^5.3.3"
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md"
43
+ ]
44
+ }
45
+