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.
- package/README.md +132 -0
- package/dist/api/api-client.d.ts +78 -0
- package/dist/api/api-client.d.ts.map +1 -0
- package/dist/api/api-client.js +197 -0
- package/dist/api/api-client.js.map +1 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/auth/__mocks__/auth-handler.d.ts +27 -0
- package/dist/auth/__mocks__/auth-handler.d.ts.map +1 -0
- package/dist/auth/__mocks__/auth-handler.js +24 -0
- package/dist/auth/__mocks__/auth-handler.js.map +1 -0
- package/dist/auth/auth-handler.d.ts +80 -0
- package/dist/auth/auth-handler.d.ts.map +1 -0
- package/dist/auth/auth-handler.js +266 -0
- package/dist/auth/auth-handler.js.map +1 -0
- package/dist/auth/callback-server.d.ts +31 -0
- package/dist/auth/callback-server.d.ts.map +1 -0
- package/dist/auth/callback-server.js +143 -0
- package/dist/auth/callback-server.js.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +422 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/accounts.d.ts +15 -0
- package/dist/commands/accounts.d.ts.map +1 -0
- package/dist/commands/accounts.js +307 -0
- package/dist/commands/accounts.js.map +1 -0
- package/dist/commands/audit.d.ts +23 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +348 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/config.d.ts +15 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +148 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/incident.d.ts +59 -0
- package/dist/commands/incident.d.ts.map +1 -0
- package/dist/commands/incident.js +1032 -0
- package/dist/commands/incident.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +300 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/investigate.d.ts +15 -0
- package/dist/commands/investigate.d.ts.map +1 -0
- package/dist/commands/investigate.js +65 -0
- package/dist/commands/investigate.js.map +1 -0
- package/dist/commands/runbook.d.ts +20 -0
- package/dist/commands/runbook.d.ts.map +1 -0
- package/dist/commands/runbook.js +265 -0
- package/dist/commands/runbook.js.map +1 -0
- package/dist/config/__mocks__/config-handler.d.ts +11 -0
- package/dist/config/__mocks__/config-handler.d.ts.map +1 -0
- package/dist/config/__mocks__/config-handler.js +31 -0
- package/dist/config/__mocks__/config-handler.js.map +1 -0
- package/dist/config/certificate-pinning.d.ts +68 -0
- package/dist/config/certificate-pinning.d.ts.map +1 -0
- package/dist/config/certificate-pinning.js +249 -0
- package/dist/config/certificate-pinning.js.map +1 -0
- package/dist/config/config-handler.d.ts +45 -0
- package/dist/config/config-handler.d.ts.map +1 -0
- package/dist/config/config-handler.js +149 -0
- package/dist/config/config-handler.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/types/cli-options.d.ts +31 -0
- package/dist/types/cli-options.d.ts.map +1 -0
- package/dist/types/cli-options.js +3 -0
- package/dist/types/cli-options.js.map +1 -0
- package/dist/utils/output-formatter.d.ts +67 -0
- package/dist/utils/output-formatter.d.ts.map +1 -0
- package/dist/utils/output-formatter.js +147 -0
- package/dist/utils/output-formatter.js.map +1 -0
- 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 @@
|
|
|
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"}
|