cloudops-cli 0.1.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 (86) hide show
  1. package/README.md +132 -0
  2. package/dist/api/api-client.d.ts +78 -0
  3. package/dist/api/api-client.d.ts.map +1 -0
  4. package/dist/api/api-client.js +197 -0
  5. package/dist/api/api-client.js.map +1 -0
  6. package/dist/api/index.d.ts +3 -0
  7. package/dist/api/index.d.ts.map +1 -0
  8. package/dist/api/index.js +8 -0
  9. package/dist/api/index.js.map +1 -0
  10. package/dist/auth/__mocks__/auth-handler.d.ts +27 -0
  11. package/dist/auth/__mocks__/auth-handler.d.ts.map +1 -0
  12. package/dist/auth/__mocks__/auth-handler.js +24 -0
  13. package/dist/auth/__mocks__/auth-handler.js.map +1 -0
  14. package/dist/auth/auth-handler.d.ts +80 -0
  15. package/dist/auth/auth-handler.d.ts.map +1 -0
  16. package/dist/auth/auth-handler.js +266 -0
  17. package/dist/auth/auth-handler.js.map +1 -0
  18. package/dist/auth/callback-server.d.ts +31 -0
  19. package/dist/auth/callback-server.d.ts.map +1 -0
  20. package/dist/auth/callback-server.js +143 -0
  21. package/dist/auth/callback-server.js.map +1 -0
  22. package/dist/auth/index.d.ts +3 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +8 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +422 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/commands/accounts.d.ts +15 -0
  31. package/dist/commands/accounts.d.ts.map +1 -0
  32. package/dist/commands/accounts.js +307 -0
  33. package/dist/commands/accounts.js.map +1 -0
  34. package/dist/commands/audit.d.ts +23 -0
  35. package/dist/commands/audit.d.ts.map +1 -0
  36. package/dist/commands/audit.js +348 -0
  37. package/dist/commands/audit.js.map +1 -0
  38. package/dist/commands/config.d.ts +15 -0
  39. package/dist/commands/config.d.ts.map +1 -0
  40. package/dist/commands/config.js +148 -0
  41. package/dist/commands/config.js.map +1 -0
  42. package/dist/commands/incident.d.ts +59 -0
  43. package/dist/commands/incident.d.ts.map +1 -0
  44. package/dist/commands/incident.js +1032 -0
  45. package/dist/commands/incident.js.map +1 -0
  46. package/dist/commands/init.d.ts +9 -0
  47. package/dist/commands/init.d.ts.map +1 -0
  48. package/dist/commands/init.js +300 -0
  49. package/dist/commands/init.js.map +1 -0
  50. package/dist/commands/investigate.d.ts +15 -0
  51. package/dist/commands/investigate.d.ts.map +1 -0
  52. package/dist/commands/investigate.js +65 -0
  53. package/dist/commands/investigate.js.map +1 -0
  54. package/dist/commands/runbook.d.ts +20 -0
  55. package/dist/commands/runbook.d.ts.map +1 -0
  56. package/dist/commands/runbook.js +265 -0
  57. package/dist/commands/runbook.js.map +1 -0
  58. package/dist/config/__mocks__/config-handler.d.ts +11 -0
  59. package/dist/config/__mocks__/config-handler.d.ts.map +1 -0
  60. package/dist/config/__mocks__/config-handler.js +31 -0
  61. package/dist/config/__mocks__/config-handler.js.map +1 -0
  62. package/dist/config/certificate-pinning.d.ts +68 -0
  63. package/dist/config/certificate-pinning.d.ts.map +1 -0
  64. package/dist/config/certificate-pinning.js +249 -0
  65. package/dist/config/certificate-pinning.js.map +1 -0
  66. package/dist/config/config-handler.d.ts +45 -0
  67. package/dist/config/config-handler.d.ts.map +1 -0
  68. package/dist/config/config-handler.js +149 -0
  69. package/dist/config/config-handler.js.map +1 -0
  70. package/dist/config/index.d.ts +2 -0
  71. package/dist/config/index.d.ts.map +1 -0
  72. package/dist/config/index.js +7 -0
  73. package/dist/config/index.js.map +1 -0
  74. package/dist/index.d.ts +4 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +25 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/types/cli-options.d.ts +31 -0
  79. package/dist/types/cli-options.d.ts.map +1 -0
  80. package/dist/types/cli-options.js +3 -0
  81. package/dist/types/cli-options.js.map +1 -0
  82. package/dist/utils/output-formatter.d.ts +67 -0
  83. package/dist/utils/output-formatter.d.ts.map +1 -0
  84. package/dist/utils/output-formatter.js +147 -0
  85. package/dist/utils/output-formatter.js.map +1 -0
  86. package/package.json +65 -0
package/README.md ADDED
@@ -0,0 +1,132 @@
1
+ # CloudOps CLI
2
+
3
+ CloudOps Enterprise CLI - AI-assisted cloud operations control plane
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @cloudops/cli
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```bash
14
+ cloudops [options] [command]
15
+ ```
16
+
17
+ ### Global Options
18
+
19
+ All commands support the following global options:
20
+
21
+ - `--config <path>` - Path to config file (default: `~/.cloudops/config.yaml`)
22
+ - `--profile <name>` - AI model profile to use for this command
23
+ - `--debug` - Enable debug output
24
+
25
+ ### Examples
26
+
27
+ ```bash
28
+ # Use custom config file
29
+ cloudops --config /path/to/config.yaml investigate "high CPU usage"
30
+
31
+ # Use specific AI model profile
32
+ cloudops --profile production incident inc-123 diagnose
33
+
34
+ # Enable debug output
35
+ cloudops --debug config show
36
+ ```
37
+
38
+ ## Output Formatting
39
+
40
+ The CLI uses consistent formatting for all output:
41
+
42
+ - **Success messages**: Green checkmark (✓)
43
+ - **Error messages**: Red X (✗)
44
+ - **Warning messages**: Yellow warning symbol (⚠)
45
+ - **Info messages**: Blue info symbol (ℹ)
46
+ - **Debug messages**: Gray arrow (→) - only shown with `--debug`
47
+
48
+ ### Tables
49
+
50
+ The CLI can display data in formatted tables:
51
+
52
+ ```typescript
53
+ import { OutputFormatter } from '@cloudops/cli';
54
+
55
+ // Simple table
56
+ OutputFormatter.table(
57
+ ['Name', 'Status', 'Count'],
58
+ [
59
+ ['Item 1', 'Active', '10'],
60
+ ['Item 2', 'Inactive', '5']
61
+ ]
62
+ );
63
+
64
+ // Key-value table
65
+ OutputFormatter.keyValue({
66
+ 'Incident ID': 'inc-123',
67
+ 'Status': 'active',
68
+ 'Created': '2024-01-01'
69
+ });
70
+ ```
71
+
72
+ ### JSON Output
73
+
74
+ ```typescript
75
+ // Pretty JSON (default)
76
+ OutputFormatter.json({ key: 'value' });
77
+
78
+ // Compact JSON
79
+ OutputFormatter.json({ key: 'value' }, false);
80
+ ```
81
+
82
+ ## Development
83
+
84
+ ### Build
85
+
86
+ ```bash
87
+ npm run build
88
+ ```
89
+
90
+ ### Test
91
+
92
+ ```bash
93
+ npm test
94
+ ```
95
+
96
+ ### Type Check
97
+
98
+ ```bash
99
+ npm run typecheck
100
+ ```
101
+
102
+ ## Architecture
103
+
104
+ The CLI is built with:
105
+
106
+ - **Commander.js** - Command parsing and argument handling
107
+ - **Chalk** - Terminal colors and styling
108
+ - **cli-table3** - Formatted table output
109
+ - **Inquirer** - Interactive prompts
110
+ - **Axios** - HTTP client for API calls
111
+
112
+ ### Project Structure
113
+
114
+ ```
115
+ src/
116
+ ├── cli.ts # Main CLI entry point
117
+ ├── config/ # Configuration management
118
+ │ └── config-handler.ts
119
+ ├── utils/ # Utility functions
120
+ │ └── output-formatter.ts # Output formatting utilities
121
+ └── types/ # TypeScript type definitions
122
+ └── cli-options.ts
123
+ ```
124
+
125
+ ## Requirements
126
+
127
+ - Node.js 18.x or higher
128
+ - TypeScript 5.x
129
+
130
+ ## License
131
+
132
+ Proprietary - CloudOps Enterprise
@@ -0,0 +1,78 @@
1
+ import { AxiosRequestConfig } from 'axios';
2
+ import { AuthHandler } from '../auth/auth-handler';
3
+ import { ConfigHandler } from '../config/config-handler';
4
+ /**
5
+ * API error with additional context
6
+ */
7
+ export declare class APIError extends Error {
8
+ statusCode?: number | undefined;
9
+ code?: string | undefined;
10
+ details?: any | undefined;
11
+ constructor(message: string, statusCode?: number | undefined, code?: string | undefined, details?: any | undefined);
12
+ }
13
+ /**
14
+ * API client configuration
15
+ */
16
+ export interface APIClientConfig {
17
+ baseURL: string;
18
+ timeout?: number;
19
+ maxRetries?: number;
20
+ retryDelay?: number;
21
+ }
22
+ /**
23
+ * HTTP client for control plane API
24
+ * Handles authentication, retries, and error handling
25
+ */
26
+ export declare class APIClient {
27
+ private client;
28
+ private authHandler;
29
+ private configHandler;
30
+ private maxRetries;
31
+ private retryDelay;
32
+ constructor(config: APIClientConfig, authHandler: AuthHandler, configHandler: ConfigHandler);
33
+ /**
34
+ * Add JWT token to request headers
35
+ */
36
+ private addAuthHeader;
37
+ /**
38
+ * Handle response errors with retries
39
+ */
40
+ private handleResponseError;
41
+ /**
42
+ * Check if error is retryable
43
+ */
44
+ private isRetryableError;
45
+ /**
46
+ * Convert axios error to APIError
47
+ */
48
+ private convertToAPIError;
49
+ /**
50
+ * Sleep for specified milliseconds
51
+ */
52
+ private sleep;
53
+ /**
54
+ * Make GET request
55
+ */
56
+ get<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
57
+ /**
58
+ * Make POST request
59
+ */
60
+ post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
61
+ /**
62
+ * Make PUT request
63
+ */
64
+ put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
65
+ /**
66
+ * Make DELETE request
67
+ */
68
+ delete<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
69
+ /**
70
+ * Make PATCH request
71
+ */
72
+ patch<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
73
+ }
74
+ /**
75
+ * Create API client from CLI configuration
76
+ */
77
+ export declare function createAPIClient(configHandler?: ConfigHandler, authHandler?: AuthHandler): APIClient;
78
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/api/api-client.ts"],"names":[],"mappings":"AAAA,OAAc,EAA6B,kBAAkB,EAA8B,MAAM,OAAO,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAGxB,UAAU,CAAC,EAAE,MAAM;IACnB,IAAI,CAAC,EAAE,MAAM;IACb,OAAO,CAAC,EAAE,GAAG;gBAHpB,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,GAAG,YAAA;CAKvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAGzB,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa;IA6B9B;;OAEG;YACW,aAAa;IAqC3B;;OAEG;YACW,mBAAmB;IAqBjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKlE;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/E;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK9E;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKrE;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;CAIjF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,aAAa,CAAC,EAAE,aAAa,EAC7B,WAAW,CAAC,EAAE,WAAW,GACxB,SAAS,CAgBX"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.APIClient = exports.APIError = void 0;
7
+ exports.createAPIClient = createAPIClient;
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const auth_handler_1 = require("../auth/auth-handler");
10
+ const config_handler_1 = require("../config/config-handler");
11
+ /**
12
+ * API error with additional context
13
+ */
14
+ class APIError extends Error {
15
+ statusCode;
16
+ code;
17
+ details;
18
+ constructor(message, statusCode, code, details) {
19
+ super(message);
20
+ this.statusCode = statusCode;
21
+ this.code = code;
22
+ this.details = details;
23
+ this.name = 'APIError';
24
+ }
25
+ }
26
+ exports.APIError = APIError;
27
+ /**
28
+ * HTTP client for control plane API
29
+ * Handles authentication, retries, and error handling
30
+ */
31
+ class APIClient {
32
+ client;
33
+ authHandler;
34
+ configHandler;
35
+ maxRetries;
36
+ retryDelay;
37
+ constructor(config, authHandler, configHandler) {
38
+ this.authHandler = authHandler;
39
+ this.configHandler = configHandler;
40
+ this.maxRetries = config.maxRetries || 3;
41
+ this.retryDelay = config.retryDelay || 1000;
42
+ // Create axios instance
43
+ this.client = axios_1.default.create({
44
+ baseURL: config.baseURL,
45
+ timeout: config.timeout || 30000,
46
+ headers: {
47
+ 'Content-Type': 'application/json',
48
+ },
49
+ });
50
+ // Add request interceptor to inject JWT token
51
+ this.client.interceptors.request.use(async (config) => this.addAuthHeader(config), (error) => Promise.reject(error));
52
+ // Add response interceptor for error handling
53
+ this.client.interceptors.response.use((response) => response, async (error) => this.handleResponseError(error));
54
+ }
55
+ /**
56
+ * Add JWT token to request headers
57
+ */
58
+ async addAuthHeader(config) {
59
+ try {
60
+ const cliConfig = this.configHandler.readConfig();
61
+ let token = null;
62
+ // Check auth method
63
+ if (cliConfig.auth.method === 'sso' || cliConfig.auth.method === 'oauth') {
64
+ // Use SSO/OAuth flow - get token from auth handler
65
+ if (cliConfig.auth.sso_url) {
66
+ token = await this.authHandler.getAccessToken(cliConfig.auth.sso_url, cliConfig.tenant_id);
67
+ }
68
+ }
69
+ else if (cliConfig.auth.method === 'api_key') {
70
+ // For API key auth, try to get token from auth handler storage
71
+ token = await this.authHandler.getAccessToken(cliConfig.control_plane_url, cliConfig.tenant_id);
72
+ }
73
+ if (token) {
74
+ config.headers.Authorization = `Bearer ${token}`;
75
+ }
76
+ }
77
+ catch (error) {
78
+ // If we can't get a token, let the request proceed
79
+ // The server will return 401 if authentication is required
80
+ console.warn('Failed to get access token:', error);
81
+ }
82
+ return config;
83
+ }
84
+ /**
85
+ * Handle response errors with retries
86
+ */
87
+ async handleResponseError(error) {
88
+ // Check if this is a retryable error
89
+ if (this.isRetryableError(error)) {
90
+ const config = error.config;
91
+ config._retryCount = config._retryCount || 0;
92
+ if (config._retryCount < this.maxRetries) {
93
+ config._retryCount++;
94
+ // Exponential backoff
95
+ const delay = this.retryDelay * Math.pow(2, config._retryCount - 1);
96
+ await this.sleep(delay);
97
+ return this.client.request(config);
98
+ }
99
+ }
100
+ // Convert to APIError
101
+ throw this.convertToAPIError(error);
102
+ }
103
+ /**
104
+ * Check if error is retryable
105
+ */
106
+ isRetryableError(error) {
107
+ // Retry on network errors
108
+ if (!error.response) {
109
+ return true;
110
+ }
111
+ // Retry on 5xx errors (server errors)
112
+ if (error.response.status >= 500) {
113
+ return true;
114
+ }
115
+ // Retry on 429 (rate limit)
116
+ if (error.response.status === 429) {
117
+ return true;
118
+ }
119
+ // Don't retry on 4xx errors (client errors)
120
+ return false;
121
+ }
122
+ /**
123
+ * Convert axios error to APIError
124
+ */
125
+ convertToAPIError(error) {
126
+ if (error.response) {
127
+ // Server responded with error status
128
+ const data = error.response.data;
129
+ return new APIError(data?.message || error.message, error.response.status, data?.code, data?.details);
130
+ }
131
+ else if (error.request) {
132
+ // Request was made but no response received
133
+ return new APIError('No response from server', undefined, 'NETWORK_ERROR');
134
+ }
135
+ else {
136
+ // Error setting up the request
137
+ return new APIError(error.message, undefined, 'REQUEST_ERROR');
138
+ }
139
+ }
140
+ /**
141
+ * Sleep for specified milliseconds
142
+ */
143
+ sleep(ms) {
144
+ return new Promise((resolve) => setTimeout(resolve, ms));
145
+ }
146
+ /**
147
+ * Make GET request
148
+ */
149
+ async get(url, config) {
150
+ const response = await this.client.get(url, config);
151
+ return response.data;
152
+ }
153
+ /**
154
+ * Make POST request
155
+ */
156
+ async post(url, data, config) {
157
+ const response = await this.client.post(url, data, config);
158
+ return response.data;
159
+ }
160
+ /**
161
+ * Make PUT request
162
+ */
163
+ async put(url, data, config) {
164
+ const response = await this.client.put(url, data, config);
165
+ return response.data;
166
+ }
167
+ /**
168
+ * Make DELETE request
169
+ */
170
+ async delete(url, config) {
171
+ const response = await this.client.delete(url, config);
172
+ return response.data;
173
+ }
174
+ /**
175
+ * Make PATCH request
176
+ */
177
+ async patch(url, data, config) {
178
+ const response = await this.client.patch(url, data, config);
179
+ return response.data;
180
+ }
181
+ }
182
+ exports.APIClient = APIClient;
183
+ /**
184
+ * Create API client from CLI configuration
185
+ */
186
+ function createAPIClient(configHandler, authHandler) {
187
+ const config = configHandler || new config_handler_1.ConfigHandler();
188
+ const auth = authHandler || new auth_handler_1.AuthHandler();
189
+ const cliConfig = config.readConfig();
190
+ return new APIClient({
191
+ baseURL: cliConfig.control_plane_url,
192
+ timeout: 30000,
193
+ maxRetries: 3,
194
+ retryDelay: 1000,
195
+ }, auth, config);
196
+ }
197
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/api/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { APIClient, APIError, createAPIClient } from './api-client';
2
+ export type { APIClientConfig } from './api-client';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAPIClient = exports.APIError = exports.APIClient = void 0;
4
+ var api_client_1 = require("./api-client");
5
+ Object.defineProperty(exports, "APIClient", { enumerable: true, get: function () { return api_client_1.APIClient; } });
6
+ Object.defineProperty(exports, "APIError", { enumerable: true, get: function () { return api_client_1.APIError; } });
7
+ Object.defineProperty(exports, "createAPIClient", { enumerable: true, get: function () { return api_client_1.createAPIClient; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";;;AAAA,2CAAoE;AAA3D,uGAAA,SAAS,OAAA;AAAE,sGAAA,QAAQ,OAAA;AAAE,6GAAA,eAAe,OAAA"}
@@ -0,0 +1,27 @@
1
+ export interface TokenResponse {
2
+ accessToken: string;
3
+ refreshToken?: string;
4
+ idToken?: string;
5
+ expiresIn: number;
6
+ tokenType: string;
7
+ }
8
+ export interface TokenStorage {
9
+ accessToken: string;
10
+ refreshToken?: string;
11
+ expiresAt: number;
12
+ tokenType: string;
13
+ }
14
+ export declare class AuthHandler {
15
+ constructor(_configDir?: string);
16
+ startAuthFlow(_issuerUrl: string, _clientId: string, _redirectUri?: string): Promise<{
17
+ authUrl: string;
18
+ codeVerifier: string;
19
+ state: string;
20
+ }>;
21
+ completeAuthFlow(_issuerUrl: string, _clientId: string, _code: string, _codeVerifier: string, _redirectUri?: string): Promise<void>;
22
+ getAccessToken(_issuerUrl?: string, _clientId?: string): Promise<string | null>;
23
+ refreshToken(_issuerUrl: string, _clientId: string, _refreshToken: string): Promise<void>;
24
+ isAuthenticated(): Promise<boolean>;
25
+ clearTokens(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=auth-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../../src/auth/__mocks__/auth-handler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;gBACV,UAAU,CAAC,EAAE,MAAM;IAEzB,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ9D,gBAAgB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAEV,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI/E,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEzF,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CACnC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthHandler = void 0;
4
+ class AuthHandler {
5
+ constructor(_configDir) { }
6
+ async startAuthFlow(_issuerUrl, _clientId, _redirectUri) {
7
+ return {
8
+ authUrl: 'https://mock-auth-url.com',
9
+ codeVerifier: 'mock-verifier',
10
+ state: 'mock-state',
11
+ };
12
+ }
13
+ async completeAuthFlow(_issuerUrl, _clientId, _code, _codeVerifier, _redirectUri) { }
14
+ async getAccessToken(_issuerUrl, _clientId) {
15
+ return 'mock-token';
16
+ }
17
+ async refreshToken(_issuerUrl, _clientId, _refreshToken) { }
18
+ async isAuthenticated() {
19
+ return true;
20
+ }
21
+ async clearTokens() { }
22
+ }
23
+ exports.AuthHandler = AuthHandler;
24
+ //# sourceMappingURL=auth-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.js","sourceRoot":"","sources":["../../../src/auth/__mocks__/auth-handler.ts"],"names":[],"mappings":";;;AAeA,MAAa,WAAW;IACtB,YAAY,UAAmB,IAAG,CAAC;IAEnC,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,SAAiB,EACjB,YAAqB;QAErB,OAAO;YACL,OAAO,EAAE,2BAA2B;YACpC,YAAY,EAAE,eAAe;YAC7B,KAAK,EAAE,YAAY;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,UAAkB,EAClB,SAAiB,EACjB,KAAa,EACb,aAAqB,EACrB,YAAqB,IACL,CAAC;IAEnB,KAAK,CAAC,cAAc,CAAC,UAAmB,EAAE,SAAkB;QAC1D,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,SAAiB,EAAE,aAAqB,IAAkB,CAAC;IAElG,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,WAAW,KAAmB,CAAC;CACtC;AAlCD,kCAkCC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Token response from OIDC provider
3
+ */
4
+ export interface TokenResponse {
5
+ accessToken: string;
6
+ refreshToken?: string;
7
+ idToken?: string;
8
+ expiresIn: number;
9
+ tokenType: string;
10
+ }
11
+ /**
12
+ * Token storage structure
13
+ */
14
+ export interface TokenStorage {
15
+ accessToken: string;
16
+ refreshToken?: string;
17
+ expiresAt: number;
18
+ tokenType: string;
19
+ }
20
+ /**
21
+ * Authentication handler for CLI
22
+ * Manages OAuth/SSO flow and secure token storage
23
+ */
24
+ export declare class AuthHandler {
25
+ private tokenDir;
26
+ private tokenFile;
27
+ private encryptionKey;
28
+ constructor(configDir?: string);
29
+ /**
30
+ * Start OAuth/SSO authentication flow
31
+ * Returns the authorization URL for the user to visit
32
+ */
33
+ startAuthFlow(issuerUrl: string, clientId: string, redirectUri?: string): Promise<{
34
+ authUrl: string;
35
+ codeVerifier: string;
36
+ state: string;
37
+ }>;
38
+ /**
39
+ * Complete OAuth/SSO authentication flow
40
+ * Exchange authorization code for tokens
41
+ */
42
+ completeAuthFlow(issuerUrl: string, clientId: string, code: string, codeVerifier: string, redirectUri?: string): Promise<void>;
43
+ /**
44
+ * Get current access token, refreshing if necessary
45
+ */
46
+ getAccessToken(issuerUrl?: string, clientId?: string): Promise<string | null>;
47
+ /**
48
+ * Refresh access token using refresh token
49
+ */
50
+ refreshToken(issuerUrl: string, clientId: string, refreshToken: string): Promise<void>;
51
+ /**
52
+ * Check if user is authenticated
53
+ */
54
+ isAuthenticated(): Promise<boolean>;
55
+ /**
56
+ * Clear stored tokens (logout)
57
+ */
58
+ clearTokens(): Promise<void>;
59
+ /**
60
+ * Store tokens securely (encrypted)
61
+ */
62
+ private storeTokens;
63
+ /**
64
+ * Load tokens from secure storage (decrypted)
65
+ */
66
+ private loadTokens;
67
+ /**
68
+ * Get or create encryption key for token storage
69
+ */
70
+ private getOrCreateEncryptionKey;
71
+ /**
72
+ * Encrypt data using AES-256-GCM
73
+ */
74
+ private encrypt;
75
+ /**
76
+ * Decrypt data using AES-256-GCM
77
+ */
78
+ private decrypt;
79
+ }
80
+ //# sourceMappingURL=auth-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handler.d.ts","sourceRoot":"","sources":["../../src/auth/auth-handler.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;gBAElB,SAAS,CAAC,EAAE,MAAM;IAQ9B;;;OAGG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAyC,GACrD,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BpE;;;OAGG;IACG,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,GAAE,MAAyC,GACrD,OAAO,CAAC,IAAI,CAAC;IAmChB;;OAEG;IACG,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgCnF;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5F;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAUzC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC;;OAEG;YACW,WAAW;IAqBzB;;OAEG;YACW,UAAU;IAexB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAqBhC;;OAEG;IACH,OAAO,CAAC,OAAO;IAaf;;OAEG;IACH,OAAO,CAAC,OAAO;CAkBhB"}